Response from RCP

This commit is contained in:
Aiden
2026-05-13 13:10:25 +10:00
parent f99a60710e
commit f406bc12a2
21 changed files with 2073 additions and 4 deletions

View File

@@ -0,0 +1,17 @@
Listening on COM5 at 38400 8N1; will send 00 00 B0 00 80 6A after 1.5s
12:58:47.795 RX 001 bytes 00
12:58:47.845 RX 005 bytes 00 00 00 80 DA
12:58:48.500 RX 006 bytes 00 00 00 00 80 DA
12:58:48.652 TX frame 006 00 00 B0 00 80 6A
12:58:49.208 RX 006 bytes 00 00 00 00 80 DA
12:58:49.461 RX 006 bytes 00 00 00 00 80 DA
12:58:49.714 RX 006 bytes 00 00 00 00 80 DA
12:58:49.967 RX 006 bytes 00 00 00 00 80 DA
12:58:50.220 RX 006 bytes 00 00 00 00 80 DA
12:58:50.472 RX 006 bytes 00 00 00 00 80 DA
12:58:51.127 RX 006 bytes 00 00 00 00 80 DA
12:58:51.782 RX 001 bytes 00
12:58:51.834 RX 005 bytes 00 00 00 80 DA
12:58:52.491 RX 001 bytes 00
12:58:52.542 RX 005 bytes 00 00 00 80 DA
12:58:53.199 RX 006 bytes 00 00 00 00 80 DA

View File

@@ -0,0 +1,15 @@
Listening on COM5 at 38400 8N1; will send 00 00 B1 00 80 6B after 1.5s
12:59:05.114 RX 006 bytes 00 00 00 00 80 DA
12:59:05.820 RX 006 bytes 00 00 00 00 80 DA
12:59:05.971 TX frame 006 00 00 B1 00 80 6B
12:59:06.525 RX 006 bytes 00 00 00 00 80 DA
12:59:06.777 RX 006 bytes 00 00 00 00 80 DA
12:59:07.031 RX 006 bytes 00 00 00 00 80 DA
12:59:07.283 RX 006 bytes 00 00 00 00 80 DA
12:59:07.535 RX 006 bytes 00 00 00 00 80 DA
12:59:07.787 RX 006 bytes 00 00 00 00 80 DA
12:59:08.393 RX 001 bytes 00
12:59:08.444 RX 005 bytes 00 00 00 80 DA
12:59:09.101 RX 006 bytes 00 00 00 00 80 DA
12:59:09.808 RX 006 bytes 00 00 00 00 80 DA
12:59:10.515 RX 006 bytes 00 00 00 00 80 DA

View File

@@ -0,0 +1,20 @@
Listening on COM5 at 38400 8N1; will send 00 00 B4 00 80 6E after 1.5s
12:55:25.765 RX 001 bytes 00
12:55:25.817 RX 005 bytes 00 00 00 80 DA
12:55:26.474 RX 006 bytes 00 00 00 00 80 DA
12:55:26.979 TX frame 006 00 00 B4 00 80 6E
12:55:27.180 RX 006 bytes 00 00 00 00 80 DA
12:55:27.433 RX 006 bytes 00 00 00 00 80 DA
12:55:27.685 RX 006 bytes 00 00 00 00 80 DA
12:55:27.938 RX 006 bytes 00 00 00 00 80 DA
12:55:28.190 RX 006 bytes 00 00 00 00 80 DA
12:55:28.442 RX 006 bytes 00 00 00 00 80 DA
12:55:28.694 RX 006 bytes 00 00 00 00 80 DA
12:55:28.948 RX 006 bytes 00 00 00 00 80 DA
12:55:29.558 RX 001 bytes 00
12:55:29.608 RX 005 bytes 00 00 00 80 DA
12:55:30.261 RX 001 bytes 00
12:55:30.312 RX 005 bytes 00 00 00 80 DA
12:55:30.968 RX 001 bytes 00
12:55:31.018 RX 005 bytes 00 00 00 80 DA
12:55:31.676 RX 006 bytes 00 00 00 00 80 DA

View File

@@ -0,0 +1,19 @@
Listening on COM5 at 38400 8N1; will send 00 00 B5 00 80 6F after 1.5s
12:55:41.489 RX 006 bytes 00 00 00 00 80 DA
12:55:42.195 RX 006 bytes 00 00 00 00 80 DA
12:55:42.848 TX frame 006 00 00 B5 00 80 6F
12:55:42.899 RX 006 bytes 00 00 00 00 80 DA
12:55:43.150 RX 006 bytes 00 00 00 00 80 DA
12:55:43.404 RX 006 bytes 00 00 00 00 80 DA
12:55:43.655 RX 006 bytes 00 00 00 00 80 DA
12:55:43.909 RX 006 bytes 00 00 00 00 80 DA
12:55:44.110 RX 001 bytes 00
12:55:44.161 RX 005 bytes 00 00 00 80 DA
12:55:44.363 RX 001 bytes 00
12:55:44.414 RX 005 bytes 00 00 00 80 DA
12:55:44.618 RX 001 bytes 00
12:55:44.669 RX 005 bytes 00 00 00 80 DA
12:55:45.275 RX 006 bytes 00 00 00 00 80 DA
12:55:45.984 RX 006 bytes 00 00 00 00 80 DA
12:55:46.689 RX 006 bytes 00 00 00 00 80 DA
12:55:47.396 RX 006 bytes 00 00 00 00 80 DA

View File

@@ -0,0 +1,18 @@
Listening on COM5 at 38400 8N1; will send 00 00 B6 00 80 6C after 1.5s
12:55:57.174 RX 006 bytes 00 00 00 00 80 DA
12:55:57.879 RX 006 bytes 00 00 00 00 80 DA
12:55:58.233 TX frame 006 00 00 B6 00 80 6C
12:55:58.587 RX 006 bytes 00 00 00 00 80 DA
12:55:58.839 RX 006 bytes 00 00 00 00 80 DA
12:55:59.092 RX 006 bytes 00 00 00 00 80 DA
12:55:59.345 RX 006 bytes 00 00 00 00 80 DA
12:55:59.597 RX 006 bytes 00 00 00 00 80 DA
12:55:59.849 RX 006 bytes 00 00 00 00 80 DA
12:56:00.101 RX 006 bytes 00 00 00 00 80 DA
12:56:00.758 RX 001 bytes 00
12:56:00.808 RX 005 bytes 00 00 00 80 DA
12:56:01.464 RX 001 bytes 00
12:56:01.515 RX 005 bytes 00 00 00 80 DA
12:56:02.168 RX 001 bytes 00
12:56:02.218 RX 005 bytes 00 00 00 80 DA
12:56:02.873 RX 006 bytes 00 00 00 00 80 DA

View File

@@ -0,0 +1,189 @@
Direct response sweep: 256 frames on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
12:49:52.045 TX p1=0x00 p2=0x00 cmd=0x00 state=0x00 value=0x80 frame 006 00 00 00 00 80 DA
12:49:52.656 TX p1=0x00 p2=0x00 cmd=0x01 state=0x00 value=0x80 frame 006 00 00 01 00 80 DB
12:49:53.265 TX p1=0x00 p2=0x00 cmd=0x02 state=0x00 value=0x80 frame 006 00 00 02 00 80 D8
12:49:53.874 TX p1=0x00 p2=0x00 cmd=0x03 state=0x00 value=0x80 frame 006 00 00 03 00 80 D9
12:49:54.482 TX p1=0x00 p2=0x00 cmd=0x04 state=0x00 value=0x80 frame 006 00 00 04 00 80 DE
12:49:55.093 TX p1=0x00 p2=0x00 cmd=0x05 state=0x00 value=0x80 frame 006 00 00 05 00 80 DF
12:49:55.705 TX p1=0x00 p2=0x00 cmd=0x06 state=0x00 value=0x80 frame 006 00 00 06 00 80 DC
12:49:56.314 TX p1=0x00 p2=0x00 cmd=0x07 state=0x00 value=0x80 frame 006 00 00 07 00 80 DD
12:49:56.924 TX p1=0x00 p2=0x00 cmd=0x08 state=0x00 value=0x80 frame 006 00 00 08 00 80 D2
12:49:57.535 TX p1=0x00 p2=0x00 cmd=0x09 state=0x00 value=0x80 frame 006 00 00 09 00 80 D3
12:49:58.145 TX p1=0x00 p2=0x00 cmd=0x0A state=0x00 value=0x80 frame 006 00 00 0A 00 80 D0
12:49:58.756 TX p1=0x00 p2=0x00 cmd=0x0B state=0x00 value=0x80 frame 006 00 00 0B 00 80 D1
12:49:59.367 TX p1=0x00 p2=0x00 cmd=0x0C state=0x00 value=0x80 frame 006 00 00 0C 00 80 D6
12:49:59.977 TX p1=0x00 p2=0x00 cmd=0x0D state=0x00 value=0x80 frame 006 00 00 0D 00 80 D7
12:50:00.588 TX p1=0x00 p2=0x00 cmd=0x0E state=0x00 value=0x80 frame 006 00 00 0E 00 80 D4
12:50:01.197 TX p1=0x00 p2=0x00 cmd=0x0F state=0x00 value=0x80 frame 006 00 00 0F 00 80 D5
12:50:01.808 TX p1=0x00 p2=0x00 cmd=0x10 state=0x00 value=0x80 frame 006 00 00 10 00 80 CA
12:50:02.417 TX p1=0x00 p2=0x00 cmd=0x11 state=0x00 value=0x80 frame 006 00 00 11 00 80 CB
12:50:03.027 TX p1=0x00 p2=0x00 cmd=0x12 state=0x00 value=0x80 frame 006 00 00 12 00 80 C8
12:50:03.638 TX p1=0x00 p2=0x00 cmd=0x13 state=0x00 value=0x80 frame 006 00 00 13 00 80 C9
12:50:04.248 TX p1=0x00 p2=0x00 cmd=0x14 state=0x00 value=0x80 frame 006 00 00 14 00 80 CE
12:50:04.857 TX p1=0x00 p2=0x00 cmd=0x15 state=0x00 value=0x80 frame 006 00 00 15 00 80 CF
12:50:05.469 TX p1=0x00 p2=0x00 cmd=0x16 state=0x00 value=0x80 frame 006 00 00 16 00 80 CC
12:50:06.077 TX p1=0x00 p2=0x00 cmd=0x17 state=0x00 value=0x80 frame 006 00 00 17 00 80 CD
12:50:06.687 TX p1=0x00 p2=0x00 cmd=0x18 state=0x00 value=0x80 frame 006 00 00 18 00 80 C2
12:50:07.301 TX p1=0x00 p2=0x00 cmd=0x19 state=0x00 value=0x80 frame 006 00 00 19 00 80 C3
12:50:07.940 TX p1=0x00 p2=0x00 cmd=0x1A state=0x00 value=0x80 frame 006 00 00 1A 00 80 C0
12:50:08.549 TX p1=0x00 p2=0x00 cmd=0x1B state=0x00 value=0x80 frame 006 00 00 1B 00 80 C1
12:50:09.161 TX p1=0x00 p2=0x00 cmd=0x1C state=0x00 value=0x80 frame 006 00 00 1C 00 80 C6
12:50:09.771 TX p1=0x00 p2=0x00 cmd=0x1D state=0x00 value=0x80 frame 006 00 00 1D 00 80 C7
12:50:10.409 TX p1=0x00 p2=0x00 cmd=0x1E state=0x00 value=0x80 frame 006 00 00 1E 00 80 C4
12:50:11.020 TX p1=0x00 p2=0x00 cmd=0x1F state=0x00 value=0x80 frame 006 00 00 1F 00 80 C5
12:50:11.658 TX p1=0x00 p2=0x00 cmd=0x20 state=0x00 value=0x80 frame 006 00 00 20 00 80 FA
12:50:12.275 TX p1=0x00 p2=0x00 cmd=0x21 state=0x00 value=0x80 frame 006 00 00 21 00 80 FB
12:50:12.886 TX p1=0x00 p2=0x00 cmd=0x22 state=0x00 value=0x80 frame 006 00 00 22 00 80 F8
12:50:13.496 TX p1=0x00 p2=0x00 cmd=0x23 state=0x00 value=0x80 frame 006 00 00 23 00 80 F9
12:50:14.109 TX p1=0x00 p2=0x00 cmd=0x24 state=0x00 value=0x80 frame 006 00 00 24 00 80 FE
12:50:14.718 TX p1=0x00 p2=0x00 cmd=0x25 state=0x00 value=0x80 frame 006 00 00 25 00 80 FF
12:50:15.325 TX p1=0x00 p2=0x00 cmd=0x26 state=0x00 value=0x80 frame 006 00 00 26 00 80 FC
12:50:15.934 TX p1=0x00 p2=0x00 cmd=0x27 state=0x00 value=0x80 frame 006 00 00 27 00 80 FD
12:50:16.545 TX p1=0x00 p2=0x00 cmd=0x28 state=0x00 value=0x80 frame 006 00 00 28 00 80 F2
12:50:17.155 TX p1=0x00 p2=0x00 cmd=0x29 state=0x00 value=0x80 frame 006 00 00 29 00 80 F3
12:50:17.763 TX p1=0x00 p2=0x00 cmd=0x2A state=0x00 value=0x80 frame 006 00 00 2A 00 80 F0
12:50:18.373 TX p1=0x00 p2=0x00 cmd=0x2B state=0x00 value=0x80 frame 006 00 00 2B 00 80 F1
12:50:18.981 TX p1=0x00 p2=0x00 cmd=0x2C state=0x00 value=0x80 frame 006 00 00 2C 00 80 F6
12:50:19.590 TX p1=0x00 p2=0x00 cmd=0x2D state=0x00 value=0x80 frame 006 00 00 2D 00 80 F7
12:50:20.199 TX p1=0x00 p2=0x00 cmd=0x2E state=0x00 value=0x80 frame 006 00 00 2E 00 80 F4
12:50:20.806 TX p1=0x00 p2=0x00 cmd=0x2F state=0x00 value=0x80 frame 006 00 00 2F 00 80 F5
12:50:21.415 TX p1=0x00 p2=0x00 cmd=0x30 state=0x00 value=0x80 frame 006 00 00 30 00 80 EA
12:50:22.023 TX p1=0x00 p2=0x00 cmd=0x31 state=0x00 value=0x80 frame 006 00 00 31 00 80 EB
12:50:22.633 TX p1=0x00 p2=0x00 cmd=0x32 state=0x00 value=0x80 frame 006 00 00 32 00 80 E8
12:50:23.244 TX p1=0x00 p2=0x00 cmd=0x33 state=0x00 value=0x80 frame 006 00 00 33 00 80 E9
12:50:23.852 TX p1=0x00 p2=0x00 cmd=0x34 state=0x00 value=0x80 frame 006 00 00 34 00 80 EE
12:50:24.459 TX p1=0x00 p2=0x00 cmd=0x35 state=0x00 value=0x80 frame 006 00 00 35 00 80 EF
12:50:25.072 TX p1=0x00 p2=0x00 cmd=0x36 state=0x00 value=0x80 frame 006 00 00 36 00 80 EC
12:50:25.681 TX p1=0x00 p2=0x00 cmd=0x37 state=0x00 value=0x80 frame 006 00 00 37 00 80 ED
12:50:26.294 TX p1=0x00 p2=0x00 cmd=0x38 state=0x00 value=0x80 frame 006 00 00 38 00 80 E2
12:50:26.902 TX p1=0x00 p2=0x00 cmd=0x39 state=0x00 value=0x80 frame 006 00 00 39 00 80 E3
12:50:27.513 TX p1=0x00 p2=0x00 cmd=0x3A state=0x00 value=0x80 frame 006 00 00 3A 00 80 E0
12:50:28.122 TX p1=0x00 p2=0x00 cmd=0x3B state=0x00 value=0x80 frame 006 00 00 3B 00 80 E1
12:50:28.732 TX p1=0x00 p2=0x00 cmd=0x3C state=0x00 value=0x80 frame 006 00 00 3C 00 80 E6
12:50:29.341 TX p1=0x00 p2=0x00 cmd=0x3D state=0x00 value=0x80 frame 006 00 00 3D 00 80 E7
12:50:29.951 TX p1=0x00 p2=0x00 cmd=0x3E state=0x00 value=0x80 frame 006 00 00 3E 00 80 E4
12:50:30.559 TX p1=0x00 p2=0x00 cmd=0x3F state=0x00 value=0x80 frame 006 00 00 3F 00 80 E5
12:50:31.168 TX p1=0x00 p2=0x00 cmd=0x40 state=0x00 value=0x80 frame 006 00 00 40 00 80 9A
12:50:31.777 TX p1=0x00 p2=0x00 cmd=0x41 state=0x00 value=0x80 frame 006 00 00 41 00 80 9B
12:50:32.388 TX p1=0x00 p2=0x00 cmd=0x42 state=0x00 value=0x80 frame 006 00 00 42 00 80 98
12:50:32.997 TX p1=0x00 p2=0x00 cmd=0x43 state=0x00 value=0x80 frame 006 00 00 43 00 80 99
12:50:33.605 TX p1=0x00 p2=0x00 cmd=0x44 state=0x00 value=0x80 frame 006 00 00 44 00 80 9E
12:50:34.219 TX p1=0x00 p2=0x00 cmd=0x45 state=0x00 value=0x80 frame 006 00 00 45 00 80 9F
12:50:34.825 TX p1=0x00 p2=0x00 cmd=0x46 state=0x00 value=0x80 frame 006 00 00 46 00 80 9C
12:50:35.436 TX p1=0x00 p2=0x00 cmd=0x47 state=0x00 value=0x80 frame 006 00 00 47 00 80 9D
12:50:36.043 TX p1=0x00 p2=0x00 cmd=0x48 state=0x00 value=0x80 frame 006 00 00 48 00 80 92
12:50:36.655 TX p1=0x00 p2=0x00 cmd=0x49 state=0x00 value=0x80 frame 006 00 00 49 00 80 93
12:50:37.264 TX p1=0x00 p2=0x00 cmd=0x4A state=0x00 value=0x80 frame 006 00 00 4A 00 80 90
12:50:37.875 TX p1=0x00 p2=0x00 cmd=0x4B state=0x00 value=0x80 frame 006 00 00 4B 00 80 91
12:50:38.484 TX p1=0x00 p2=0x00 cmd=0x4C state=0x00 value=0x80 frame 006 00 00 4C 00 80 96
12:50:39.093 TX p1=0x00 p2=0x00 cmd=0x4D state=0x00 value=0x80 frame 006 00 00 4D 00 80 97
12:50:39.705 TX p1=0x00 p2=0x00 cmd=0x4E state=0x00 value=0x80 frame 006 00 00 4E 00 80 94
12:50:40.314 TX p1=0x00 p2=0x00 cmd=0x4F state=0x00 value=0x80 frame 006 00 00 4F 00 80 95
12:50:40.925 TX p1=0x00 p2=0x00 cmd=0x50 state=0x00 value=0x80 frame 006 00 00 50 00 80 8A
12:50:41.534 TX p1=0x00 p2=0x00 cmd=0x51 state=0x00 value=0x80 frame 006 00 00 51 00 80 8B
12:50:42.143 TX p1=0x00 p2=0x00 cmd=0x52 state=0x00 value=0x80 frame 006 00 00 52 00 80 88
12:50:42.753 TX p1=0x00 p2=0x00 cmd=0x53 state=0x00 value=0x80 frame 006 00 00 53 00 80 89
12:50:43.362 TX p1=0x00 p2=0x00 cmd=0x54 state=0x00 value=0x80 frame 006 00 00 54 00 80 8E
12:50:43.972 TX p1=0x00 p2=0x00 cmd=0x55 state=0x00 value=0x80 frame 006 00 00 55 00 80 8F
12:50:44.583 TX p1=0x00 p2=0x00 cmd=0x56 state=0x00 value=0x80 frame 006 00 00 56 00 80 8C
12:50:45.193 TX p1=0x00 p2=0x00 cmd=0x57 state=0x00 value=0x80 frame 006 00 00 57 00 80 8D
12:50:45.802 TX p1=0x00 p2=0x00 cmd=0x58 state=0x00 value=0x80 frame 006 00 00 58 00 80 82
12:50:46.414 TX p1=0x00 p2=0x00 cmd=0x59 state=0x00 value=0x80 frame 006 00 00 59 00 80 83
12:50:47.023 TX p1=0x00 p2=0x00 cmd=0x5A state=0x00 value=0x80 frame 006 00 00 5A 00 80 80
12:50:47.634 TX p1=0x00 p2=0x00 cmd=0x5B state=0x00 value=0x80 frame 006 00 00 5B 00 80 81
12:50:48.244 TX p1=0x00 p2=0x00 cmd=0x5C state=0x00 value=0x80 frame 006 00 00 5C 00 80 86
12:50:48.853 TX p1=0x00 p2=0x00 cmd=0x5D state=0x00 value=0x80 frame 006 00 00 5D 00 80 87
12:50:49.462 TX p1=0x00 p2=0x00 cmd=0x5E state=0x00 value=0x80 frame 006 00 00 5E 00 80 84
12:50:50.073 TX p1=0x00 p2=0x00 cmd=0x5F state=0x00 value=0x80 frame 006 00 00 5F 00 80 85
12:50:50.683 TX p1=0x00 p2=0x00 cmd=0x60 state=0x00 value=0x80 frame 006 00 00 60 00 80 BA
12:50:51.293 TX p1=0x00 p2=0x00 cmd=0x61 state=0x00 value=0x80 frame 006 00 00 61 00 80 BB
12:50:51.904 TX p1=0x00 p2=0x00 cmd=0x62 state=0x00 value=0x80 frame 006 00 00 62 00 80 B8
12:50:52.512 TX p1=0x00 p2=0x00 cmd=0x63 state=0x00 value=0x80 frame 006 00 00 63 00 80 B9
12:50:53.121 TX p1=0x00 p2=0x00 cmd=0x64 state=0x00 value=0x80 frame 006 00 00 64 00 80 BE
12:50:53.730 TX p1=0x00 p2=0x00 cmd=0x65 state=0x00 value=0x80 frame 006 00 00 65 00 80 BF
12:50:54.337 TX p1=0x00 p2=0x00 cmd=0x66 state=0x00 value=0x80 frame 006 00 00 66 00 80 BC
12:50:54.950 TX p1=0x00 p2=0x00 cmd=0x67 state=0x00 value=0x80 frame 006 00 00 67 00 80 BD
12:50:55.559 TX p1=0x00 p2=0x00 cmd=0x68 state=0x00 value=0x80 frame 006 00 00 68 00 80 B2
12:50:56.170 TX p1=0x00 p2=0x00 cmd=0x69 state=0x00 value=0x80 frame 006 00 00 69 00 80 B3
12:50:56.778 TX p1=0x00 p2=0x00 cmd=0x6A state=0x00 value=0x80 frame 006 00 00 6A 00 80 B0
12:50:57.389 TX p1=0x00 p2=0x00 cmd=0x6B state=0x00 value=0x80 frame 006 00 00 6B 00 80 B1
12:50:57.998 TX p1=0x00 p2=0x00 cmd=0x6C state=0x00 value=0x80 frame 006 00 00 6C 00 80 B6
12:50:58.608 TX p1=0x00 p2=0x00 cmd=0x6D state=0x00 value=0x80 frame 006 00 00 6D 00 80 B7
12:50:59.219 TX p1=0x00 p2=0x00 cmd=0x6E state=0x00 value=0x80 frame 006 00 00 6E 00 80 B4
12:50:59.828 TX p1=0x00 p2=0x00 cmd=0x6F state=0x00 value=0x80 frame 006 00 00 6F 00 80 B5
12:51:00.440 TX p1=0x00 p2=0x00 cmd=0x70 state=0x00 value=0x80 frame 006 00 00 70 00 80 AA
12:51:01.052 TX p1=0x00 p2=0x00 cmd=0x71 state=0x00 value=0x80 frame 006 00 00 71 00 80 AB
12:51:01.664 TX p1=0x00 p2=0x00 cmd=0x72 state=0x00 value=0x80 frame 006 00 00 72 00 80 A8
12:51:02.273 TX p1=0x00 p2=0x00 cmd=0x73 state=0x00 value=0x80 frame 006 00 00 73 00 80 A9
12:51:02.883 TX p1=0x00 p2=0x00 cmd=0x74 state=0x00 value=0x80 frame 006 00 00 74 00 80 AE
12:51:03.492 TX p1=0x00 p2=0x00 cmd=0x75 state=0x00 value=0x80 frame 006 00 00 75 00 80 AF
12:51:04.101 TX p1=0x00 p2=0x00 cmd=0x76 state=0x00 value=0x80 frame 006 00 00 76 00 80 AC
12:51:04.711 TX p1=0x00 p2=0x00 cmd=0x77 state=0x00 value=0x80 frame 006 00 00 77 00 80 AD
12:51:05.319 TX p1=0x00 p2=0x00 cmd=0x78 state=0x00 value=0x80 frame 006 00 00 78 00 80 A2
12:51:05.927 TX p1=0x00 p2=0x00 cmd=0x79 state=0x00 value=0x80 frame 006 00 00 79 00 80 A3
12:51:06.538 TX p1=0x00 p2=0x00 cmd=0x7A state=0x00 value=0x80 frame 006 00 00 7A 00 80 A0
12:51:07.148 TX p1=0x00 p2=0x00 cmd=0x7B state=0x00 value=0x80 frame 006 00 00 7B 00 80 A1
12:51:07.758 TX p1=0x00 p2=0x00 cmd=0x7C state=0x00 value=0x80 frame 006 00 00 7C 00 80 A6
12:51:08.367 TX p1=0x00 p2=0x00 cmd=0x7D state=0x00 value=0x80 frame 006 00 00 7D 00 80 A7
12:51:08.976 TX p1=0x00 p2=0x00 cmd=0x7E state=0x00 value=0x80 frame 006 00 00 7E 00 80 A4
12:51:09.585 TX p1=0x00 p2=0x00 cmd=0x7F state=0x00 value=0x80 frame 006 00 00 7F 00 80 A5
12:51:10.194 TX p1=0x00 p2=0x00 cmd=0x80 state=0x00 value=0x80 frame 006 00 00 80 00 80 5A
12:51:10.802 TX p1=0x00 p2=0x00 cmd=0x81 state=0x00 value=0x80 frame 006 00 00 81 00 80 5B
12:51:11.412 TX p1=0x00 p2=0x00 cmd=0x82 state=0x00 value=0x80 frame 006 00 00 82 00 80 58
12:51:12.049 TX p1=0x00 p2=0x00 cmd=0x83 state=0x00 value=0x80 frame 006 00 00 83 00 80 59
12:51:12.658 TX p1=0x00 p2=0x00 cmd=0x84 state=0x00 value=0x80 frame 006 00 00 84 00 80 5E
12:51:13.271 TX p1=0x00 p2=0x00 cmd=0x85 state=0x00 value=0x80 frame 006 00 00 85 00 80 5F
12:51:13.881 TX p1=0x00 p2=0x00 cmd=0x86 state=0x00 value=0x80 frame 006 00 00 86 00 80 5C
12:51:14.490 TX p1=0x00 p2=0x00 cmd=0x87 state=0x00 value=0x80 frame 006 00 00 87 00 80 5D
12:51:15.100 TX p1=0x00 p2=0x00 cmd=0x88 state=0x00 value=0x80 frame 006 00 00 88 00 80 52
12:51:15.710 TX p1=0x00 p2=0x00 cmd=0x89 state=0x00 value=0x80 frame 006 00 00 89 00 80 53
12:51:16.318 TX p1=0x00 p2=0x00 cmd=0x8A state=0x00 value=0x80 frame 006 00 00 8A 00 80 50
12:51:16.930 TX p1=0x00 p2=0x00 cmd=0x8B state=0x00 value=0x80 frame 006 00 00 8B 00 80 51
12:51:17.540 TX p1=0x00 p2=0x00 cmd=0x8C state=0x00 value=0x80 frame 006 00 00 8C 00 80 56
12:51:18.149 TX p1=0x00 p2=0x00 cmd=0x8D state=0x00 value=0x80 frame 006 00 00 8D 00 80 57
12:51:18.758 TX p1=0x00 p2=0x00 cmd=0x8E state=0x00 value=0x80 frame 006 00 00 8E 00 80 54
12:51:19.367 TX p1=0x00 p2=0x00 cmd=0x8F state=0x00 value=0x80 frame 006 00 00 8F 00 80 55
12:51:19.976 TX p1=0x00 p2=0x00 cmd=0x90 state=0x00 value=0x80 frame 006 00 00 90 00 80 4A
12:51:20.583 TX p1=0x00 p2=0x00 cmd=0x91 state=0x00 value=0x80 frame 006 00 00 91 00 80 4B
12:51:21.192 TX p1=0x00 p2=0x00 cmd=0x92 state=0x00 value=0x80 frame 006 00 00 92 00 80 48
12:51:21.831 TX p1=0x00 p2=0x00 cmd=0x93 state=0x00 value=0x80 frame 006 00 00 93 00 80 49
12:51:22.440 TX p1=0x00 p2=0x00 cmd=0x94 state=0x00 value=0x80 frame 006 00 00 94 00 80 4E
12:51:23.052 TX p1=0x00 p2=0x00 cmd=0x95 state=0x00 value=0x80 frame 006 00 00 95 00 80 4F
12:51:23.661 TX p1=0x00 p2=0x00 cmd=0x96 state=0x00 value=0x80 frame 006 00 00 96 00 80 4C
12:51:24.299 TX p1=0x00 p2=0x00 cmd=0x97 state=0x00 value=0x80 frame 006 00 00 97 00 80 4D
12:51:24.910 TX p1=0x00 p2=0x00 cmd=0x98 state=0x00 value=0x80 frame 006 00 00 98 00 80 42
12:51:25.518 TX p1=0x00 p2=0x00 cmd=0x99 state=0x00 value=0x80 frame 006 00 00 99 00 80 43
12:51:26.125 TX p1=0x00 p2=0x00 cmd=0x9A state=0x00 value=0x80 frame 006 00 00 9A 00 80 40
12:51:26.735 TX p1=0x00 p2=0x00 cmd=0x9B state=0x00 value=0x80 frame 006 00 00 9B 00 80 41
12:51:27.344 TX p1=0x00 p2=0x00 cmd=0x9C state=0x00 value=0x80 frame 006 00 00 9C 00 80 46
12:51:27.955 TX p1=0x00 p2=0x00 cmd=0x9D state=0x00 value=0x80 frame 006 00 00 9D 00 80 47
12:51:28.563 TX p1=0x00 p2=0x00 cmd=0x9E state=0x00 value=0x80 frame 006 00 00 9E 00 80 44
12:51:29.173 TX p1=0x00 p2=0x00 cmd=0x9F state=0x00 value=0x80 frame 006 00 00 9F 00 80 45
12:51:29.782 TX p1=0x00 p2=0x00 cmd=0xA0 state=0x00 value=0x80 frame 006 00 00 A0 00 80 7A
12:51:30.392 TX p1=0x00 p2=0x00 cmd=0xA1 state=0x00 value=0x80 frame 006 00 00 A1 00 80 7B
12:51:31.000 TX p1=0x00 p2=0x00 cmd=0xA2 state=0x00 value=0x80 frame 006 00 00 A2 00 80 78
12:51:31.610 TX p1=0x00 p2=0x00 cmd=0xA3 state=0x00 value=0x80 frame 006 00 00 A3 00 80 79
12:51:32.220 TX p1=0x00 p2=0x00 cmd=0xA4 state=0x00 value=0x80 frame 006 00 00 A4 00 80 7E
12:51:32.829 TX p1=0x00 p2=0x00 cmd=0xA5 state=0x00 value=0x80 frame 006 00 00 A5 00 80 7F
12:51:33.439 TX p1=0x00 p2=0x00 cmd=0xA6 state=0x00 value=0x80 frame 006 00 00 A6 00 80 7C
12:51:34.048 TX p1=0x00 p2=0x00 cmd=0xA7 state=0x00 value=0x80 frame 006 00 00 A7 00 80 7D
12:51:34.658 TX p1=0x00 p2=0x00 cmd=0xA8 state=0x00 value=0x80 frame 006 00 00 A8 00 80 72
12:51:35.266 TX p1=0x00 p2=0x00 cmd=0xA9 state=0x00 value=0x80 frame 006 00 00 A9 00 80 73
12:51:35.878 TX p1=0x00 p2=0x00 cmd=0xAA state=0x00 value=0x80 frame 006 00 00 AA 00 80 70
12:51:36.488 TX p1=0x00 p2=0x00 cmd=0xAB state=0x00 value=0x80 frame 006 00 00 AB 00 80 71
12:51:37.096 TX p1=0x00 p2=0x00 cmd=0xAC state=0x00 value=0x80 frame 006 00 00 AC 00 80 76
12:51:37.710 TX p1=0x00 p2=0x00 cmd=0xAD state=0x00 value=0x80 frame 006 00 00 AD 00 80 77
12:51:38.348 TX p1=0x00 p2=0x00 cmd=0xAE state=0x00 value=0x80 frame 006 00 00 AE 00 80 74
12:51:38.958 TX p1=0x00 p2=0x00 cmd=0xAF state=0x00 value=0x80 frame 006 00 00 AF 00 80 75
12:51:39.570 TX p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
12:51:40.180 TX p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
12:51:40.791 TX p1=0x00 p2=0x00 cmd=0xB2 state=0x00 value=0x80 frame 006 00 00 B2 00 80 68
12:51:41.401 TX p1=0x00 p2=0x00 cmd=0xB3 state=0x00 value=0x80 frame 006 00 00 B3 00 80 69
12:51:42.014 TX p1=0x00 p2=0x00 cmd=0xB4 state=0x00 value=0x80 frame 006 00 00 B4 00 80 6E
12:51:42.623 TX p1=0x00 p2=0x00 cmd=0xB5 state=0x00 value=0x80 frame 006 00 00 B5 00 80 6F
12:51:42.623 ANOMALY 18 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
12:51:42.623 RX raw 07 80 6D 20 D8 48 07 80 6D 20 D8 48 07 80 6D 20 D8 48
Stopping after anomaly.
FINAL ANOMALY 42 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 07 80 6D 20 D8 48 00 00 00 00 80 DA

View File

@@ -0,0 +1,6 @@
Direct response sweep: 2 frames on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 12 bytes, offset 0, 2 frames + 0 bytes
12:59:25.335 TX p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
12:59:25.944 TX p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
FINAL heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
Anomalies: 0

View File

@@ -0,0 +1,9 @@
Direct response sweep: 9 frames on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 18 bytes, offset 0, 3 frames + 0 bytes
12:57:22.733 TX p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
12:57:23.342 TX p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
12:57:23.342 ANOMALY 6 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
12:57:23.342 RX raw 07 80 6C 20 D8 49
Stopping after anomaly.
FINAL heartbeat-compatible RX: 42 bytes, offset 0, 7 frames + 0 bytes
Anomalies: 1

View File

@@ -0,0 +1,294 @@
Probing 16 field combinations on COM5 at 38400 8N1
12:37:52.619 RX frame 006 00 00 00 00 80 DA
12:37:53.325 RX frame 006 00 00 00 00 80 DA
12:37:53.931 TX fields p1=0x00 p2=0x00 cmd=0x15 state=0x00 value=0x80 frame 006 00 00 15 00 80 CF
12:37:54.032 RX frame 006 00 00 00 00 80 DA
12:37:54.285 RX frame 006 00 00 00 00 80 DA
12:37:54.538 RX frame 006 00 00 00 00 80 DA
12:37:54.789 RX frame 006 00 00 00 00 80 DA
12:37:55.041 RX frame 006 00 00 00 00 80 DA
12:38:02.805 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:38:02.806 TX fields p1=0x00 p2=0x01 cmd=0x15 state=0x00 value=0x80 frame 006 00 01 15 00 80 CE
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.808 RX frame 006 00 00 00 00 80 DA
12:38:02.859 RX frame 006 00 00 00 00 80 DA
12:38:02.859 RX frame 006 00 00 00 00 80 DA
12:38:02.859 RX frame 006 00 00 00 00 80 DA
12:38:03.414 RX frame 006 00 00 00 00 80 DA
12:38:03.666 RX frame 006 00 00 00 00 80 DA
12:38:03.918 RX frame 006 00 00 00 00 80 DA
12:38:11.920 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:38:11.920 TX fields p1=0x00 p2=0x02 cmd=0x15 state=0x00 value=0x80 frame 006 00 02 15 00 80 CD
12:38:11.920 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.921 RX frame 006 00 00 00 00 80 DA
12:38:11.922 RX frame 006 00 00 00 00 80 DA
12:38:11.922 RX frame 006 00 00 00 00 80 DA
12:38:11.972 RX frame 006 00 00 00 00 80 DA
12:38:11.972 RX frame 006 00 00 00 00 80 DA
12:38:11.972 RX frame 006 00 00 00 00 80 DA
12:38:12.325 RX frame 006 00 00 00 00 80 DA
12:38:12.577 RX frame 006 00 00 00 00 80 DA
12:38:12.829 RX frame 006 00 00 00 00 80 DA
12:38:13.082 RX frame 006 00 00 00 00 80 DA
12:38:20.492 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:38:20.492 TX fields p1=0x00 p2=0x03 cmd=0x15 state=0x00 value=0x80 frame 006 00 03 15 00 80 CC
12:38:20.492 RX frame 006 00 00 00 00 80 DA
12:38:20.492 RX frame 006 00 00 00 00 80 DA
12:38:20.492 RX frame 006 00 00 00 00 80 DA
12:38:20.492 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.493 RX frame 006 00 00 00 00 80 DA
12:38:20.543 RX frame 006 00 00 00 00 80 DA
12:38:20.543 RX frame 006 00 00 00 00 80 DA
12:38:20.847 RX frame 006 00 00 00 00 80 DA
12:38:21.099 RX frame 006 00 00 00 00 80 DA
12:38:21.352 RX frame 006 00 00 00 00 80 DA
12:38:21.604 RX frame 006 00 00 00 00 80 DA
12:38:29.244 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NTO ACT
12:38:29.244 TX fields p1=0x00 p2=0x04 cmd=0x15 state=0x00 value=0x80 frame 006 00 04 15 00 80 CB
12:38:29.245 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.246 RX frame 006 00 00 00 00 80 DA
12:38:29.297 RX frame 006 00 00 00 00 80 DA
12:38:29.297 RX frame 006 00 00 00 00 80 DA
12:38:29.347 RX frame 006 00 00 00 00 80 DA
12:38:29.600 RX frame 006 00 00 00 00 80 DA
12:38:29.853 RX frame 006 00 00 00 00 80 DA
12:38:30.105 RX frame 006 00 00 00 00 80 DA
12:38:30.356 RX frame 006 00 00 00 00 80 DA
12:38:38.590 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:38:38.590 TX fields p1=0x00 p2=0x05 cmd=0x15 state=0x00 value=0x80 frame 006 00 05 15 00 80 CA
12:38:38.590 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.592 RX frame 006 00 00 00 00 80 DA
12:38:38.642 RX frame 006 00 00 00 00 80 DA
12:38:38.642 RX frame 006 00 00 00 00 80 DA
12:38:38.642 RX frame 006 00 00 00 00 80 DA
12:38:38.743 RX frame 006 00 00 00 00 80 DA
12:38:38.995 RX frame 006 00 00 00 00 80 DA
12:38:39.246 RX frame 006 00 00 00 00 80 DA
12:38:39.498 RX frame 006 00 00 00 00 80 DA
12:38:39.750 RX frame 006 00 00 00 00 80 DA
12:38:49.741 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:38:49.741 TX fields p1=0x00 p2=0x06 cmd=0x15 state=0x00 value=0x80 frame 006 00 06 15 00 80 C9
12:38:49.742 RX frame 006 00 00 00 00 80 DA
12:38:49.742 RX frame 006 00 00 00 00 80 DA
12:38:49.742 RX frame 006 00 00 00 00 80 DA
12:38:49.742 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.743 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:49.793 RX frame 006 00 00 00 00 80 DA
12:38:50.246 RX frame 006 00 00 00 00 80 DA
12:38:50.499 RX frame 006 00 00 00 00 80 DA
12:38:50.751 RX frame 006 00 00 00 00 80 DA
12:39:00.497 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:00.497 TX fields p1=0x00 p2=0x07 cmd=0x15 state=0x00 value=0x80 frame 006 00 07 15 00 80 C8
12:39:00.497 RX frame 006 00 00 00 00 80 DA
12:39:00.497 RX frame 006 00 00 00 00 80 DA
12:39:00.497 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.498 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:00.549 RX frame 006 00 00 00 00 80 DA
12:39:01.255 RX frame 006 00 00 00 00 80 DA
12:39:08.978 TX fields p1=0x00 p2=0x08 cmd=0x15 state=0x00 value=0x80 frame 006 00 08 15 00 80 C7
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:08.979 RX frame 006 00 00 00 00 80 DA
12:39:09.030 RX frame 006 00 00 00 00 80 DA
12:39:09.635 RX frame 006 00 00 00 00 80 DA
12:39:09.888 RX frame 006 00 00 00 00 80 DA
12:39:10.141 RX frame 006 00 00 00 00 80 DA
12:39:18.496 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:18.496 TX fields p1=0x00 p2=0x09 cmd=0x15 state=0x00 value=0x80 frame 006 00 09 15 00 80 C6
12:39:18.497 RX frame 006 00 00 00 00 80 DA
12:39:18.497 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.498 RX frame 006 00 00 00 00 80 DA
12:39:18.549 RX frame 006 00 00 00 00 80 DA
12:39:18.549 RX frame 006 00 00 00 00 80 DA
12:39:18.549 RX frame 006 00 00 00 00 80 DA
12:39:18.549 RX frame 006 00 00 00 00 80 DA
12:39:18.800 RX frame 006 00 00 00 00 80 DA
12:39:19.052 RX frame 006 00 00 00 00 80 DA
12:39:19.304 RX frame 006 00 00 00 00 80 DA
12:39:19.557 RX frame 006 00 00 00 00 80 DA
12:39:28.690 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:28.690 TX fields p1=0x00 p2=0x0A cmd=0x15 state=0x00 value=0x80 frame 006 00 0A 15 00 80 C5
12:39:28.690 RX frame 006 00 00 00 00 80 DA
12:39:28.690 RX frame 006 00 00 00 00 80 DA
12:39:28.690 RX frame 006 00 00 00 00 80 DA
12:39:28.690 RX frame 006 00 00 00 00 80 DA
12:39:28.690 RX frame 006 00 00 00 00 80 DA
12:39:28.691 RX frame 006 00 00 00 00 80 DA
12:39:28.691 RX frame 006 00 00 00 00 80 DA
12:39:28.691 RX frame 006 00 00 00 00 80 DA
12:39:28.691 RX frame 006 00 00 00 00 80 DA
12:39:28.691 RX frame 006 00 00 00 00 80 DA
12:39:28.741 RX frame 006 00 00 00 00 80 DA
12:39:28.741 RX frame 006 00 00 00 00 80 DA
12:39:28.741 RX frame 006 00 00 00 00 80 DA
12:39:28.741 RX frame 006 00 00 00 00 80 DA
12:39:28.741 RX frame 006 00 00 00 00 80 DA
12:39:29.349 RX frame 006 00 00 00 00 80 DA
12:39:29.601 RX frame 006 00 00 00 00 80 DA
12:39:29.853 RX frame 006 00 00 00 00 80 DA
12:39:37.248 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:37.248 TX fields p1=0x00 p2=0x0B cmd=0x15 state=0x00 value=0x80 frame 006 00 0B 15 00 80 C4
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.249 RX frame 006 00 00 00 00 80 DA
12:39:37.250 RX frame 006 00 00 00 00 80 DA
12:39:37.250 RX frame 006 00 00 00 00 80 DA
12:39:37.250 RX frame 006 00 00 00 00 80 DA
12:39:37.300 RX frame 006 00 00 00 00 80 DA
12:39:37.300 RX frame 006 00 00 00 00 80 DA
12:39:37.552 RX frame 006 00 00 00 00 80 DA
12:39:37.804 RX frame 006 00 00 00 00 80 DA
12:39:38.055 RX frame 006 00 00 00 00 80 DA
12:39:38.307 RX frame 006 00 00 00 00 80 DA
12:39:46.402 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:46.403 TX fields p1=0x00 p2=0x0C cmd=0x15 state=0x00 value=0x80 frame 006 00 0C 15 00 80 C3
12:39:46.403 RX frame 006 00 00 00 00 80 DA
12:39:46.404 RX frame 006 00 00 00 00 80 DA
12:39:46.404 RX frame 006 00 00 00 00 80 DA
12:39:46.404 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.405 RX frame 006 00 00 00 00 80 DA
12:39:46.455 RX frame 006 00 00 00 00 80 DA
12:39:46.455 RX frame 006 00 00 00 00 80 DA
12:39:46.455 RX frame 006 00 00 00 00 80 DA
12:39:46.757 RX frame 006 00 00 00 00 80 DA
12:39:47.011 RX frame 006 00 00 00 00 80 DA
12:39:47.264 RX frame 006 00 00 00 00 80 DA
12:39:47.517 RX frame 006 00 00 00 00 80 DA
12:39:54.570 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:39:54.571 TX fields p1=0x00 p2=0x0D cmd=0x15 state=0x00 value=0x80 frame 006 00 0D 15 00 80 C2
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.571 RX frame 006 00 00 00 00 80 DA
12:39:54.572 RX frame 006 00 00 00 00 80 DA
12:39:54.623 RX frame 006 00 00 00 00 80 DA
12:39:54.623 RX frame 006 00 00 00 00 80 DA
12:39:55.280 RX frame 006 00 00 00 00 80 DA
12:39:55.531 RX frame 006 00 00 00 00 80 DA
12:39:55.733 RX frame 006 00 00 00 00 80 DA
12:40:03.339 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:40:03.339 TX fields p1=0x00 p2=0x0E cmd=0x15 state=0x00 value=0x80 frame 006 00 0E 15 00 80 C1
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.340 RX frame 006 00 00 00 00 80 DA
12:40:03.391 RX frame 006 00 00 00 00 80 DA
12:40:03.391 RX frame 006 00 00 00 00 80 DA
12:40:03.442 RX frame 006 00 00 00 00 80 DA
12:40:03.693 RX frame 006 00 00 00 00 80 DA
12:40:03.945 RX frame 006 00 00 00 00 80 DA
12:40:04.198 RX frame 006 00 00 00 00 80 DA
12:40:04.450 RX frame 006 00 00 00 00 80 DA
12:40:10.928 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:40:10.928 TX fields p1=0x00 p2=0x0F cmd=0x15 state=0x00 value=0x80 frame 006 00 0F 15 00 80 C0
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.929 RX frame 006 00 00 00 00 80 DA
12:40:10.930 RX frame 006 00 00 00 00 80 DA
12:40:10.930 RX frame 006 00 00 00 00 80 DA
12:40:10.930 RX frame 006 00 00 00 00 80 DA
12:40:10.930 RX frame 006 00 00 00 00 80 DA
12:40:10.981 RX frame 006 00 00 00 00 80 DA
12:40:11.436 RX frame 006 00 00 00 00 80 DA
12:40:12.143 RX frame 006 00 00 00 00 80 DA
12:40:15.159 RX frame 006 00 00 00 00 80 DA
12:40:15.159 RX frame 006 00 00 00 00 80 DA
12:40:15.159 RX frame 006 00 00 00 00 80 DA
12:40:15.159 RX frame 006 00 00 00 00 80 DA
12:40:15.664 RX frame 006 00 00 00 00 80 DA
12:40:16.371 RX frame 006 00 00 00 00 80 DA
12:40:17.077 RX frame 006 00 00 00 00 80 DA
12:40:17.783 RX frame 006 00 00 00 00 80 DA

View File

@@ -0,0 +1,88 @@
Probing 5 field combinations on COM5 at 38400 8N1
12:42:53.175 RX frame 006 00 00 00 00 80 DA
12:42:53.882 RX frame 006 00 00 00 00 80 DA
12:42:54.388 TX fields p1=0x00 p2=0x06 cmd=0x15 state=0x00 value=0x80 frame 006 00 06 15 00 80 C9
12:42:54.591 RX frame 006 00 00 00 00 80 DA
12:42:54.843 RX frame 006 00 00 00 00 80 DA
12:42:55.095 RX frame 006 00 00 00 00 80 DA
12:42:55.348 RX frame 006 00 00 00 00 80 DA
12:42:55.600 RX frame 006 00 00 00 00 80 DA
12:43:06.568 SCREEN p1=0x00 p2=0x06 cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:43:06.569 TX fields p1=0x00 p2=0x07 cmd=0x15 state=0x00 value=0x80 frame 006 00 07 15 00 80 C8
12:43:06.570 RX frame 006 00 00 00 00 80 DA
12:43:06.570 RX frame 006 00 00 00 00 80 DA
12:43:06.570 RX frame 006 00 00 00 00 80 DA
12:43:06.570 RX frame 006 00 00 00 00 80 DA
12:43:06.571 RX frame 006 00 00 00 00 80 DA
12:43:06.571 RX frame 006 00 00 00 00 80 DA
12:43:06.571 RX frame 006 00 00 00 00 80 DA
12:43:06.572 RX frame 006 00 00 00 00 80 DA
12:43:06.572 RX frame 006 00 00 00 00 80 DA
12:43:06.572 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.623 RX frame 006 00 00 00 00 80 DA
12:43:06.624 RX frame 006 00 00 00 00 80 DA
12:43:06.776 RX frame 006 00 00 00 00 80 DA
12:43:07.483 RX frame 006 00 00 00 00 80 DA
12:43:13.717 TX fields p1=0x00 p2=0x08 cmd=0x15 state=0x00 value=0x80 frame 006 00 08 15 00 80 C7
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:13.768 RX frame 006 00 00 00 00 80 DA
12:43:14.020 RX frame 006 00 00 00 00 80 DA
12:43:14.272 RX frame 006 00 00 00 00 80 DA
12:43:14.525 RX frame 006 00 00 00 00 80 DA
12:43:14.777 RX frame 006 00 00 00 00 80 DA
12:43:22.946 SCREEN p1=0x00 p2=0x08 cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:43:22.946 TX fields p1=0x00 p2=0x0E cmd=0x15 state=0x00 value=0x80 frame 006 00 0E 15 00 80 C1
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.947 RX frame 006 00 00 00 00 80 DA
12:43:22.948 RX frame 006 00 00 00 00 80 DA
12:43:22.948 RX frame 006 00 00 00 00 80 DA
12:43:22.948 RX frame 006 00 00 00 00 80 DA
12:43:22.948 RX frame 006 00 00 00 00 80 DA
12:43:22.998 RX frame 006 00 00 00 00 80 DA
12:43:22.998 RX frame 006 00 00 00 00 80 DA
12:43:22.998 RX frame 006 00 00 00 00 80 DA
12:43:23.200 RX frame 006 00 00 00 00 80 DA
12:43:23.453 RX frame 006 00 00 00 00 80 DA
12:43:23.705 RX frame 006 00 00 00 00 80 DA
12:43:23.957 RX frame 006 00 00 00 00 80 DA
12:43:31.920 SCREEN p1=0x00 p2=0x0E cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:43:31.920 TX fields p1=0x00 p2=0x0F cmd=0x15 state=0x00 value=0x80 frame 006 00 0F 15 00 80 C0
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.921 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.922 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.922 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.922 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.972 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.972 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:31.972 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:32.577 RX frame 006 00 00 00 80 DA 00 NON_HEARTBEAT
12:43:35.909 RX frame 006 00 00 00 00 80 DA
12:43:35.909 RX frame 006 00 00 00 00 80 DA
12:43:35.909 RX frame 006 00 00 00 00 80 DA
12:43:35.909 RX frame 006 00 00 00 00 80 DA
12:43:36.112 RX frame 006 00 00 00 00 80 DA
12:43:36.769 RX frame 006 00 00 00 00 80 DA
12:43:37.478 RX frame 006 00 00 00 00 80 DA
12:43:38.186 RX frame 006 00 00 00 00 80 DA
12:43:38.892 RX frame 006 00 00 00 00 80 DA

View File

@@ -0,0 +1,102 @@
Probing 4 field combinations on COM5 at 38400 8N1
12:35:06.502 RX frame 006 00 00 00 00 80 DA
12:35:07.209 RX frame 006 00 00 00 00 80 DA
12:35:07.361 TX fields p1=0x00 p2=0x00 cmd=0x15 state=0x00 value=0x00 frame 006 00 00 15 00 00 4F
12:35:07.917 RX frame 006 00 00 00 00 80 DA
12:35:08.170 RX frame 006 00 00 00 00 80 DA
12:35:08.422 RX frame 006 00 00 00 00 80 DA
12:35:21.094 SCREEN cmd=0x15 state=0x00 value=0x00 CONNECT NOT ACT
12:35:21.094 TX fields p1=0x00 p2=0x00 cmd=0x15 state=0x00 value=0x80 frame 006 00 00 15 00 80 CF
12:35:21.094 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.096 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.146 RX frame 006 00 00 00 00 80 DA
12:35:21.704 RX frame 006 00 00 00 00 80 DA
12:35:21.955 RX frame 006 00 00 00 00 80 DA
12:35:22.208 RX frame 006 00 00 00 00 80 DA
12:35:31.923 SCREEN cmd=0x15 state=0x00 value=0x80 CONNECT NOT ACT
12:35:31.923 TX fields p1=0x00 p2=0x00 cmd=0x15 state=0x80 value=0x00 frame 006 00 00 15 80 00 CF
12:35:31.923 RX frame 006 00 00 00 00 80 DA
12:35:31.923 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.924 RX frame 006 00 00 00 00 80 DA
12:35:31.975 RX frame 006 00 00 00 00 80 DA
12:35:31.975 RX frame 006 00 00 00 00 80 DA
12:35:31.975 RX frame 006 00 00 00 00 80 DA
12:35:31.975 RX frame 006 00 00 00 00 80 DA
12:35:31.975 RX frame 006 00 00 00 00 80 DA
12:35:32.026 RX frame 006 00 00 00 00 80 DA
12:35:32.278 RX frame 006 00 00 00 00 80 DA
12:35:32.529 RX frame 006 00 00 00 00 80 DA
12:35:32.782 RX frame 006 00 00 00 00 80 DA
12:35:33.033 RX frame 006 00 00 00 00 80 DA
12:35:42.653 SCREEN cmd=0x15 state=0x80 value=0x00 CONNECT NOT ACT
12:35:42.653 TX fields p1=0x00 p2=0x00 cmd=0x15 state=0x80 value=0x80 frame 006 00 00 15 80 80 4F
12:35:42.654 RX frame 006 00 00 00 00 80 DA
12:35:42.654 RX frame 006 00 00 00 00 80 DA
12:35:42.655 RX frame 006 00 00 00 00 80 DA
12:35:42.655 RX frame 006 00 00 00 00 80 DA
12:35:42.655 RX frame 006 00 00 00 00 80 DA
12:35:42.656 RX frame 006 00 00 00 00 80 DA
12:35:42.656 RX frame 006 00 00 00 00 80 DA
12:35:42.656 RX frame 006 00 00 00 00 80 DA
12:35:42.656 RX frame 006 00 00 00 00 80 DA
12:35:42.656 RX frame 006 00 00 00 00 80 DA
12:35:42.706 RX frame 006 00 00 00 00 80 DA
12:35:42.706 RX frame 006 00 00 00 00 80 DA
12:35:42.706 RX frame 006 00 00 00 00 80 DA
12:35:42.706 RX frame 006 00 00 00 00 80 DA
12:35:42.706 RX frame 006 00 00 00 00 80 DA
12:35:42.807 RX frame 006 00 00 00 00 80 DA
12:35:43.060 RX frame 006 00 00 00 00 80 DA
12:35:43.313 RX frame 006 00 00 00 00 80 DA
12:35:43.566 RX frame 006 00 00 00 00 80 DA
12:35:43.817 RX frame 006 00 00 00 00 80 DA
12:35:56.963 SCREEN cmd=0x15 state=0x80 value=0x80 CONNECT NOT ACT
12:35:56.964 RX frame 006 00 00 00 00 80 DA
12:35:56.965 RX frame 006 00 00 00 00 80 DA
12:35:56.965 RX frame 006 00 00 00 00 80 DA
12:35:56.965 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:56.966 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.016 RX frame 006 00 00 00 00 80 DA
12:35:57.017 RX frame 006 00 00 00 00 80 DA
12:35:57.017 RX frame 006 00 00 00 00 80 DA
12:35:57.119 RX frame 006 00 00 00 00 80 DA
12:35:57.827 RX frame 006 00 00 00 00 80 DA
12:35:58.533 RX frame 006 00 00 00 00 80 DA
12:35:59.241 RX frame 006 00 00 00 00 80 DA
12:35:59.897 RX frame 006 00 00 00 00 80 DA

View File

@@ -0,0 +1,10 @@
Direct response sweep: 9 frames x 1 cycles (9 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:05:24.270 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
13:05:24.880 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
13:05:24.880 ANOMALY 18 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:05:24.880 RX raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
Stopping after anomaly.
FINAL ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
FINAL 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 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -0,0 +1,10 @@
Direct response sweep: 9 frames x 1 cycles (9 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 30 bytes, offset 0, 5 frames + 0 bytes
13:05:53.454 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
13:05:54.064 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
13:05:54.064 ANOMALY 18 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:05:54.064 RX raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
Stopping after anomaly.
FINAL ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
FINAL 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 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -0,0 +1,10 @@
Direct response sweep: 9 frames x 1 cycles (9 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:06:17.115 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
13:06:17.725 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
13:06:17.725 ANOMALY 18 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:06:17.725 RX raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
Stopping after anomaly.
FINAL ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
FINAL 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 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -0,0 +1,5 @@
Direct response sweep: 1 frames x 1 cycles (1 total) on COM5 at 38400 8N1
BASELINE heartbeat-compatible RX: 24 bytes, offset 0, 4 frames + 0 bytes
13:09:03.408 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
FINAL heartbeat-compatible RX: 36 bytes, offset 0, 6 frames + 0 bytes
Anomalies: 0

View File

@@ -0,0 +1,44 @@
Listening on COM5 at 38400 8N1; will send 00 00 B1 00 80 6B after 3.0s
13:08:08.742 RX 006 bytes 00 00 00 00 80 DA
13:08:09.450 RX 006 bytes 00 00 00 00 80 DA
13:08:10.106 RX 001 bytes 00
13:08:10.156 RX 005 bytes 00 00 00 80 DA
13:08:10.813 RX 001 bytes 00
13:08:10.863 RX 005 bytes 00 00 00 80 DA
13:08:11.468 TX frame 006 00 00 B1 00 80 6B
13:08:11.519 RX 006 bytes 00 00 00 00 80 DA
13:08:11.771 RX 006 bytes 00 00 00 00 80 DA
13:08:12.024 RX 006 bytes 00 00 00 00 80 DA
13:08:12.277 RX 006 bytes 00 00 00 00 80 DA
13:08:12.529 RX 006 bytes 00 00 00 00 80 DA
13:08:12.783 RX 006 bytes 00 00 00 00 80 DA
13:08:13.036 RX 006 bytes 00 00 00 00 80 DA
13:08:13.287 RX 006 bytes 00 00 00 00 80 DA
13:08:13.943 RX 006 bytes 00 00 00 00 80 DA
13:08:14.600 RX 001 bytes 00
13:08:14.650 RX 005 bytes 00 00 00 80 DA
13:08:15.307 RX 001 bytes 00
13:08:15.357 RX 005 bytes 00 00 00 80 DA
13:08:16.013 RX 001 bytes 00
13:08:16.063 RX 005 bytes 00 00 00 80 DA
Listening on COM5 at 38400 8N1; will send 00 00 B1 00 80 6B after 3.0s
13:08:29.402 RX 006 bytes 00 00 00 00 80 DA
13:08:30.110 RX 006 bytes 00 00 00 00 80 DA
13:08:30.765 RX 001 bytes 00
13:08:30.815 RX 005 bytes 00 00 00 80 DA
13:08:31.471 RX 001 bytes 00
13:08:31.522 RX 005 bytes 00 00 00 80 DA
13:08:32.178 RX 006 bytes 00 00 00 00 80 DA
13:08:32.279 TX frame 006 00 00 B1 00 80 6B
13:08:32.885 RX 006 bytes 00 00 00 00 80 DA
13:08:33.137 RX 006 bytes 00 00 00 00 80 DA
13:08:33.389 RX 006 bytes 00 00 00 00 80 DA
13:08:33.642 RX 006 bytes 00 00 00 00 80 DA
13:08:33.894 RX 006 bytes 00 00 00 00 80 DA
13:08:34.146 RX 006 bytes 00 00 00 00 80 DA
13:08:34.804 RX 006 bytes 00 00 00 00 80 DA
13:08:35.510 RX 006 bytes 00 00 00 00 80 DA
13:08:36.166 RX 001 bytes 00
13:08:36.216 RX 005 bytes 00 00 00 80 DA
13:08:36.873 RX 001 bytes 00
13:08:36.924 RX 005 bytes 00 00 00 80 DA

View File

@@ -0,0 +1,10 @@
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:07:51.066 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB0 state=0x00 value=0x80 frame 006 00 00 B0 00 80 6A
13:07:51.674 TX cycle=1 p1=0x00 p2=0x00 cmd=0xB1 state=0x00 value=0x80 frame 006 00 00 B1 00 80 6B
13:07:51.674 ANOMALY 18 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
13:07:51.674 RX raw 07 80 6C 20 D8 49 07 80 6C 20 D8 49 07 80 6C 20 D8 49
Stopping after anomaly.
FINAL ANOMALY 36 RX bytes; first mismatch at byte 0: got 07, heartbeat offset 3 expected 00
FINAL 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 00 00 00 00 80 DA
Anomalies: 1

View File

@@ -437,3 +437,683 @@ Emerging pattern:
- `CONNECT: NOT ACT` appears to be a parser-recognized but not session-active - `CONNECT: NOT ACT` appears to be a parser-recognized but not session-active
state. It may indicate the RCP recognizes the command class as CCU-like, but state. It may indicate the RCP recognizes the command class as CCU-like, but
the remaining status/identity/activation fields are wrong or incomplete. the remaining status/identity/activation fields are wrong or incomplete.
### Targeted Field Matrix Probe
After the `0x15-0x30` sweep, the best next experiment is not a broader command
sweep. The command byte is clearly relevant, but active-session behavior may
depend on the state/value fields or the prefix bytes. Use
`scripts/serial_probe_matrix.py` to hold one promising command constant and vary
only a small set of fields.
Start with command `0x15` because it is already associated with the RCP's own
`CALL` output frames:
```powershell
python scripts/serial_probe_matrix.py --port COM5 --commands 0x15 --states "0x00 0x80" --values "0x00 0x80" --after-each 1.2 --prompt-screen --log captures/rcp-matrix-cmd15-state-value.txt
```
Dry-run frames:
```text
00 00 15 00 00 4F
00 00 15 00 80 CF
00 00 15 80 00 CF
00 00 15 80 80 4F
```
Why this is useful:
- `00 00 15 00 00 4F` and `00 00 15 80 00 CF` match the RCP's observed
`CALL` frames.
- `00 00 15 00 80 CF` matches the command-sweep shape that triggered
`CONNECT: NOT ACT`.
- `00 00 15 80 80 4F` checks whether both high/state bits together change the
parser state.
If all four still produce only `CONNECT: NOT ACT` or no change, the next matrix
should keep `cmd=0x15`, `state=0x00`, `value=0x80`, and vary only prefix bytes:
```powershell
python scripts/serial_probe_matrix.py --port COM5 --prefix2s "0x00-0x0F" --commands 0x15 --states 0x00 --values 0x80 --after-each 1.2 --prompt-screen --log captures/rcp-matrix-cmd15-prefix2-00-0f.txt
```
Treat any result other than heartbeat-only pin 4 output as high-priority. In
particular, look for a new RCP frame, a different LCD message, or any transition
from `CONNECT: NOT ACT` to an active/connected state.
### 2026-05-13 Command `0x15` State/Value Matrix Result
Capture:
- `captures/rcp-matrix-cmd15-state-value.txt`
Frames tested:
| Command | State | Value | TX frame | Screen result |
| ---: | ---: | ---: | --- | --- |
| `0x15` | `0x00` | `0x00` | `00 00 15 00 00 4F` | `CONNECT NOT ACT` |
| `0x15` | `0x00` | `0x80` | `00 00 15 00 80 CF` | `CONNECT NOT ACT` |
| `0x15` | `0x80` | `0x00` | `00 00 15 80 00 CF` | `CONNECT NOT ACT` |
| `0x15` | `0x80` | `0x80` | `00 00 15 80 80 4F` | `CONNECT NOT ACT` |
Analyzer result:
- Pin 4 RX stayed at heartbeat only: `00 00 00 00 80 DA`.
- No non-heartbeat RCP-to-host frames were observed.
- The RCP was sensitive to all four command `0x15` variants, including both
frames that match the panel's own `CALL` output, but none advanced the panel
beyond `CONNECT NOT ACT`.
Interpretation:
- For command `0x15`, the tested state/value high bits are not enough to produce
an active session.
- The missing host response is likely in another field, a required repeated
cadence, a multi-frame exchange, or a CCU/camera identity/status frame.
- Since command `0x15` is parser-visible across all tested state/value variants,
it is a good anchor for prefix-byte testing.
Recommended next matrix:
```powershell
python scripts/serial_probe_matrix.py --port COM5 --prefix2s "0x00-0x0F" --commands 0x15 --states 0x00 --values 0x80 --after-each 1.2 --prompt-screen --log captures/rcp-matrix-cmd15-prefix2-00-0f.txt
```
If all `prefix2` values behave the same, repeat with `prefix1s "0x00-0x0F"` and
`prefix2s 0x00`. Prefix bytes may encode device address, CCU identity, panel
number, or bus direction.
### 2026-05-13 Command `0x15` Prefix2 Matrix Result
Capture:
- `captures/rcp-matrix-cmd15-prefix2-00-0f.txt`
Test shape:
- `p1=0x00`
- `p2=0x00-0x0F`
- `cmd=0x15`
- `state=0x00`
- `value=0x80`
Analyzer result:
- Pin 4 RX stayed at heartbeat only: `00 00 00 00 80 DA`.
- No non-heartbeat RCP-to-host frames were observed.
- The log contains 263 heartbeat RX frames and 16 transmitted prefix2 variants.
Screen observations:
- `CONNECT NOT ACT` was recorded after prefix2 values `0x00`, `0x01`, `0x02`,
`0x03`, `0x04`, `0x05`, `0x06`, `0x08`, `0x09`, `0x0A`, `0x0B`, `0x0C`,
`0x0D`, and `0x0E`.
- No screen marker was recorded after prefix2 `0x07` or `0x0F`.
- One marker was typed as `CONNECT NTO ACT`; treat this as the same
observation unless later testing proves otherwise.
Interpretation:
- Prefix2 did not produce an active session in the tested low-nibble range.
- The missing response is still not visible on pin 4.
- The missing markers at `0x07` and `0x0F` may be real parser behavior, because
both have low three bits set, but this needs a focused confirmation run before
treating it as a rule.
Recommended confirmation:
```powershell
python scripts/serial_probe_matrix.py --port COM5 --prefix2s "0x06 0x07 0x08 0x0E 0x0F" --commands 0x15 --states 0x00 --values 0x80 --after-each 1.2 --prompt-screen --log captures/rcp-matrix-cmd15-prefix2-confirm.txt
```
Reset the RCP after any screen-triggering result. This keeps the comparison
between trigger and non-trigger prefix2 values clean.
### 2026-05-13 Prefix2 Confirmation Result
Capture:
- `captures/rcp-matrix-cmd15-prefix2-confirm.txt`
Test shape:
- `p1=0x00`
- `p2=0x06`, `0x07`, `0x08`, `0x0E`, `0x0F`
- `cmd=0x15`
- `state=0x00`
- `value=0x80`
Screen observations:
| Prefix2 | TX frame | Screen marker |
| ---: | --- | --- |
| `0x06` | `00 06 15 00 80 C9` | `CONNECT NOT ACT` |
| `0x07` | `00 07 15 00 80 C8` | none recorded |
| `0x08` | `00 08 15 00 80 C7` | `CONNECT NOT ACT` |
| `0x0E` | `00 0E 15 00 80 C1` | `CONNECT NOT ACT` |
| `0x0F` | `00 0F 15 00 80 C0` | none recorded |
Analyzer result:
- 65 heartbeat RX frames: `00 00 00 00 80 DA`.
- 14 apparent non-heartbeat RX frames after `p2=0x0F`:
`00 00 00 80 DA 00`.
- No other RCP-to-host frame shape was observed.
Interpretation:
- `p2=0x07` and `p2=0x0F` again failed to produce a recorded screen marker,
while neighboring values did.
- The apparent `00 00 00 80 DA 00` response after `p2=0x0F` is probably a
one-byte framing slip of the normal heartbeat stream, because it is exactly
the heartbeat sequence viewed from byte offset 1:
`00 00 00 00 80 DA 00 00 ...`.
- Because the shifted heartbeat also satisfies the current XOR checksum
hypothesis, checksum validity alone is not enough to prove frame alignment.
Recommended raw confirmation for `p2=0x0F`:
```powershell
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 0F 15 00 80 C0" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-prefix2-0f-raw.txt
```
Then repeat for `p2=0x07`:
```powershell
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 07 15 00 80 C8" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-prefix2-07-raw.txt
```
Raw capture avoids imposing 6-byte alignment on the received stream, so it
should show whether the apparent non-heartbeat is a real frame or just a shifted
view of the heartbeat.
### Series Resistor Note
Current host-to-RCP tests use a series resistor between adapter `TXD` and RCP
pin 7 as a protection measure. A 4.7 kOhm series resistor should normally still
work with a high-impedance RS-232 receiver input, so it is unlikely to explain a
selective pattern where nearby checksum-valid frames behave differently.
Possible resistor-related failure modes:
- If the RCP input is much lower impedance than expected, 4.7 kOhm could reduce
the voltage swing at pin 7.
- If the input is clamped internally, the resistor may limit current enough to
make the received waveform marginal.
- Marginal signaling would more likely produce random missed/garbled frames
than a repeatable distinction between specific prefix values.
Low-risk check:
- Measure pin 7 relative to pin 9 on the RCP side of the resistor while the
adapter is idle; it should show a strong RS-232 idle level, not near 0 V.
- If testing without the resistor, first try a smaller protection resistor such
as 1 kOhm rather than going straight to a direct connection.
- Compare one known-trigger frame, such as `00 06 15 00 80 C9`, and one
suspected non-trigger frame, such as `00 07 15 00 80 C8`, using the same reset
procedure.
### Direct Response Sweep Without Screen Logging
For response hunting, use `scripts/serial_direct_response_sweep.py` rather than
the older fixed-frame sweep. It sends checksum-valid 6-byte host frames, but
reads pin 4 as raw bytes and checks whether the received data can be explained
as the repeated heartbeat:
```text
00 00 00 00 80 DA
```
This avoids treating shifted heartbeat bytes such as `00 00 00 80 DA 00` as a
new response frame.
Recommended first direct sweep:
```powershell
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
```
What to watch for:
- If the script reports `Anomalies: 0`, the panel never sent raw bytes that
differed from the heartbeat stream during this sweep.
- If it stops on an anomaly, preserve the log and rerun only the reported frame
with raw capture before assuming it is a real response.
- Keep the same resistor/wiring setup for this run so the result remains
comparable to the earlier observations.
If the command-only direct sweep finds nothing, the next direct grid should be
split into two chunks to stay within the default safety limit:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --prefix2s "0x00-0x0F" --commands "0x00-0x1F" --states 0x00 --values 0x80 --after-each 0.4 --stop-on-anomaly --log captures/rcp-direct-p2-00-0f-cmd-00-1f.txt
python scripts/serial_direct_response_sweep.py --port COM5 --prefix2s "0x00-0x0F" --commands "0x20-0x3F" --states 0x00 --values 0x80 --after-each 0.4 --stop-on-anomaly --log captures/rcp-direct-p2-00-0f-cmd-20-3f.txt
```
### 2026-05-13 Direct Command Sweep Response Hit
Capture:
- `captures/rcp-direct-cmd-00-ff.txt`
Sweep shape:
- `p1=0x00`
- `p2=0x00`
- `cmd=0x00-0xFF`
- `state=0x00`
- `value=0x80`
- Stop on first raw RX anomaly.
Important result:
- The sweep stopped immediately after transmitting command `0xB5`:
`00 00 B5 00 80 6F`.
- The previous transmitted command was `0xB4`: `00 00 B4 00 80 6E`, about
0.6 seconds earlier.
- The RCP produced repeated non-heartbeat frames:
`07 80 6D 20 D8 48`.
- Final raw capture showed the same frame repeated, then the panel returned to
the normal heartbeat `00 00 00 00 80 DA`.
Observed response:
```text
07 80 6D 20 D8 48
07 80 6D 20 D8 48
07 80 6D 20 D8 48
...
00 00 00 00 80 DA
```
Checksum check:
- `5A xor 07 xor 80 xor 6D xor 20 xor D8 = 48`.
- This means `07 80 6D 20 D8 48` is a real checksum-valid 6-byte frame under the
current checksum hypothesis, not a shifted heartbeat artifact.
Interpretation:
- This is the first confirmed non-heartbeat RCP-to-host serial response on pin
4 during host-frame probing.
- `cmd=0xB5` is the most likely trigger, but `cmd=0xB4` should be retested
because it was sent one read window earlier and delayed responses are possible.
- The response frame shape suggests the RCP may be reporting a status or
identity-like frame with `p1=0x07`, `p2=0x80`, `cmd=0x6D`, `state=0x20`,
`value=0xD8`.
Recommended confirmation tests:
```powershell
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B4 00 80 6E" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-confirm-cmd-b4-raw.txt
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B5 00 80 6F" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-confirm-cmd-b5-raw.txt
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B6 00 80 6C" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-confirm-cmd-b6-raw.txt
```
If `cmd=0xB5` reliably triggers the `07 80 6D 20 D8 48` response, test whether
the response depends on the state/value fields:
```powershell
python scripts/serial_probe_matrix.py --port COM5 --commands 0xB5 --states "0x00 0x80" --values "0x00 0x80" --after-each 1.2 --prompt-screen --log captures/rcp-matrix-cmd-b5-state-value.txt
```
### 2026-05-13 B4/B5/B6 Single-Frame Confirmation
Captures:
- `captures/rcp-confirm-cmd-b4-raw.txt`
- `captures/rcp-confirm-cmd-b5-raw.txt`
- `captures/rcp-confirm-cmd-b6-raw.txt`
Single frames tested:
| Command | TX frame | Pin 4 result |
| ---: | --- | --- |
| `0xB4` | `00 00 B4 00 80 6E` | heartbeat only |
| `0xB5` | `00 00 B5 00 80 6F` | heartbeat only |
| `0xB6` | `00 00 B6 00 80 6C` | heartbeat only |
Interpretation:
- The earlier `07 80 6D 20 D8 48` response did not reproduce from isolated
single-frame `B4`, `B5`, or `B6` tests.
- The response may require prior sweep history, a command sequence, repeated
cadence, or a temporary parser/session state produced by many earlier frames.
- The `B5` frame is still the best suspect because the direct sweep reported the
anomaly in the read window immediately after transmitting `B5`, but it is not
sufficient by itself in a fresh single-frame test.
Recommended focused replay:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --after-each 0.6 --stop-on-anomaly --log captures/rcp-direct-cmd-b0-b8-replay.txt
```
If that does not reproduce the response, try the same range with a shorter
cadence to better mimic the long sweep:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --after-each 0.25 --stop-on-anomaly --log captures/rcp-direct-cmd-b0-b8-fast.txt
```
If the focused range still does not reproduce it, rerun the longer sweep from
`0xA0-0xB8` rather than the full `0x00-0xFF` range:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xA0-0xB8" --states 0x00 --values 0x80 --after-each 0.6 --stop-on-anomaly --log captures/rcp-direct-cmd-a0-b8-replay.txt
```
### 2026-05-13 B0-B8 Focused Replay Hit
Capture:
- `captures/rcp-direct-cmd-b0-b8-replay.txt`
Replay shape:
- `p1=0x00`
- `p2=0x00`
- `cmd=0xB0-0xB8`
- `state=0x00`
- `value=0x80`
- `after-each=0.6`
- Stop on first raw RX anomaly.
Important result:
- The sweep sent `cmd=0xB0`, then `cmd=0xB1`.
- The anomaly was captured in the read window immediately after transmitting
`cmd=0xB1`: `00 00 B1 00 80 6B`.
- The RCP emitted one checksum-valid non-heartbeat frame:
`07 80 6C 20 D8 49`.
- The final read window returned to heartbeat-only traffic.
Checksum check:
- `5A xor 07 xor 80 xor 6C xor 20 xor D8 = 49`.
Comparison with the earlier full sweep hit:
| Trigger window | RCP response |
| --- | --- |
| After `cmd=0xB1` in focused `B0-B8` replay | `07 80 6C 20 D8 49` |
| After `cmd=0xB5` in full `00-FF` sweep | `07 80 6D 20 D8 48` |
Interpretation:
- The non-heartbeat response is reproducible with a short local sequence, so it
does not require the entire `0x00-0xFF` sweep history.
- The response may be sequence-dependent: `B1` alone is not yet proven as the
trigger because `B0` was sent one window earlier.
- The response command byte changed from `0x6D` to `0x6C`, which suggests the
RCP may be returning a status/identity code related to the host command or to
internal state.
Recommended tight confirmations:
```powershell
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B0 00 80 6A" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-confirm-cmd-b0-raw.txt
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B1 00 80 6B" --repeat 1 --delay 1.5 --after 5 --frame-size 0 --log captures/rcp-confirm-cmd-b1-raw.txt
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB1" --states 0x00 --values 0x80 --after-each 0.6 --stop-on-anomaly --log captures/rcp-direct-cmd-b0-b1-replay.txt
```
If `B1` alone is heartbeat-only but `B0-B1` reproduces the response, treat
`B0 -> B1` as a required two-frame sequence.
### 2026-05-13 B0/B1 Tight Confirmation Result
Captures:
- `captures/rcp-confirm-cmd-b0-raw.txt`
- `captures/rcp-confirm-cmd-b1-raw.txt`
- `captures/rcp-direct-cmd-b0-b1-replay.txt`
Results:
| Test | Pin 4 result |
| --- | --- |
| Single `B0`: `00 00 B0 00 80 6A` | heartbeat only |
| Single `B1`: `00 00 B1 00 80 6B` | heartbeat only |
| Sequence `B0 -> B1` | heartbeat only, `Anomalies: 0` |
Interpretation:
- The `07 80 6C 20 D8 49` response from the `B0-B8` replay did not reproduce
with the minimal `B0 -> B1` sequence.
- The response may be intermittent, cadence-sensitive, dependent on a longer
sequence such as `B0-B8`, or affected by panel state that was not identical
between runs.
- The next priority is measuring reproducibility of the same short range rather
than expanding the search space.
Recommended reproducibility test:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --after-each 0.6 --cycles 5 --cycle-pause 2 --log captures/rcp-direct-cmd-b0-b8-cycles.txt
```
Run this without `--stop-on-anomaly` so all five cycles complete and the log can
show whether the response happens consistently, intermittently, or only once.
### Power-Cycle Isolation Test Plan
Use this plan when intentionally power-cycling the RCP between tests. The goal
is to distinguish a cold-boot reproducible protocol response from a response
that only appears after accumulated parser/session state.
Before each test:
1. Stop any serial script.
2. Power off the RCP.
3. Wait at least 5 seconds.
4. Power on the RCP.
5. Wait until the panel is stable and heartbeat traffic has resumed.
6. Run exactly one test command.
Keep the wiring and series resistor the same between tests unless the test name
explicitly says otherwise.
#### Set A: Cold-Boot Reproducibility
Run these first. They test whether the `B0-B8` response is repeatable from a
fresh power cycle.
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-a1-b0-b8.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-a2-b0-b8.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-a3-b0-b8.txt
```
Expected useful outcomes:
- If all three produce the same response, the sequence is cold-boot
reproducible.
- If only some produce a response, the behavior may be timing-sensitive or
intermittent.
- If none produce a response, the earlier hit likely depended on prior panel
state.
#### Set B: Minimum Sequence Length
Run this set only if Set A produces at least one response. Power-cycle between
each command. These tests find the shortest command prefix that can trigger a
non-heartbeat response.
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB1" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-b1-b0-b1.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB2" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-b2-b0-b2.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB3" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-b3-b0-b3.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB4" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-b4-b0-b4.txt
```
#### Set C: Cadence Sensitivity
Run this set if Set A is inconsistent or if Set B does not identify a clean
minimum sequence. Power-cycle between each command.
Slow cadence:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 1.2 --stop-on-anomaly --log captures/rcp-powercycle-c1-b0-b8-slow.txt
```
Fast cadence:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 0.25 --stop-on-anomaly --log captures/rcp-powercycle-c2-b0-b8-fast.txt
```
Very fast cadence:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB8" --states 0x00 --values 0x80 --settle 3 --after-each 0.1 --stop-on-anomaly --log captures/rcp-powercycle-c3-b0-b8-very-fast.txt
```
#### Set D: Control Tests
Run these if the `B0-B8` range is producing responses. Power-cycle between
each command. These confirm the response is specific to the `B0` range.
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xA8-0xAF" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-d1-a8-af-control.txt
```
Power-cycle, then:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB8-0xBF" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-d2-b8-bf-control.txt
```
If a response appears in control ranges too, the trigger may be a broader
command class rather than a specific `B0-B8` sequence.
### 2026-05-13 Power-Cycle Set A Result
Captures:
- `captures/rcp-powercycle-a1-b0-b8.txt`
- `captures/rcp-powercycle-a2-b0-b8.txt`
- `captures/rcp-powercycle-a3-b0-b8.txt`
Each run was performed after a panel power cycle. All three runs produced the
same non-heartbeat response.
| Run | Trigger window | RCP response | Result |
| --- | --- | --- | --- |
| A1 | after `B1`: `00 00 B1 00 80 6B` | `07 80 6C 20 D8 49` repeated | anomaly |
| A2 | after `B1`: `00 00 B1 00 80 6B` | `07 80 6C 20 D8 49` repeated | anomaly |
| A3 | after `B1`: `00 00 B1 00 80 6B` | `07 80 6C 20 D8 49` repeated | anomaly |
Observed raw pattern in each run:
```text
07 80 6C 20 D8 49
07 80 6C 20 D8 49
07 80 6C 20 D8 49
...
00 00 00 00 80 DA
```
Interpretation:
- The `B0-B8` response is cold-boot reproducible.
- The response appears immediately after the `B1` transmit window when the test
starts from a fresh power cycle.
- The earlier `B0 -> B1` heartbeat-only result was likely affected by panel
state from previous experiments, timing, or not starting from an equivalent
cold condition.
- The next test should determine whether `B0 -> B1` is sufficient from a fresh
power cycle, or whether the script/test context of the `B0-B8` run matters.
Recommended next power-cycle tests:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB1" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-b1-b0-b1.txt
```
Power-cycle, then:
```powershell
python scripts/serial_probe_response.py --port COM5 --tx-frame "00 00 B1 00 80 6B" --repeat 1 --delay 3 --after 5 --frame-size 0 --log captures/rcp-powercycle-b1-alone-raw.txt
```
If `B0-B1` reproduces but `B1` alone does not, treat `B0 -> B1` as the minimum
cold-boot sequence.
### 2026-05-13 Minimum Cold-Boot Sequence Result
Captures:
- `captures/rcp-powercycle-b0.txt`
- `captures/rcp-powercycle-b1-b0-b1.txt`
- `captures/rcp-powercycle-b1-alone-raw.txt`
Each test was run after a panel power cycle.
| Test | TX frame(s) | Pin 4 result |
| --- | --- | --- |
| `B0` alone | `00 00 B0 00 80 6A` | heartbeat only, `Anomalies: 0` |
| `B1` alone | `00 00 B1 00 80 6B` | heartbeat only |
| `B0 -> B1` | `00 00 B0 00 80 6A`, then `00 00 B1 00 80 6B` | `07 80 6C 20 D8 49` repeated |
Conclusion:
- The minimum confirmed cold-boot trigger is the two-frame sequence:
```text
Host -> RCP: 00 00 B0 00 80 6A
Host -> RCP: 00 00 B1 00 80 6B
RCP -> Host: 07 80 6C 20 D8 49
```
- Neither `B0` nor `B1` is sufficient alone from a cold panel.
- `B0` appears to prime the panel, and `B1` completes the query/trigger.
- The response repeats for a short period, then the panel returns to the normal
heartbeat `00 00 00 00 80 DA`.
Recommended next tests:
1. Timing sensitivity between `B0` and `B1`.
2. State/value sensitivity of the `B0 -> B1` pair.
3. Whether the response changes when sending nearby pairs such as `B1 -> B2`,
`B2 -> B3`, etc.
Suggested timing tests, with power cycle between each:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB1" --states 0x00 --values 0x80 --settle 3 --after-each 0.1 --stop-on-anomaly --log captures/rcp-powercycle-timing-b0-b1-100ms.txt
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB0-0xB1" --states 0x00 --values 0x80 --settle 3 --after-each 1.2 --stop-on-anomaly --log captures/rcp-powercycle-timing-b0-b1-1200ms.txt
```
Suggested nearby-pair tests, with power cycle between each:
```powershell
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB1-0xB2" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-pair-b1-b2.txt
python scripts/serial_direct_response_sweep.py --port COM5 --commands "0xB2-0xB3" --states 0x00 --values 0x80 --settle 3 --after-each 0.6 --stop-on-anomaly --log captures/rcp-powercycle-pair-b2-b3.txt
```

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Summarize fixed-size hex frames from serial_sniff.py logs.""" """Summarize fixed-size hex frames from serial helper logs."""
from __future__ import annotations from __future__ import annotations
@@ -9,7 +9,11 @@ import re
from pathlib import Path from pathlib import Path
FRAME_RE = re.compile(r"\b(?:(RX|TX)\s+)?frame\s+\d+\s+((?:[0-9A-Fa-f]{2}\s*)+)$") FRAME_RE = re.compile(
r"\b(?P<direction>RX|TX)(?:\s+cmd\s+0x[0-9A-Fa-f]{2})?"
r"(?:\s+fields\b.*?)?\s+"
r"frame\s+\d+\s+(?P<frame>(?:[0-9A-Fa-f]{2}\s*)+)(?:\s+\S.*)?$"
)
def frames_from_log(path: Path) -> list[tuple[str, str]]: def frames_from_log(path: Path) -> list[tuple[str, str]]:
@@ -17,8 +21,8 @@ def frames_from_log(path: Path) -> list[tuple[str, str]]:
for line in path.read_text(encoding="utf-8").splitlines(): for line in path.read_text(encoding="utf-8").splitlines():
match = FRAME_RE.search(line.strip()) match = FRAME_RE.search(line.strip())
if match: if match:
direction = match.group(1) or "RX" direction = match.group("direction")
frame = " ".join(match.group(2).upper().split()) frame = " ".join(match.group("frame").upper().split())
frames.append((direction, frame)) frames.append((direction, frame))
return frames return frames

View File

@@ -0,0 +1,293 @@
#!/usr/bin/env python3
"""Sweep RCP-TX7 host frames and flag raw RX bytes beyond heartbeat.
This helper is for unattended response hunting. It sends checksum-valid 6-byte
candidate frames and reads the RCP-to-host line as raw bytes. Instead of forcing
the incoming stream into fixed 6-byte frames, it checks whether the received
bytes can be explained as a contiguous slice of the known repeated heartbeat:
00 00 00 00 80 DA
That avoids false positives such as:
00 00 00 80 DA 00
which is just the normal heartbeat viewed one byte late.
"""
from __future__ import annotations
import argparse
import datetime as dt
import itertools
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 candidate host frames and stop/log on 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("--prefix1s", type=parse_byte_set, default=[0x00])
parser.add_argument("--prefix2s", type=parse_byte_set, default=[0x00])
parser.add_argument("--commands", type=parse_byte_set, default=[0x00])
parser.add_argument("--states", type=parse_byte_set, default=[0x00])
parser.add_argument("--values", type=parse_byte_set, default=[0x80])
parser.add_argument("--settle", type=float, default=1.5)
parser.add_argument("--after-each", type=float, default=1.0)
parser.add_argument("--after", 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("--stop-on-anomaly", action="store_true")
parser.add_argument("--verbose-heartbeat", action="store_true")
parser.add_argument("--cycles", type=int, default=1)
parser.add_argument("--cycle-pause", type=float, default=0.0)
parser.add_argument(
"--max-frames",
type=int,
default=512,
help="safety limit for generated frames",
)
return parser.parse_args()
def main() -> int:
args = parse_args()
if args.cycles < 1:
raise SystemExit("--cycles must be >= 1")
rows = list(
itertools.product(
args.prefix1s,
args.prefix2s,
args.commands,
args.states,
args.values,
)
)
if len(rows) > args.max_frames:
raise SystemExit(
f"Refusing to send {len(rows)} frames; raise --max-frames if intentional"
)
frames = [
(prefix1, prefix2, command, state, value, build_frame(prefix1, prefix2, command, state, value))
for prefix1, prefix2, command, state, value in rows
]
if args.dry_run:
for prefix1, prefix2, command, state, value, frame in frames:
print(
f"p1=0x{prefix1:02X} p2=0x{prefix2:02X} cmd=0x{command:02X} "
f"state=0x{state:02X} value=0x{value: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:
ser.reset_input_buffer()
total_frames = len(frames) * args.cycles
emit(
f"Direct response sweep: {len(frames)} frames x {args.cycles} cycles "
f"({total_frames} total) on {ser.port} at {ser.baudrate} 8N1"
)
baseline = read_window(ser, args.settle)
baseline_anomaly, baseline_note = classify_rx(baseline)
emit(f"BASELINE {baseline_note}")
if baseline_anomaly:
emit(f"BASELINE raw {hex_preview(baseline)}")
should_stop = False
for cycle in range(1, args.cycles + 1):
if args.cycles > 1:
emit(f"CYCLE {cycle}/{args.cycles}")
for prefix1, prefix2, command, state, value, frame in frames:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(
f"{stamp} TX cycle={cycle} p1=0x{prefix1:02X} p2=0x{prefix2:02X} "
f"cmd=0x{command:02X} state=0x{state:02X} value=0x{value:02X} "
f"frame {len(frame):03d} {hex_preview(frame)}"
)
ser.write(frame)
ser.flush()
rx = read_window(ser, args.after_each)
is_anomaly, note = classify_rx(rx)
if is_anomaly:
anomaly_count += 1
emit(f"{stamp} {note}")
emit(f"{stamp} RX raw {hex_preview(rx)}")
if args.stop_on_anomaly:
emit("Stopping after anomaly.")
should_stop = True
break
elif args.verbose_heartbeat:
emit(f"{stamp} {note}")
if should_stop:
break
if cycle < args.cycles and args.cycle_pause > 0:
pause_rx = read_window(ser, args.cycle_pause)
pause_anomaly, pause_note = classify_rx(pause_rx)
emit(f"CYCLE {cycle} PAUSE {pause_note}")
if pause_anomaly:
anomaly_count += 1
emit(f"CYCLE {cycle} PAUSE raw {hex_preview(pause_rx)}")
if args.stop_on_anomaly:
emit("Stopping after anomaly.")
break
final_rx = read_window(ser, args.after)
final_anomaly, final_note = classify_rx(final_rx)
emit(f"FINAL {final_note}")
if final_anomaly:
emit(f"FINAL raw {hex_preview(final_rx)}")
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())

View File

@@ -0,0 +1,226 @@
#!/usr/bin/env python3
"""Targeted RCP-TX7 host-frame field probe.
This is for the phase after a command sweep finds parser-visible commands. It
keeps the observed 6-byte frame shape:
prefix1 prefix2 command state value checksum
and tries a small matrix of selected field values with the checksum hypothesis:
checksum = 0x5A xor prefix1 xor prefix2 xor command xor state xor value
Use narrow ranges and reset the RCP between screen-triggering attempts when you
need independent observations.
"""
from __future__ import annotations
import argparse
import datetime as dt
import itertools
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")
deduped = list(dict.fromkeys(values))
return deduped
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 drain_rx(ser: serial.Serial, emit, until: float, frame_size: int) -> int:
buffer = bytearray()
interesting = 0
while time.monotonic() < until:
data = ser.read(64)
if not data:
continue
buffer.extend(data)
while len(buffer) >= frame_size:
frame = bytes(buffer[:frame_size])
del buffer[:frame_size]
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
marker = "" if frame == HEARTBEAT else " NON_HEARTBEAT"
emit(f"{stamp} RX frame {frame_size:03d} {hex_preview(frame)}{marker}")
if frame != HEARTBEAT:
interesting += 1
return interesting
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Probe selected RCP-TX7 frame fields and log screen observations."
)
parser.add_argument("--port", required=True, help="serial port, for example COM5")
parser.add_argument("--baud", type=int, default=38400)
parser.add_argument("--prefix1s", type=parse_byte_set, default=[0x00])
parser.add_argument("--prefix2s", type=parse_byte_set, default=[0x00])
parser.add_argument("--commands", type=parse_byte_set, default=[0x15])
parser.add_argument("--states", type=parse_byte_set, default=[0x00, 0x80])
parser.add_argument("--values", type=parse_byte_set, default=[0x00, 0x80])
parser.add_argument("--settle", type=float, default=1.5)
parser.add_argument("--after-each", type=float, default=1.0)
parser.add_argument("--after", type=float, default=3.0)
parser.add_argument("--frame-size", type=int, default=6)
parser.add_argument("--log", help="append capture/transmit log to this file")
parser.add_argument("--prompt-screen", action="store_true")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument(
"--max-frames",
type=int,
default=64,
help="safety limit for generated frames",
)
return parser.parse_args()
def main() -> int:
args = parse_args()
rows = list(
itertools.product(
args.prefix1s,
args.prefix2s,
args.commands,
args.states,
args.values,
)
)
if len(rows) > args.max_frames:
raise SystemExit(
f"Refusing to send {len(rows)} frames; raise --max-frames if intentional"
)
frames = [
(prefix1, prefix2, command, state, value, build_frame(prefix1, prefix2, command, state, value))
for prefix1, prefix2, command, state, value in rows
]
if args.dry_run:
for prefix1, prefix2, command, state, value, frame in frames:
print(
f"p1=0x{prefix1:02X} p2=0x{prefix2:02X} cmd=0x{command:02X} "
f"state=0x{state:02X} value=0x{value: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=0.05,
write_timeout=1.0,
rtscts=False,
dsrdtr=False,
xonxoff=False,
) as ser:
ser.reset_input_buffer()
emit(f"Probing {len(frames)} field combinations on {ser.port} at {ser.baudrate} 8N1")
drain_rx(ser, emit, time.monotonic() + args.settle, args.frame_size)
for prefix1, prefix2, command, state, value, frame in frames:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(
f"{stamp} TX fields p1=0x{prefix1:02X} p2=0x{prefix2:02X} "
f"cmd=0x{command:02X} state=0x{state:02X} value=0x{value:02X} "
f"frame {len(frame):03d} {hex_preview(frame)}"
)
ser.write(frame)
ser.flush()
drain_rx(ser, emit, time.monotonic() + args.after_each, args.frame_size)
if args.prompt_screen:
screen = input(
"Screen after "
f"cmd 0x{command:02X} state 0x{state:02X} value 0x{value:02X} "
"(blank = no change, q = stop): "
).strip()
if screen:
stamp = dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
emit(
f"{stamp} SCREEN p1=0x{prefix1:02X} p2=0x{prefix2:02X} "
f"cmd=0x{command:02X} state=0x{state:02X} "
f"value=0x{value:02X} {screen}"
)
if screen.lower() in {"q", "quit", "stop"}:
break
drain_rx(ser, emit, time.monotonic() + args.after, args.frame_size)
except KeyboardInterrupt:
print("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())