Skip to content

Commit 0df090b

Browse files
committed
fix: Fix up bluest usage for CoreBluetooth.
1 parent 4ad0dfc commit 0df090b

File tree

1 file changed

+57
-63
lines changed

1 file changed

+57
-63
lines changed

src-tauri/src/transport/gatt.rs

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use futures::StreamExt;
55
use std::time::Duration;
66
use uuid::Uuid;
77

8-
use bluest::Adapter;
8+
use bluest::{Adapter, DeviceId};
99

1010
use tauri::{command, AppHandle, State};
1111

@@ -22,67 +22,60 @@ pub async fn gatt_connect(
2222

2323
let adapter = Adapter::default().await.ok_or(())?;
2424

25-
let mut devices: Vec<_> = adapter
26-
.discover_devices(&[uuid])
27-
.await
28-
.expect("GET DEVICES!")
29-
.take_until(async_std::task::sleep(Duration::from_secs(2)))
30-
.filter_map(|d| ready(d.ok()))
31-
.filter(|d| ready(d.name().unwrap_or("Unknown".to_string()).eq(&id)))
32-
.collect()
33-
.await;
25+
adapter.wait_available().await.map_err(|_| ())?;
26+
27+
let device_id: DeviceId = serde_json::from_str(&id).unwrap();
28+
let mut d = adapter.open_device(&device_id).await.map_err(|_| ())?;
29+
30+
if !d.is_connected().await {
31+
adapter.connect_device(&d).await.map_err(|_| ())?;
32+
}
3433

35-
match devices.get(0).cloned() {
36-
Some(d) => {
37-
if !d.is_connected().await {
38-
adapter.connect_device(&d).await.map_err(|_| ())?;
39-
}
40-
41-
let service = d
42-
.discover_services_with_uuid(uuid)
43-
.await
44-
.map_err(|e| ())?
45-
.get(0)
46-
.cloned();
47-
match service {
48-
Some(s) => {
49-
let char_uuid = Uuid::parse_str(RPC_CHRC_UUID).expect("Valid UUID");
50-
let char = s
51-
.discover_characteristics_with_uuid(char_uuid)
52-
.await
53-
.map_err(|_| ())?
54-
.get(0)
55-
.cloned();
56-
57-
match char {
58-
Some(c) => {
59-
let c2 = c.clone();
60-
tauri::async_runtime::spawn(async move {
61-
if let Ok(mut n) = c.notify().await {
62-
while let Some(Ok(vn)) = n.next().await {
63-
use tauri::Manager;
64-
65-
app_handle.emit("connection_data", vn.clone());
66-
}
67-
}
68-
});
69-
70-
let (send, mut recv) = channel(5);
71-
*state.conn.lock().await = Some(Box::new(send));
72-
tauri::async_runtime::spawn(async move {
73-
while let Some(data) = recv.next().await {
74-
c2.write(&data).await.expect("Write uneventfully");
75-
}
76-
});
77-
Ok(true)
78-
}
79-
_ => Err(()),
34+
let service = d
35+
.discover_services_with_uuid(uuid)
36+
.await
37+
.map_err(|e| ())?
38+
.get(0)
39+
.cloned();
40+
41+
if let Some(s) = service {
42+
let char_uuid = Uuid::parse_str(RPC_CHRC_UUID).expect("Valid UUID");
43+
let char = s
44+
.discover_characteristics_with_uuid(char_uuid)
45+
.await
46+
.map_err(|_| ())?
47+
.get(0)
48+
.cloned();
49+
50+
if let Some(c) = char {
51+
let c2 = c.clone();
52+
tauri::async_runtime::spawn(async move {
53+
if let Ok(mut n) = c2.notify().await {
54+
// Need to keep adapter from being dropped while active/connected
55+
let a = adapter;
56+
57+
while let Some(Ok(vn)) = n.next().await {
58+
use tauri::Manager;
59+
60+
app_handle.emit("connection_data", vn.clone());
8061
}
8162
}
82-
_ => Err(()),
83-
}
63+
});
64+
65+
let (send, mut recv) = channel(5);
66+
*state.conn.lock().await = Some(Box::new(send));
67+
tauri::async_runtime::spawn(async move {
68+
while let Some(data) = recv.next().await {
69+
c.write(&data).await.expect("Write uneventfully");
70+
}
71+
});
72+
73+
Ok(true)
74+
} else {
75+
Err(())
8476
}
85-
_ => Err(()),
77+
} else {
78+
Err(())
8679
}
8780
}
8881

@@ -92,6 +85,8 @@ pub async fn gatt_list_devices() -> Result<Vec<super::commands::AvailableDevice>
9285

9386
let adapter = Adapter::default().await.ok_or(())?;
9487

88+
adapter.wait_available().await.map_err(|_| ())?;
89+
9590
let devices = adapter
9691
.discover_devices(&[uuid])
9792
.await
@@ -104,11 +99,10 @@ pub async fn gatt_list_devices() -> Result<Vec<super::commands::AvailableDevice>
10499
.into_iter()
105100
.filter_map(|d| {
106101
d.map(|device| {
107-
let name = device.name().unwrap_or("Unknown".to_string());
108-
super::commands::AvailableDevice {
109-
label: name.clone(),
110-
id: name,
111-
}
102+
let label = device.name().unwrap_or("Unknown".to_string());
103+
let id = serde_json::to_string(&device.id()).unwrap();
104+
105+
super::commands::AvailableDevice { label, id }
112106
})
113107
.ok()
114108
})

0 commit comments

Comments
 (0)