feat: update event iteration logic to use null sentinel for end-of-events detection
This commit is contained in:
@@ -174,25 +174,33 @@ class MiniMateClient:
|
||||
TCP session, so the index may reflect session-scoped state rather than
|
||||
device-wide storage.
|
||||
|
||||
This method issues 1E (first key) then 1F repeatedly until the null key
|
||||
b'\\x00\\x00\\x00\\x00', counting as it goes. No 0A/0C/5A reads are
|
||||
performed, so it is much faster than get_events().
|
||||
This method issues 1E (first key) then 1F repeatedly until the null
|
||||
sentinel, counting as it goes. No 0A/0C/5A reads are performed, so it
|
||||
is much faster than get_events().
|
||||
|
||||
Null sentinel: event_data8[4:8] == b'\\x00\\x00\\x00\\x00'.
|
||||
DO NOT check key4 — key4 is all-zeros for event 0 and would falsely
|
||||
signal end-of-events on the very first iteration.
|
||||
|
||||
Returns:
|
||||
Number of stored waveform events (0 if device is empty).
|
||||
"""
|
||||
proto = self._require_proto()
|
||||
try:
|
||||
key4, _ = proto.read_event_first()
|
||||
key4, data8 = proto.read_event_first()
|
||||
except ProtocolError as exc:
|
||||
log.warning("count_events: 1E failed: %s — returning 0", exc)
|
||||
return 0
|
||||
|
||||
if data8[4:8] == b"\x00\x00\x00\x00":
|
||||
log.info("count_events: 1E returned null sentinel — device is empty")
|
||||
return 0
|
||||
|
||||
count = 0
|
||||
while key4 != b"\x00\x00\x00\x00":
|
||||
while data8[4:8] != b"\x00\x00\x00\x00":
|
||||
count += 1
|
||||
try:
|
||||
key4 = proto.advance_event()
|
||||
key4, data8 = proto.advance_event()
|
||||
except ProtocolError as exc:
|
||||
log.warning("count_events: 1F failed after %d events: %s", count, exc)
|
||||
break
|
||||
@@ -234,11 +242,14 @@ class MiniMateClient:
|
||||
|
||||
log.info("get_events: requesting first event (SUB 1E)")
|
||||
try:
|
||||
key4, _event_data8 = proto.read_event_first()
|
||||
key4, data8 = proto.read_event_first()
|
||||
except ProtocolError as exc:
|
||||
raise ProtocolError(f"get_events: 1E failed: {exc}") from exc
|
||||
|
||||
if key4 == b"\x00\x00\x00\x00":
|
||||
# Null sentinel: trailing 4 bytes of the 8-byte event data block are
|
||||
# all zero. DO NOT use key4 == b"\x00\x00\x00\x00" — event 0 has
|
||||
# key4=00000000 which would falsely signal an empty device.
|
||||
if data8[4:8] == b"\x00\x00\x00\x00":
|
||||
log.info("get_events: device reports no stored events")
|
||||
return []
|
||||
|
||||
@@ -246,7 +257,7 @@ class MiniMateClient:
|
||||
idx = 0
|
||||
is_first = True
|
||||
|
||||
while key4 != b"\x00\x00\x00\x00":
|
||||
while data8[4:8] != b"\x00\x00\x00\x00":
|
||||
log.info("get_events: record %d key=%s", idx, key4.hex())
|
||||
ev = Event(index=idx)
|
||||
ev._waveform_key = key4 # stored so download_waveform() can re-use it
|
||||
@@ -328,7 +339,7 @@ class MiniMateClient:
|
||||
|
||||
# SUB 1F — advance to the next full waveform record key
|
||||
try:
|
||||
key4 = proto.advance_event()
|
||||
key4, data8 = proto.advance_event()
|
||||
except ProtocolError as exc:
|
||||
log.warning("get_events: 1F failed: %s — stopping iteration", exc)
|
||||
break
|
||||
|
||||
Reference in New Issue
Block a user