fix(parser): resolve BAD CHK for BW frames caused by SESSION_RESET bytes #4
+28
-10
@@ -33,7 +33,7 @@ STX = 0x02
|
|||||||
ETX = 0x03
|
ETX = 0x03
|
||||||
ACK = 0x41
|
ACK = 0x41
|
||||||
|
|
||||||
__version__ = "0.2.2"
|
__version__ = "0.2.3"
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -227,17 +227,32 @@ def parse_s3(blob: bytes, trailer_len: int) -> List[Frame]:
|
|||||||
trailer_end = trailer_start + trailer_len
|
trailer_end = trailer_start + trailer_len
|
||||||
trailer = blob[trailer_start:trailer_end]
|
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(
|
frames.append(Frame(
|
||||||
index=idx,
|
index=idx,
|
||||||
start_offset=start_offset,
|
start_offset=start_offset,
|
||||||
end_offset=end_offset,
|
end_offset=end_offset,
|
||||||
payload_raw=bytes(body),
|
payload_raw=bytes(body),
|
||||||
payload=bytes(body),
|
payload=payload,
|
||||||
trailer=trailer,
|
trailer=trailer,
|
||||||
checksum_valid=None,
|
checksum_valid=chk_valid,
|
||||||
checksum_type=None,
|
checksum_type=chk_type,
|
||||||
checksum_hex=None
|
checksum_hex=chk_hex
|
||||||
))
|
))
|
||||||
|
|
||||||
idx += 1
|
idx += 1
|
||||||
@@ -298,10 +313,13 @@ def parse_bw(blob: bytes, trailer_len: int, validate_checksum: bool) -> List[Fra
|
|||||||
|
|
||||||
if b == ETX:
|
if b == ETX:
|
||||||
# Candidate end-of-frame.
|
# Candidate end-of-frame.
|
||||||
# Accept ETX if the next bytes look like a real next-frame start (ACK+STX),
|
# Skip any SESSION_RESET (41 03) sequences — sent before POLL to wake
|
||||||
# or we're at EOF. This prevents chopping on in-payload 0x03.
|
# monitoring units — to find the real next frame start (ACK+STX).
|
||||||
next_is_start = (i + 2 < n and blob[i + 1] == ACK and blob[i + 2] == STX)
|
j = i + 1
|
||||||
at_eof = (i == n - 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):
|
if not (next_is_start or at_eof):
|
||||||
# Not a real boundary -> payload byte
|
# Not a real boundary -> payload byte
|
||||||
|
|||||||
Reference in New Issue
Block a user