aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32-wpan
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-07-17 20:14:06 -0500
committerxoviat <[email protected]>2023-07-17 20:14:06 -0500
commitd040871f7a078db94846305463c30a461f821d7f (patch)
tree4b3280994fb762542a37c47182461cbf6fa1f9a3 /embassy-stm32-wpan
parent8f23b6faa6f04f83ece119e94335f892d516f6b3 (diff)
wpan: fix comp errors and impl. some of runner
Diffstat (limited to 'embassy-stm32-wpan')
-rw-r--r--embassy-stm32-wpan/src/mac/driver.rs8
-rw-r--r--embassy-stm32-wpan/src/mac/mod.rs9
-rw-r--r--embassy-stm32-wpan/src/mac/runner.rs75
3 files changed, 75 insertions, 17 deletions
diff --git a/embassy-stm32-wpan/src/mac/driver.rs b/embassy-stm32-wpan/src/mac/driver.rs
index 00072749b..118f6908f 100644
--- a/embassy-stm32-wpan/src/mac/driver.rs
+++ b/embassy-stm32-wpan/src/mac/driver.rs
@@ -25,6 +25,8 @@ impl<'d> embassy_net_driver::Driver for Driver<'d> {
25 type TxToken<'a> = TxToken where Self: 'a; 25 type TxToken<'a> = TxToken where Self: 'a;
26 26
27 fn receive(&mut self, cx: &mut Context) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { 27 fn receive(&mut self, cx: &mut Context) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
28 self.runner.rx_waker.register(cx.waker());
29
28 // WAKER.register(cx.waker()); 30 // WAKER.register(cx.waker());
29 // if self.rx.available().is_some() && self.tx.available().is_some() { 31 // if self.rx.available().is_some() && self.tx.available().is_some() {
30 // Some((RxToken { rx: &mut self.rx }, TxToken { tx: &mut self.tx })) 32 // Some((RxToken { rx: &mut self.rx }, TxToken { tx: &mut self.tx }))
@@ -36,6 +38,8 @@ impl<'d> embassy_net_driver::Driver for Driver<'d> {
36 } 38 }
37 39
38 fn transmit(&mut self, cx: &mut Context) -> Option<Self::TxToken<'_>> { 40 fn transmit(&mut self, cx: &mut Context) -> Option<Self::TxToken<'_>> {
41 self.runner.tx_waker.register(cx.waker());
42
39 // WAKER.register(cx.waker()); 43 // WAKER.register(cx.waker());
40 // / if self.tx.available().is_some() { 44 // / if self.tx.available().is_some() {
41 // / Some(TxToken { tx: &mut self.tx }) 45 // / Some(TxToken { tx: &mut self.tx })
@@ -84,7 +88,7 @@ impl embassy_net_driver::RxToken for RxToken {
84 // NOTE(unwrap): we checked the queue wasn't full when creating the token. 88 // NOTE(unwrap): we checked the queue wasn't full when creating the token.
85 // let pkt = unwrap!(self.rx.available()); 89 // let pkt = unwrap!(self.rx.available());
86 90
87 let pkt = &[]; 91 let pkt = &mut [];
88 let r = f(&mut pkt[0..]); 92 let r = f(&mut pkt[0..]);
89 // self.rx.pop_packet(); 93 // self.rx.pop_packet();
90 r 94 r
@@ -102,7 +106,7 @@ impl embassy_net_driver::TxToken for TxToken {
102 { 106 {
103 // NOTE(unwrap): we checked the queue wasn't full when creating the token. 107 // NOTE(unwrap): we checked the queue wasn't full when creating the token.
104 // let pkt = unwrap!(self.tx.available()); 108 // let pkt = unwrap!(self.tx.available());
105 let pkt = &[]; 109 let pkt = &mut [];
106 let r = f(&mut pkt[..len]); 110 let r = f(&mut pkt[..len]);
107 // self.tx.transmit(len); 111 // self.tx.transmit(len);
108 r 112 r
diff --git a/embassy-stm32-wpan/src/mac/mod.rs b/embassy-stm32-wpan/src/mac/mod.rs
index e024aeae3..2f9d1c81e 100644
--- a/embassy-stm32-wpan/src/mac/mod.rs
+++ b/embassy-stm32-wpan/src/mac/mod.rs
@@ -15,16 +15,11 @@ use core::slice;
15pub use crate::mac::control::{Control, Error as ControlError}; 15pub use crate::mac::control::{Control, Error as ControlError};
16use crate::mac::driver::Driver; 16use crate::mac::driver::Driver;
17pub use crate::mac::runner::Runner; 17pub use crate::mac::runner::Runner;
18use crate::sub::mac::Mac;
19 18
20const MTU: usize = 127; 19const MTU: usize = 127;
21 20
22pub async fn new<'a>(mac: Mac) -> (Runner, Control<'a>, Driver<'a>) { 21pub async fn new<'a>(runner: &'a Runner) -> (Control<'a>, Driver<'a>) {
23 let runner = Runner::new(mac); 22 (Control::new(runner), Driver::new(runner))
24 let control = Control::new(&runner);
25 let driver = Driver::new(&runner);
26
27 (runner, control, driver)
28} 23}
29 24
30fn slice8_mut(x: &mut [u32]) -> &mut [u8] { 25fn slice8_mut(x: &mut [u32]) -> &mut [u8] {
diff --git a/embassy-stm32-wpan/src/mac/runner.rs b/embassy-stm32-wpan/src/mac/runner.rs
index e97c9c8e2..d545d6c96 100644
--- a/embassy-stm32-wpan/src/mac/runner.rs
+++ b/embassy-stm32-wpan/src/mac/runner.rs
@@ -1,27 +1,86 @@
1use embassy_futures::select::{select3, Either3}; 1use embassy_futures::select::{select3, Either3};
2use embassy_sync::waitqueue::AtomicWaker;
2 3
4use crate::mac::event::{Event, MacEvent};
3use crate::mac::MTU; 5use crate::mac::MTU;
4use crate::sub::mac::Mac; 6use crate::sub::mac::Mac;
5 7
8pub(crate) struct TxRing {
9 // stores n packets of up to mtu size
10 ring: [[u8; MTU]; 5],
11 pending: bool,
12 // start: u8,
13 // end: u8,
14}
15
16impl TxRing {
17 pub(crate) fn new() -> Self {
18 Self {
19 ring: [[0; MTU]; 5],
20 pending: false,
21 }
22 }
23
24 // wait for a free packet to become available
25 pub fn is_packet_free(&self) -> bool {
26 !self.pending
27 }
28
29 // get the next available free packet
30 pub fn get_free_packet<'a>(&'a mut self) -> &'a mut [u8] {
31 self.pending = true;
32
33 &mut self.ring[0]
34 }
35
36 pub fn get_packet_to_transmit<'a>(&'a mut self) -> Option<&'a [u8]> {
37 if self.pending {
38 self.pending = false;
39
40 Some(&self.ring[0])
41 } else {
42 None
43 }
44 }
45}
46
6pub struct Runner { 47pub struct Runner {
7 mac: Mac, 48 mac_subsystem: Mac,
8 // TODO: tx_ring 49 pub(crate) rx_ring: Option<Event>,
9 // TODO: rx_buf 50 pub(crate) tx_ring: TxRing,
51 pub(crate) rx_waker: AtomicWaker,
52 pub(crate) tx_waker: AtomicWaker,
10} 53}
11 54
12impl Runner { 55impl Runner {
13 pub(crate) fn new(mac: Mac) -> Self { 56 pub fn new(mac: Mac) -> Self {
14 Self { mac } 57 Self {
58 mac_subsystem: mac,
59 rx_ring: None,
60 tx_ring: TxRing::new(),
61 rx_waker: AtomicWaker::new(),
62 tx_waker: AtomicWaker::new(),
63 }
15 } 64 }
16 65
17 pub(crate) async fn init(&mut self, firmware: &[u8]) { 66 pub(crate) async fn init(&mut self, firmware: &[u8]) {
18 debug!("wifi init done"); 67 debug!("wifi init done");
19 } 68 }
20 69
21 pub async fn run(mut self) -> ! { 70 pub async fn run(&self) -> ! {
22 let mut buf = [0; 512];
23 loop { 71 loop {
24 // TODO 72 let event = self.mac_subsystem.read().await;
73 if let Ok(evt) = event.mac_event() {
74 match evt {
75 MacEvent::McpsDataInd(data_ind) => {
76 // TODO: store mac_event in rx_ring
77 self.rx_waker.wake();
78 }
79 _ => {}
80 }
81 }
82
83 // TODO: select tx event
25 } 84 }
26 } 85 }
27} 86}