Compare commits

...

3 Commits

Author SHA1 Message Date
Aiden
feb78475c0 More test run data 2026-05-13 15:04:40 +10:00
Aiden
9bcc75c2e9 More tests 2026-05-13 14:45:34 +10:00
Aiden
769e47ed67 new discovery phase 2026-05-13 13:57:19 +10:00
24 changed files with 2715 additions and 1 deletions

View File

@@ -0,0 +1,79 @@
Direct response sweep: 43 frames x 1 cycles (43 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:59:39.639 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
14:59:40.464 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
14:59:40.464 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:59:40.464 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:59:48.216 TX cycle=1 p1=0x00 p2=0x00 cmd=0x1B state=0x00 value=0x80 frame 006 00 00 1B 00 80 C1
14:59:49.043 TX cycle=1 p1=0x00 p2=0x00 cmd=0x36 state=0x00 value=0x80 frame 006 00 00 36 00 80 EC
14:59:49.863 TX cycle=1 p1=0x00 p2=0x00 cmd=0x40 state=0x00 value=0x80 frame 006 00 00 40 00 80 9A
14:59:49.863 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:59:49.863 RX raw 07 80 50 40 30 FD 07 80 50 40 30 FD 07 80 50 40 30 FD 07 80 50 40 30 FD
14:59:57.647 TX cycle=1 p1=0x00 p2=0x00 cmd=0x6C state=0x00 value=0x80 frame 006 00 00 6C 00 80 B6
14:59:58.469 TX cycle=1 p1=0x00 p2=0x00 cmd=0x6D state=0x00 value=0x80 frame 006 00 00 6D 00 80 B7
14:59:58.469 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:59:58.469 RX raw 07 80 5B 20 D8 7E 07 80 5B 20 D8 7E 07 80 5B 20 D8 7E 07 80 5B 20 D8 7E
15:00:04.979 TX cycle=1 p1=0x00 p2=0x00 cmd=0x20 state=0x00 value=0x80 frame 006 00 00 20 00 80 FA
15:00:05.804 TX cycle=1 p1=0x00 p2=0x00 cmd=0x2F state=0x00 value=0x80 frame 006 00 00 2F 00 80 F5
15:00:06.627 TX cycle=1 p1=0x00 p2=0x00 cmd=0x30 state=0x00 value=0x80 frame 006 00 00 30 00 80 EA
15:00:07.450 TX cycle=1 p1=0x00 p2=0x00 cmd=0x3F state=0x00 value=0x80 frame 006 00 00 3F 00 80 E5
15:00:08.273 TX cycle=1 p1=0x00 p2=0x00 cmd=0x40 state=0x00 value=0x80 frame 006 00 00 40 00 80 9A
15:00:08.273 ANOMALY 27 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:00:08.273 RX raw 07 80 50 40 30 FD 07 80 50 40 30 FD 07 80 50 40 30 FD 07 80 50 40 30 FD 07 80 50
15:00:20.236 TX cycle=1 p1=0x00 p2=0x00 cmd=0x4F state=0x00 value=0x80 frame 006 00 00 4F 00 80 95
15:00:20.236 ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
15:00:20.236 RX raw 07 80 0A 04 AB 78 00 00 00 00 80 DA
15:00:26.062 TX cycle=1 p1=0x00 p2=0x00 cmd=0x50 state=0x00 value=0x80 frame 006 00 00 50 00 80 8A
15:00:26.884 TX cycle=1 p1=0x00 p2=0x00 cmd=0x5F state=0x00 value=0x80 frame 006 00 00 5F 00 80 85
15:00:27.707 TX cycle=1 p1=0x00 p2=0x00 cmd=0x7F state=0x00 value=0x80 frame 006 00 00 7F 00 80 A5
15:00:28.528 TX cycle=1 p1=0x00 p2=0x00 cmd=0x80 state=0x00 value=0x80 frame 006 00 00 80 00 80 5A
15:00:29.350 TX cycle=1 p1=0x00 p2=0x00 cmd=0x8F state=0x00 value=0x80 frame 006 00 00 8F 00 80 55
15:00:29.350 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:00:29.350 RX raw 07 80 0C 04 AB 7E 07 80 0C 04 AB 7E 07 80 0C 04 AB 7E 07 80 0C 04 AB 7E
15:00:35.669 TX cycle=1 p1=0x00 p2=0x00 cmd=0x90 state=0x00 value=0x80 frame 006 00 00 90 00 80 4A
15:00:36.492 TX cycle=1 p1=0x00 p2=0x00 cmd=0x9F state=0x00 value=0x80 frame 006 00 00 9F 00 80 45
15:00:37.316 TX cycle=1 p1=0x00 p2=0x00 cmd=0xA0 state=0x00 value=0x80 frame 006 00 00 A0 00 80 7A
15:00:37.316 ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
15:00:37.316 RX raw 07 80 E8 40 30 45 00 00 00 00 80 DA
15:00:44.466 TX cycle=1 p1=0x00 p2=0x00 cmd=0xAF state=0x00 value=0x80 frame 006 00 00 AF 00 80 75
15:00:45.289 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
15:00:45.289 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:00:45.289 RX raw 07 80 6C 40 30 C1 07 80 6C 40 30 C1 07 80 6C 40 30 C1 07 80 6C 40 30 C1
15:00:52.165 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBF state=0x00 value=0x80 frame 006 00 00 BF 00 80 65
15:00:52.988 TX cycle=1 p1=0x00 p2=0x00 cmd=0xC0 state=0x00 value=0x80 frame 006 00 00 C0 00 80 1A
15:00:53.811 TX cycle=1 p1=0x00 p2=0x00 cmd=0xCF state=0x00 value=0x80 frame 006 00 00 CF 00 80 15
15:00:53.811 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:00:53.811 RX raw 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C
15:00:59.683 TX cycle=1 p1=0x00 p2=0x00 cmd=0xE0 state=0x00 value=0x80 frame 006 00 00 E0 00 80 3A
15:01:00.507 TX cycle=1 p1=0x00 p2=0x00 cmd=0xEF state=0x00 value=0x80 frame 006 00 00 EF 00 80 35
15:01:00.507 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:01:00.507 RX raw 07 80 0F 04 EB 3D 07 80 0F 04 EB 3D 07 80 0F 04 EB 3D 07 80 0F 04 EB 3D
15:01:06.293 TX cycle=1 p1=0x00 p2=0x00 cmd=0xF0 state=0x00 value=0x80 frame 006 00 00 F0 00 80 2A
15:01:07.118 TX cycle=1 p1=0x00 p2=0x00 cmd=0xFF state=0x00 value=0x80 frame 006 00 00 FF 00 80 25
15:01:07.945 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
15:01:07.945 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:01:07.945 RX raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
15:01:16.350 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB2 state=0x00 value=0x80 frame 006 00 00 B2 00 80 68
15:01:17.172 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB3 state=0x00 value=0x80 frame 006 00 00 B3 00 80 69
15:01:17.172 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:01:17.172 RX raw 07 80 36 10 2C D7 07 80 36 10 2C D7 07 80 36 10 2C D7 07 80 36 10 2C D7
15:01:22.380 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB4 state=0x00 value=0x80 frame 006 00 00 B4 00 80 6E
15:01:23.203 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB6 state=0x00 value=0x80 frame 006 00 00 B6 00 80 6C
15:01:23.203 ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
15:01:23.203 RX raw 07 80 1B 08 C6 08 00 00 00 00 80 DA
15:01:28.861 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB7 state=0x00 value=0x80 frame 006 00 00 B7 00 80 6D
15:01:29.681 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB8 state=0x00 value=0x80 frame 006 00 00 B8 00 80 62
15:01:29.681 ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
15:01:29.681 RX raw 07 80 6E 40 30 C3 00 00 00 00 80 DA
15:01:34.912 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB9 state=0x00 value=0x80 frame 006 00 00 B9 00 80 63
15:01:35.740 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBA state=0x00 value=0x80 frame 006 00 00 BA 00 80 60
15:01:35.740 ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
15:01:35.740 RX raw 07 80 37 10 0C F6 00 00 00 00 80 DA
15:01:43.081 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBB state=0x00 value=0x80 frame 006 00 00 BB 00 80 61
15:01:43.907 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBC state=0x00 value=0x80 frame 006 00 00 BC 00 80 66
15:01:43.907 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
15:01:43.907 RX raw 07 80 6F 40 30 C2 07 80 6F 40 30 C2 07 80 6F 40 30 C2 07 80 6F 40 30 C2
15:01:50.437 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBD state=0x00 value=0x80 frame 006 00 00 BD 00 80 67
15:01:51.262 TX cycle=1 p1=0x00 p2=0x00 cmd=0xBE state=0x00 value=0x80 frame 006 00 00 BE 00 80 64
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 16

View File

@@ -0,0 +1,149 @@
Keepalive-after-query on COM5 at 38400 8N1
Primer 00 00 00 00 80 DA; query 00 00 B5 00 80 6F; keepalive 00 00 00 00 80 DA
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:31:59.333 TX primer 00 00 00 00 80 DA
14:31:59.333 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:31:59.546 TX query 00 00 B5 00 80 6F
14:31:59.546 QUERY RX NON_HEARTBEAT RX: 48 bytes 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:32:01.560 TX keepalive 001 00 00 00 00 80 DA
14:32:01.774 TX keepalive 002 00 00 00 00 80 DA
14:32:01.774 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:01.987 TX keepalive 003 00 00 00 00 80 DA
14:32:01.987 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:02.201 TX keepalive 004 00 00 00 00 80 DA
14:32:02.201 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:02.413 TX keepalive 005 00 00 00 00 80 DA
14:32:02.413 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:02.626 TX keepalive 006 00 00 00 00 80 DA
14:32:02.626 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:02.839 TX keepalive 007 00 00 00 00 80 DA
14:32:02.839 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:03.053 TX keepalive 008 00 00 00 00 80 DA
14:32:03.053 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:03.265 TX keepalive 009 00 00 00 00 80 DA
14:32:03.265 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:03.479 TX keepalive 010 00 00 00 00 80 DA
14:32:03.479 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:03.693 TX keepalive 011 00 00 00 00 80 DA
14:32:03.693 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:03.907 TX keepalive 012 00 00 00 00 80 DA
14:32:03.907 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:04.121 TX keepalive 013 00 00 00 00 80 DA
14:32:04.121 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:04.336 TX keepalive 014 00 00 00 00 80 DA
14:32:04.336 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:04.551 TX keepalive 015 00 00 00 00 80 DA
14:32:04.551 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:04.764 TX keepalive 016 00 00 00 00 80 DA
14:32:04.764 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:04.978 TX keepalive 017 00 00 00 00 80 DA
14:32:04.978 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:05.191 TX keepalive 018 00 00 00 00 80 DA
14:32:05.191 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:05.403 TX keepalive 019 00 00 00 00 80 DA
14:32:05.403 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:05.617 TX keepalive 020 00 00 00 00 80 DA
14:32:05.617 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:05.830 TX keepalive 021 00 00 00 00 80 DA
14:32:05.830 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:06.044 TX keepalive 022 00 00 00 00 80 DA
14:32:06.044 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:06.259 TX keepalive 023 00 00 00 00 80 DA
14:32:06.259 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:06.471 TX keepalive 024 00 00 00 00 80 DA
14:32:06.471 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:06.685 TX keepalive 025 00 00 00 00 80 DA
14:32:06.685 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:06.899 TX keepalive 026 00 00 00 00 80 DA
14:32:06.899 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:07.112 TX keepalive 027 00 00 00 00 80 DA
14:32:07.112 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:07.327 TX keepalive 028 00 00 00 00 80 DA
14:32:07.327 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:07.540 TX keepalive 029 00 00 00 00 80 DA
14:32:07.540 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:07.754 TX keepalive 030 00 00 00 00 80 DA
14:32:07.754 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:07.967 TX keepalive 031 00 00 00 00 80 DA
14:32:07.967 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:08.179 TX keepalive 032 00 00 00 00 80 DA
14:32:08.179 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:08.393 TX keepalive 033 00 00 00 00 80 DA
14:32:08.393 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:08.605 TX keepalive 034 00 00 00 00 80 DA
14:32:08.605 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:08.819 TX keepalive 035 00 00 00 00 80 DA
14:32:08.819 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:09.034 TX keepalive 036 00 00 00 00 80 DA
14:32:09.034 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:09.249 TX keepalive 037 00 00 00 00 80 DA
14:32:09.249 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:09.461 TX keepalive 038 00 00 00 00 80 DA
14:32:09.461 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:09.675 TX keepalive 039 00 00 00 00 80 DA
14:32:09.675 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:09.888 TX keepalive 040 00 00 00 00 80 DA
14:32:09.888 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:10.104 TX keepalive 041 00 00 00 00 80 DA
14:32:10.104 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:10.320 TX keepalive 042 00 00 00 00 80 DA
14:32:10.320 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:10.535 TX keepalive 043 00 00 00 00 80 DA
14:32:10.535 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:10.750 TX keepalive 044 00 00 00 00 80 DA
14:32:10.750 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:10.963 TX keepalive 045 00 00 00 00 80 DA
14:32:10.963 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:11.177 TX keepalive 046 00 00 00 00 80 DA
14:32:11.177 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:11.392 TX keepalive 047 00 00 00 00 80 DA
14:32:11.392 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:11.608 TX keepalive 048 00 00 00 00 80 DA
14:32:11.608 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:11.823 TX keepalive 049 00 00 00 00 80 DA
14:32:11.823 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:12.037 TX keepalive 050 00 00 00 00 80 DA
14:32:12.037 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:12.250 TX keepalive 051 00 00 00 00 80 DA
14:32:12.250 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:12.464 TX keepalive 052 00 00 00 00 80 DA
14:32:12.464 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:12.678 TX keepalive 053 00 00 00 00 80 DA
14:32:12.678 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:12.890 TX keepalive 054 00 00 00 00 80 DA
14:32:12.890 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:13.103 TX keepalive 055 00 00 00 00 80 DA
14:32:13.103 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:13.316 TX keepalive 056 00 00 00 00 80 DA
14:32:13.316 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:13.530 TX keepalive 057 00 00 00 00 80 DA
14:32:13.530 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:13.744 TX keepalive 058 00 00 00 00 80 DA
14:32:13.744 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:13.961 TX keepalive 059 00 00 00 00 80 DA
14:32:13.961 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:14.179 TX keepalive 060 00 00 00 00 80 DA
14:32:14.179 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:14.393 TX keepalive 061 00 00 00 00 80 DA
14:32:14.393 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:14.605 TX keepalive 062 00 00 00 00 80 DA
14:32:14.605 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:14.819 TX keepalive 063 00 00 00 00 80 DA
14:32:14.819 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:15.032 TX keepalive 064 00 00 00 00 80 DA
14:32:15.032 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:15.246 TX keepalive 065 00 00 00 00 80 DA
14:32:15.246 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:15.461 TX keepalive 066 00 00 00 00 80 DA
14:32:15.461 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:15.673 TX keepalive 067 00 00 00 00 80 DA
14:32:15.673 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:15.887 TX keepalive 068 00 00 00 00 80 DA
14:32:15.887 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:16.102 TX keepalive 069 00 00 00 00 80 DA
14:32:16.102 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:16.317 TX keepalive 070 00 00 00 00 80 DA
14:32:16.317 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:32:16.531 TX keepalive 071 00 00 00 00 80 DA
14:32:16.531 KEEPALIVE RX heartbeat-compatible RX: 1 bytes, offset 0, 0 frames + 1 bytes
14:32:20.819 SCREEN CONNECT NOT ACT

View File

@@ -0,0 +1,58 @@
Keepalive-after-query on COM5 at 38400 8N1
Primer 00 00 00 00 80 DA; query 00 00 B5 00 80 6F; keepalive 00 00 00 00 80 DA
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:30:00.588 TX primer 00 00 00 00 80 DA
14:30:00.588 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:01.198 TX query 00 00 B5 00 80 6F
14:30:01.198 QUERY RX NON_HEARTBEAT RX: 48 bytes 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:30:03.210 TX keepalive 001 00 00 00 00 80 DA
14:30:03.210 KEEPALIVE RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:30:03.820 TX keepalive 002 00 00 00 00 80 DA
14:30:03.820 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:04.429 TX keepalive 003 00 00 00 00 80 DA
14:30:04.429 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:05.038 TX keepalive 004 00 00 00 00 80 DA
14:30:05.038 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:05.649 TX keepalive 005 00 00 00 00 80 DA
14:30:05.649 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:06.256 TX keepalive 006 00 00 00 00 80 DA
14:30:06.256 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:06.865 TX keepalive 007 00 00 00 00 80 DA
14:30:06.865 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:07.479 TX keepalive 008 00 00 00 00 80 DA
14:30:07.479 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:08.088 TX keepalive 009 00 00 00 00 80 DA
14:30:08.088 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:08.699 TX keepalive 010 00 00 00 00 80 DA
14:30:08.699 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:09.309 TX keepalive 011 00 00 00 00 80 DA
14:30:09.309 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:09.917 TX keepalive 012 00 00 00 00 80 DA
14:30:09.917 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:10.525 TX keepalive 013 00 00 00 00 80 DA
14:30:10.525 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:11.135 TX keepalive 014 00 00 00 00 80 DA
14:30:11.135 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:11.743 TX keepalive 015 00 00 00 00 80 DA
14:30:11.743 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:12.354 TX keepalive 016 00 00 00 00 80 DA
14:30:12.354 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:12.963 TX keepalive 017 00 00 00 00 80 DA
14:30:12.963 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:13.573 TX keepalive 018 00 00 00 00 80 DA
14:30:13.573 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:14.183 TX keepalive 019 00 00 00 00 80 DA
14:30:14.183 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:14.793 TX keepalive 020 00 00 00 00 80 DA
14:30:14.793 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:15.403 TX keepalive 021 00 00 00 00 80 DA
14:30:15.403 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:16.011 TX keepalive 022 00 00 00 00 80 DA
14:30:16.011 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:16.620 TX keepalive 023 00 00 00 00 80 DA
14:30:16.620 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:17.229 TX keepalive 024 00 00 00 00 80 DA
14:30:17.229 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:17.839 TX keepalive 025 00 00 00 00 80 DA
14:30:17.839 KEEPALIVE RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:30:25.571 SCREEN CONNECT NOT ACT

View File

@@ -0,0 +1,58 @@
Keepalive-after-query on COM5 at 38400 8N1
Primer 00 00 00 00 80 DA; query 00 00 B5 00 80 6F; keepalive 00 00 00 80 00 DA
BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:31:25.424 TX primer 00 00 00 00 80 DA
14:31:25.424 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:31:26.035 TX query 00 00 B5 00 80 6F
14:31:26.035 QUERY RX NON_HEARTBEAT RX: 48 bytes 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:31:28.051 TX keepalive 001 00 00 00 80 00 DA
14:31:28.051 KEEPALIVE RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:31:28.660 TX keepalive 002 00 00 00 80 00 DA
14:31:28.660 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:29.269 TX keepalive 003 00 00 00 80 00 DA
14:31:29.269 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:29.876 TX keepalive 004 00 00 00 80 00 DA
14:31:29.876 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:30.486 TX keepalive 005 00 00 00 80 00 DA
14:31:30.486 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:31.094 TX keepalive 006 00 00 00 80 00 DA
14:31:31.094 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:31.705 TX keepalive 007 00 00 00 80 00 DA
14:31:31.705 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:32.318 TX keepalive 008 00 00 00 80 00 DA
14:31:32.318 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:32.931 TX keepalive 009 00 00 00 80 00 DA
14:31:32.931 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:33.539 TX keepalive 010 00 00 00 80 00 DA
14:31:33.539 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:34.150 TX keepalive 011 00 00 00 80 00 DA
14:31:34.150 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:34.757 TX keepalive 012 00 00 00 80 00 DA
14:31:34.757 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:35.367 TX keepalive 013 00 00 00 80 00 DA
14:31:35.367 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:35.978 TX keepalive 014 00 00 00 80 00 DA
14:31:35.978 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:36.587 TX keepalive 015 00 00 00 80 00 DA
14:31:36.587 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:37.196 TX keepalive 016 00 00 00 80 00 DA
14:31:37.196 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:37.803 TX keepalive 017 00 00 00 80 00 DA
14:31:37.803 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:38.413 TX keepalive 018 00 00 00 80 00 DA
14:31:38.413 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:39.024 TX keepalive 019 00 00 00 80 00 DA
14:31:39.024 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:39.634 TX keepalive 020 00 00 00 80 00 DA
14:31:39.634 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:40.244 TX keepalive 021 00 00 00 80 00 DA
14:31:40.244 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:40.854 TX keepalive 022 00 00 00 80 00 DA
14:31:40.854 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:41.464 TX keepalive 023 00 00 00 80 00 DA
14:31:41.464 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:42.076 TX keepalive 024 00 00 00 80 00 DA
14:31:42.076 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:42.683 TX keepalive 025 00 00 00 80 00 DA
14:31:42.683 KEEPALIVE RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:31:47.293 SCREEN CONNECT NOT ACT

View File

@@ -0,0 +1,58 @@
Keepalive-after-query on COM5 at 38400 8N1
Primer 00 00 00 00 80 DA; query 00 00 B5 00 80 6F; keepalive 00 00 00 00 00 5A
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:30:49.577 TX primer 00 00 00 00 80 DA
14:30:49.577 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:30:50.188 TX query 00 00 B5 00 80 6F
14:30:50.188 QUERY RX NON_HEARTBEAT RX: 54 bytes 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:30:52.201 TX keepalive 001 00 00 00 00 00 5A
14:30:52.201 KEEPALIVE RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:30:52.809 TX keepalive 002 00 00 00 00 00 5A
14:30:52.809 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:53.419 TX keepalive 003 00 00 00 00 00 5A
14:30:53.419 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:54.030 TX keepalive 004 00 00 00 00 00 5A
14:30:54.030 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:54.640 TX keepalive 005 00 00 00 00 00 5A
14:30:54.640 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:55.278 TX keepalive 006 00 00 00 00 00 5A
14:30:55.278 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:55.888 TX keepalive 007 00 00 00 00 00 5A
14:30:55.888 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:56.499 TX keepalive 008 00 00 00 00 00 5A
14:30:56.499 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:57.137 TX keepalive 009 00 00 00 00 00 5A
14:30:57.137 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:57.748 TX keepalive 010 00 00 00 00 00 5A
14:30:57.748 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:58.360 TX keepalive 011 00 00 00 00 00 5A
14:30:58.360 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:58.969 TX keepalive 012 00 00 00 00 00 5A
14:30:58.969 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:30:59.579 TX keepalive 013 00 00 00 00 00 5A
14:30:59.579 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:00.191 TX keepalive 014 00 00 00 00 00 5A
14:31:00.191 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:00.799 TX keepalive 015 00 00 00 00 00 5A
14:31:00.799 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:01.406 TX keepalive 016 00 00 00 00 00 5A
14:31:01.406 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:02.015 TX keepalive 017 00 00 00 00 00 5A
14:31:02.015 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:02.627 TX keepalive 018 00 00 00 00 00 5A
14:31:02.627 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:03.236 TX keepalive 019 00 00 00 00 00 5A
14:31:03.236 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:03.845 TX keepalive 020 00 00 00 00 00 5A
14:31:03.845 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:04.455 TX keepalive 021 00 00 00 00 00 5A
14:31:04.455 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:05.064 TX keepalive 022 00 00 00 00 00 5A
14:31:05.064 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:05.674 TX keepalive 023 00 00 00 00 00 5A
14:31:05.674 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:06.284 TX keepalive 024 00 00 00 00 00 5A
14:31:06.284 KEEPALIVE RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:31:06.894 TX keepalive 025 00 00 00 00 00 5A
14:31:06.894 KEEPALIVE RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:31:13.497 SCREEN CONNECT NOT ACT

View File

@@ -0,0 +1,327 @@
Post-discovery sweep: primer 00 00 00 00 80 DA, query 00 00 B5 00 80 6F, 32 candidates on COM5 at 38400 8N1
CANDIDATE 0x00 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:57:37.331 TX primer frame 006 00 00 00 00 80 DA
13:57:37.331 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
13:57:38.156 TX query 0xB5 frame 006 00 00 B5 00 80 6F
13:57:38.156 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:57:38.156 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
13:57:39.376 TX candidate 0x00 frame 006 00 00 00 00 80 DA
13:57:39.376 CANDIDATE 0x00 RX ANOMALY 53 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 1 expected 00
13:57:39.376 CANDIDATE 0x00 RX raw 07 80 6D 20 D8 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
13:57:49.402 SCREEN candidate=0x00 CONNECT NOT ACT
Completed candidate 1/32
CANDIDATE 0x01 BASELINE heartbeat-compatible RX: 29 bytes, offset 1, 4 frames + 5 bytes
13:58:15.301 TX primer frame 006 00 00 00 00 80 DA
13:58:15.301 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
13:58:16.124 TX query 0xB5 frame 006 00 00 B5 00 80 6F
13:58:16.124 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:58:16.124 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
13:58:17.340 TX candidate 0x01 frame 006 00 00 01 00 80 DB
13:58:17.340 CANDIDATE 0x01 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
13:59:28.114 SCREEN candidate=0x01 CONNECT NOT ACTCONNECT NOT ACT
Completed candidate 2/32
CANDIDATE 0x02 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:59:38.147 TX primer frame 006 00 00 00 00 80 DA
13:59:38.147 PRIMER RX heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:59:38.974 TX query 0xB5 frame 006 00 00 B5 00 80 6F
13:59:38.974 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:59:38.974 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
13:59:40.193 TX candidate 0x02 frame 006 00 00 02 00 80 D8
13:59:40.193 CANDIDATE 0x02 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:00:09.105 SCREEN candidate=0x02 CONNECT NOT ACT
Completed candidate 3/32
CANDIDATE 0x03 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:00:17.993 TX primer frame 006 00 00 00 00 80 DA
14:00:17.993 PRIMER RX ANOMALY 12 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:00:17.993 PRIMER RX raw 07 80 40 40 30 ED 00 00 00 00 80 DA
14:00:18.816 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:00:18.816 QUERY RX heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:00:20.035 TX candidate 0x03 frame 006 00 00 03 00 80 D9
14:00:20.035 CANDIDATE 0x03 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:00:29.112 SCREEN candidate=0x03 CONNECT NOT ACT
Completed candidate 4/32
CANDIDATE 0x04 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:00:38.847 TX primer frame 006 00 00 00 00 80 DA
14:00:38.847 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:00:39.667 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:00:39.667 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:00:39.667 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:00:40.858 TX candidate 0x04 frame 006 00 00 04 00 80 DE
14:00:40.858 CANDIDATE 0x04 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:00:52.036 SCREEN candidate=0x04 CONNECT NOT ACT
Completed candidate 5/32
CANDIDATE 0x05 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:01:00.767 TX primer frame 006 00 00 00 00 80 DA
14:01:00.767 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:01:01.585 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:01:01.585 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:01:01.585 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:01:02.809 TX candidate 0x05 frame 006 00 00 05 00 80 DF
14:01:02.809 CANDIDATE 0x05 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:01:21.665 SCREEN candidate=0x05 CONNECT NOT ACT
Completed candidate 6/32
CANDIDATE 0x06 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:01:34.465 TX primer frame 006 00 00 00 00 80 DA
14:01:34.465 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:01:35.290 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:01:35.290 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:01:35.290 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:01:36.508 TX candidate 0x06 frame 006 00 00 06 00 80 DC
14:01:36.508 CANDIDATE 0x06 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:01:59.113 SCREEN candidate=0x06 CONNECT NOT ACT
Completed candidate 7/32
CANDIDATE 0x07 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:02:09.750 TX primer frame 006 00 00 00 00 80 DA
14:02:09.750 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:02:10.576 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:02:10.576 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:02:10.576 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:02:11.793 TX candidate 0x07 frame 006 00 00 07 00 80 DD
14:02:11.793 CANDIDATE 0x07 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:02:18.645 SCREEN candidate=0x07 CONNECT NOT ACT
Completed candidate 8/32
CANDIDATE 0x08 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:02:47.194 TX primer frame 006 00 00 00 00 80 DA
14:02:47.194 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:02:48.017 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:02:48.017 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:02:48.017 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:02:49.236 TX candidate 0x08 frame 006 00 00 08 00 80 D2
14:02:49.236 CANDIDATE 0x08 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:02:57.276 SCREEN candidate=0x08 CONNECT NOT ACT
Completed candidate 9/32
CANDIDATE 0x09 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:03:09.529 TX primer frame 006 00 00 00 00 80 DA
14:03:09.529 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:03:10.353 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:03:10.353 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:03:10.353 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:03:11.571 TX candidate 0x09 frame 006 00 00 09 00 80 D3
14:03:11.571 CANDIDATE 0x09 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:03:22.406 SCREEN candidate=0x09 CONNECT NOT ACT
Completed candidate 10/32
CANDIDATE 0x0A BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:03:32.214 TX primer frame 006 00 00 00 00 80 DA
14:03:32.214 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:03:33.038 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:03:33.038 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:03:33.038 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:03:34.261 TX candidate 0x0A frame 006 00 00 0A 00 80 D0
14:03:34.261 CANDIDATE 0x0A RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:04:31.913 SCREEN candidate=0x0A CONNECT NOT ACT
Completed candidate 11/32
CANDIDATE 0x0B BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:04:41.814 TX primer frame 006 00 00 00 00 80 DA
14:04:41.814 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:04:42.641 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:04:42.641 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:04:42.641 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:04:43.863 TX candidate 0x0B frame 006 00 00 0B 00 80 D1
14:04:43.863 CANDIDATE 0x0B RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:04:51.132 SCREEN candidate=0x0B CONNECT NOT ACT
Completed candidate 12/32
CANDIDATE 0x0C BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:05:01.364 TX primer frame 006 00 00 00 00 80 DA
14:05:01.364 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:05:02.183 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:05:02.183 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:05:02.183 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:05:03.401 TX candidate 0x0C frame 006 00 00 0C 00 80 D6
14:05:03.401 CANDIDATE 0x0C RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:05:11.289 SCREEN candidate=0x0C CONNECT NOT ACT
Completed candidate 13/32
CANDIDATE 0x0D BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:05:19.111 TX primer frame 006 00 00 00 00 80 DA
14:05:19.111 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:05:19.936 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:05:19.936 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:05:19.936 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:05:21.126 TX candidate 0x0D frame 006 00 00 0D 00 80 D7
14:05:21.126 CANDIDATE 0x0D RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:05:31.382 SCREEN candidate=0x0D CONNECT NOT ACT
Completed candidate 14/32
CANDIDATE 0x0E BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:05:44.762 TX primer frame 006 00 00 00 00 80 DA
14:05:44.762 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:05:45.588 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:05:45.588 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:05:45.588 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:05:46.806 TX candidate 0x0E frame 006 00 00 0E 00 80 D4
14:05:46.806 CANDIDATE 0x0E RX ANOMALY 25 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:05:46.806 CANDIDATE 0x0E RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA 00
14:05:54.627 SCREEN candidate=0x0E CONNECT NOT ACT
Completed candidate 15/32
CANDIDATE 0x0F BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:06:05.428 TX primer frame 006 00 00 00 00 80 DA
14:06:05.428 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:06:06.255 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:06:06.255 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:06:06.255 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:06:07.477 TX candidate 0x0F frame 006 00 00 0F 00 80 D5
14:06:07.477 CANDIDATE 0x0F RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:06:07.477 CANDIDATE 0x0F RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA 00 00 00 00 80 DA
14:06:17.323 SCREEN candidate=0x0F CONNECT NOT ACT
Completed candidate 16/32
CANDIDATE 0x10 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:06:29.790 TX primer frame 006 00 00 00 00 80 DA
14:06:29.790 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:06:30.613 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:06:30.613 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:06:30.613 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:06:31.834 TX candidate 0x10 frame 006 00 00 10 00 80 CA
14:06:31.834 CANDIDATE 0x10 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:06:39.289 SCREEN candidate=0x10 CONNECT NOT ACT
Completed candidate 17/32
CANDIDATE 0x11 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:06:51.468 TX primer frame 006 00 00 00 00 80 DA
14:06:51.468 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:06:52.289 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:06:52.289 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:06:52.289 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:06:53.511 TX candidate 0x11 frame 006 00 00 11 00 80 CB
14:06:53.511 CANDIDATE 0x11 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:07:17.742 SCREEN candidate=0x11 CONNECT NOT ACT
Completed candidate 18/32
CANDIDATE 0x12 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:07:34.256 TX primer frame 006 00 00 00 00 80 DA
14:07:34.256 PRIMER RX heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:07:35.077 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:07:35.077 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:07:35.077 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:07:36.296 TX candidate 0x12 frame 006 00 00 12 00 80 C8
14:07:36.296 CANDIDATE 0x12 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:08:00.196 SCREEN candidate=0x12 CONNECT NOT ACT
Completed candidate 19/32
CANDIDATE 0x13 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:08:57.563 TX primer frame 006 00 00 00 00 80 DA
14:08:57.563 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:08:58.386 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:08:58.386 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:08:58.386 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:08:59.604 TX candidate 0x13 frame 006 00 00 13 00 80 C9
14:08:59.604 CANDIDATE 0x13 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:09:08.311 SCREEN candidate=0x13 CONNECTION NOT ACT
Completed candidate 20/32
CANDIDATE 0x14 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:09:36.745 TX primer frame 006 00 00 00 00 80 DA
14:09:36.745 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:09:37.571 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:09:37.571 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:09:37.571 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:09:38.789 TX candidate 0x14 frame 006 00 00 14 00 80 CE
14:09:38.789 CANDIDATE 0x14 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:09:46.337 SCREEN candidate=0x14 CONNECT NOT ACT
Completed candidate 21/32
CANDIDATE 0x15 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:10:00.865 TX primer frame 006 00 00 00 00 80 DA
14:10:00.865 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:10:01.689 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:10:01.689 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:10:01.689 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:10:02.907 TX candidate 0x15 frame 006 00 00 15 00 80 CF
14:10:02.907 CANDIDATE 0x15 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:10:11.428 SCREEN candidate=0x15 CONNECT NOT ACT
Completed candidate 22/32
CANDIDATE 0x16 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:10:23.417 TX primer frame 006 00 00 00 00 80 DA
14:10:23.417 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:10:24.240 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:10:24.240 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:10:24.240 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:10:25.460 TX candidate 0x16 frame 006 00 00 16 00 80 CC
14:10:25.460 CANDIDATE 0x16 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:10:38.357 SCREEN candidate=0x16 CONNECT NOT ACT
Completed candidate 23/32
CANDIDATE 0x17 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:10:48.678 TX primer frame 006 00 00 00 00 80 DA
14:10:48.678 PRIMER RX heartbeat-compatible RX: 6 bytes, offset 0, 1 frames + 0 bytes
14:10:49.500 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:10:49.500 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:10:49.500 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:10:50.690 TX candidate 0x17 frame 006 00 00 17 00 80 CD
14:10:50.690 CANDIDATE 0x17 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:10:57.530 SCREEN candidate=0x17 CONNECT NOT ACT
Completed candidate 24/32
CANDIDATE 0x18 BASELINE heartbeat-compatible RX: 29 bytes, offset 1, 4 frames + 5 bytes
14:11:06.439 TX primer frame 006 00 00 00 00 80 DA
14:11:06.439 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:11:07.261 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:11:07.261 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:11:07.261 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:11:08.480 TX candidate 0x18 frame 006 00 00 18 00 80 C2
14:11:08.480 CANDIDATE 0x18 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:11:16.993 SCREEN candidate=0x18 CONNECT NOT ACT
Completed candidate 25/32
CANDIDATE 0x19 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:11:27.321 TX primer frame 006 00 00 00 00 80 DA
14:11:27.321 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:11:28.144 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:11:28.144 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:11:28.144 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:11:29.365 TX candidate 0x19 frame 006 00 00 19 00 80 C3
14:11:29.365 CANDIDATE 0x19 RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:11:36.120 SCREEN candidate=0x19 CONNECT NOT ACT
Completed candidate 26/32
CANDIDATE 0x1A BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:11:46.807 TX primer frame 006 00 00 00 00 80 DA
14:11:46.807 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:11:47.631 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:11:47.631 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:11:47.631 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:11:48.848 TX candidate 0x1A frame 006 00 00 1A 00 80 C0
14:11:48.848 CANDIDATE 0x1A RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:11:48.848 CANDIDATE 0x1A RX raw 07 80 6D 20 D8 48 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
14:12:00.487 SCREEN candidate=0x1A CONNECT NOT ACT
Completed candidate 27/32
CANDIDATE 0x1B BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:12:11.309 TX primer frame 006 00 00 00 00 80 DA
14:12:11.309 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:12:12.132 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:12:12.132 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:12:12.132 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:12:13.352 TX candidate 0x1B frame 006 00 00 1B 00 80 C1
14:12:13.352 CANDIDATE 0x1B RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:12:25.370 SCREEN candidate=0x1B CONNECT NOT ACT
Completed candidate 28/32
CANDIDATE 0x1C BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:12:36.906 TX primer frame 006 00 00 00 00 80 DA
14:12:36.906 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:12:37.710 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:12:37.710 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:12:37.710 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:12:38.928 TX candidate 0x1C frame 006 00 00 1C 00 80 C6
14:12:38.928 CANDIDATE 0x1C RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:12:46.949 SCREEN candidate=0x1C CONNECT NOT ACT
Completed candidate 29/32
CANDIDATE 0x1D BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:13:00.022 TX primer frame 006 00 00 00 00 80 DA
14:13:00.022 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:13:00.846 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:13:00.846 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:13:00.846 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:13:02.037 TX candidate 0x1D frame 006 00 00 1D 00 80 C7
14:13:02.037 CANDIDATE 0x1D RX heartbeat-compatible RX: 48 bytes, offset 0, 8 frames + 0 bytes
14:13:21.735 SCREEN candidate=0x1D CONNECT NOT ACT
Completed candidate 30/32
CANDIDATE 0x1E BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:13:29.692 TX primer frame 006 00 00 00 00 80 DA
14:13:29.692 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:13:30.514 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:13:30.514 QUERY RX ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:13:30.514 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:13:31.732 TX candidate 0x1E frame 006 00 00 1E 00 80 C4
14:13:31.732 CANDIDATE 0x1E RX ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:13:31.732 CANDIDATE 0x1E RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA
14:13:37.600 SCREEN candidate=0x1E CONNECT NOT ACT
Completed candidate 31/32
CANDIDATE 0x1F BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:13:45.189 TX primer frame 006 00 00 00 00 80 DA
14:13:45.189 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:13:46.012 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:13:46.012 QUERY RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:13:46.012 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:13:47.229 TX candidate 0x1F frame 006 00 00 1F 00 80 C5
14:13:47.229 CANDIDATE 0x1F RX ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:13:47.229 CANDIDATE 0x1F RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA 00 00 00 00 80 DA
14:13:52.562 SCREEN candidate=0x1F CONNECT NOT ACT
Completed candidate 32/32

View File

@@ -0,0 +1,12 @@
Post-discovery sweep: primer 00 00 00 00 80 DA, query 00 00 B5 00 80 6F, 32 candidates on COM5 at 38400 8N1
CANDIDATE 0x20 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:18:40.052 TX primer frame 006 00 00 00 00 80 DA
14:18:40.052 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:18:40.878 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:18:40.878 QUERY RX ANOMALY 48 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:18:40.878 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:18:42.894 TX candidate 0x20 frame 006 00 00 20 00 80 FA
14:18:42.894 CANDIDATE 0x20 RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:18:54.471 SCREEN candidate=0x20 CONNECT NOT ACT
Completed candidate 1/32
Stopped.

View File

@@ -0,0 +1,81 @@
Post-discovery sweep: primer 00 00 00 00 80 DA, query 00 00 B5 00 80 6F, 8 candidates on COM5 at 38400 8N1
CANDIDATE 0x00 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:23:38.585 TX primer frame 006 00 00 00 00 80 DA
14:23:38.585 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:23:39.408 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:23:39.408 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:23:39.408 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:23:41.426 TX candidate 0x00 frame 006 00 00 00 00 80 DA
14:23:41.426 CANDIDATE 0x00 RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:23:49.184 SCREEN candidate=0x00 CONNECT NOT ACT
Completed candidate 1/8
CANDIDATE 0x01 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:23:58.214 TX primer frame 006 00 00 00 00 80 DA
14:23:58.214 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:23:59.034 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:23:59.034 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:23:59.034 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:24:01.044 TX candidate 0x01 frame 006 00 00 01 00 80 DB
14:24:01.044 CANDIDATE 0x01 RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:24:05.765 SCREEN candidate=0x01 CONNECT NOT ACT
Completed candidate 2/8
CANDIDATE 0x03 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:24:16.412 TX primer frame 006 00 00 00 00 80 DA
14:24:16.412 PRIMER RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:24:17.236 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:24:17.236 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:24:17.236 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:24:19.251 TX candidate 0x03 frame 006 00 00 03 00 80 D9
14:24:19.251 CANDIDATE 0x03 RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:24:25.861 SCREEN candidate=0x03 CONNECT NOT ACT
Completed candidate 3/8
CANDIDATE 0x07 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:24:34.363 TX primer frame 006 00 00 00 00 80 DA
14:24:34.363 PRIMER RX heartbeat-compatible RX: 19 bytes, offset 0, 3 frames + 1 bytes
14:24:35.186 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:24:35.186 QUERY RX ANOMALY 53 RX bytes; first mismatch at byte 0: got 00, heartbeat offset 4 expected 80
14:24:35.186 QUERY RX raw 00 00 00 80 DA 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:24:37.196 TX candidate 0x07 frame 006 00 00 07 00 80 DD
14:24:37.196 CANDIDATE 0x07 RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:24:43.994 SCREEN candidate=0x07 CONNECT NOT ACT
Completed candidate 4/8
CANDIDATE 0x0F BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:24:54.811 TX primer frame 006 00 00 00 00 80 DA
14:24:54.811 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:24:55.632 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:24:55.632 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:24:55.632 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:24:57.640 TX candidate 0x0F frame 006 00 00 0F 00 80 D5
14:24:57.640 CANDIDATE 0x0F RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:25:05.820 SCREEN candidate=0x0F CONNECT NOT ACT
Completed candidate 5/8
CANDIDATE 0x10 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:25:15.731 TX primer frame 006 00 00 00 00 80 DA
14:25:15.731 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:25:16.559 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:25:16.559 QUERY RX ANOMALY 48 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:25:16.559 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:25:18.572 TX candidate 0x10 frame 006 00 00 10 00 80 CA
14:25:18.572 CANDIDATE 0x10 RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:25:23.775 SCREEN candidate=0x10 CONNECT NOT ACT
Completed candidate 6/8
CANDIDATE 0x1B BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:25:32.116 TX primer frame 006 00 00 00 00 80 DA
14:25:32.116 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:25:32.939 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:25:32.939 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:25:32.939 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:25:34.954 TX candidate 0x1B frame 006 00 00 1B 00 80 C1
14:25:34.954 CANDIDATE 0x1B RX heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
14:25:46.206 SCREEN candidate=0x1B CONNECT NOT ACT
Completed candidate 7/8
CANDIDATE 0x1F BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:25:58.538 TX primer frame 006 00 00 00 00 80 DA
14:25:58.538 PRIMER RX heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
14:25:59.361 TX query 0xB5 frame 006 00 00 B5 00 80 6F
14:25:59.361 QUERY RX ANOMALY 54 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:25:59.361 QUERY RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
14:26:01.377 TX candidate 0x1F frame 006 00 00 1F 00 80 C5
14:26:01.377 CANDIDATE 0x1F RX heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:26:14.985 SCREEN candidate=0x1F CONNECT NOT ACT
Completed candidate 8/8

View File

@@ -0,0 +1,98 @@
Primer/candidate sweep: primer 00 00 00 00 80 DA, 16 candidates on COM5 at 38400 8N1
CANDIDATE 0xA0 BASELINE heartbeat-compatible RX: 29 bytes, offset 1, 4 frames + 5 bytes
14:48:15.694 TX primer frame 006 00 00 00 00 80 DA
14:48:16.303 TX candidate 0xA0 frame 006 00 00 A0 00 80 7A
14:48:16.303 CANDIDATE 0xA0 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:48:16.303 CANDIDATE 0xA0 raw 07 80 68 40 30 C5 07 80 68 40 30 C5 07 80 68 40 30 C5 07 80 68 40 30 C5 07 80 68 40 30 C5 07 80 68 40 30 C5 07 80 68 40 30 C5
Completed candidate 1/16
CANDIDATE 0xA1 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:48:26.678 TX primer frame 006 00 00 00 00 80 DA
14:48:27.286 TX candidate 0xA1 frame 006 00 00 A1 00 80 7B
14:48:27.286 CANDIDATE 0xA1 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:48:27.286 CANDIDATE 0xA1 raw 07 80 68 20 D8 4D 07 80 68 20 D8 4D 07 80 68 20 D8 4D 07 80 68 20 D8 4D 07 80 68 20 D8 4D 07 80 68 20 D8 4D 07 80 68 20 D8 4D
Completed candidate 2/16
CANDIDATE 0xA2 BASELINE heartbeat-compatible RX: 25 bytes, offset 0, 4 frames + 1 bytes
14:48:39.570 TX primer frame 006 00 00 00 00 80 DA
14:48:40.180 TX candidate 0xA2 frame 006 00 00 A2 00 80 78
14:48:40.180 CANDIDATE 0xA2 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:48:40.180 CANDIDATE 0xA2 raw 07 80 34 10 0C F5 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 3/16
CANDIDATE 0xA3 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:48:53.676 TX primer frame 006 00 00 00 00 80 DA
14:48:54.289 TX candidate 0xA3 frame 006 00 00 A3 00 80 79
14:48:54.289 CANDIDATE 0xA3 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:48:54.289 CANDIDATE 0xA3 raw 07 80 34 10 2C D5 07 80 34 10 2C D5 07 80 34 10 2C D5 07 80 34 10 2C D5 07 80 34 10 2C D5 07 80 34 10 2C D5 07 80 34 10 2C D5
Completed candidate 4/16
CANDIDATE 0xA4 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:49:09.583 TX primer frame 006 00 00 00 00 80 DA
14:49:10.192 TX candidate 0xA4 frame 006 00 00 A4 00 80 7E
14:49:10.192 CANDIDATE 0xA4 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:49:10.192 CANDIDATE 0xA4 raw 07 80 69 40 30 C4 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 5/16
CANDIDATE 0xA5 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:49:20.586 TX primer frame 006 00 00 00 00 80 DA
14:49:21.195 TX candidate 0xA5 frame 006 00 00 A5 00 80 7F
14:49:21.195 CANDIDATE 0xA5 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:49:21.195 CANDIDATE 0xA5 raw 07 80 69 20 D8 4C 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 6/16
CANDIDATE 0xA6 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:49:31.236 TX primer frame 006 00 00 00 00 80 DA
14:49:31.848 TX candidate 0xA6 frame 006 00 00 A6 00 80 7C
14:49:31.848 CANDIDATE 0xA6 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:49:31.848 CANDIDATE 0xA6 raw 07 80 1A 08 C6 09 07 80 1A 08 C6 09 07 80 1A 08 C6 09 07 80 1A 08 C6 09 07 80 1A 08 C6 09 07 80 1A 08 C6 09 07 80 1A 08 C6 09
Completed candidate 7/16
CANDIDATE 0xA7 BASELINE heartbeat-compatible RX: 29 bytes, offset 1, 4 frames + 5 bytes
14:49:44.172 TX primer frame 006 00 00 00 00 80 DA
14:49:44.781 TX candidate 0xA7 frame 006 00 00 A7 00 80 7D
14:49:44.781 CANDIDATE 0xA7 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:49:44.781 CANDIDATE 0xA7 raw 07 80 1A 08 D6 19 07 80 1A 08 D6 19 07 80 1A 08 D6 19 07 80 1A 08 D6 19 07 80 1A 08 D6 19 07 80 1A 08 D6 19 07 80 1A 08 D6 19
Completed candidate 8/16
CANDIDATE 0xA8 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:49:55.419 TX primer frame 006 00 00 00 00 80 DA
14:49:56.029 TX candidate 0xA8 frame 006 00 00 A8 00 80 72
14:49:56.029 CANDIDATE 0xA8 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:49:56.029 CANDIDATE 0xA8 raw 07 80 6A 40 30 C7 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 9/16
CANDIDATE 0xA9 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:50:08.463 TX primer frame 006 00 00 00 00 80 DA
14:50:09.075 TX candidate 0xA9 frame 006 00 00 A9 00 80 73
14:50:09.075 CANDIDATE 0xA9 ANOMALY 47 RX bytes; first mismatch at byte 0: got 00, heartbeat offset 4 expected 80
14:50:09.075 CANDIDATE 0xA9 raw 00 00 00 80 DA 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F 07 80 6A 20 D8 4F
Completed candidate 10/16
CANDIDATE 0xAA BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:50:19.356 TX primer frame 006 00 00 00 00 80 DA
14:50:19.965 TX candidate 0xAA frame 006 00 00 AA 00 80 70
14:50:19.965 CANDIDATE 0xAA ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:50:19.965 CANDIDATE 0xAA raw 07 80 35 10 0C F4 07 80 35 10 0C F4 07 80 35 10 0C F4 07 80 35 10 0C F4 07 80 35 10 0C F4 07 80 35 10 0C F4 07 80 35 10 0C F4
Completed candidate 11/16
CANDIDATE 0xAB BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:50:33.133 TX primer frame 006 00 00 00 00 80 DA
14:50:33.743 TX candidate 0xAB frame 006 00 00 AB 00 80 71
14:50:33.743 CANDIDATE 0xAB ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:50:33.743 CANDIDATE 0xAB raw 07 80 35 10 2C D4 07 80 35 10 2C D4 07 80 35 10 2C D4 07 80 35 10 2C D4 07 80 35 10 2C D4 07 80 35 10 2C D4 07 80 35 10 2C D4
Completed candidate 12/16
CANDIDATE 0xAC BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:50:49.511 TX primer frame 006 00 00 00 00 80 DA
14:50:50.120 TX candidate 0xAC frame 006 00 00 AC 00 80 76
14:50:50.120 CANDIDATE 0xAC ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:50:50.120 CANDIDATE 0xAC raw 07 80 6B 40 30 C6 07 80 6B 40 30 C6 07 80 6B 40 30 C6 07 80 6B 40 30 C6 07 80 6B 40 30 C6 07 80 6B 40 30 C6 07 80 6B 40 30 C6
Completed candidate 13/16
CANDIDATE 0xAD BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:51:03.030 TX primer frame 006 00 00 00 00 80 DA
14:51:03.640 TX candidate 0xAD frame 006 00 00 AD 00 80 77
14:51:03.640 CANDIDATE 0xAD ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:51:03.640 CANDIDATE 0xAD raw 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E 07 80 6B 20 D8 4E
Completed candidate 14/16
CANDIDATE 0xAE BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:51:32.943 TX primer frame 006 00 00 00 00 80 DA
14:51:33.552 TX candidate 0xAE frame 006 00 00 AE 00 80 74
14:51:33.552 CANDIDATE 0xAE ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:51:33.552 CANDIDATE 0xAE raw 07 80 0D 04 A3 77 07 80 0D 04 A3 77 07 80 0D 04 A3 77 07 80 0D 04 A3 77 07 80 0D 04 A3 77 07 80 0D 04 A3 77 07 80 0D 04 A3 77
Completed candidate 15/16
CANDIDATE 0xAF BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:51:51.382 TX primer frame 006 00 00 00 00 80 DA
14:51:51.991 TX candidate 0xAF frame 006 00 00 AF 00 80 75
14:51:51.991 CANDIDATE 0xAF ANOMALY 41 RX bytes; first mismatch at byte 0: got 00, heartbeat offset 4 expected 80
14:51:51.991 CANDIDATE 0xAF raw 00 00 00 80 DA 07 80 0D 04 AB 7F 07 80 0D 04 AB 7F 07 80 0D 04 AB 7F 07 80 0D 04 AB 7F 07 80 0D 04 AB 7F 07 80 0D 04 AB 7F
Completed candidate 16/16
Anomalies: 16

View File

@@ -0,0 +1,66 @@
Primer/candidate sweep: primer 00 00 00 00 80 DA, 11 candidates on COM5 at 38400 8N1
CANDIDATE 0xB1 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:45:48.741 TX primer frame 006 00 00 00 00 80 DA
14:45:49.351 TX candidate 0xB1 frame 006 00 00 B1 00 80 6B
14:45:49.351 CANDIDATE 0xB1 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:45:49.351 CANDIDATE 0xB1 raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
Completed candidate 1/11
CANDIDATE 0xB6 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:46:00.508 TX primer frame 006 00 00 00 00 80 DA
14:46:01.117 TX candidate 0xB6 frame 006 00 00 B6 00 80 6C
14:46:01.117 CANDIDATE 0xB6 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:46:01.117 CANDIDATE 0xB6 raw 07 80 1B 08 C6 08 07 80 1B 08 C6 08 07 80 1B 08 C6 08 07 80 1B 08 C6 08 07 80 1B 08 C6 08 07 80 1B 08 C6 08 07 80 1B 08 C6 08
Completed candidate 2/11
CANDIDATE 0xB7 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:46:14.984 TX primer frame 006 00 00 00 00 80 DA
14:46:15.595 TX candidate 0xB7 frame 006 00 00 B7 00 80 6D
14:46:15.595 CANDIDATE 0xB7 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:46:15.595 CANDIDATE 0xB7 raw 07 80 1B 08 F6 38 07 80 1B 08 F6 38 07 80 1B 08 F6 38 07 80 1B 08 F6 38 07 80 1B 08 F6 38 07 80 1B 08 F6 38 07 80 1B 08 F6 38
Completed candidate 3/11
CANDIDATE 0xB8 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:46:26.859 TX primer frame 006 00 00 00 00 80 DA
14:46:27.470 TX candidate 0xB8 frame 006 00 00 B8 00 80 62
14:46:27.470 CANDIDATE 0xB8 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:46:27.470 CANDIDATE 0xB8 raw 07 80 EE 40 30 43 07 80 EE 40 30 43 07 80 EE 40 30 43 07 80 EE 40 30 43 07 80 EE 40 30 43 07 80 EE 40 30 43 07 80 EE 40 30 43
Completed candidate 4/11
CANDIDATE 0xB9 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:46:39.937 TX primer frame 006 00 00 00 00 80 DA
14:46:40.546 TX candidate 0xB9 frame 006 00 00 B9 00 80 63
14:46:40.546 CANDIDATE 0xB9 ANOMALY 41 RX bytes; first mismatch at byte 0: got 00, heartbeat offset 4 expected 80
14:46:40.546 CANDIDATE 0xB9 raw 00 00 00 80 DA 07 80 6E 20 D8 4B 07 80 6E 20 D8 4B 07 80 6E 20 D8 4B 07 80 6E 20 D8 4B 07 80 6E 20 D8 4B 07 80 6E 20 D8 4B
Completed candidate 5/11
CANDIDATE 0xBA BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:46:51.553 TX primer frame 006 00 00 00 00 80 DA
14:46:52.164 TX candidate 0xBA frame 006 00 00 BA 00 80 60
14:46:52.164 CANDIDATE 0xBA ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:46:52.164 CANDIDATE 0xBA raw 07 80 37 10 0C F6 07 80 37 10 0C F6 07 80 37 10 0C F6 07 80 37 10 0C F6 07 80 37 10 0C F6 07 80 37 10 0C F6 07 80 37 10 0C F6
Completed candidate 6/11
CANDIDATE 0xBB BASELINE heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:47:03.106 TX primer frame 006 00 00 00 00 80 DA
14:47:03.718 TX candidate 0xBB frame 006 00 00 BB 00 80 61
14:47:03.718 CANDIDATE 0xBB ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:47:03.718 CANDIDATE 0xBB raw 07 80 37 10 2C D6 07 80 37 10 2C D6 07 80 37 10 2C D6 07 80 37 10 2C D6 07 80 37 10 2C D6 07 80 37 10 2C D6 07 80 37 10 2C D6
Completed candidate 7/11
CANDIDATE 0xBC BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:47:13.483 TX primer frame 006 00 00 00 00 80 DA
14:47:14.092 TX candidate 0xBC frame 006 00 00 BC 00 80 66
14:47:14.092 CANDIDATE 0xBC ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:47:14.092 CANDIDATE 0xBC raw 07 80 EF 40 30 42 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 8/11
CANDIDATE 0xBD BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:47:27.366 TX primer frame 006 00 00 00 00 80 DA
14:47:27.976 TX candidate 0xBD frame 006 00 00 BD 00 80 67
14:47:27.976 CANDIDATE 0xBD ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:47:27.976 CANDIDATE 0xBD raw 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A 07 80 6F 20 D8 4A
Completed candidate 9/11
CANDIDATE 0xBE BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:47:39.896 TX primer frame 006 00 00 00 00 80 DA
14:47:40.503 TX candidate 0xBE frame 006 00 00 BE 00 80 64
14:47:40.503 CANDIDATE 0xBE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Completed candidate 10/11
CANDIDATE 0xBF BASELINE heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
14:47:50.628 TX primer frame 006 00 00 00 00 80 DA
14:47:51.238 TX candidate 0xBF frame 006 00 00 BF 00 80 65
14:47:51.238 CANDIDATE 0xBF heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
Completed candidate 11/11
Anomalies: 9

View File

@@ -0,0 +1,97 @@
Primer/candidate sweep: primer 00 00 00 00 80 DA, 16 candidates on COM5 at 38400 8N1
CANDIDATE 0xC0 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:52:21.270 TX primer frame 006 00 00 00 00 80 DA
14:52:21.881 TX candidate 0xC0 frame 006 00 00 C0 00 80 1A
14:52:21.881 CANDIDATE 0xC0 heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
Completed candidate 1/16
CANDIDATE 0xC1 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:52:33.733 TX primer frame 006 00 00 00 00 80 DA
14:52:34.344 TX candidate 0xC1 frame 006 00 00 C1 00 80 1B
14:52:34.344 CANDIDATE 0xC1 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:52:34.344 CANDIDATE 0xC1 raw 07 80 70 20 D8 55 07 80 70 20 D8 55 07 80 70 20 D8 55 07 80 70 20 D8 55 07 80 70 20 D8 55 07 80 70 20 D8 55 07 80 70 20 D8 55
Completed candidate 2/16
CANDIDATE 0xC2 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:52:45.838 TX primer frame 006 00 00 00 00 80 DA
14:52:46.445 TX candidate 0xC2 frame 006 00 00 C2 00 80 18
14:52:46.445 CANDIDATE 0xC2 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:52:46.445 CANDIDATE 0xC2 raw 07 80 38 10 0C F9 07 80 38 10 0C F9 07 80 38 10 0C F9 07 80 38 10 0C F9 07 80 38 10 0C F9 07 80 38 10 0C F9 07 80 38 10 0C F9
Completed candidate 3/16
CANDIDATE 0xC3 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:52:57.631 TX primer frame 006 00 00 00 00 80 DA
14:52:58.240 TX candidate 0xC3 frame 006 00 00 C3 00 80 19
14:52:58.240 CANDIDATE 0xC3 ANOMALY 41 RX bytes; first mismatch at byte 0: got 00, heartbeat offset 4 expected 80
14:52:58.240 CANDIDATE 0xC3 raw 00 00 00 80 DA 07 80 38 10 2C D9 07 80 38 10 2C D9 07 80 38 10 2C D9 07 80 38 10 2C D9 07 80 38 10 2C D9 07 80 38 10 2C D9
Completed candidate 4/16
CANDIDATE 0xC4 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:53:08.501 TX primer frame 006 00 00 00 00 80 DA
14:53:09.109 TX candidate 0xC4 frame 006 00 00 C4 00 80 1E
14:53:09.109 CANDIDATE 0xC4 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:53:09.109 CANDIDATE 0xC4 raw 07 80 71 40 30 DC 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 5/16
CANDIDATE 0xC5 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:53:19.519 TX primer frame 006 00 00 00 00 80 DA
14:53:20.128 TX candidate 0xC5 frame 006 00 00 C5 00 80 1F
14:53:20.128 CANDIDATE 0xC5 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:53:20.128 CANDIDATE 0xC5 raw 07 80 71 20 D8 54 07 80 71 20 D8 54 07 80 71 20 D8 54 07 80 71 20 D8 54 07 80 71 20 D8 54 07 80 71 20 D8 54 07 80 71 20 D8 54
Completed candidate 6/16
CANDIDATE 0xC6 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:53:31.064 TX primer frame 006 00 00 00 00 80 DA
14:53:31.676 TX candidate 0xC6 frame 006 00 00 C6 00 80 1C
14:53:31.676 CANDIDATE 0xC6 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:53:31.676 CANDIDATE 0xC6 raw 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F 07 80 1C 08 C6 0F
Completed candidate 7/16
CANDIDATE 0xC7 BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
14:53:49.649 TX primer frame 006 00 00 00 00 80 DA
14:53:50.259 TX candidate 0xC7 frame 006 00 00 C7 00 80 1D
14:53:50.259 CANDIDATE 0xC7 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
14:53:50.259 CANDIDATE 0xC7 raw 07 80 1C 08 D6 1F 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA 00 00 00 00 80 DA
Completed candidate 8/16
CANDIDATE 0xC8 BASELINE heartbeat-compatible RX: 29 bytes, offset 1, 4 frames + 5 bytes
14:54:02.047 TX primer frame 006 00 00 00 00 80 DA
14:54:02.656 TX candidate 0xC8 frame 006 00 00 C8 00 80 12
14:54:02.656 CANDIDATE 0xC8 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:54:02.656 CANDIDATE 0xC8 raw 07 80 72 40 30 DF 07 80 72 40 30 DF 07 80 72 40 30 DF 07 80 72 40 30 DF 07 80 72 40 30 DF 07 80 72 40 30 DF 07 80 72 40 30 DF
Completed candidate 9/16
CANDIDATE 0xC9 BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:54:14.717 TX primer frame 006 00 00 00 00 80 DA
14:54:15.326 TX candidate 0xC9 frame 006 00 00 C9 00 80 13
14:54:15.326 CANDIDATE 0xC9 ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:54:15.326 CANDIDATE 0xC9 raw 07 80 72 20 D8 57 07 80 72 20 D8 57 07 80 72 20 D8 57 07 80 72 20 D8 57 07 80 72 20 D8 57 07 80 72 20 D8 57 07 80 72 20 D8 57
Completed candidate 10/16
CANDIDATE 0xCA BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:54:29.004 TX primer frame 006 00 00 00 00 80 DA
14:54:29.616 TX candidate 0xCA frame 006 00 00 CA 00 80 10
14:54:29.616 CANDIDATE 0xCA ANOMALY 39 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:54:29.616 CANDIDATE 0xCA raw 07 80 39 10 0C F8 07 80 39 10 0C F8 07 80 39 10 0C F8 07 80 39 10 0C F8 07 80 39 10 0C F8 07 80 39 10 0C F8 07 80 39
Completed candidate 11/16
CANDIDATE 0xCB BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:54:42.342 TX primer frame 006 00 00 00 00 80 DA
14:54:42.952 TX candidate 0xCB frame 006 00 00 CB 00 80 11
14:54:42.952 CANDIDATE 0xCB ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:54:42.952 CANDIDATE 0xCB raw 07 80 39 10 2C D8 07 80 39 10 2C D8 07 80 39 10 2C D8 07 80 39 10 2C D8 07 80 39 10 2C D8 07 80 39 10 2C D8 07 80 39 10 2C D8
Completed candidate 12/16
CANDIDATE 0xCC BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:54:55.757 TX primer frame 006 00 00 00 00 80 DA
14:54:56.367 TX candidate 0xCC frame 006 00 00 CC 00 80 16
14:54:56.367 CANDIDATE 0xCC ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:54:56.367 CANDIDATE 0xCC raw 07 80 F3 40 30 5E 07 80 F3 40 30 5E 07 80 F3 40 30 5E 07 80 F3 40 30 5E 07 80 F3 40 30 5E 07 80 F3 40 30 5E 07 80 F3 40 30 5E
Completed candidate 13/16
CANDIDATE 0xCD BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:55:09.547 TX primer frame 006 00 00 00 00 80 DA
14:55:10.155 TX candidate 0xCD frame 006 00 00 CD 00 80 17
14:55:10.155 CANDIDATE 0xCD ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:55:10.155 CANDIDATE 0xCD raw 07 80 73 20 D8 56 07 80 73 20 D8 56 07 80 73 20 D8 56 07 80 73 20 D8 56 07 80 73 20 D8 56 07 80 73 20 D8 56 07 80 73 20 D8 56
Completed candidate 14/16
CANDIDATE 0xCE BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:55:21.792 TX primer frame 006 00 00 00 00 80 DA
14:55:22.400 TX candidate 0xCE frame 006 00 00 CE 00 80 14
14:55:22.400 CANDIDATE 0xCE ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:55:22.400 CANDIDATE 0xCE raw 07 80 0E 04 A3 74 07 80 0E 04 A3 74 07 80 0E 04 A3 74 07 80 0E 04 A3 74 07 80 0E 04 A3 74 07 80 0E 04 A3 74 07 80 0E 04 A3 74
Completed candidate 15/16
CANDIDATE 0xCF BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
14:55:32.994 TX primer frame 006 00 00 00 00 80 DA
14:55:33.602 TX candidate 0xCF frame 006 00 00 CF 00 80 15
14:55:33.602 CANDIDATE 0xCF ANOMALY 42 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
14:55:33.602 CANDIDATE 0xCF raw 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C 07 80 0E 04 AB 7C
Completed candidate 16/16
Anomalies: 15

View File

@@ -0,0 +1,11 @@
Direct response sweep: 5 frames x 1 cycles (5 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:46:41.102 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:46:41.929 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB2 state=0x00 value=0x80 frame 006 00 00 B2 00 80 68
13:46:41.929 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:46:41.929 RX raw 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7
13:46:42.752 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB3 state=0x00 value=0x80 frame 006 00 00 B3 00 80 69
13:46:43.577 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB4 state=0x00 value=0x80 frame 006 00 00 B4 00 80 6E
13:46:44.400 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 1

View File

@@ -0,0 +1,10 @@
Direct response sweep: 4 frames x 1 cycles (4 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:51:07.753 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:51:08.574 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:51:08.574 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:51:08.574 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
13:51:09.396 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:51:10.220 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 1

View File

@@ -0,0 +1,9 @@
Direct response sweep: 2 frames x 1 cycles (2 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:47:32.862 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:47:33.688 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:47:33.688 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:47:33.688 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
FINAL ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
FINAL raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -0,0 +1,12 @@
Direct response sweep: 6 frames x 1 cycles (6 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
13:51:31.244 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:51:32.067 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:51:32.067 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:51:32.067 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
13:51:32.893 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:51:33.720 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:51:34.544 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:51:35.366 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 1

View File

@@ -0,0 +1,9 @@
Direct response sweep: 2 frames x 1 cycles (2 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:47:48.759 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:47:49.581 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
13:47:49.581 ANOMALY 24 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:47:49.581 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
FINAL ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 0 expected 00
FINAL raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -0,0 +1,14 @@
Direct response sweep: 8 frames x 1 cycles (8 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:50:40.514 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:50:41.338 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB2 state=0x00 value=0x80 frame 006 00 00 B2 00 80 68
13:50:41.338 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:50:41.338 RX raw 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7
13:50:42.161 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:50:42.989 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB3 state=0x00 value=0x80 frame 006 00 00 B3 00 80 69
13:50:43.813 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:50:44.638 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB4 state=0x00 value=0x80 frame 006 00 00 B4 00 80 6E
13:50:45.458 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:50:46.280 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 1

View File

@@ -0,0 +1,11 @@
Direct response sweep: 5 frames x 1 cycles (5 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:47:04.045 TX cycle=1 p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
13:47:04.870 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB2 state=0x00 value=0x80 frame 006 00 00 B2 00 80 68
13:47:04.870 ANOMALY 30 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:47:04.870 RX raw 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7 07 80 36 10 0C F7
13:47:05.694 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB3 state=0x00 value=0x80 frame 006 00 00 B3 00 80 69
13:47:06.518 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB4 state=0x00 value=0x80 frame 006 00 00 B4 00 80 6E
13:47:07.341 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
FINAL heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
Anomalies: 1

View File

@@ -674,6 +674,11 @@ Recommended first direct sweep:
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00-0xFF" --states 0x00 --values 0x80 --after-each 0.6 --stop-on-anomaly --log captures/rcp-direct-cmd-00-ff.txt python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00-0xFF" --states 0x00 --values 0x80 --after-each 0.6 --stop-on-anomaly --log captures/rcp-direct-cmd-00-ff.txt
``` ```
For a long sweep where every anomaly should be logged but the panel needs a
fresh power cycle before continuing, use `--pause-on-anomaly` instead of
`--stop-on-anomaly`. After the prompt, power-cycle the RCP, wait for the normal
heartbeat, then press Enter.
What to watch for: What to watch for:
- If the script reports `Anomalies: 0`, the panel never sent raw bytes that - If the script reports `Anomalies: 0`, the panel never sent raw bytes that
@@ -1413,3 +1418,742 @@ Optional latch test, without power-cycling after the first run:
```powershell ```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --cycles 3 --cycle-pause 2 --log captures/rcp-latch-primer-00-b5-cycles.txt python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --cycles 3 --cycle-pause 2 --log captures/rcp-latch-primer-00-b5-cycles.txt
``` ```
## Current Inferred Behavior
The current evidence suggests the RCP is entering a discovery/query/status-read
phase, not a completed active-control handshake.
Working model:
```text
Host/CCU -> RCP: valid primer frame
Host/CCU -> RCP: selected query/status command
RCP -> Host/CCU: checksum-valid response frame repeated briefly
RCP -> Host/CCU: returns to heartbeat
```
Important details:
- Single selected commands such as `B2`, `B6`, and `B7` do not respond from a
cold panel.
- A preceding valid frame is required. `00 00 00 00 80 DA` works as a generic
primer for several selected commands.
- The second command selects the response payload.
- The LCD can remain `CONNECT NOT ACT` while serial responses vary in a
structured way. Serial response does not yet mean the active control session
is accepted.
- At least some primed queries appear one-shot after power-up. Repeating the
same primed query without power-cycling can produce only heartbeat traffic.
Likely protocol role:
- These `B0`-range commands may be a CCU discovery or capability/status query
phase.
- The CCU may query RCP model/capability/state blocks before sending a later
activation/session command.
- The next unknown is the command or command sequence that follows these
discovery responses and moves the panel from `CONNECT NOT ACT` to active.
## Primer-Candidate Broad Sweep
Use `scripts/serial_primer_candidate_sweep.py` for broader searches based on
the current primer/query model. It sends:
```text
primer frame -> candidate frame -> raw RX classification
```
For clean mapping, use `--prompt-power-cycle` and power-cycle before each
candidate. This avoids the one-shot/latch behavior contaminating later
candidates.
Example dry run:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xB0-0xB7" --dry-run
```
Continue the known `B` range first:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xB1 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF" --prompt-power-cycle --stop-on-anomaly --log captures/rcp-primer-sweep-b1-bf.txt
```
Because `--stop-on-anomaly` stops at the first response, after each hit:
1. Save the reported candidate and response frame.
2. Power-cycle the panel.
3. Restart the sweep from the next unmapped candidate.
For non-stop mapping, omit `--stop-on-anomaly`, but still power-cycle at each
prompt:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xB8-0xBF" --prompt-power-cycle --log captures/rcp-primer-sweep-b8-bf.txt
```
Suggested broad ranges after `B0-BF`:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xA0-0xAF" --prompt-power-cycle --log captures/rcp-primer-sweep-a0-af.txt
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xC0-0xCF" --prompt-power-cycle --log captures/rcp-primer-sweep-c0-cf.txt
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0x00-0x1F" --prompt-power-cycle --log captures/rcp-primer-sweep-00-1f.txt
```
Recommended first run:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xB1 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF" --prompt-power-cycle --log captures/rcp-primer-sweep-b1-bf.txt
```
## Primer Reuse and Sequential Query Tests
Two open questions:
1. After a cold boot, does the RCP only answer one selected query before it
latches/suppresses further responses?
2. Is a fresh primer required before every selected query, or can one primer
unlock several selected commands in sequence?
Use `scripts/serial_direct_response_sweep.py` for these tests because it can
send arbitrary command sequences without stopping between commands. For each
test below, power-cycle once before starting the script, then do not power-cycle
again until the script exits.
### Test S1: One Primer, Multiple Different Queries
Purpose: test whether one primer can unlock several different selected commands.
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB2 0xB3 0xB4 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-one-primer-b2-b5.txt
```
Interpretation:
- If only `B2` responds, the panel likely allows one selected response per
cold-boot/primer state.
- If `B2`, `B3`, `B4`, and `B5` all respond, one primer can unlock multiple
sequential queries.
- If some respond and some do not, there may be command-group or latch behavior.
### Test S2: Primer Before Every Query, No Power Cycle
Purpose: test whether a new primer can re-arm another selected query without
power-cycling.
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB2 0x00 0xB3 0x00 0xB4 0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-reprimer-b2-b5.txt
```
Interpretation:
- If every selected command responds, a primer is required before each query but
power-cycling is not.
- If only the first selected command responds, power-cycle or another reset-like
command may be required to clear the latch.
### Test S3: Repeat Same Query With and Without Reprimer
Purpose: test whether the same selected query can be repeated in one powered
session.
Without re-primer:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5 0xB5 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-repeat-b5-no-reprimer.txt
```
Power-cycle, then with re-primer:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5 0x00 0xB5 0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-repeat-b5-reprimer.txt
```
Interpretation:
- If only the first `B5` responds in both tests, the response is one-shot until
power cycle or a yet-unknown reset/ack command.
- If the re-primer version responds repeatedly, the primer re-arms the selected
query.
### 2026-05-13 Sequential Query Test Result
Captures:
- `captures/rcp-seq-one-primer-b2-b5.txt`
- `captures/rcp-seq-reprimer-b2-b5.txt`
- `captures/rcp-seq-repeat-b5-no-reprimer.txt`
- `captures/rcp-seq-repeat-b5-reprimer.txt`
Valid result:
| Test | Intended sequence | Actual sequence sent | Result |
| --- | --- | --- | --- |
| S1 | `00 -> B2 -> B3 -> B4 -> B5` | `00 -> B2 -> B3 -> B4 -> B5` | only `B2` responded: `07 80 36 10 0C F7` |
Tooling caveat:
- The original `serial_direct_response_sweep.py` de-duplicated command lists.
- Because of that, sequences containing repeated commands did not run as
intended.
- `S2`, `S3 no re-primer`, and `S3 re-primer` need to be rerun after the
script fix.
- The script has been updated to preserve repeated command values in explicit
command lists.
Interpretation from S1:
- One primer did not unlock a whole list of feature/status queries.
- After `00 -> B2` returned `07 80 36 10 0C F7`, later `B3`, `B4`, and `B5`
in the same powered session did not produce additional non-heartbeat frames.
- This supports a one-response latch model unless the re-primer test proves that
the primer can re-arm another query.
Rerun these tests after the script fix:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB2 0x00 0xB3 0x00 0xB4 0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-reprimer-b2-b5-v2.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5 0xB5 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-repeat-b5-no-reprimer-v2.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0x00 0xB5 0x00 0xB5 0x00 0xB5" --states 0x00 --values 0x80 --settle 3 --after-each 0.8 --log captures/rcp-seq-repeat-b5-reprimer-v2.txt
```
### 2026-05-13 Sequential Query Rerun Result
Captures:
- `captures/rcp-seq-reprimer-b2-b5-v2.txt`
- `captures/rcp-seq-repeat-b5-no-reprimer-v2.txt`
- `captures/rcp-seq-repeat-b5-reprimer-v2.txt`
These reruns used the fixed `serial_direct_response_sweep.py`, which preserves
repeated command values in explicit sequences.
Results:
| Test | Sequence | Non-heartbeat response(s) |
| --- | --- | --- |
| Re-primer between different queries | `00 -> B2 -> 00 -> B3 -> 00 -> B4 -> 00 -> B5` | only `B2`: `07 80 36 10 0C F7` |
| Repeat `B5`, no re-primer | `00 -> B5 -> B5 -> B5` | only first `B5`: `07 80 6D 20 D8 48` |
| Repeat `B5`, re-primer each time | `00 -> B5 -> 00 -> B5 -> 00 -> B5` | only first `B5`: `07 80 6D 20 D8 48` |
Interpretation:
- The RCP appears to allow only one selected query response per powered session
in the current `CONNECT NOT ACT` state.
- Sending another primer (`00 00 00 00 80 DA`) after the first response does not
re-arm the query responder.
- Repeating the same selected query does not produce another response.
- This strongly suggests a one-shot discovery/status response followed by a
required next-stage command, acknowledgement, reset, or activation step.
Implication for CCU behavior:
- The CCU may not scan a list of feature queries in the current state. It may
send one discovery/status query, receive one response, then decide what
activation/session command to send next.
- Alternatively, additional feature reads may require an acknowledgement or
state-advance command that has not yet been identified.
Recommended next direction:
- Stop broad feature scanning for the moment.
- Search for the post-discovery acknowledgement/activation command that follows
one known response such as `00 -> B5 => 07 80 6D 20 D8 48`.
- Use a three-step pattern:
```text
primer -> selected query -> candidate activation/ack command
```
Known reproducible setup:
```text
Host -> RCP: 00 00 00 00 80 DA
Host -> RCP: 00 00 B5 00 80 6F
RCP -> Host: 07 80 6D 20 D8 48
Host -> RCP: candidate next-stage command
```
## Post-Discovery Candidate Sweep
Use `scripts/serial_post_discovery_sweep.py` to search for the command that
comes after one known discovery/status response. This is the likely next stage
after the one-shot response behavior.
Default setup:
```text
primer: 00 00 00 00 80 DA
query: 00 00 B5 00 80 6F
RCP: 07 80 6D 20 D8 48
then: candidate next-stage command
```
Recommended first post-discovery sweep:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x00-0x1F" --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-00-1f.txt
```
For each candidate:
1. Power-cycle the RCP.
2. Wait for heartbeat/panel stable.
3. Press Enter at the prompt.
4. Watch for any screen change after the candidate frame.
5. Type the screen state if it changes, or press Enter for no visible change.
Why this range first:
- Earlier frame-length tests showed small command values can change screen state
to `CONNECT NOT ACT`.
- If a simple ACK/activation command exists, it may be in the low command range.
Next ranges if `00-1F` does not change state:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x20-0x3F" --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-20-3f.txt
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x80-0x9F" --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-80-9f.txt
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0xB0-0xBF" --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-b0-bf.txt
```
If any candidate changes the screen away from `CONNECT NOT ACT`, or produces a
new RCP response after the candidate stage, retest that candidate alone with
three fresh power cycles.
### 2026-05-13 Post-Discovery Sweep `00-1F` Result
Capture:
- `captures/rcp-post-discovery-b5-candidates-00-1f.txt`
Sweep setup:
```text
primer: 00 00 00 00 80 DA
query: 00 00 B5 00 80 6F
expected: 07 80 6D 20 D8 48
candidate: 00-1F
```
Screen result:
- Every candidate remained at `CONNECT NOT ACT` / `CONNECTION NOT ACT`.
- No candidate in `0x00-0x1F` moved the panel into an active state.
Serial result:
- Most candidates produced only heartbeat-compatible traffic after the candidate
frame.
- Candidate windows for `0x00`, `0x0E`, `0x0F`, `0x1A`, `0x1E`, and `0x1F`
included additional bytes matching the known discovery response
`07 80 6D 20 D8 48`.
- Those candidate-window anomalies are likely trailing/repeated discovery
response frames from the `B5` query, not new candidate-specific responses.
Notable outlier:
- During candidate `0x03`, the primer read window contained
`07 80 40 40 30 ED`, followed by heartbeat.
- This is checksum-valid, but it occurred before the `B5` query in that test
window. Treat it as an outlier until reproduced. Possible explanations include
incomplete power-cycle reset, a previous state/latch edge, or an accidental
timing artifact.
Interpretation:
- Low command range `0x00-0x1F` does not appear to contain the simple
post-discovery activation command when tested after the `B5` discovery query.
- The script's candidate read window can still catch residual discovery
response frames; candidate anomalies must be checked against the known query
response before treating them as new behavior.
Recommended next sweep:
Use a slightly longer query read window so the known discovery response has more
time to finish before the candidate frame:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x20-0x3F" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-20-3f.txt
```
If `20-3F` also keeps the screen at `CONNECT NOT ACT`, continue:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x80-0x9F" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-80-9f.txt
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0xB0-0xBF" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-discovery-b5-candidates-b0-bf.txt
```
## Post-Discovery Test Ladder
Before manually sweeping every command byte, sample representative patterns from
several command regions. The goal is to identify which command families are
worth expanding.
Use the same known discovery setup for each sample:
```text
primer: 00 00 00 00 80 DA
query: 00 00 B5 00 80 6F
RCP: 07 80 6D 20 D8 48
then: sampled candidate command
```
Power-cycle before each candidate prompt. Type any screen change, otherwise
press Enter.
### Ladder 1: Low-Range Sanity Sample
The full `00-1F` sweep did not activate the panel, but one outlier appeared
during the `0x03` test. Retest only representative low bytes plus the outlier:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x00 0x01 0x03 0x07 0x0F 0x10 0x1B 0x1F" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-low-sample.txt
```
What this checks:
- `0x00`, `0x01`: no-op / ACK-like small commands.
- `0x03`: the outlier run produced `07 80 40 40 30 ED`.
- `0x07`, `0x0F`, `0x1F`: bit-mask/boundary values.
- `0x10`, `0x1B`: response command-family values observed in RCP frames.
### Ladder 2: Response-Command Echo Sample
Test host commands that match command bytes seen in RCP responses. If the CCU
acknowledges or advances using related command IDs, these are good candidates.
Observed RCP response command bytes so far:
```text
1B 36 40 6C 6D
```
Run:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x1B 0x36 0x40 0x6C 0x6D" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-response-cmds.txt
```
Expand only if one of these changes screen state or produces a new
candidate-stage response.
### Ladder 3: Boundary and Bit-Pattern Sample
This tests command bytes that often mark command classes, flags, or boundaries:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0x20 0x2F 0x30 0x3F 0x40 0x4F 0x50 0x5F 0x7F 0x80 0x8F 0x90 0x9F 0xA0 0xAF 0xB0 0xBF 0xC0 0xCF 0xE0 0xEF 0xF0 0xFF" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-boundaries.txt
```
What this checks:
- Nibble/region boundaries.
- The high-bit transition at `0x80`.
- Known discovery query region around `0xB0`.
- High command space around `0xE0-0xFF`.
### Ladder 4: Known Query Region Sample
The `B0` range is known to produce discovery/status responses when used as the
selected query. It may also contain a next-stage command.
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --candidates "0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0xB7 0xB8 0xBF" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-b-region.txt
```
If any `B` candidate changes behavior, expand locally around it rather than
sweeping the full byte space.
### Ladder 5: Alternate Discovery Response Bases
If all candidate ladders after `00 -> B5` leave the screen at `CONNECT NOT ACT`,
try the same sampled candidates after a different discovery query. Different RCP
responses may expect different follow-up ACKs.
Use `B2` discovery:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --query-command 0xB2 --candidates "0x00 0x01 0x1B 0x36 0x40 0x6C 0x6D 0x80 0xB0 0xB5 0xFF" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-after-b2.txt
```
Use `B0` discovery:
```powershell
python scripts/serial_post_discovery_sweep.py --port COM5 --query-command 0xB0 --candidates "0x00 0x01 0x1B 0x36 0x40 0x6C 0x6D 0x80 0xB0 0xB5 0xFF" --after-query 2.0 --prompt-power-cycle --prompt-screen --log captures/rcp-post-ladder-after-b0.txt
```
Interpretation:
- If a candidate only works after one discovery response, the next-stage command
may depend on the returned block.
- If the same candidate works after multiple discovery responses, it is a
stronger activation/ACK candidate.
### When to Expand
Expand a region only when one of these occurs:
- Screen changes away from `CONNECT NOT ACT`.
- RCP sends a new candidate-stage frame that is not the known discovery response
trailing into the candidate window.
- The panel begins sending different heartbeat/status frames after the
candidate.
If none of the ladder samples produce a new behavior, stop command-byte guessing
and test other frame fields for the candidate stage: state byte, value byte, or
prefix bytes.
### 2026-05-13 Ladder 1 Result and Keepalive Hypothesis
Capture:
- `captures/rcp-post-ladder-low-sample.txt`
Ladder 1 candidates:
```text
00 01 03 07 0F 10 1B 1F
```
Result:
- Every sampled candidate left the screen at `CONNECT NOT ACT`.
- Candidate-stage RX was heartbeat-compatible for all candidates.
- The earlier `0x03` outlier did not reproduce.
- Query-stage response `07 80 6D 20 D8 48` reproduced reliably before each
candidate.
Interpretation:
- The low/outlier sample did not find a post-discovery activation/ACK command.
- `CONNECT NOT ACT` may be unrelated to a one-shot ACK. It may mean the RCP sees
host traffic but is not receiving the correct ongoing CCU heartbeat/session
cadence.
Alternative working model:
```text
Host sends discovery/status query
RCP answers once
Host must then send a sustained keepalive/session heartbeat
RCP remains CONNECT NOT ACT until that heartbeat/cadence is correct
```
### Keepalive After Discovery Tests
Use `scripts/serial_keepalive_after_query.py` to test whether a sustained host
heartbeat changes the RCP state after a known discovery response.
Default setup:
```text
primer: 00 00 00 00 80 DA
query: 00 00 B5 00 80 6F
RCP reply: 07 80 6D 20 D8 48
keepalive: repeated candidate frame
```
Test K1: repeat the known primer/heartbeat shape:
```powershell
python scripts/serial_keepalive_after_query.py --port COM5 --keepalive-command 0x00 --duration 15 --interval 0.6 --prompt-screen --log captures/rcp-keepalive-after-b5-cmd00-600ms.txt
```
Test K2: repeat the zero-state frame:
```powershell
python scripts/serial_keepalive_after_query.py --port COM5 --keepalive-frame "00 00 00 00 00 5A" --duration 15 --interval 0.6 --prompt-screen --log captures/rcp-keepalive-after-b5-zero-state-600ms.txt
```
Test K3: repeat the alternate state frame:
```powershell
python scripts/serial_keepalive_after_query.py --port COM5 --keepalive-frame "00 00 00 80 00 DA" --duration 15 --interval 0.6 --prompt-screen --log captures/rcp-keepalive-after-b5-state80-600ms.txt
```
Test K4: faster primer/heartbeat cadence:
```powershell
python scripts/serial_keepalive_after_query.py --port COM5 --keepalive-command 0x00 --duration 15 --interval 0.2 --prompt-screen --log captures/rcp-keepalive-after-b5-cmd00-200ms.txt
```
Power-cycle before each keepalive test. Watch for:
- Screen changing away from `CONNECT NOT ACT`.
- Pin 4 changing from heartbeat to another recurring status frame.
- RCP controls beginning to transmit additional button/status data.
### 2026-05-13 Keepalive After Discovery Result
Captures:
- `captures/rcp-keepalive-after-b5-cmd00-600ms.txt`
- `captures/rcp-keepalive-after-b5-zero-state-600ms.txt`
- `captures/rcp-keepalive-after-b5-state80-600ms.txt`
- `captures/rcp-keepalive-after-b5-cmd00-200ms.txt`
Result:
| Test | Keepalive frame | Cadence | Screen result | Pin 4 RX |
| --- | --- | --- | --- | --- |
| K1 | `00 00 00 00 80 DA` | 0.6 s | `CONNECT NOT ACT` | heartbeat-compatible |
| K2 | `00 00 00 00 00 5A` | 0.6 s | `CONNECT NOT ACT` | heartbeat-compatible |
| K3 | `00 00 00 80 00 DA` | 0.6 s | `CONNECT NOT ACT` | heartbeat-compatible |
| K4 | `00 00 00 00 80 DA` | 0.2 s | `CONNECT NOT ACT` | heartbeat-compatible |
Interpretation:
- A simple sustained host heartbeat after `00 -> B5` does not activate the RCP.
- The RCP continues emitting only the known heartbeat-compatible stream on pin
4 during these keepalive attempts.
- The correct next stage is probably not just "repeat the primer" or "hold a
no-op frame at CCU cadence".
- The better next branch is to map additional `primer -> request` commands that
cause one-shot RCP responses. Those response blocks may reveal the command
families, status bits, or identity data needed for the later activation step.
Recommended next request sweep:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xB1 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF" --prompt-power-cycle --log captures/rcp-primer-sweep-b1-bf.txt
```
Power-cycle before each candidate prompt. This fills the gaps around the known
`B0-B5` discovery/status region and checks whether `B8-BF` contain additional
one-shot readable blocks.
If this range is quiet, continue with neighboring command regions:
```powershell
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xA0-0xAF" --prompt-power-cycle --log captures/rcp-primer-sweep-a0-af.txt
python scripts/serial_primer_candidate_sweep.py --port COM5 --candidates "0xC0-0xCF" --prompt-power-cycle --log captures/rcp-primer-sweep-c0-cf.txt
```
### 2026-05-13 Primer Sweep A/B/C Region Result
Captures:
- `captures/rcp-primer-sweep-a0-af.txt`
- `captures/rcp-primer-sweep-b1-bf.tx`
- `captures/rcp-primer-sweep-c0-cf.txt`
These sweeps used a fresh power cycle before each candidate, with the standard
primer shape before the selected request:
```text
primer: 00 00 00 00 80 DA
candidate: 00 00 CMD 00 80 CHECKSUM
```
New selected-command response map:
| Selected command | Observed RCP response |
| ---: | --- |
| `A0` | `07 80 68 40 30 C5` |
| `A1` | `07 80 68 20 D8 4D` |
| `A2` | `07 80 34 10 0C F5` |
| `A3` | `07 80 34 10 2C D5` |
| `A4` | `07 80 69 40 30 C4` |
| `A5` | `07 80 69 20 D8 4C` |
| `A6` | `07 80 1A 08 C6 09` |
| `A7` | `07 80 1A 08 D6 19` |
| `A8` | `07 80 6A 40 30 C7` |
| `A9` | `07 80 6A 20 D8 4F` |
| `AA` | `07 80 35 10 0C F4` |
| `AB` | `07 80 35 10 2C D4` |
| `AC` | `07 80 6B 40 30 C6` |
| `AD` | `07 80 6B 20 D8 4E` |
| `AE` | `07 80 0D 04 A3 77` |
| `AF` | `07 80 0D 04 AB 7F` |
| `B1` | `07 80 6C 20 D8 49` |
| `B6` | `07 80 1B 08 C6 08` |
| `B7` | `07 80 1B 08 F6 38` |
| `B8` | `07 80 EE 40 30 43` |
| `B9` | `07 80 6E 20 D8 4B` |
| `BA` | `07 80 37 10 0C F6` |
| `BB` | `07 80 37 10 2C D6` |
| `BC` | `07 80 EF 40 30 42` |
| `BD` | `07 80 6F 20 D8 4A` |
| `BE` | heartbeat only |
| `BF` | heartbeat only |
| `C0` | heartbeat only |
| `C1` | `07 80 70 20 D8 55` |
| `C2` | `07 80 38 10 0C F9` |
| `C3` | `07 80 38 10 2C D9` |
| `C4` | `07 80 71 40 30 DC` |
| `C5` | `07 80 71 20 D8 54` |
| `C6` | `07 80 1C 08 C6 0F` |
| `C7` | `07 80 1C 08 D6 1F` |
| `C8` | `07 80 72 40 30 DF` |
| `C9` | `07 80 72 20 D8 57` |
| `CA` | `07 80 39 10 0C F8` |
| `CB` | `07 80 39 10 2C D8` |
| `CC` | `07 80 F3 40 30 5E` |
| `CD` | `07 80 73 20 D8 56` |
| `CE` | `07 80 0E 04 A3 74` |
| `CF` | `07 80 0E 04 AB 7C` |
Interpretation:
- The RCP has a much larger one-shot readable status/query surface than first
assumed.
- The `A0-CF` region looks highly structured. Most commands return stable
six-byte responses with the same `07 80` prefix and valid XOR checksum.
- Pairs often share a response command byte and differ in state/value fields:
`A0/A1`, `A2/A3`, `A4/A5`, `A6/A7`, and similar patterns continue through
the `B` and `C` regions.
- `BE`, `BF`, and `C0` are current no-response candidates in this mapping.
- This strongly supports a discovery/status table model: the CCU may read a
specific set of one-shot blocks, then choose a later activation/session
command based on the returned table values.
### 2026-05-13 Paused Direct Sweep Result
Capture:
- `captures/rcp-direct-remaining-after-b5-pause.txt`
The paused direct sweep logged anomalies and then allowed a manual power cycle
before continuing. Because the script continues with the next command after the
pause, this run is useful for finding response-producing commands, but it is
not a clean `00 -> B5 -> candidate` post-discovery sweep.
Response hits observed in this run:
| Command at anomaly | Observed RCP response | Caution |
| ---: | --- | --- |
| `B5` | `07 80 6D 20 D8 48` | expected known query response |
| `40` | `07 80 50 40 30 FD` | repeated twice in this run |
| `6D` | `07 80 5B 20 D8 7E` | may depend on prior `6C` |
| `4F` | `07 80 0A 04 AB 78` | needs clean one-per-boot confirmation |
| `8F` | `07 80 0C 04 AB 7E` | may depend on prior sequence |
| `A0` | `07 80 E8 40 30 45` | differs from primer-sweep `A0` response |
| `B0` | `07 80 6C 40 30 C1` | known response |
| `CF` | `07 80 0E 04 AB 7C` | matches primer-sweep `CF` response |
| `EF` | `07 80 0F 04 EB 3D` | needs clean one-per-boot confirmation |
| `B1` | `07 80 6C 20 D8 49` | known response |
| `B3` | `07 80 36 10 2C D7` | known response |
| `B6` | `07 80 1B 08 C6 08` | known response |
| `B8` | `07 80 6E 40 30 C3` | differs from primer-sweep `B8` response |
| `BA` | `07 80 37 10 0C F6` | matches primer-sweep `BA` response |
| `BC` | `07 80 6F 40 30 C2` | differs from primer-sweep `BC` response |
Next confirmations:
- Retest `40`, `4F`, `8F`, `EF`, and the differing `A0/B8/BC` cases as clean
one-per-boot primer pairs.
- If a response differs between a plain/direct command and a primer-pair query,
treat the first host frame as a mode/context selector rather than only a
generic wake-up primer.

View File

@@ -58,7 +58,7 @@ def parse_byte_set(text: str) -> list[int]:
values.append(parse_byte(part)) values.append(parse_byte(part))
if not values: if not values:
raise argparse.ArgumentTypeError("empty byte set") raise argparse.ArgumentTypeError("empty byte set")
return list(dict.fromkeys(values)) return values
def build_frame(prefix1: int, prefix2: int, command: int, state: int, value: int) -> bytes: def build_frame(prefix1: int, prefix2: int, command: int, state: int, value: int) -> bytes:
@@ -159,6 +159,11 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--log", help="append sweep log to this file") parser.add_argument("--log", help="append sweep log to this file")
parser.add_argument("--dry-run", action="store_true") parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--stop-on-anomaly", action="store_true") parser.add_argument("--stop-on-anomaly", action="store_true")
parser.add_argument(
"--pause-on-anomaly",
action="store_true",
help="after logging an anomaly, wait for Enter so the RCP can be power-cycled before continuing",
)
parser.add_argument("--verbose-heartbeat", action="store_true") parser.add_argument("--verbose-heartbeat", action="store_true")
parser.add_argument("--cycles", type=int, default=1) parser.add_argument("--cycles", type=int, default=1)
parser.add_argument("--cycle-pause", type=float, default=0.0) parser.add_argument("--cycle-pause", type=float, default=0.0)
@@ -171,6 +176,18 @@ def parse_args() -> argparse.Namespace:
return parser.parse_args() return parser.parse_args()
def pause_after_anomaly(ser: serial.Serial, emit, label: str) -> bool:
answer = input(
f"{label}: anomaly logged. Power-cycle RCP, wait for heartbeat, "
"then press Enter to continue (q then Enter to stop): "
).strip()
if answer.lower() in {"q", "quit", "stop"}:
emit("Stopped after anomaly pause.")
return False
ser.reset_input_buffer()
return True
def main() -> int: def main() -> int:
args = parse_args() args = parse_args()
if args.cycles < 1: if args.cycles < 1:
@@ -253,6 +270,13 @@ def main() -> int:
emit("Stopping after anomaly.") emit("Stopping after anomaly.")
should_stop = True should_stop = True
break break
if args.pause_on_anomaly and not pause_after_anomaly(
ser,
emit,
f"cmd=0x{command:02X}",
):
should_stop = True
break
elif args.verbose_heartbeat: elif args.verbose_heartbeat:
emit(f"{stamp} {note}") emit(f"{stamp} {note}")
@@ -269,6 +293,12 @@ def main() -> int:
if args.stop_on_anomaly: if args.stop_on_anomaly:
emit("Stopping after anomaly.") emit("Stopping after anomaly.")
break break
if args.pause_on_anomaly and not pause_after_anomaly(
ser,
emit,
f"cycle {cycle} pause",
):
break
final_rx = read_window(ser, args.after) final_rx = read_window(ser, args.after)
final_anomaly, final_note = classify_rx(final_rx) final_anomaly, final_note = classify_rx(final_rx)

View File

@@ -0,0 +1,201 @@
#!/usr/bin/env python3
"""Send discovery query, then repeat a candidate host keepalive frame.
This tests the hypothesis that the RCP enters CONNECT NOT ACT because it sees
some host traffic but does not receive the expected ongoing CCU heartbeat.
"""
from __future__ import annotations
import argparse
import datetime as dt
import sys
import time
try:
import serial
except ImportError:
print(
"Missing dependency: pyserial\n"
"Install it with: python -m pip install pyserial",
file=sys.stderr,
)
raise SystemExit(2)
HEARTBEAT = bytes.fromhex("00 00 00 00 80 DA")
def parse_byte(text: str) -> int:
value = int(text, 0)
if not 0 <= value <= 0xFF:
raise argparse.ArgumentTypeError(f"must be a byte: {text}")
return value
def parse_hex_bytes(text: str) -> bytes:
parts = text.replace(",", " ").replace("0x", "").replace("0X", "").split()
values = [int(part, 16) for part in parts]
if not values:
raise argparse.ArgumentTypeError("hex frame cannot be empty")
if any(value < 0 or value > 0xFF for value in values):
raise argparse.ArgumentTypeError("hex values must be bytes")
return bytes(values)
def build_frame(prefix1: int, prefix2: int, command: int, state: int, value: int) -> bytes:
body = bytes([prefix1, prefix2, command, state, value])
checksum = 0x5A
for byte in body:
checksum ^= byte
return body + bytes([checksum])
def hex_preview(data: bytes) -> str:
return " ".join(f"{byte:02X}" for byte in data)
def make_logger(path: str | None):
log_file = open(path, "a", encoding="utf-8") if path else None
def emit(line: str) -> None:
print(line)
if log_file:
log_file.write(line + "\n")
log_file.flush()
return emit, log_file
def heartbeat_offset(data: bytes) -> int | None:
if not data:
return 0
for offset in range(len(HEARTBEAT)):
if all(byte == HEARTBEAT[(offset + index) % len(HEARTBEAT)] for index, byte in enumerate(data)):
return offset
return None
def classify_rx(data: bytes) -> str:
if not data:
return "no RX bytes"
offset = heartbeat_offset(data)
if offset is not None:
full = len(data) // len(HEARTBEAT)
extra = len(data) % len(HEARTBEAT)
return f"heartbeat-compatible RX: {len(data)} bytes, offset {offset}, {full} frames + {extra} bytes"
return f"NON_HEARTBEAT RX: {len(data)} bytes {hex_preview(data)}"
def read_window(ser: serial.Serial, duration: float) -> bytes:
stop_at = time.monotonic() + duration
data = bytearray()
while time.monotonic() < stop_at:
chunk = ser.read(128)
if chunk:
data.extend(chunk)
return bytes(data)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Send discovery query, then repeat a candidate keepalive frame."
)
parser.add_argument("--port", required=True, help="serial port, for example COM5")
parser.add_argument("--baud", type=int, default=38400)
parser.add_argument("--primer-command", type=parse_byte, default=0x00)
parser.add_argument("--query-command", type=parse_byte, default=0xB5)
parser.add_argument("--state", type=parse_byte, default=0x00)
parser.add_argument("--value", type=parse_byte, default=0x80)
parser.add_argument(
"--keepalive-frame",
type=parse_hex_bytes,
help="explicit keepalive frame; default builds from --keepalive-command",
)
parser.add_argument("--keepalive-command", type=parse_byte, default=0x00)
parser.add_argument("--duration", type=float, default=10.0)
parser.add_argument("--interval", type=float, default=0.6)
parser.add_argument("--settle", type=float, default=3.0)
parser.add_argument("--after-query", type=float, default=2.0)
parser.add_argument("--timeout", type=float, default=0.03)
parser.add_argument("--log", help="append log to this file")
parser.add_argument("--prompt-screen", action="store_true")
parser.add_argument("--dry-run", action="store_true")
return parser.parse_args()
def main() -> int:
args = parse_args()
primer = build_frame(0x00, 0x00, args.primer_command, args.state, args.value)
query = build_frame(0x00, 0x00, args.query_command, args.state, args.value)
keepalive = args.keepalive_frame or build_frame(0x00, 0x00, args.keepalive_command, args.state, args.value)
if args.dry_run:
print(f"primer: {hex_preview(primer)}")
print(f"query: {hex_preview(query)}")
print(f"keepalive: {hex_preview(keepalive)} every {args.interval}s for {args.duration}s")
return 0
emit, log_file = make_logger(args.log)
try:
with serial.Serial(
port=args.port,
baudrate=args.baud,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=args.timeout,
write_timeout=1.0,
rtscts=False,
dsrdtr=False,
xonxoff=False,
) as ser:
ser.reset_input_buffer()
emit(f"Keepalive-after-query on {ser.port} at {ser.baudrate} 8N1")
emit(f"Primer {hex_preview(primer)}; query {hex_preview(query)}; keepalive {hex_preview(keepalive)}")
emit(f"BASELINE {classify_rx(read_window(ser, args.settle))}")
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX primer {hex_preview(primer)}")
ser.write(primer)
ser.flush()
emit(f"{stamp} PRIMER RX {classify_rx(read_window(ser, args.interval))}")
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX query {hex_preview(query)}")
ser.write(query)
ser.flush()
emit(f"{stamp} QUERY RX {classify_rx(read_window(ser, args.after_query))}")
stop_at = time.monotonic() + args.duration
count = 0
while time.monotonic() < stop_at:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
ser.write(keepalive)
ser.flush()
count += 1
emit(f"{stamp} TX keepalive {count:03d} {hex_preview(keepalive)}")
rx = read_window(ser, min(args.interval, max(0.0, stop_at - time.monotonic())))
if rx:
emit(f"{stamp} KEEPALIVE RX {classify_rx(rx)}")
if args.prompt_screen:
screen = input("Screen after keepalive run (blank = no change): ").strip()
if screen:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} SCREEN {screen}")
except KeyboardInterrupt:
emit("Stopped.")
return 0
except serial.SerialException as exc:
print(f"Serial error: {exc}", file=sys.stderr)
return 1
finally:
if log_file:
log_file.close()
return 0
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -0,0 +1,302 @@
#!/usr/bin/env python3
"""Sweep candidate commands after a known RCP-TX7 discovery response.
Current working sequence:
primer -> discovery query -> RCP response -> candidate next-stage command
By default this uses:
primer: 00 00 00 00 80 DA
query: 00 00 B5 00 80 6F
Use --prompt-power-cycle for clean testing because the RCP appears to latch after
one selected query response per powered session.
"""
from __future__ import annotations
import argparse
import datetime as dt
import sys
import time
try:
import serial
except ImportError:
print(
"Missing dependency: pyserial\n"
"Install it with: python -m pip install pyserial",
file=sys.stderr,
)
raise SystemExit(2)
HEARTBEAT = bytes.fromhex("00 00 00 00 80 DA")
def parse_byte(text: str) -> int:
value = int(text, 0)
if not 0 <= value <= 0xFF:
raise argparse.ArgumentTypeError(f"must be a byte: {text}")
return value
def parse_byte_set(text: str) -> list[int]:
values: list[int] = []
for part in text.replace(",", " ").split():
if "-" in part:
start_text, end_text = part.split("-", 1)
start = parse_byte(start_text)
end = parse_byte(end_text)
if end < start:
raise argparse.ArgumentTypeError(f"bad range: {part}")
values.extend(range(start, end + 1))
else:
values.append(parse_byte(part))
if not values:
raise argparse.ArgumentTypeError("empty byte set")
return values
def build_frame(prefix1: int, prefix2: int, command: int, state: int, value: int) -> bytes:
body = bytes([prefix1, prefix2, command, state, value])
checksum = 0x5A
for byte in body:
checksum ^= byte
return body + bytes([checksum])
def hex_preview(data: bytes) -> str:
return " ".join(f"{byte:02X}" for byte in data)
def make_logger(path: str | None):
log_file = open(path, "a", encoding="utf-8") if path else None
def emit(line: str) -> None:
print(line)
if log_file:
log_file.write(line + "\n")
log_file.flush()
return emit, log_file
def heartbeat_offset(data: bytes) -> int | None:
if not data:
return 0
for offset in range(len(HEARTBEAT)):
if all(byte == HEARTBEAT[(offset + index) % len(HEARTBEAT)] for index, byte in enumerate(data)):
return offset
return None
def first_mismatch(data: bytes, offset: int) -> tuple[int, int, int] | None:
for index, byte in enumerate(data):
expected = HEARTBEAT[(offset + index) % len(HEARTBEAT)]
if byte != expected:
return index, byte, expected
return None
def classify_rx(data: bytes) -> tuple[bool, str]:
if not data:
return False, "no RX bytes"
offset = heartbeat_offset(data)
if offset is not None:
full = len(data) // len(HEARTBEAT)
extra = len(data) % len(HEARTBEAT)
return False, f"heartbeat-compatible RX: {len(data)} bytes, offset {offset}, {full} frames + {extra} bytes"
best_offset = min(
range(len(HEARTBEAT)),
key=lambda candidate: sum(
byte != HEARTBEAT[(candidate + index) % len(HEARTBEAT)]
for index, byte in enumerate(data)
),
)
mismatch = first_mismatch(data, best_offset)
if mismatch is None:
return False, "heartbeat-compatible RX"
index, byte, expected = mismatch
return (
True,
f"ANOMALY {len(data)} RX bytes; first mismatch at byte {index}: "
f"got {byte:02X}, heartbeat offset {best_offset} expected {expected:02X}",
)
def read_window(ser: serial.Serial, duration: float) -> bytes:
stop_at = time.monotonic() + duration
data = bytearray()
while time.monotonic() < stop_at:
chunk = ser.read(128)
if chunk:
data.extend(chunk)
return bytes(data)
def emit_rx(emit, label: str, data: bytes) -> bool:
is_anomaly, note = classify_rx(data)
emit(f"{label} {note}")
if is_anomaly:
emit(f"{label} raw {hex_preview(data)}")
return is_anomaly
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Sweep next-stage commands after a known discovery query."
)
parser.add_argument("--port", required=True, help="serial port, for example COM5")
parser.add_argument("--baud", type=int, default=38400)
parser.add_argument("--prefix1", type=parse_byte, default=0x00)
parser.add_argument("--prefix2", type=parse_byte, default=0x00)
parser.add_argument("--primer-command", type=parse_byte, default=0x00)
parser.add_argument("--primer-state", type=parse_byte, default=0x00)
parser.add_argument("--primer-value", type=parse_byte, default=0x80)
parser.add_argument("--query-command", type=parse_byte, default=0xB5)
parser.add_argument("--query-state", type=parse_byte, default=0x00)
parser.add_argument("--query-value", type=parse_byte, default=0x80)
parser.add_argument("--candidates", type=parse_byte_set, required=True)
parser.add_argument("--candidate-state", type=parse_byte, default=0x00)
parser.add_argument("--candidate-value", type=parse_byte, default=0x80)
parser.add_argument("--settle", type=float, default=3.0)
parser.add_argument("--between", type=float, default=0.8)
parser.add_argument("--after-query", type=float, default=1.2)
parser.add_argument("--after-candidate", type=float, default=2.0)
parser.add_argument("--timeout", type=float, default=0.03)
parser.add_argument("--log", help="append sweep log to this file")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--prompt-power-cycle", action="store_true")
parser.add_argument("--prompt-screen", action="store_true")
parser.add_argument("--stop-on-candidate-anomaly", action="store_true")
return parser.parse_args()
def main() -> int:
args = parse_args()
primer = build_frame(
args.prefix1,
args.prefix2,
args.primer_command,
args.primer_state,
args.primer_value,
)
query = build_frame(
args.prefix1,
args.prefix2,
args.query_command,
args.query_state,
args.query_value,
)
candidates = [
(
command,
build_frame(
args.prefix1,
args.prefix2,
command,
args.candidate_state,
args.candidate_value,
),
)
for command in args.candidates
]
if args.dry_run:
print(f"primer cmd 0x{args.primer_command:02X}: {hex_preview(primer)}")
print(f"query cmd 0x{args.query_command:02X}: {hex_preview(query)}")
for command, frame in candidates:
print(f"candidate 0x{command:02X}: {hex_preview(frame)}")
return 0
emit, log_file = make_logger(args.log)
try:
with serial.Serial(
port=args.port,
baudrate=args.baud,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=args.timeout,
write_timeout=1.0,
rtscts=False,
dsrdtr=False,
xonxoff=False,
) as ser:
emit(
f"Post-discovery sweep: primer {hex_preview(primer)}, "
f"query {hex_preview(query)}, {len(candidates)} candidates "
f"on {ser.port} at {ser.baudrate} 8N1"
)
for index, (command, candidate) in enumerate(candidates, start=1):
if args.prompt_power_cycle:
answer = input(
f"Power-cycle RCP for candidate 0x{command:02X}, wait for heartbeat, "
"then press Enter (q then Enter to stop): "
).strip()
if answer.lower() in {"q", "quit", "stop"}:
emit("Stopped before next candidate.")
break
ser.reset_input_buffer()
emit_rx(emit, f"CANDIDATE 0x{command:02X} BASELINE", read_window(ser, args.settle))
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX primer frame {len(primer):03d} {hex_preview(primer)}")
ser.write(primer)
ser.flush()
emit_rx(emit, f"{stamp} PRIMER RX", read_window(ser, args.between))
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX query 0x{args.query_command:02X} frame {len(query):03d} {hex_preview(query)}")
ser.write(query)
ser.flush()
emit_rx(emit, f"{stamp} QUERY RX", read_window(ser, args.after_query))
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX candidate 0x{command:02X} frame {len(candidate):03d} {hex_preview(candidate)}")
ser.write(candidate)
ser.flush()
candidate_anomaly = emit_rx(
emit,
f"{stamp} CANDIDATE 0x{command:02X} RX",
read_window(ser, args.after_candidate),
)
if args.prompt_screen:
screen = input(
f"Screen after candidate 0x{command:02X} "
"(blank = no change, q = stop): "
).strip()
if screen:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} SCREEN candidate=0x{command:02X} {screen}")
if screen.lower() in {"q", "quit", "stop"}:
break
if candidate_anomaly and args.stop_on_candidate_anomaly:
emit("Stopping after candidate anomaly.")
break
emit(f"Completed candidate {index}/{len(candidates)}")
except KeyboardInterrupt:
emit("Stopped.")
return 0
except serial.SerialException as exc:
print(f"Serial error: {exc}", file=sys.stderr)
return 1
finally:
if log_file:
log_file.close()
return 0
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -0,0 +1,278 @@
#!/usr/bin/env python3
"""Sweep RCP-TX7 primer -> candidate query pairs.
The current working model is that a valid host frame primes the RCP and the next
host frame selects a status/query response. This helper sends one primer frame
followed by one candidate frame and classifies raw pin-4 RX against the known
heartbeat stream.
Use --prompt-power-cycle for clean mapping: power-cycle the RCP before each
candidate, press Enter, then the script sends exactly one primer/candidate pair.
"""
from __future__ import annotations
import argparse
import datetime as dt
import sys
import time
try:
import serial
except ImportError:
print(
"Missing dependency: pyserial\n"
"Install it with: python -m pip install pyserial",
file=sys.stderr,
)
raise SystemExit(2)
HEARTBEAT = bytes.fromhex("00 00 00 00 80 DA")
def parse_byte(text: str) -> int:
value = int(text, 0)
if not 0 <= value <= 0xFF:
raise argparse.ArgumentTypeError(f"must be a byte: {text}")
return value
def parse_byte_set(text: str) -> list[int]:
values: list[int] = []
for part in text.replace(",", " ").split():
if "-" in part:
start_text, end_text = part.split("-", 1)
start = parse_byte(start_text)
end = parse_byte(end_text)
if end < start:
raise argparse.ArgumentTypeError(f"bad range: {part}")
values.extend(range(start, end + 1))
else:
values.append(parse_byte(part))
if not values:
raise argparse.ArgumentTypeError("empty byte set")
return list(dict.fromkeys(values))
def build_frame(prefix1: int, prefix2: int, command: int, state: int, value: int) -> bytes:
body = bytes([prefix1, prefix2, command, state, value])
checksum = 0x5A
for byte in body:
checksum ^= byte
return body + bytes([checksum])
def hex_preview(data: bytes) -> str:
return " ".join(f"{byte:02X}" for byte in data)
def make_logger(path: str | None):
log_file = open(path, "a", encoding="utf-8") if path else None
def emit(line: str) -> None:
print(line)
if log_file:
log_file.write(line + "\n")
log_file.flush()
return emit, log_file
def heartbeat_offset(data: bytes) -> int | None:
if not data:
return 0
for offset in range(len(HEARTBEAT)):
if all(byte == HEARTBEAT[(offset + index) % len(HEARTBEAT)] for index, byte in enumerate(data)):
return offset
return None
def first_mismatch(data: bytes, offset: int) -> tuple[int, int, int] | None:
for index, byte in enumerate(data):
expected = HEARTBEAT[(offset + index) % len(HEARTBEAT)]
if byte != expected:
return index, byte, expected
return None
def classify_rx(data: bytes) -> tuple[bool, str]:
if not data:
return False, "no RX bytes"
offset = heartbeat_offset(data)
if offset is not None:
full = len(data) // len(HEARTBEAT)
extra = len(data) % len(HEARTBEAT)
return False, f"heartbeat-compatible RX: {len(data)} bytes, offset {offset}, {full} frames + {extra} bytes"
best_offset = min(
range(len(HEARTBEAT)),
key=lambda candidate: sum(
byte != HEARTBEAT[(candidate + index) % len(HEARTBEAT)]
for index, byte in enumerate(data)
),
)
mismatch = first_mismatch(data, best_offset)
if mismatch is None:
return False, "heartbeat-compatible RX"
index, byte, expected = mismatch
return (
True,
f"ANOMALY {len(data)} RX bytes; first mismatch at byte {index}: "
f"got {byte:02X}, heartbeat offset {best_offset} expected {expected:02X}",
)
def read_window(ser: serial.Serial, duration: float) -> bytes:
stop_at = time.monotonic() + duration
data = bytearray()
while time.monotonic() < stop_at:
chunk = ser.read(128)
if chunk:
data.extend(chunk)
return bytes(data)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Sweep primer->candidate pairs and log non-heartbeat raw RX."
)
parser.add_argument("--port", required=True, help="serial port, for example COM5")
parser.add_argument("--baud", type=int, default=38400)
parser.add_argument("--prefix1", type=parse_byte, default=0x00)
parser.add_argument("--prefix2", type=parse_byte, default=0x00)
parser.add_argument("--primer-command", type=parse_byte, default=0x00)
parser.add_argument("--primer-state", type=parse_byte, default=0x00)
parser.add_argument("--primer-value", type=parse_byte, default=0x80)
parser.add_argument("--candidates", type=parse_byte_set, required=True)
parser.add_argument("--candidate-state", type=parse_byte, default=0x00)
parser.add_argument("--candidate-value", type=parse_byte, default=0x80)
parser.add_argument("--settle", type=float, default=3.0)
parser.add_argument("--between", type=float, default=0.6)
parser.add_argument("--after", type=float, default=1.5)
parser.add_argument("--timeout", type=float, default=0.03)
parser.add_argument("--log", help="append sweep log to this file")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--prompt-power-cycle", action="store_true")
parser.add_argument("--stop-on-anomaly", action="store_true")
return parser.parse_args()
def main() -> int:
args = parse_args()
primer = build_frame(
args.prefix1,
args.prefix2,
args.primer_command,
args.primer_state,
args.primer_value,
)
candidates = [
(
command,
build_frame(
args.prefix1,
args.prefix2,
command,
args.candidate_state,
args.candidate_value,
),
)
for command in args.candidates
]
if args.dry_run:
print(f"primer cmd 0x{args.primer_command:02X}: {hex_preview(primer)}")
for command, frame in candidates:
print(f"candidate 0x{command:02X}: {hex_preview(frame)}")
return 0
emit, log_file = make_logger(args.log)
anomaly_count = 0
try:
with serial.Serial(
port=args.port,
baudrate=args.baud,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=args.timeout,
write_timeout=1.0,
rtscts=False,
dsrdtr=False,
xonxoff=False,
) as ser:
emit(
f"Primer/candidate sweep: primer {hex_preview(primer)}, "
f"{len(candidates)} candidates on {ser.port} at {ser.baudrate} 8N1"
)
for index, (command, candidate) in enumerate(candidates, start=1):
if args.prompt_power_cycle:
answer = input(
f"Power-cycle RCP for candidate 0x{command:02X}, wait for heartbeat, "
"then press Enter (q then Enter to stop): "
).strip()
if answer.lower() in {"q", "quit", "stop"}:
emit("Stopped before next candidate.")
break
ser.reset_input_buffer()
baseline = read_window(ser, args.settle)
baseline_anomaly, baseline_note = classify_rx(baseline)
emit(f"CANDIDATE 0x{command:02X} BASELINE {baseline_note}")
if baseline_anomaly:
emit(f"CANDIDATE 0x{command:02X} BASELINE raw {hex_preview(baseline)}")
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(f"{stamp} TX primer frame {len(primer):03d} {hex_preview(primer)}")
ser.write(primer)
ser.flush()
primer_rx = read_window(ser, args.between)
primer_anomaly, primer_note = classify_rx(primer_rx)
if primer_anomaly:
anomaly_count += 1
emit(f"{stamp} PRIMER {primer_note}")
emit(f"{stamp} PRIMER raw {hex_preview(primer_rx)}")
if args.stop_on_anomaly:
emit("Stopping after primer anomaly.")
break
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(
f"{stamp} TX candidate 0x{command:02X} "
f"frame {len(candidate):03d} {hex_preview(candidate)}"
)
ser.write(candidate)
ser.flush()
rx = read_window(ser, args.after)
is_anomaly, note = classify_rx(rx)
if is_anomaly:
anomaly_count += 1
emit(f"{stamp} CANDIDATE 0x{command:02X} {note}")
emit(f"{stamp} CANDIDATE 0x{command:02X} raw {hex_preview(rx)}")
if args.stop_on_anomaly:
emit("Stopping after candidate anomaly.")
break
else:
emit(f"{stamp} CANDIDATE 0x{command:02X} {note}")
emit(f"Completed candidate {index}/{len(candidates)}")
emit(f"Anomalies: {anomaly_count}")
except KeyboardInterrupt:
emit("Stopped.")
return 0
except serial.SerialException as exc:
print(f"Serial error: {exc}", file=sys.stderr)
return 1
finally:
if log_file:
log_file.close()
return 0
if __name__ == "__main__":
raise SystemExit(main())