@@ -16,62 +16,67 @@ const OPCODE_READ_REQUEST: u8 = 0x0A;
1616const OPCODE_WRITE_REQUEST : u8 = 0x12 ;
1717const OPCODE_HANDLE_VALUE_NTF : u8 = 0x1B ;
1818const OPCODE_WRITE_RESPONSE : u8 = 0x13 ;
19+ const RESPONSE_TIMEOUT : u64 = 5000 ;
1920
2021#[ repr( u16 ) ]
2122#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
2223pub enum ATTHandles {
23- Transparency = 0x18 ,
24- LoudSoundReduction = 0x1B ,
25- HearingAid = 0x2A ,
24+ AirPodsTransparency = 0x18 ,
25+ AirPodsLoudSoundReduction = 0x1B ,
26+ AirPodsHearingAid = 0x2A ,
27+ NothingEverything = 0x8002 ,
28+ NothingEverythingRead = 0x8005 // for some reason, and not the same as the write handle
2629}
2730
2831#[ repr( u16 ) ]
2932#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
3033pub enum ATTCCCDHandles {
31- Transparency = ATTHandles :: Transparency as u16 + 1 ,
32- LoudSoundReduction = ATTHandles :: LoudSoundReduction as u16 + 1 ,
33- HearingAid = ATTHandles :: HearingAid as u16 + 1 ,
34+ Transparency = ATTHandles :: AirPodsTransparency as u16 + 1 ,
35+ LoudSoundReduction = ATTHandles :: AirPodsLoudSoundReduction as u16 + 1 ,
36+ HearingAid = ATTHandles :: AirPodsHearingAid as u16 + 1 ,
3437}
3538
3639impl From < ATTHandles > for ATTCCCDHandles {
3740 fn from ( handle : ATTHandles ) -> Self {
3841 match handle {
39- ATTHandles :: Transparency => ATTCCCDHandles :: Transparency ,
40- ATTHandles :: LoudSoundReduction => ATTCCCDHandles :: LoudSoundReduction ,
41- ATTHandles :: HearingAid => ATTCCCDHandles :: HearingAid ,
42+ ATTHandles :: AirPodsTransparency => ATTCCCDHandles :: Transparency ,
43+ ATTHandles :: AirPodsLoudSoundReduction => ATTCCCDHandles :: LoudSoundReduction ,
44+ ATTHandles :: AirPodsHearingAid => ATTCCCDHandles :: HearingAid ,
45+ ATTHandles :: NothingEverything => panic ! ( "No CCCD for NothingEverything handle" ) , // we don't request it
46+ ATTHandles :: NothingEverythingRead => panic ! ( "No CCD for NothingEverythingRead handle" ) // it sends notifications without CCCD
4247 }
4348 }
4449}
4550
4651struct ATTManagerState {
4752 sender : Option < mpsc:: Sender < Vec < u8 > > > ,
4853 listeners : HashMap < u16 , Vec < mpsc:: UnboundedSender < Vec < u8 > > > > ,
49- responses : mpsc:: UnboundedReceiver < Vec < u8 > > ,
50- response_tx : mpsc:: UnboundedSender < Vec < u8 > > ,
5154}
5255
5356impl ATTManagerState {
5457 fn new ( ) -> Self {
55- let ( tx, rx) = mpsc:: unbounded_channel ( ) ;
5658 ATTManagerState {
5759 sender : None ,
58- listeners : HashMap :: new ( ) ,
59- responses : rx,
60- response_tx : tx,
60+ listeners : HashMap :: new ( )
6161 }
6262 }
6363}
6464
6565#[ derive( Clone ) ]
6666pub struct ATTManager {
6767 state : Arc < Mutex < ATTManagerState > > ,
68+ response_rx : Arc < Mutex < mpsc:: UnboundedReceiver < Vec < u8 > > > > ,
69+ response_tx : mpsc:: UnboundedSender < Vec < u8 > > ,
6870 tasks : Arc < Mutex < JoinSet < ( ) > > > ,
6971}
7072
7173impl ATTManager {
7274 pub fn new ( ) -> Self {
75+ let ( tx, rx) = mpsc:: unbounded_channel ( ) ;
7376 ATTManager {
7477 state : Arc :: new ( Mutex :: new ( ATTManagerState :: new ( ) ) ) ,
78+ response_rx : Arc :: new ( Mutex :: new ( rx) ) ,
79+ response_tx : tx,
7580 tasks : Arc :: new ( Mutex :: new ( JoinSet :: new ( ) ) ) ,
7681 }
7782 }
@@ -184,11 +189,18 @@ impl ATTManager {
184189 }
185190
186191 async fn read_response ( & self ) -> Result < Vec < u8 > > {
187- let mut state = self . state . lock ( ) . await ;
188- match tokio:: time:: timeout ( Duration :: from_millis ( 2000 ) , state. responses . recv ( ) ) . await {
192+ debug ! ( "Waiting for response..." ) ;
193+ let mut rx = self . response_rx . lock ( ) . await ;
194+ match tokio:: time:: timeout ( Duration :: from_millis ( RESPONSE_TIMEOUT ) , rx. recv ( ) ) . await {
189195 Ok ( Some ( resp) ) => Ok ( resp) ,
190- Ok ( None ) => Err ( Error :: from ( std:: io:: Error :: new ( std:: io:: ErrorKind :: UnexpectedEof , "Response channel closed" ) ) ) ,
191- Err ( _) => Err ( Error :: from ( std:: io:: Error :: new ( std:: io:: ErrorKind :: TimedOut , "Response timeout" ) ) ) ,
196+ Ok ( None ) => Err ( Error :: from ( std:: io:: Error :: new (
197+ std:: io:: ErrorKind :: UnexpectedEof ,
198+ "Response channel closed"
199+ ) ) ) ,
200+ Err ( _) => Err ( Error :: from ( std:: io:: Error :: new (
201+ std:: io:: ErrorKind :: TimedOut ,
202+ "Response timeout"
203+ ) ) ) ,
192204 }
193205 }
194206}
@@ -217,10 +229,11 @@ async fn recv_thread(manager: ATTManager, sp: Arc<SeqPacket>) {
217229 let _ = listener. send ( value. clone ( ) ) ;
218230 }
219231 }
232+ } else if data[ 0 ] == OPCODE_WRITE_RESPONSE {
233+ let _ = manager. response_tx . send ( vec ! [ ] ) ;
220234 } else {
221235 // Response
222- let state = manager. state . lock ( ) . await ;
223- let _ = state. response_tx . send ( data[ 1 ..] . to_vec ( ) ) ;
236+ let _ = manager. response_tx . send ( data[ 1 ..] . to_vec ( ) ) ;
224237 }
225238 }
226239 Err ( e) => {
0 commit comments