@@ -3,8 +3,8 @@ use crate::api::{Central, CentralEvent, CentralState, ScanFilter};
3
3
use crate :: { Error , Result } ;
4
4
use async_trait:: async_trait;
5
5
use bluez_async:: {
6
- AdapterId , BluetoothError , BluetoothEvent , BluetoothSession , DeviceEvent , DiscoveryFilter ,
7
- Transport ,
6
+ AdapterEvent , AdapterId , BluetoothError , BluetoothEvent , BluetoothSession , DeviceEvent ,
7
+ DiscoveryFilter , Transport ,
8
8
} ;
9
9
use futures:: stream:: { self , Stream , StreamExt } ;
10
10
use std:: pin:: Pin ;
@@ -22,6 +22,13 @@ impl Adapter {
22
22
}
23
23
}
24
24
25
+ fn get_central_state ( powered : bool ) -> CentralState {
26
+ match powered {
27
+ true => CentralState :: PoweredOn ,
28
+ false => CentralState :: PoweredOff ,
29
+ }
30
+ }
31
+
25
32
#[ async_trait]
26
33
impl Central for Adapter {
27
34
type Peripheral = Peripheral ;
@@ -107,7 +114,11 @@ impl Central for Adapter {
107
114
}
108
115
109
116
async fn adapter_state ( & self ) -> Result < CentralState > {
110
- Ok ( CentralState :: Unknown )
117
+ let mut powered = false ;
118
+ if let Ok ( info) = self . session . get_adapter_info ( & self . adapter ) . await {
119
+ powered = info. powered ;
120
+ }
121
+ Ok ( get_central_state ( powered) )
111
122
}
112
123
}
113
124
@@ -166,6 +177,16 @@ async fn central_event(
166
177
}
167
178
_ => None ,
168
179
} ,
180
+ BluetoothEvent :: Adapter {
181
+ id,
182
+ event : adapter_event,
183
+ } if id == adapter_id => match adapter_event {
184
+ AdapterEvent :: Powered { powered } => {
185
+ let state = get_central_state ( powered) ;
186
+ Some ( CentralEvent :: StateUpdate ( state) )
187
+ }
188
+ _ => None ,
189
+ } ,
169
190
_ => None ,
170
191
}
171
192
}
0 commit comments