feat: update event iteration logic to use null sentinel for end-of-events detection

This commit is contained in:
Brian Harrison
2026-04-03 16:29:10 -04:00
parent 2cb95cd45e
commit 95f2becf21
3 changed files with 64 additions and 22 deletions

View File

@@ -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