aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-07-21 16:10:34 -0500
committerxoviat <[email protected]>2023-07-21 16:10:34 -0500
commitc675208b8a90bee39e99c8cd3bb620b99c439482 (patch)
tree208957b34aec9876a8d7af1c1b28e3a0dfa1e023
parent899a68325c322a813155c7ba9c6e43c79be99bd8 (diff)
wpan: complete prelim. command impl.
-rw-r--r--embassy-stm32-wpan/src/mac/control.rs16
-rw-r--r--embassy-stm32-wpan/src/mac/runner.rs7
2 files changed, 14 insertions, 9 deletions
diff --git a/embassy-stm32-wpan/src/mac/control.rs b/embassy-stm32-wpan/src/mac/control.rs
index fd8c22b26..ded419203 100644
--- a/embassy-stm32-wpan/src/mac/control.rs
+++ b/embassy-stm32-wpan/src/mac/control.rs
@@ -1,5 +1,6 @@
1use core::future::Future; 1use core::future::Future;
2use core::task; 2use core::task;
3use core::task::Poll;
3 4
4use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 5use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
5use embassy_sync::mutex::MutexGuard; 6use embassy_sync::mutex::MutexGuard;
@@ -7,6 +8,7 @@ use embassy_sync::signal::Signal;
7use futures::FutureExt; 8use futures::FutureExt;
8 9
9use super::commands::MacCommand; 10use super::commands::MacCommand;
11use super::event::MacEvent;
10use super::typedefs::MacError; 12use super::typedefs::MacError;
11use crate::mac::runner::Runner; 13use crate::mac::runner::Runner;
12 14
@@ -62,10 +64,9 @@ impl<'a> EventToken<'a> {
62} 64}
63 65
64impl<'a> Future for EventToken<'a> { 66impl<'a> Future for EventToken<'a> {
65 // TODO: output something 67 type Output = MacEvent<'a>;
66 type Output = ();
67 68
68 fn poll(self: core::pin::Pin<&mut Self>, cx: &mut task::Context<'_>) -> task::Poll<Self::Output> { 69 fn poll(self: core::pin::Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<Self::Output> {
69 self.get_mut().runner.rx_event_channel.lock(|s| { 70 self.get_mut().runner.rx_event_channel.lock(|s| {
70 let signal = s.borrow_mut(); 71 let signal = s.borrow_mut();
71 let signal = match &*signal { 72 let signal = match &*signal {
@@ -73,10 +74,13 @@ impl<'a> Future for EventToken<'a> {
73 _ => unreachable!(), 74 _ => unreachable!(),
74 }; 75 };
75 76
76 let _ = signal.wait().poll_unpin(cx); 77 let result = match signal.wait().poll_unpin(cx) {
77 }); 78 Poll::Ready(mac_event) => Poll::Ready(mac_event),
79 Poll::Pending => Poll::Pending,
80 };
78 81
79 todo!() 82 result
83 })
80 } 84 }
81} 85}
82 86
diff --git a/embassy-stm32-wpan/src/mac/runner.rs b/embassy-stm32-wpan/src/mac/runner.rs
index f964d6b3d..482321b95 100644
--- a/embassy-stm32-wpan/src/mac/runner.rs
+++ b/embassy-stm32-wpan/src/mac/runner.rs
@@ -13,12 +13,13 @@ use crate::mac::typedefs::{AddressMode, MacAddress, PanId, SecurityLevel};
13use crate::mac::MTU; 13use crate::mac::MTU;
14use crate::sub::mac::Mac; 14use crate::sub::mac::Mac;
15 15
16type ZeroCopyPubSub<M, T> = blocking_mutex::Mutex<M, RefCell<Option<Signal<NoopRawMutex, T>>>>;
17
16pub struct Runner<'a> { 18pub struct Runner<'a> {
17 pub(crate) mac_subsystem: Mac, 19 pub(crate) mac_subsystem: Mac,
18
19 // rx event backpressure is already provided through the MacEvent drop mechanism 20 // rx event backpressure is already provided through the MacEvent drop mechanism
20 pub(crate) rx_event_channel: 21 // therefore, we don't need to worry about overwriting events
21 blocking_mutex::Mutex<CriticalSectionRawMutex, RefCell<Option<Signal<NoopRawMutex, MacEvent<'a>>>>>, 22 pub(crate) rx_event_channel: ZeroCopyPubSub<CriticalSectionRawMutex, MacEvent<'a>>,
22 pub(crate) read_mutex: Mutex<CriticalSectionRawMutex, ()>, 23 pub(crate) read_mutex: Mutex<CriticalSectionRawMutex, ()>,
23 pub(crate) write_mutex: Mutex<CriticalSectionRawMutex, ()>, 24 pub(crate) write_mutex: Mutex<CriticalSectionRawMutex, ()>,
24 pub(crate) rx_channel: Channel<CriticalSectionRawMutex, MacEvent<'a>, 1>, 25 pub(crate) rx_channel: Channel<CriticalSectionRawMutex, MacEvent<'a>, 1>,