Skip to content

Commit fed3aeb

Browse files
authored
Merge pull request #26 from akshat2112/use-intrusive-list
Using transport layer instead of PubSubChannel for power button service
2 parents d5730d3 + 5239386 commit fed3aeb

File tree

1 file changed

+77
-16
lines changed

1 file changed

+77
-16
lines changed

examples/rt685s-evk/src/bin/power_button.rs

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,93 @@ use defmt::info;
77
use embassy_executor::Spawner;
88
use embassy_imxrt::gpio::{self, Input, Inverter, Pull};
99
use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
10-
use embassy_sync::pubsub::{PubSubChannel, Publisher};
10+
use embassy_sync::once_lock::OnceLock;
11+
use embassy_sync::signal::Signal;
1112
use embassy_time::Duration;
13+
use embedded_services::transport::{self, Endpoint, Internal};
1214
use power_button_service::button::{Button, ButtonConfig};
1315
use power_button_service::button_interpreter::{check_button_press, Message};
1416
use power_button_service::debounce::{ActiveState, Debouncer};
1517
use {defmt_rtt as _, panic_probe as _};
1618

17-
/// Create a message bus.
18-
static MESSAGE_BUS: PubSubChannel<ThreadModeRawMutex, Message, 4, 4, 4> = PubSubChannel::new();
19+
mod sender {
20+
use super::*;
21+
22+
pub struct Sender {
23+
pub tp: transport::EndpointLink,
24+
sn: Signal<ThreadModeRawMutex, Message>,
25+
}
26+
27+
impl Sender {
28+
pub fn new() -> Self {
29+
Self {
30+
tp: transport::EndpointLink::uninit(Endpoint::Internal(Internal::Power)),
31+
sn: Signal::new(),
32+
}
33+
}
34+
35+
pub async fn send(&self, message: Message) {
36+
self.tp
37+
.send(Endpoint::Internal(Internal::Power), &message)
38+
.await
39+
.unwrap();
40+
}
41+
}
42+
43+
impl<'a> transport::MessageDelegate for Sender {
44+
fn process(&self, message: &transport::Message) {
45+
if let Some(sig) = message.data.get::<Message>() {
46+
self.sn.signal(*sig);
47+
}
48+
}
49+
}
50+
}
51+
52+
mod receiver {
53+
use super::*;
54+
55+
pub struct Receiver {
56+
pub tp: transport::EndpointLink,
57+
pub sn: Signal<ThreadModeRawMutex, Message>,
58+
}
59+
60+
impl Receiver {
61+
pub fn new() -> Self {
62+
Self {
63+
tp: transport::EndpointLink::uninit(Endpoint::Internal(Internal::Power)),
64+
sn: Signal::new(),
65+
}
66+
}
67+
}
68+
69+
impl transport::MessageDelegate for Receiver {
70+
fn process(&self, message: &transport::Message) {
71+
if let Some(sig) = message.data.get::<Message>() {
72+
self.sn.signal(*sig);
73+
}
74+
}
75+
}
76+
}
1977

2078
#[embassy_executor::task(pool_size = 4)]
21-
async fn button_task(
22-
gpio: Input<'static>,
23-
config: ButtonConfig,
24-
publisher: Publisher<'static, ThreadModeRawMutex, Message, 4, 4, 4>,
25-
) {
79+
async fn button_task(gpio: Input<'static>, config: ButtonConfig) {
80+
static SENDER: OnceLock<sender::Sender> = OnceLock::new();
81+
let sender = SENDER.get_or_init(|| sender::Sender::new());
2682
let mut button = Button::new(gpio, config);
2783

2884
loop {
2985
match check_button_press(&mut button).await {
3086
Some(Message::ShortPress) => {
3187
info!("Short press");
32-
publisher.publish(Message::ShortPress).await;
88+
sender.send(Message::ShortPress).await;
3389
}
3490
Some(Message::LongPress) => {
3591
info!("Long press");
36-
publisher.publish(Message::LongPress).await;
92+
sender.send(Message::LongPress).await;
3793
}
3894
Some(Message::PressAndHold) => {
3995
info!("Press and hold");
40-
publisher.publish(Message::PressAndHold).await;
96+
sender.send(Message::PressAndHold).await;
4197
}
4298
None => {}
4399
}
@@ -46,6 +102,8 @@ async fn button_task(
46102

47103
#[embassy_executor::main]
48104
async fn main(spawner: Spawner) {
105+
embedded_services::init().await;
106+
49107
let p = embassy_imxrt::init(Default::default());
50108

51109
unsafe { gpio::init() };
@@ -63,8 +121,13 @@ async fn main(spawner: Spawner) {
63121
let config_b = ButtonConfig::default();
64122

65123
// Spawn the button tasks
66-
spawner.must_spawn(button_task(button_a, config_a, MESSAGE_BUS.publisher().unwrap()));
67-
spawner.must_spawn(button_task(button_b, config_b, MESSAGE_BUS.publisher().unwrap()));
124+
spawner.must_spawn(button_task(button_a, config_a));
125+
spawner.must_spawn(button_task(button_b, config_b));
126+
127+
static RECEIVER: OnceLock<receiver::Receiver> = OnceLock::new();
128+
let receiver = RECEIVER.get_or_init(receiver::Receiver::new);
129+
130+
transport::register_endpoint(receiver, &receiver.tp).await.unwrap();
68131

69132
// Create an LED instance
70133
let mut led_r = gpio::Output::new(
@@ -93,10 +156,8 @@ async fn main(spawner: Spawner) {
93156
gpio::SlewRate::Standard,
94157
);
95158

96-
let mut subscriber = MESSAGE_BUS.subscriber().unwrap();
97-
98159
loop {
99-
let msg = subscriber.next_message_pure().await;
160+
let msg = receiver.sn.wait().await;
100161

101162
// Toggle the LEDs based on the button press duration
102163
match msg {

0 commit comments

Comments
 (0)