@@ -5,7 +5,7 @@ use futures::StreamExt;
55use std:: time:: Duration ;
66use uuid:: Uuid ;
77
8- use bluest:: Adapter ;
8+ use bluest:: { Adapter , DeviceId } ;
99
1010use 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