@@ -9,7 +9,7 @@ use crate::uuid::Uuid;
99use crate :: write_type:: WriteType ;
1010use crate :: { Error , get_adapter} ;
1111use btleplug:: api:: { Central , CentralEvent , Peripheral as _, ScanFilter } ;
12- use std:: sync:: Arc ;
12+ use std:: sync:: { Arc , Mutex } ;
1313use std:: time:: Duration ;
1414use tokio:: time:: timeout;
1515use tokio_stream:: StreamExt ;
@@ -28,15 +28,26 @@ pub struct Peripheral {
2828 id : Arc < PeripheralId > ,
2929 callbacks : Arc < Box < dyn PeripheralCallbacks > > ,
3030 cancellation : CancellationHandle ,
31+ cached_peripheral : Arc < Mutex < Option < btleplug:: platform:: Peripheral > > > ,
3132}
3233
3334impl Peripheral {
3435 async fn get_platform ( & self ) -> Result < btleplug:: platform:: Peripheral > {
35- get_adapter ( )
36- . await
37- . peripheral ( & self . id . platform )
38- . await
39- . map_err ( Into :: into)
36+ let platform = self . cached_peripheral . lock ( ) . unwrap ( ) . clone ( ) ;
37+ if platform. is_none ( ) {
38+ match get_adapter ( )
39+ . await
40+ . peripheral ( & self . id . platform )
41+ . await
42+ . map_err ( Into :: into)
43+ {
44+ Ok ( peripheral) => * self . cached_peripheral . lock ( ) . unwrap ( ) = Some ( peripheral) ,
45+ Err ( err) => return Err ( err) ,
46+ }
47+ return Ok ( self . cached_peripheral . lock ( ) . unwrap ( ) . clone ( ) . unwrap ( ) ) ;
48+ }
49+
50+ Ok ( platform. unwrap ( ) )
4051 }
4152
4253 async fn platform_connect (
@@ -95,7 +106,9 @@ impl Peripheral {
95106 id : id. clone ( ) ,
96107 callbacks : callbacks. clone ( ) ,
97108 cancellation : CancellationHandle :: from_token ( token. clone ( ) ) ,
109+ cached_peripheral : Arc :: new ( Mutex :: new ( None ) ) ,
98110 } ;
111+ let cached_peripheral = peripheral. cached_peripheral . clone ( ) ;
99112
100113 std:: thread:: spawn ( || {
101114 let rt = tokio:: runtime:: Builder :: new_current_thread ( )
@@ -115,7 +128,10 @@ impl Peripheral {
115128 CentralEvent :: DeviceConnected ( connected) =>
116129 if connected == id. platform { callbacks. connected( ) }
117130 CentralEvent :: DeviceDisconnected ( disconnected) =>
118- if disconnected == id. platform { callbacks. disconnected( ) }
131+ if disconnected == id. platform {
132+ * cached_peripheral. lock( ) . unwrap( ) = None ;
133+ callbacks. disconnected( )
134+ }
119135 _ => { }
120136 } ,
121137 }
0 commit comments