1- use crate :: { state:: GlobalState , structs:: BleDisplayDevice } ;
1+ use crate :: {
2+ state:: { BleAction , GlobalState , MenuScene } ,
3+ structs:: BleDisplayDevice ,
4+ } ;
25use alloc:: string:: ToString ;
36use core:: cell:: RefCell ;
47use embassy_futures:: select:: { Either , select, select3, select4} ;
@@ -18,6 +21,26 @@ pub async fn bluetooth_timer_task(
1821 state : GlobalState ,
1922) {
2023 loop {
24+ let ( mut has_bond_info, bond_info) =
25+ if let Some ( bond_info) = load_bonding_info ( & state. nvs ) . await {
26+ log:: info!( "Bond stored." ) ;
27+ ( true , Some ( bond_info) )
28+ } else {
29+ log:: info!( "No bond stored." ) ;
30+
31+ let current_menu_scene = state. state . lock ( ) . await . menu_scene . clone ( ) ;
32+ if current_menu_scene != Some ( MenuScene :: BtDisplay ) {
33+ loop {
34+ let sig = state. ble_sig . wait ( ) . await ;
35+ if let BleAction :: StartScan = sig {
36+ break ;
37+ }
38+ }
39+ }
40+
41+ ( false , None )
42+ } ;
43+
2144 let Ok ( connector) = BleConnector :: new (
2245 init,
2346 unsafe { bt. clone_unchecked ( ) } ,
@@ -42,16 +65,6 @@ pub async fn bluetooth_timer_task(
4265 ..
4366 } = stack. build ( ) ;
4467
45- let ( mut has_bond_info, bond_info) =
46- if let Some ( bond_info) = load_bonding_info ( & state. nvs ) . await {
47- log:: info!( "Bond stored. Adding to stack." ) ;
48- stack. add_bond_information ( bond_info. clone ( ) ) . unwrap ( ) ;
49- ( true , Some ( bond_info) )
50- } else {
51- log:: info!( "No bond stored." ) ;
52- ( false , None )
53- } ;
54-
5568 let mut central = if !has_bond_info {
5669 let discovery_channel: Channel < NoopRawMutex , BleDisplayDevice , 10 > =
5770 embassy_sync:: channel:: Channel :: new ( ) ;
@@ -98,7 +111,7 @@ pub async fn bluetooth_timer_task(
98111 async {
99112 loop {
100113 Timer :: after_millis ( 200 ) . await ;
101- if state. ble_connect_sig . signaled ( ) {
114+ if state. ble_sig . signaled ( ) {
102115 break ;
103116 }
104117 }
@@ -108,12 +121,21 @@ pub async fn bluetooth_timer_task(
108121
109122 scanner. into_inner ( )
110123 } else {
124+ stack
125+ . add_bond_information ( bond_info. clone ( ) . unwrap ( ) )
126+ . unwrap ( ) ;
127+
111128 central
112129 } ;
113130
114131 let display_addr = match bond_info {
115132 Some ( ref bond_info) => bond_info. identity . bd_addr . into_inner ( ) ,
116- None => state. ble_connect_sig . wait ( ) . await . addr ,
133+ None => loop {
134+ let sig = state. ble_sig . wait ( ) . await ;
135+ if let BleAction :: Connect ( d) = sig {
136+ break d. addr ;
137+ }
138+ } ,
117139 } ;
118140 let target: Address = Address :: random ( display_addr) ;
119141
@@ -129,7 +151,12 @@ pub async fn bluetooth_timer_task(
129151 let _ = select3 (
130152 runner. run ( ) ,
131153 async {
132- state. ble_unpair_sig . wait ( ) . await ;
154+ loop {
155+ let sig = state. ble_sig . wait ( ) . await ;
156+ if let BleAction :: Unpair = sig {
157+ break ;
158+ }
159+ }
133160 } ,
134161 async {
135162 ' outer: loop {
0 commit comments