@@ -7,37 +7,93 @@ use defmt::info;
77use embassy_executor:: Spawner ;
88use embassy_imxrt:: gpio:: { self , Input , Inverter , Pull } ;
99use 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 ;
1112use embassy_time:: Duration ;
13+ use embedded_services:: transport:: { self , Endpoint , Internal } ;
1214use power_button_service:: button:: { Button , ButtonConfig } ;
1315use power_button_service:: button_interpreter:: { check_button_press, Message } ;
1416use power_button_service:: debounce:: { ActiveState , Debouncer } ;
1517use { 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]
48104async 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