diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-12-27 01:07:58 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-12-27 01:07:58 +0100 |
| commit | 771806be790a2758f1314d6460defe7c2f0d3e99 (patch) | |
| tree | ea20047099f48b1ac3014ffb36b892ef25f25de8 | |
| parent | 4a4b59369482572c415487b9d90166e7c19b592a (diff) | |
net/chan: split state runner.
| -rw-r--r-- | embassy-net-driver-channel/src/lib.rs | 26 | ||||
| -rw-r--r-- | embassy-usb/src/class/cdc_ncm/embassy_net.rs | 6 |
2 files changed, 20 insertions, 12 deletions
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs index 073edb41a..0c8dcc22b 100644 --- a/embassy-net-driver-channel/src/lib.rs +++ b/embassy-net-driver-channel/src/lib.rs | |||
| @@ -50,9 +50,13 @@ pub struct Runner<'d, const MTU: usize> { | |||
| 50 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | 50 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | #[derive(Clone, Copy)] | ||
| 54 | pub struct StateRunner<'d> { | ||
| 55 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | ||
| 56 | } | ||
| 57 | |||
| 53 | pub struct RxRunner<'d, const MTU: usize> { | 58 | pub struct RxRunner<'d, const MTU: usize> { |
| 54 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 59 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 55 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | ||
| 56 | } | 60 | } |
| 57 | 61 | ||
| 58 | pub struct TxRunner<'d, const MTU: usize> { | 62 | pub struct TxRunner<'d, const MTU: usize> { |
| @@ -60,16 +64,18 @@ pub struct TxRunner<'d, const MTU: usize> { | |||
| 60 | } | 64 | } |
| 61 | 65 | ||
| 62 | impl<'d, const MTU: usize> Runner<'d, MTU> { | 66 | impl<'d, const MTU: usize> Runner<'d, MTU> { |
| 63 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { | 67 | pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) { |
| 64 | ( | 68 | ( |
| 65 | RxRunner { | 69 | StateRunner { shared: self.shared }, |
| 66 | shared: self.shared, | 70 | RxRunner { rx_chan: self.rx_chan }, |
| 67 | rx_chan: self.rx_chan, | ||
| 68 | }, | ||
| 69 | TxRunner { tx_chan: self.tx_chan }, | 71 | TxRunner { tx_chan: self.tx_chan }, |
| 70 | ) | 72 | ) |
| 71 | } | 73 | } |
| 72 | 74 | ||
| 75 | pub fn state_runner(&self) -> StateRunner<'d> { | ||
| 76 | StateRunner { shared: self.shared } | ||
| 77 | } | ||
| 78 | |||
| 73 | pub fn set_link_state(&mut self, state: LinkState) { | 79 | pub fn set_link_state(&mut self, state: LinkState) { |
| 74 | self.shared.lock(|s| { | 80 | self.shared.lock(|s| { |
| 75 | let s = &mut *s.borrow_mut(); | 81 | let s = &mut *s.borrow_mut(); |
| @@ -131,8 +137,8 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 131 | } | 137 | } |
| 132 | } | 138 | } |
| 133 | 139 | ||
| 134 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | 140 | impl<'d> StateRunner<'d> { |
| 135 | pub fn set_link_state(&mut self, state: LinkState) { | 141 | pub fn set_link_state(&self, state: LinkState) { |
| 136 | self.shared.lock(|s| { | 142 | self.shared.lock(|s| { |
| 137 | let s = &mut *s.borrow_mut(); | 143 | let s = &mut *s.borrow_mut(); |
| 138 | s.link_state = state; | 144 | s.link_state = state; |
| @@ -140,14 +146,16 @@ impl<'d, const MTU: usize> RxRunner<'d, MTU> { | |||
| 140 | }); | 146 | }); |
| 141 | } | 147 | } |
| 142 | 148 | ||
| 143 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | 149 | pub fn set_ethernet_address(&self, address: [u8; 6]) { |
| 144 | self.shared.lock(|s| { | 150 | self.shared.lock(|s| { |
| 145 | let s = &mut *s.borrow_mut(); | 151 | let s = &mut *s.borrow_mut(); |
| 146 | s.ethernet_address = address; | 152 | s.ethernet_address = address; |
| 147 | s.waker.wake(); | 153 | s.waker.wake(); |
| 148 | }); | 154 | }); |
| 149 | } | 155 | } |
| 156 | } | ||
| 150 | 157 | ||
| 158 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | ||
| 151 | pub async fn rx_buf(&mut self) -> &mut [u8] { | 159 | pub async fn rx_buf(&mut self) -> &mut [u8] { |
| 152 | let p = self.rx_chan.send().await; | 160 | let p = self.rx_chan.send().await; |
| 153 | &mut p.buf | 161 | &mut p.buf |
diff --git a/embassy-usb/src/class/cdc_ncm/embassy_net.rs b/embassy-usb/src/class/cdc_ncm/embassy_net.rs index 7ecf693d2..501df2d8c 100644 --- a/embassy-usb/src/class/cdc_ncm/embassy_net.rs +++ b/embassy-usb/src/class/cdc_ncm/embassy_net.rs | |||
| @@ -25,16 +25,16 @@ pub struct Runner<'d, D: Driver<'d>, const MTU: usize> { | |||
| 25 | 25 | ||
| 26 | impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { | 26 | impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { |
| 27 | pub async fn run(mut self) -> ! { | 27 | pub async fn run(mut self) -> ! { |
| 28 | let (mut rx_chan, mut tx_chan) = self.ch.split(); | 28 | let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split(); |
| 29 | let rx_fut = async move { | 29 | let rx_fut = async move { |
| 30 | loop { | 30 | loop { |
| 31 | trace!("WAITING for connection"); | 31 | trace!("WAITING for connection"); |
| 32 | rx_chan.set_link_state(LinkState::Down); | 32 | state_chan.set_link_state(LinkState::Down); |
| 33 | 33 | ||
| 34 | self.rx_usb.wait_connection().await.unwrap(); | 34 | self.rx_usb.wait_connection().await.unwrap(); |
| 35 | 35 | ||
| 36 | trace!("Connected"); | 36 | trace!("Connected"); |
| 37 | rx_chan.set_link_state(LinkState::Up); | 37 | state_chan.set_link_state(LinkState::Up); |
| 38 | 38 | ||
| 39 | loop { | 39 | loop { |
| 40 | let p = rx_chan.rx_buf().await; | 40 | let p = rx_chan.rx_buf().await; |
