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