MCPcopy Create free account
hub / github.com/deviceplug/btleplug / new

Method new

src/corebluetooth/adapter.rs:35–100  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

33
34impl 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 }

Callers

nothing calls this directly

Calls 8

run_corebluetooth_threadFunction · 0.85
nextMethod · 0.80
emitMethod · 0.80
peripheral_mutMethod · 0.80
update_nameMethod · 0.80
valueMethod · 0.80
get_central_stateFunction · 0.70
add_peripheralMethod · 0.45

Tested by

no test coverage detected