• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! GATT service facade
2 
3 use bt_topshim::btif::{BluetoothInterface, Uuid};
4 use bt_topshim::profiles::gatt::{
5     AdvertiseParameters, Gatt, GattFilterParam, PeriodicAdvertisingParameters,
6 };
7 use bt_topshim::profiles::gatt::{
8     GattAdvCallbacksDispatcher, GattAdvInbandCallbacksDispatcher, GattClientCallbacksDispatcher,
9     GattScannerCallbacksDispatcher, GattScannerInbandCallbacksDispatcher,
10     GattServerCallbacksDispatcher,
11 };
12 use bt_topshim_facade_protobuf::empty::Empty;
13 //use bt_topshim_facade_protobuf::facade::{
14 //    EventType, FetchEventsRequest, FetchEventsResponse, SetDiscoveryModeRequest,
15 //    SetDiscoveryModeResponse, ToggleStackRequest, ToggleStackResponse,
16 //};
17 use bt_topshim_facade_protobuf::facade_grpc::{create_gatt_service, GattService};
18 //use futures::sink::SinkExt;
19 use crate::btif::RawAddress;
20 use grpcio::*;
21 
22 use std::sync::{Arc, Mutex};
23 use tokio::runtime::Runtime;
24 use tokio::sync::mpsc;
25 use tokio::sync::Mutex as TokioMutex;
26 
27 struct GattCallbacks {}
28 
29 /// Main object for GATT facade service
30 #[derive(Clone)]
31 pub struct GattServiceImpl {
32     #[allow(dead_code)]
33     rt: Arc<Runtime>,
34     #[allow(dead_code)]
35     btif_intf: Arc<Mutex<BluetoothInterface>>,
36     #[allow(dead_code)]
37     gatt: Arc<Mutex<Gatt>>,
38     #[allow(dead_code)]
39     event_rx: Arc<TokioMutex<mpsc::Receiver<GattCallbacks>>>,
40     #[allow(dead_code)]
41     event_tx: mpsc::Sender<GattCallbacks>,
42 }
43 
44 impl GattServiceImpl {
45     /// Create a new instance of the root facade service
create(rt: Arc<Runtime>, btif_intf: Arc<Mutex<BluetoothInterface>>) -> grpcio::Service46     pub fn create(rt: Arc<Runtime>, btif_intf: Arc<Mutex<BluetoothInterface>>) -> grpcio::Service {
47         let (event_tx, rx) = mpsc::channel(10);
48         let btif_clone = btif_intf.clone();
49         let me = Self {
50             rt,
51             btif_intf,
52             gatt: Arc::new(Mutex::new(Gatt::new(&btif_clone.lock().unwrap()).unwrap())),
53             event_rx: Arc::new(TokioMutex::new(rx)),
54             event_tx,
55         };
56         me.gatt.lock().unwrap().initialize(
57             GattClientCallbacksDispatcher {
58                 dispatch: Box::new(move |cb| {
59                     println!("Received Gatt Client Callback: {:?}", cb);
60                 }),
61             },
62             GattServerCallbacksDispatcher {
63                 dispatch: Box::new(move |cb| {
64                     println!("Received Gatt Server Callback: {:?}", cb);
65                 }),
66             },
67             GattScannerCallbacksDispatcher {
68                 dispatch: Box::new(move |cb| {
69                     println!("received Gatt scanner callback: {:?}", cb);
70                 }),
71             },
72             GattScannerInbandCallbacksDispatcher {
73                 dispatch: Box::new(move |cb| {
74                     println!("received Gatt scanner inband callback: {:?}", cb);
75                 }),
76             },
77             GattAdvInbandCallbacksDispatcher {
78                 dispatch: Box::new(move |cb| {
79                     println!("received Gatt advertiser inband callback: {:?}", cb);
80                 }),
81             },
82             GattAdvCallbacksDispatcher {
83                 dispatch: Box::new(move |cb| {
84                     println!("received Gatt advertising callback: {:?}", cb);
85                 }),
86             },
87         );
88 
89         create_gatt_service(me)
90     }
91 
create_raw_address(&self) -> RawAddress92     fn create_raw_address(&self) -> RawAddress {
93         RawAddress { address: [0; 6] }
94     }
95 
create_advertise_parameters(&self) -> AdvertiseParameters96     fn create_advertise_parameters(&self) -> AdvertiseParameters {
97         AdvertiseParameters {
98             advertising_event_properties: 0,
99             min_interval: 0,
100             max_interval: 0,
101             channel_map: 0,
102             tx_power: 0,
103             primary_advertising_phy: 0,
104             secondary_advertising_phy: 0,
105             scan_request_notification_enable: 0,
106             own_address_type: 0,
107         }
108     }
109 
create_periodic_advertising_parameters(&self) -> PeriodicAdvertisingParameters110     fn create_periodic_advertising_parameters(&self) -> PeriodicAdvertisingParameters {
111         PeriodicAdvertisingParameters {
112             enable: false,
113             include_adi: false,
114             min_interval: 0,
115             max_interval: 0,
116             periodic_advertising_properties: 0,
117         }
118     }
119 
create_gatt_filter_param(&self) -> GattFilterParam120     fn create_gatt_filter_param(&self) -> GattFilterParam {
121         GattFilterParam {
122             feat_seln: 0,
123             list_logic_type: 0,
124             filt_logic_type: 0,
125             rssi_high_thres: 0,
126             rssi_low_thres: 0,
127             delay_mode: 0,
128             found_timeout: 0,
129             lost_timeout: 0,
130             found_timeout_count: 0,
131             num_of_tracking_entries: 0,
132         }
133     }
134 
create_uuid(&self) -> Uuid135     fn create_uuid(&self) -> Uuid {
136         Uuid::from([0; 16])
137     }
138 }
139 
140 impl GattService for GattServiceImpl {
141     //    fn fetch_events(
142     //        &mut self,
143     //        ctx: RpcContext<'_>,
144     //        _req: FetchEventsRequest,
145     //        mut sink: ServerStreamingSink<FetchEventsResponse>,
146     //    ) {
147     //        let rx = self.event_rx.clone();
148     //        ctx.spawn(async move {
149     //            while let Some(event) = rx.lock().await.recv().await {
150     //                match event {
151     //                    GattCallbacks::AdapterState(_state) => {
152     //                        let mut rsp = FetchEventsResponse::new();
153     //                        rsp.event_type = EventType::ADAPTER_STATE;
154     //                        rsp.data = "ON".to_string();
155     //                        sink.send((rsp, WriteFlags::default())).await.unwrap();
156     //                    }
157     //                    GattCallbacks::SspRequest(_, _, _, _, _) => {}
158     //                    GattCallbacks::LeRandCallback(random) => {
159     //                        let mut rsp = FetchEventsResponse::new();
160     //                        rsp.event_type = EventType::LE_RAND;
161     //                        rsp.data = random.to_string();
162     //                        sink.send((rsp, WriteFlags::default())).await.unwrap();
163     //                    }
164     //                    _ => (),
165     //                }
166     //            }
167     //        })
168     //    }
169 
170     // TODO(optedoblivion): Implement all send messages and returns
171     // Advertising
register_advertiser(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)172     fn register_advertiser(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
173         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
174         advertiser.register_advertiser();
175         ctx.spawn(async move {
176             sink.success(Empty::default()).await.unwrap();
177         })
178     }
179 
unregister_advertiser(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)180     fn unregister_advertiser(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
181         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
182         advertiser.unregister(0);
183         ctx.spawn(async move {
184             sink.success(Empty::default()).await.unwrap();
185         })
186     }
187 
get_own_address(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)188     fn get_own_address(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
189         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
190         advertiser.get_own_address(0);
191         ctx.spawn(async move {
192             sink.success(Empty::default()).await.unwrap();
193         })
194     }
195 
set_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)196     fn set_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
197         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
198         advertiser.set_parameters(0, self.create_advertise_parameters());
199         ctx.spawn(async move {
200             sink.success(Empty::default()).await.unwrap();
201         })
202     }
203 
set_data(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)204     fn set_data(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
205         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
206         advertiser.set_data(0, true, vec![0]);
207         ctx.spawn(async move {
208             sink.success(Empty::default()).await.unwrap();
209         })
210     }
211 
advertising_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)212     fn advertising_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
213         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
214         advertiser.enable(0, true, 0, 0);
215         ctx.spawn(async move {
216             sink.success(Empty::default()).await.unwrap();
217         })
218     }
219 
advertising_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)220     fn advertising_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
221         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
222         advertiser.enable(0, false, 0, 0);
223         ctx.spawn(async move {
224             sink.success(Empty::default()).await.unwrap();
225         })
226     }
227 
start_advertising(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)228     fn start_advertising(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
229         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
230         advertiser.start_advertising(0, self.create_advertise_parameters(), vec![0], vec![0], 0);
231         ctx.spawn(async move {
232             sink.success(Empty::default()).await.unwrap();
233         })
234     }
235 
start_advertising_set(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)236     fn start_advertising_set(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
237         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
238         advertiser.start_advertising_set(
239             0,
240             self.create_advertise_parameters(),
241             vec![0],
242             vec![0],
243             self.create_periodic_advertising_parameters(),
244             vec![0],
245             0,
246             0,
247         );
248         ctx.spawn(async move {
249             sink.success(Empty::default()).await.unwrap();
250         })
251     }
252 
set_periodic_advertising_parameters( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )253     fn set_periodic_advertising_parameters(
254         &mut self,
255         ctx: RpcContext<'_>,
256         _req: Empty,
257         sink: UnarySink<Empty>,
258     ) {
259         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
260         advertiser
261             .set_periodic_advertising_parameters(0, self.create_periodic_advertising_parameters());
262         ctx.spawn(async move {
263             sink.success(Empty::default()).await.unwrap();
264         })
265     }
266 
set_periodic_advertising_data( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )267     fn set_periodic_advertising_data(
268         &mut self,
269         ctx: RpcContext<'_>,
270         _req: Empty,
271         sink: UnarySink<Empty>,
272     ) {
273         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
274         advertiser.set_periodic_advertising_data(0, vec![0]);
275         ctx.spawn(async move {
276             sink.success(Empty::default()).await.unwrap();
277         })
278     }
279 
set_periodic_advertising_enable( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )280     fn set_periodic_advertising_enable(
281         &mut self,
282         ctx: RpcContext<'_>,
283         _req: Empty,
284         sink: UnarySink<Empty>,
285     ) {
286         let advertiser = &mut self.gatt.lock().unwrap().advertiser;
287         advertiser.set_periodic_advertising_enable(0, true, false);
288         ctx.spawn(async move {
289             sink.success(Empty::default()).await.unwrap();
290         })
291     }
292 
293     // Scanner
register_scanner(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)294     fn register_scanner(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
295         let scanner = &mut self.gatt.lock().unwrap().scanner;
296         scanner.register_scanner(self.create_uuid());
297         ctx.spawn(async move {
298             sink.success(Empty::default()).await.unwrap();
299         })
300     }
301 
unregister_scanner(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)302     fn unregister_scanner(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
303         let scanner = &mut self.gatt.lock().unwrap().scanner;
304         scanner.unregister(0);
305         ctx.spawn(async move {
306             sink.success(Empty::default()).await.unwrap();
307         })
308     }
309 
start_scan(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)310     fn start_scan(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
311         let scanner = &mut self.gatt.lock().unwrap().scanner;
312         scanner.start_scan();
313         ctx.spawn(async move {
314             sink.success(Empty::default()).await.unwrap();
315         })
316     }
317 
stop_scan(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)318     fn stop_scan(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
319         let scanner = &mut self.gatt.lock().unwrap().scanner;
320         scanner.stop_scan();
321         ctx.spawn(async move {
322             sink.success(Empty::default()).await.unwrap();
323         })
324     }
325 
scan_filter_setup(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)326     fn scan_filter_setup(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
327         let scanner = &mut self.gatt.lock().unwrap().scanner;
328         scanner.scan_filter_setup(0, 0, 0, self.create_gatt_filter_param());
329         ctx.spawn(async move {
330             sink.success(Empty::default()).await.unwrap();
331         })
332     }
333 
scan_filter_add(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)334     fn scan_filter_add(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
335         println!("Unimplemented!");
336         ctx.spawn(async move {
337             sink.success(Empty::default()).await.unwrap();
338         })
339     }
340 
scan_filter_clear(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)341     fn scan_filter_clear(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
342         let scanner = &mut self.gatt.lock().unwrap().scanner;
343         scanner.scan_filter_clear(0);
344         ctx.spawn(async move {
345             sink.success(Empty::default()).await.unwrap();
346         })
347     }
348 
scan_filter_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)349     fn scan_filter_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
350         let scanner = &mut self.gatt.lock().unwrap().scanner;
351         scanner.scan_filter_enable();
352         ctx.spawn(async move {
353             sink.success(Empty::default()).await.unwrap();
354         })
355     }
356 
scan_filter_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)357     fn scan_filter_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
358         let scanner = &mut self.gatt.lock().unwrap().scanner;
359         scanner.scan_filter_disable();
360         ctx.spawn(async move {
361             sink.success(Empty::default()).await.unwrap();
362         })
363     }
364 
set_scan_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)365     fn set_scan_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
366         let scanner = &mut self.gatt.lock().unwrap().scanner;
367         scanner.set_scan_parameters(0, 0, 0);
368         ctx.spawn(async move {
369             sink.success(Empty::default()).await.unwrap();
370         })
371     }
372 
batch_scan_config_storage( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )373     fn batch_scan_config_storage(
374         &mut self,
375         ctx: RpcContext<'_>,
376         _req: Empty,
377         sink: UnarySink<Empty>,
378     ) {
379         let scanner = &mut self.gatt.lock().unwrap().scanner;
380         scanner.batchscan_config_storage(0, 0, 0, 0);
381         ctx.spawn(async move {
382             sink.success(Empty::default()).await.unwrap();
383         })
384     }
385 
batch_scan_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)386     fn batch_scan_enable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
387         let scanner = &mut self.gatt.lock().unwrap().scanner;
388         scanner.batchscan_enable(0, 0, 0, 0, 0);
389         ctx.spawn(async move {
390             sink.success(Empty::default()).await.unwrap();
391         })
392     }
393 
batch_scan_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)394     fn batch_scan_disable(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
395         let scanner = &mut self.gatt.lock().unwrap().scanner;
396         scanner.batchscan_disable();
397         ctx.spawn(async move {
398             sink.success(Empty::default()).await.unwrap();
399         })
400     }
401 
batch_scan_read_reports( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )402     fn batch_scan_read_reports(
403         &mut self,
404         ctx: RpcContext<'_>,
405         _req: Empty,
406         sink: UnarySink<Empty>,
407     ) {
408         let scanner = &mut self.gatt.lock().unwrap().scanner;
409         scanner.batchscan_read_reports(0, 0);
410         ctx.spawn(async move {
411             sink.success(Empty::default()).await.unwrap();
412         })
413     }
414 
start_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)415     fn start_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
416         let scanner = &mut self.gatt.lock().unwrap().scanner;
417         scanner.start_sync(0, self.create_raw_address(), 0, 0);
418         ctx.spawn(async move {
419             sink.success(Empty::default()).await.unwrap();
420         })
421     }
422 
stop_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)423     fn stop_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
424         let scanner = &mut self.gatt.lock().unwrap().scanner;
425         scanner.stop_sync(0);
426         ctx.spawn(async move {
427             sink.success(Empty::default()).await.unwrap();
428         })
429     }
430 
cancel_create_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)431     fn cancel_create_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
432         let scanner = &mut self.gatt.lock().unwrap().scanner;
433         scanner.cancel_create_sync(0, self.create_raw_address());
434         ctx.spawn(async move {
435             sink.success(Empty::default()).await.unwrap();
436         })
437     }
438 
transfer_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)439     fn transfer_sync(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
440         let scanner = &mut self.gatt.lock().unwrap().scanner;
441         scanner.transfer_sync(self.create_raw_address(), 0, 0);
442         ctx.spawn(async move {
443             sink.success(Empty::default()).await.unwrap();
444         })
445     }
446 
transfer_set_info(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)447     fn transfer_set_info(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
448         let scanner = &mut self.gatt.lock().unwrap().scanner;
449         scanner.transfer_set_info(self.create_raw_address(), 0, 0);
450         ctx.spawn(async move {
451             sink.success(Empty::default()).await.unwrap();
452         })
453     }
454 
sync_tx_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)455     fn sync_tx_parameters(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
456         let scanner = &mut self.gatt.lock().unwrap().scanner;
457         scanner.sync_tx_parameters(self.create_raw_address(), 0, 0, 0);
458         ctx.spawn(async move {
459             sink.success(Empty::default()).await.unwrap();
460         })
461     }
462 
463     // GATT Client
register_client(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)464     fn register_client(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
465         let client = &mut self.gatt.lock().unwrap().client;
466         client.register_client(&self.create_uuid(), true);
467         ctx.spawn(async move {
468             sink.success(Empty::default()).await.unwrap();
469         })
470     }
471 
unregister_client(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)472     fn unregister_client(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
473         let client = &mut self.gatt.lock().unwrap().client;
474         client.unregister_client(0);
475         ctx.spawn(async move {
476             sink.success(Empty::default()).await.unwrap();
477         })
478     }
479 
client_connect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)480     fn client_connect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
481         let client = &mut self.gatt.lock().unwrap().client;
482         client.connect(0, &self.create_raw_address(), 0, true, 0, true, 0);
483         ctx.spawn(async move {
484             sink.success(Empty::default()).await.unwrap();
485         })
486     }
487 
client_disconnect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)488     fn client_disconnect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
489         let client = &mut self.gatt.lock().unwrap().client;
490         client.disconnect(0, &self.create_raw_address(), 0);
491         ctx.spawn(async move {
492             sink.success(Empty::default()).await.unwrap();
493         })
494     }
495 
refresh(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)496     fn refresh(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
497         let client = &mut self.gatt.lock().unwrap().client;
498         client.refresh(0, &self.create_raw_address());
499         ctx.spawn(async move {
500             sink.success(Empty::default()).await.unwrap();
501         })
502     }
503 
search_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)504     fn search_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
505         let client = &mut self.gatt.lock().unwrap().client;
506         client.search_service(0, None);
507         ctx.spawn(async move {
508             sink.success(Empty::default()).await.unwrap();
509         })
510     }
511 
btif_gattc_discover_service_by_uuid( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )512     fn btif_gattc_discover_service_by_uuid(
513         &mut self,
514         ctx: RpcContext<'_>,
515         _req: Empty,
516         sink: UnarySink<Empty>,
517     ) {
518         let client = &mut self.gatt.lock().unwrap().client;
519         client.btif_gattc_discover_service_by_uuid(0, &self.create_uuid());
520         ctx.spawn(async move {
521             sink.success(Empty::default()).await.unwrap();
522         })
523     }
524 
read_characteristic(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)525     fn read_characteristic(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
526         let client = &mut self.gatt.lock().unwrap().client;
527         client.read_characteristic(0, 0, 0);
528         ctx.spawn(async move {
529             sink.success(Empty::default()).await.unwrap();
530         })
531     }
532 
read_using_characteristic_uuid( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )533     fn read_using_characteristic_uuid(
534         &mut self,
535         ctx: RpcContext<'_>,
536         _req: Empty,
537         sink: UnarySink<Empty>,
538     ) {
539         let client = &mut self.gatt.lock().unwrap().client;
540         client.read_using_characteristic_uuid(0, &self.create_uuid(), 0, 0, 0);
541         ctx.spawn(async move {
542             sink.success(Empty::default()).await.unwrap();
543         })
544     }
545 
write_characteristic(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)546     fn write_characteristic(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
547         let client = &mut self.gatt.lock().unwrap().client;
548         client.write_characteristic(0, 0, 0, 0, &[0]);
549         ctx.spawn(async move {
550             sink.success(Empty::default()).await.unwrap();
551         })
552     }
553 
read_descriptor(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)554     fn read_descriptor(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
555         let client = &mut self.gatt.lock().unwrap().client;
556         client.read_descriptor(0, 0, 0);
557         ctx.spawn(async move {
558             sink.success(Empty::default()).await.unwrap();
559         })
560     }
561 
write_descriptor(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)562     fn write_descriptor(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
563         let client = &mut self.gatt.lock().unwrap().client;
564         client.write_descriptor(0, 0, 0, &[0]);
565         ctx.spawn(async move {
566             sink.success(Empty::default()).await.unwrap();
567         })
568     }
569 
execute_write(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)570     fn execute_write(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
571         let client = &mut self.gatt.lock().unwrap().client;
572         client.execute_write(0, 0);
573         ctx.spawn(async move {
574             sink.success(Empty::default()).await.unwrap();
575         })
576     }
577 
register_for_notification( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )578     fn register_for_notification(
579         &mut self,
580         ctx: RpcContext<'_>,
581         _req: Empty,
582         sink: UnarySink<Empty>,
583     ) {
584         let client = &mut self.gatt.lock().unwrap().client;
585         client.register_for_notification(0, &self.create_raw_address(), 0);
586         ctx.spawn(async move {
587             sink.success(Empty::default()).await.unwrap();
588         })
589     }
590 
deregister_for_notification( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )591     fn deregister_for_notification(
592         &mut self,
593         ctx: RpcContext<'_>,
594         _req: Empty,
595         sink: UnarySink<Empty>,
596     ) {
597         let client = &mut self.gatt.lock().unwrap().client;
598         client.deregister_for_notification(0, &self.create_raw_address(), 0);
599         ctx.spawn(async move {
600             sink.success(Empty::default()).await.unwrap();
601         })
602     }
603 
read_remote_rssi(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)604     fn read_remote_rssi(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
605         let client = &mut self.gatt.lock().unwrap().client;
606         client.read_remote_rssi(0, &self.create_raw_address());
607         ctx.spawn(async move {
608             sink.success(Empty::default()).await.unwrap();
609         })
610     }
611 
get_device_type(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)612     fn get_device_type(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
613         let client = &mut self.gatt.lock().unwrap().client;
614         client.get_device_type(&self.create_raw_address());
615         ctx.spawn(async move {
616             sink.success(Empty::default()).await.unwrap();
617         })
618     }
619 
configure_mtu(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)620     fn configure_mtu(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
621         let client = &mut self.gatt.lock().unwrap().client;
622         client.configure_mtu(0, 0);
623         ctx.spawn(async move {
624             sink.success(Empty::default()).await.unwrap();
625         })
626     }
627 
conn_parameter_update(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)628     fn conn_parameter_update(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
629         let client = &mut self.gatt.lock().unwrap().client;
630         client.conn_parameter_update(&self.create_raw_address(), 0, 0, 0, 0, 0, 0);
631         ctx.spawn(async move {
632             sink.success(Empty::default()).await.unwrap();
633         })
634     }
635 
client_set_preferred_phy( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )636     fn client_set_preferred_phy(
637         &mut self,
638         ctx: RpcContext<'_>,
639         _req: Empty,
640         sink: UnarySink<Empty>,
641     ) {
642         let client = &mut self.gatt.lock().unwrap().client;
643         client.set_preferred_phy(&self.create_raw_address(), 0, 0, 0);
644         ctx.spawn(async move {
645             sink.success(Empty::default()).await.unwrap();
646         })
647     }
648 
client_read_phy(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)649     fn client_read_phy(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
650         let client = &mut self.gatt.lock().unwrap().client;
651         client.read_phy(0, &self.create_raw_address());
652         ctx.spawn(async move {
653             sink.success(Empty::default()).await.unwrap();
654         })
655     }
656 
test_command(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)657     fn test_command(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
658         println!("Not implemented!");
659         ctx.spawn(async move {
660             sink.success(Empty::default()).await.unwrap();
661         })
662     }
663 
get_gatt_db(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)664     fn get_gatt_db(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
665         let client = &mut self.gatt.lock().unwrap().client;
666         client.get_gatt_db(0);
667         ctx.spawn(async move {
668             sink.success(Empty::default()).await.unwrap();
669         })
670     }
671 
register_server(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)672     fn register_server(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
673         ctx.spawn(async move {
674             sink.success(Empty::default()).await.unwrap();
675         })
676     }
677 
unregister_server(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)678     fn unregister_server(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
679         ctx.spawn(async move {
680             sink.success(Empty::default()).await.unwrap();
681         })
682     }
683 
server_connect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)684     fn server_connect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
685         ctx.spawn(async move {
686             sink.success(Empty::default()).await.unwrap();
687         })
688     }
689 
server_disconnect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)690     fn server_disconnect(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
691         ctx.spawn(async move {
692             sink.success(Empty::default()).await.unwrap();
693         })
694     }
695 
add_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)696     fn add_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
697         ctx.spawn(async move {
698             sink.success(Empty::default()).await.unwrap();
699         })
700     }
701 
stop_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)702     fn stop_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
703         ctx.spawn(async move {
704             sink.success(Empty::default()).await.unwrap();
705         })
706     }
707 
delete_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)708     fn delete_service(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
709         ctx.spawn(async move {
710             sink.success(Empty::default()).await.unwrap();
711         })
712     }
713 
send_indication(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)714     fn send_indication(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
715         ctx.spawn(async move {
716             sink.success(Empty::default()).await.unwrap();
717         })
718     }
719 
send_response(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)720     fn send_response(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
721         ctx.spawn(async move {
722             sink.success(Empty::default()).await.unwrap();
723         })
724     }
725 
server_set_preferred_phy( &mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>, )726     fn server_set_preferred_phy(
727         &mut self,
728         ctx: RpcContext<'_>,
729         _req: Empty,
730         sink: UnarySink<Empty>,
731     ) {
732         ctx.spawn(async move {
733             sink.success(Empty::default()).await.unwrap();
734         })
735     }
736 
server_read_phy(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>)737     fn server_read_phy(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {
738         ctx.spawn(async move {
739             sink.success(Empty::default()).await.unwrap();
740         })
741     }
742 }
743