@@ -118,7 +118,17 @@ def get_device(self) -> BLEDevice:
118118
119119 async def connect (self , device : BLEDevice | None = None , max_attempts : int = MAX_CONNECT_ATTEMPTS ) -> None :
120120 """Connect to the Tesla BLE device."""
121- self .client = await establish_connection (BleakClient , self .device , self .vin , max_attempts = max_attempts , ble_device_callback = self .get_device )
121+ if device :
122+ self .device = device
123+ if not self .device :
124+ raise ValueError (f"Device { self .ble_name } not found" )
125+ self .client = await establish_connection (
126+ BleakClient ,
127+ self .device ,
128+ self .vin ,
129+ max_attempts = max_attempts ,
130+ ble_device_callback = self .get_device
131+ )
122132 await self .client .start_notify (READ_UUID , self ._on_notify )
123133
124134 async def disconnect (self ) -> bool :
@@ -140,34 +150,43 @@ async def _on_notify(self,sender: BleakGATTCharacteristic,data : bytearray) -> N
140150 self ._recv += data
141151 else :
142152 self ._recv_len = int .from_bytes (data [:2 ], 'big' )
153+ if self ._recv_len > 1024 :
154+ LOGGER .error ("Parsed very large message length" )
155+ self ._recv = bytearray ()
156+ self ._recv_len = 0
157+ return
143158 self ._recv = data [2 :]
144- LOGGER .debug (f"Received { len (self ._recv )} of { self ._recv_len } bytes" )
145- while len (self ._recv ) > self ._recv_len :
146- LOGGER .warn (f"Received more data than expected: { len (self ._recv )} > { self ._recv_len } " )
147- await self ._on_message (bytes (self ._recv [:self ._recv_len ]))
148- self ._recv_len = int .from_bytes (self ._recv [self ._recv_len :self ._recv_len + 2 ], 'big' )
149- self ._recv = self ._recv [self ._recv_len + 2 :]
150- continue
151- if len (self ._recv ) == self ._recv_len :
152- await self ._on_message (bytes (self ._recv ))
153- self ._recv = bytearray ()
154- self ._recv_len = 0
155-
156- async def _on_message (self , data :bytes ) -> None :
159+ #while len(self._recv) > self._recv_len:
160+ #
161+ # # Maybe this needs to trigger a reset
162+ # await self._on_message(bytes(self._recv[:self._recv_len]))
163+ # self._recv_len = int.from_bytes(self._recv[self._recv_len:self._recv_len+2], 'big')
164+ # self._recv = self._recv[self._recv_len+2:]
165+ # continue
166+ if len (self ._recv ) >= self ._recv_len :
167+ if len (self ._recv ) > self ._recv_len :
168+ LOGGER .debug (f"Received more data than expected: { len (self ._recv )} > { self ._recv_len } " )
169+ try :
170+ msg = RoutableMessage .FromString (bytes (self ._recv [:self ._recv_len ]))
171+ await self ._on_message (msg )
172+ self ._recv = bytearray ()
173+ self ._recv_len = 0
174+ except DecodeError :
175+ # Attempt parsing the whole payload
176+ msg = RoutableMessage .FromString (bytes (self ._recv ))
177+ LOGGER .warn (f"Parsed more data than length: { len (self ._recv )} > { self ._recv_len } " )
178+ await self ._on_message (msg )
179+ self ._recv = bytearray ()
180+ self ._recv_len = 0
181+
182+ async def _on_message (self , msg : RoutableMessage ) -> None :
157183 """Receive messages from the Tesla BLE data."""
158- try :
159- msg = RoutableMessage .FromString (data )
160- except DecodeError as e :
161- LOGGER .error (f"Error parsing message: { e } " )
162- self ._recv = bytearray ()
163- self ._recv_len = 0
164- return
165184
166185 if (msg .to_destination .routing_address != self ._from_destination ):
167186 # Ignore ephemeral key broadcasts
168187 return
169188
170- LOGGER .info (f"Received response: { msg } " )
189+ LOGGER .debug (f"Received response: { msg } " )
171190 await self ._queues [msg .from_destination .domain ].put (msg )
172191
173192 async def _send (self , msg : RoutableMessage , requires : str ) -> RoutableMessage :
@@ -184,7 +203,7 @@ async def _send(self, msg: RoutableMessage, requires: str) -> RoutableMessage:
184203 await self .client .write_gatt_char (WRITE_UUID , payload , True )
185204
186205 # Process the response
187- async with asyncio .timeout (10 ):
206+ async with asyncio .timeout (2 ):
188207 while True :
189208 resp = await self ._queues [domain ].get ()
190209 LOGGER .debug (f"Received message { resp } " )
@@ -217,7 +236,7 @@ async def pair(self, role: Role = Role.ROLE_OWNER, form: KeyFormFactor = KeyForm
217236 ),
218237 protobuf_message_as_bytes = request .SerializeToString (),
219238 )
220- resp = await self ._send (msg )
239+ resp = await self ._send (msg , "protobuf_message_as_bytes" )
221240 respMsg = FromVCSECMessage .FromString (resp .protobuf_message_as_bytes )
222241 if (respMsg .commandStatus .whitelistOperationStatus .whitelistOperationInformation ):
223242 if (respMsg .commandStatus .whitelistOperationStatus .whitelistOperationInformation < len (WHITELIST_OPERATION_STATUS )):
0 commit comments