()
| 33 | |
| 34 | impl Adapter { |
| 35 | pub(crate) async fn new() -> Result<Self> { |
| 36 | let (sender, mut receiver) = mpsc::channel(256); |
| 37 | let adapter_sender = run_corebluetooth_thread(sender)?; |
| 38 | // Since init currently blocked until the state update, we know the |
| 39 | // receiver is dropped after that. We can pick it up here and make it |
| 40 | // part of our event loop to update our peripherals. |
| 41 | debug!("Waiting on adapter connect"); |
| 42 | if !matches!( |
| 43 | receiver.next().await, |
| 44 | Some(CoreBluetoothEvent::DidUpdateState { state: _ }) |
| 45 | ) { |
| 46 | return Err(Error::Other( |
| 47 | "Adapter failed to connect.".to_string().into(), |
| 48 | )); |
| 49 | } |
| 50 | debug!("Adapter connected"); |
| 51 | let manager = Arc::new(AdapterManager::default()); |
| 52 | |
| 53 | let manager_clone = manager.clone(); |
| 54 | let adapter_sender_clone = adapter_sender.clone(); |
| 55 | task::spawn(async move { |
| 56 | while let Some(msg) = receiver.next().await { |
| 57 | match msg { |
| 58 | CoreBluetoothEvent::DeviceDiscovered { |
| 59 | uuid, |
| 60 | local_name, |
| 61 | advertisement_name, |
| 62 | event_receiver, |
| 63 | } => { |
| 64 | manager_clone.add_peripheral(Peripheral::new( |
| 65 | uuid, |
| 66 | local_name, |
| 67 | advertisement_name, |
| 68 | Arc::downgrade(&manager_clone), |
| 69 | event_receiver, |
| 70 | adapter_sender_clone.clone(), |
| 71 | )); |
| 72 | manager_clone.emit(CentralEvent::DeviceDiscovered(uuid.into())); |
| 73 | } |
| 74 | CoreBluetoothEvent::DeviceUpdated { |
| 75 | uuid, |
| 76 | local_name, |
| 77 | advertisement_name, |
| 78 | } => { |
| 79 | let id = uuid.into(); |
| 80 | if let Some(entry) = manager_clone.peripheral_mut(&id) { |
| 81 | entry.value().update_name(local_name, advertisement_name); |
| 82 | manager_clone.emit(CentralEvent::DeviceUpdated(id)); |
| 83 | } |
| 84 | } |
| 85 | CoreBluetoothEvent::DeviceDisconnected { uuid } => { |
| 86 | manager_clone.emit(CentralEvent::DeviceDisconnected(uuid.into())); |
| 87 | } |
| 88 | CoreBluetoothEvent::DidUpdateState { state } => { |
| 89 | let central_state = get_central_state(state); |
| 90 | manager_clone.emit(CentralEvent::StateUpdate(central_state)); |
| 91 | } |
| 92 | } |
nothing calls this directly
no test coverage detected