net/chan: split state runner.
This commit is contained in:
		| @@ -50,9 +50,13 @@ pub struct Runner<'d, const MTU: usize> { | |||||||
|     shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |     shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[derive(Clone, Copy)] | ||||||
|  | pub struct StateRunner<'d> { | ||||||
|  |     shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | ||||||
|  | } | ||||||
|  |  | ||||||
| pub struct RxRunner<'d, const MTU: usize> { | pub struct RxRunner<'d, const MTU: usize> { | ||||||
|     rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |     rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | ||||||
|     shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| pub struct TxRunner<'d, const MTU: usize> { | pub struct TxRunner<'d, const MTU: usize> { | ||||||
| @@ -60,16 +64,18 @@ pub struct TxRunner<'d, const MTU: usize> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, const MTU: usize> Runner<'d, MTU> { | impl<'d, const MTU: usize> Runner<'d, MTU> { | ||||||
|     pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { |     pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) { | ||||||
|         ( |         ( | ||||||
|             RxRunner { |             StateRunner { shared: self.shared }, | ||||||
|                 shared: self.shared, |             RxRunner { rx_chan: self.rx_chan }, | ||||||
|                 rx_chan: self.rx_chan, |  | ||||||
|             }, |  | ||||||
|             TxRunner { tx_chan: self.tx_chan }, |             TxRunner { tx_chan: self.tx_chan }, | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     pub fn state_runner(&self) -> StateRunner<'d> { | ||||||
|  |         StateRunner { shared: self.shared } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pub fn set_link_state(&mut self, state: LinkState) { |     pub fn set_link_state(&mut self, state: LinkState) { | ||||||
|         self.shared.lock(|s| { |         self.shared.lock(|s| { | ||||||
|             let s = &mut *s.borrow_mut(); |             let s = &mut *s.borrow_mut(); | ||||||
| @@ -131,8 +137,8 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, const MTU: usize> RxRunner<'d, MTU> { | impl<'d> StateRunner<'d> { | ||||||
|     pub fn set_link_state(&mut self, state: LinkState) { |     pub fn set_link_state(&self, state: LinkState) { | ||||||
|         self.shared.lock(|s| { |         self.shared.lock(|s| { | ||||||
|             let s = &mut *s.borrow_mut(); |             let s = &mut *s.borrow_mut(); | ||||||
|             s.link_state = state; |             s.link_state = state; | ||||||
| @@ -140,14 +146,16 @@ impl<'d, const MTU: usize> RxRunner<'d, MTU> { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn set_ethernet_address(&mut self, address: [u8; 6]) { |     pub fn set_ethernet_address(&self, address: [u8; 6]) { | ||||||
|         self.shared.lock(|s| { |         self.shared.lock(|s| { | ||||||
|             let s = &mut *s.borrow_mut(); |             let s = &mut *s.borrow_mut(); | ||||||
|             s.ethernet_address = address; |             s.ethernet_address = address; | ||||||
|             s.waker.wake(); |             s.waker.wake(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | ||||||
|     pub async fn rx_buf(&mut self) -> &mut [u8] { |     pub async fn rx_buf(&mut self) -> &mut [u8] { | ||||||
|         let p = self.rx_chan.send().await; |         let p = self.rx_chan.send().await; | ||||||
|         &mut p.buf |         &mut p.buf | ||||||
|   | |||||||
| @@ -25,16 +25,16 @@ pub struct Runner<'d, D: Driver<'d>, const MTU: usize> { | |||||||
|  |  | ||||||
| impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { | impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { | ||||||
|     pub async fn run(mut self) -> ! { |     pub async fn run(mut self) -> ! { | ||||||
|         let (mut rx_chan, mut tx_chan) = self.ch.split(); |         let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split(); | ||||||
|         let rx_fut = async move { |         let rx_fut = async move { | ||||||
|             loop { |             loop { | ||||||
|                 trace!("WAITING for connection"); |                 trace!("WAITING for connection"); | ||||||
|                 rx_chan.set_link_state(LinkState::Down); |                 state_chan.set_link_state(LinkState::Down); | ||||||
|  |  | ||||||
|                 self.rx_usb.wait_connection().await.unwrap(); |                 self.rx_usb.wait_connection().await.unwrap(); | ||||||
|  |  | ||||||
|                 trace!("Connected"); |                 trace!("Connected"); | ||||||
|                 rx_chan.set_link_state(LinkState::Up); |                 state_chan.set_link_state(LinkState::Up); | ||||||
|  |  | ||||||
|                 loop { |                 loop { | ||||||
|                     let p = rx_chan.rx_buf().await; |                     let p = rx_chan.rx_buf().await; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user