diff --git a/parsers/s3_parser.py b/parsers/s3_parser.py index bfec36b..2f32933 100644 --- a/parsers/s3_parser.py +++ b/parsers/s3_parser.py @@ -33,7 +33,7 @@ STX = 0x02 ETX = 0x03 ACK = 0x41 -__version__ = "0.2.2" +__version__ = "0.2.3" @dataclass @@ -227,17 +227,32 @@ def parse_s3(blob: bytes, trailer_len: int) -> List[Frame]: trailer_end = trailer_start + trailer_len trailer = blob[trailer_start:trailer_end] - # For S3 mode we don't assume checksum type here yet. + chk_valid = None + chk_type = None + chk_hex = None + payload = bytes(body) + + if len(body) >= 1: + received_chk = body[-1] + computed_chk = checksum8_sum(bytes(body[:-1])) + if computed_chk == received_chk: + chk_valid = True + chk_type = "SUM8" + chk_hex = f"{received_chk:02x}" + payload = bytes(body[:-1]) + else: + chk_valid = False + frames.append(Frame( index=idx, start_offset=start_offset, end_offset=end_offset, payload_raw=bytes(body), - payload=bytes(body), + payload=payload, trailer=trailer, - checksum_valid=None, - checksum_type=None, - checksum_hex=None + checksum_valid=chk_valid, + checksum_type=chk_type, + checksum_hex=chk_hex )) idx += 1 @@ -298,10 +313,13 @@ def parse_bw(blob: bytes, trailer_len: int, validate_checksum: bool) -> List[Fra if b == ETX: # Candidate end-of-frame. - # Accept ETX if the next bytes look like a real next-frame start (ACK+STX), - # or we're at EOF. This prevents chopping on in-payload 0x03. - next_is_start = (i + 2 < n and blob[i + 1] == ACK and blob[i + 2] == STX) - at_eof = (i == n - 1) + # Skip any SESSION_RESET (41 03) sequences — sent before POLL to wake + # monitoring units — to find the real next frame start (ACK+STX). + j = i + 1 + while j + 1 < n and blob[j] == ACK and blob[j + 1] == ETX: + j += 2 + next_is_start = (j + 1 < n and blob[j] == ACK and blob[j + 1] == STX) + at_eof = (i == n - 1) or (j >= n) if not (next_is_start or at_eof): # Not a real boundary -> payload byte