import struct UBX_SYNC_WORD = b'\xb5\x62' def checksum(data: bytes) -> bytes: ck_a = 0 ck_b = 0 for i in range(len(data)): ck_a = (ck_a + data[i]) & 0xFF ck_b = (ck_b + ck_a) & 0xFF return struct.pack("BB", ck_a, ck_b) class Hdr: def __init__(self, _class: int, _id: int, _length: int): self.mclass = _class self.mid = _id self.length = _length def frame_parse_hdr(frame: bytes) -> Hdr|None: hdr = Hdr(0,0,0) if len(frame) < 4: return None hdr.mclass = struct.unpack('B', frame[0:1])[0] hdr.mid = struct.unpack('B', frame[1:2])[0] hdr.length = struct.unpack(' 0: self.packet += self.d_save self.d_save = b'' self.sync_count = 0 if not self.wait_sync: self.packet += struct.pack('B', d) data, hdr = frame_parse(self.packet) if data is not None: if hdr.length == len(data): frames.append({"cls": hdr.mclass, "id": hdr.mid, "payload": data}) self.packet = b'' self.wait_sync = True return frames