diff --git a/framework/subsystems/ogpsd/ubx.py b/framework/subsystems/ogpsd/ubx.py
index 0dbad8e..1ab1dff 100644
|
a
|
b
|
class UBXDevice( GPSDevice ): |
| 320 | 320 | |
| 321 | 321 | def parse( self, data ): |
| 322 | 322 | self.buffer += data |
| | 323 | buffer_offset = 0 |
| 323 | 324 | # Minimum packet length is 8 |
| 324 | | while len(self.buffer) >= 8: |
| | 325 | while len(self.buffer) >= buffer_offset + 8: |
| 325 | 326 | # Find the beginning of a UBX message |
| 326 | | start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ) ) |
| 327 | | if start > 0 or (start == -1 and len(self.buffer) > 1): |
| | 327 | start = self.buffer.find( chr( SYNC1 ) + chr( SYNC2 ), buffer_offset ) |
| | 328 | |
| | 329 | if buffer_offset == 0 and start != 0: |
| 328 | 330 | logger.debug( "Discarded data not UBX %s" % repr(self.buffer[:start]) ) |
| 329 | 331 | self.buffer = self.buffer[start:] |
| 330 | 332 | continue |
| 331 | 333 | |
| 332 | | (cl, id, length) = struct.unpack("<xxBBH", self.buffer[:6]) |
| 333 | | if len(self.buffer) < length + 8: |
| | 334 | if start == -1 or start + 8 > len(self.buffer): |
| 334 | 335 | return |
| 335 | 336 | |
| 336 | | if self.checksum(self.buffer[2:length+6]) != struct.unpack("<BB", self.buffer[length+6:length+8]): |
| 337 | | logger.warning( "UBX packed class 0x%x, id 0x%x, length %i failed checksum" % (cl, id, length) ) |
| 338 | | self.buffer = self.buffer[2:] |
| | 337 | (cl, id, length) = struct.unpack("<BBH", self.buffer[start+2:start+6]) |
| | 338 | if len(self.buffer) < start + length + 8: |
| | 339 | buffer_offset = start + 2 |
| | 340 | continue |
| | 341 | |
| | 342 | if self.checksum(self.buffer[start+2:start+length+6]) != struct.unpack("<BB", self.buffer[start+length+6:start+length+8]): |
| | 343 | buffer_offset = start + 2 |
| | 344 | continue |
| | 345 | |
| | 346 | if start != 0: |
| | 347 | logger.warning(" UBX packet ignored %s" % repr(self.buffer[:start]) ) |
| | 348 | self.buffer = self.buffer[start:] |
| | 349 | buffer_offset = 0 |
| 339 | 350 | continue |
| 340 | 351 | |
| 341 | | # Now we got a valid UBX packet, decode it |
| 342 | | self.decode(cl, id, length, self.buffer[6:length+6]) |
| | 352 | self.decode(cl, id, length, self.buffer[start+6:start+length+6]) |
| 343 | 353 | |
| 344 | 354 | # Discard packet |
| 345 | | self.buffer = self.buffer[length+8:] |
| | 355 | self.buffer = self.buffer[start+length+8:] |
| | 356 | buffer_offset = 0 |
| 346 | 357 | |
| 347 | 358 | def send( self, clid, length, payload ): |
| 348 | 359 | logger.debug( "Sending UBX packet of type %s: %s" % ( clid, payload ) ) |