This commit is contained in:
Aiden
2026-05-13 16:41:19 +10:00
parent 4e8be74dd9
commit 27cc85e1c1
8 changed files with 151 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
Button test on COM5 at 38400 8N1
Listening for 15.0s; respond_to_cam_power=False, respond_to_call=True, mirror_call=False
16:38:07.222 RX 001 bytes 00
16:38:07.253 RX 005 bytes 00 00 00 80 DA
16:38:07.923 RX 001 bytes 00
16:38:07.954 RX 005 bytes 00 00 00 80 DA
16:38:08.076 RX 006 bytes 00 00 15 80 00 CF
16:38:08.076 DETECT call-on x1
16:38:08.177 TX button response frame 006 00 00 15 80 00 CF
16:38:08.177 TX button response frame 006 00 00 15 00 00 4F
16:38:10.134 RX 001 bytes 00
16:38:10.164 RX 005 bytes 00 00 00 80 DA
16:38:10.288 RX 001 bytes 00
16:38:10.318 RX 005 bytes 00 15 00 00 4F
16:38:10.933 RX 006 bytes 00 00 00 00 80 DA
16:38:10.933 DETECT heartbeat x1
16:38:11.633 RX 006 bytes 00 00 00 00 80 DA
16:38:11.633 DETECT heartbeat x1
Stopped.

View File

@@ -0,0 +1,16 @@
Button test on COM5 at 38400 8N1
Listening for 15.0s; respond_to_cam_power=False, respond_to_call=True, mirror_call=False
16:36:57.448 RX 001 bytes 00
16:36:57.479 RX 005 bytes 00 00 00 80 DA
16:36:57.935 RX 006 bytes 00 00 15 80 00 CF
16:36:57.935 DETECT call-on x1
16:36:57.996 TX button response frame 006 00 00 15 80 00 CF
16:36:57.996 TX button response frame 006 00 00 15 00 00 4F
16:36:59.948 RX 001 bytes 00
16:36:59.978 RX 006 bytes 00 00 00 80 DA 00
16:37:00.008 RX 005 bytes 00 15 00 00 4F
16:37:00.651 RX 001 bytes 00
16:37:00.684 RX 005 bytes 00 00 00 80 DA
16:37:01.355 RX 006 bytes 00 00 00 00 80 DA
16:37:01.355 DETECT heartbeat x1
Stopped.

View File

@@ -0,0 +1,19 @@
Button test on COM5 at 38400 8N1
Listening for 15.0s; respond_to_cam_power=False, respond_to_call=True, mirror_call=False
16:37:16.300 RX 001 bytes 00
16:37:16.330 RX 005 bytes 00 00 00 80 DA
16:37:17.000 RX 001 bytes 00
16:37:17.030 RX 005 bytes 00 00 00 80 DA
16:37:17.060 RX 006 bytes 00 00 15 80 00 CF
16:37:17.060 DETECT call-on x1
16:37:17.131 TX button response frame 006 00 00 15 80 00 CF
16:37:17.131 TX button response frame 006 00 00 15 00 00 4F
16:37:19.114 RX 006 bytes 00 00 00 00 80 DA
16:37:19.114 DETECT heartbeat x1
16:37:19.145 RX 001 bytes 00
16:37:19.175 RX 005 bytes 00 15 00 00 4F
16:37:19.817 RX 006 bytes 00 00 00 00 80 DA
16:37:19.817 DETECT heartbeat x1
16:37:20.489 RX 001 bytes 00
16:37:20.520 RX 005 bytes 00 00 00 80 DA
Stopped.

View File

@@ -0,0 +1,17 @@
Button test on COM5 at 38400 8N1
Listening for 15.0s; respond_to_cam_power=False, respond_to_call=True, mirror_call=False
16:37:34.047 RX 001 bytes 00
16:37:34.077 RX 005 bytes 00 00 00 80 DA
16:37:34.597 RX 006 bytes 00 00 15 80 00 CF
16:37:34.597 DETECT call-on x1
16:37:34.678 TX button response frame 006 00 00 15 80 00 CF
16:37:34.678 TX button response frame 006 00 00 15 00 00 4F
16:37:36.666 RX 006 bytes 00 00 00 00 80 DA
16:37:36.666 DETECT heartbeat x1
16:37:36.818 RX 001 bytes 00
16:37:36.849 RX 005 bytes 00 15 00 00 4F
16:37:37.461 RX 006 bytes 00 00 00 00 80 DA
16:37:37.461 DETECT heartbeat x1
16:37:38.162 RX 006 bytes 00 00 00 00 80 DA
16:37:38.162 DETECT heartbeat x1
Stopped.

View File

@@ -0,0 +1,19 @@
Button test on COM5 at 38400 8N1
Listening for 15.0s; respond_to_cam_power=False, respond_to_call=True, mirror_call=False
16:37:51.520 RX 001 bytes 00
16:37:51.551 RX 005 bytes 00 00 00 80 DA
16:37:51.673 RX 006 bytes 00 00 15 80 00 CF
16:37:51.673 DETECT call-on x1
16:37:51.764 TX button response frame 006 00 00 15 80 00 CF
16:37:51.764 TX button response frame 006 00 00 15 00 00 4F
16:37:53.742 RX 006 bytes 00 00 00 00 80 DA
16:37:53.742 DETECT heartbeat x1
16:37:53.984 RX 001 bytes 00
16:37:54.015 RX 005 bytes 00 15 00 00 4F
16:37:54.626 RX 001 bytes 00
16:37:54.656 RX 005 bytes 00 00 00 80 DA
16:37:55.326 RX 001 bytes 00
16:37:55.357 RX 005 bytes 00 00 00 80 DA
16:37:56.026 RX 001 bytes 00
16:37:56.058 RX 005 bytes 00 00 00 80 DA
Stopped.

View File

@@ -3034,3 +3034,55 @@ python scripts/serial_button_response_test.py --port COM5 --duration 15 --prompt
This test is deliberately secondary. Run it only after the `0x45` family This test is deliberately secondary. Run it only after the `0x45` family
repeats, so any change can be attributed to the follow-up rather than to the repeats, so any change can be attributed to the follow-up rather than to the
initial CALL echo timing. initial CALL echo timing.
### 2026-05-13 CALL 60-100 ms Repeat Result
Captures:
- `captures/rcp-buttons-call-exact-echo-delay-60ms.txt`
- `captures/rcp-buttons-call-exact-echo-delay-70ms.txt`
- `captures/rcp-buttons-call-exact-echo-delay-80ms-v2.txt`
- `captures/rcp-buttons-call-exact-echo-delay-90ms.txt`
- `captures/rcp-buttons-call-exact-echo-delay-100ms.txt`
Observed result:
| Delay | Result |
| --- | --- |
| 60 ms | no `0x45` response |
| 70 ms | no `0x45` response |
| 80 ms repeat | no `0x45` response |
| 90 ms | no `0x45` response |
| 100 ms | no `0x45` response |
Interpretation:
- The `07 80 45 30 D0 78` response from the earlier 80 ms run did not repeat in
the 80 ms repeat or nearby 60-100 ms bracket.
- The trigger is not controlled by the simple delay between CALL high detection
and the two-frame echo pair alone.
- A more likely variable is the spacing between the host's CALL-high echo and
CALL-low echo, or the RCP's internal heartbeat/call-scan phase when the echo
pair arrives.
Next test direction:
- Keep the initial response delay fixed near the values that have produced hits
before, but vary the spacing between the two echoed CALL frames.
Tooling note:
- `scripts/serial_button_response_test.py` now supports
`--response-frame-interval`, which inserts a delay between multiple
`--response-frame` values sent for the same observed button event.
Inter-frame timing ladder:
```powershell
python scripts/serial_button_response_test.py --port COM5 --duration 15 --prompt --respond-to-call --respond-once --response-delay 0.05 --response-frame-interval 0.02 --response-frame "00 00 15 80 00 CF" --response-frame "00 00 15 00 00 4F" --watch-frame "07 80 45 20 D0 68" --watch-frame "07 80 45 30 D0 78" --log captures/rcp-buttons-call-frame-gap-20ms.txt
python scripts/serial_button_response_test.py --port COM5 --duration 15 --prompt --respond-to-call --respond-once --response-delay 0.05 --response-frame-interval 0.05 --response-frame "00 00 15 80 00 CF" --response-frame "00 00 15 00 00 4F" --watch-frame "07 80 45 20 D0 68" --watch-frame "07 80 45 30 D0 78" --log captures/rcp-buttons-call-frame-gap-50ms.txt
python scripts/serial_button_response_test.py --port COM5 --duration 15 --prompt --respond-to-call --respond-once --response-delay 0.05 --response-frame-interval 0.08 --response-frame "00 00 15 80 00 CF" --response-frame "00 00 15 00 00 4F" --watch-frame "07 80 45 20 D0 68" --watch-frame "07 80 45 30 D0 78" --log captures/rcp-buttons-call-frame-gap-80ms.txt
python scripts/serial_button_response_test.py --port COM5 --duration 15 --prompt --respond-to-call --respond-once --response-delay 0.08 --response-frame-interval 0.05 --response-frame "00 00 15 80 00 CF" --response-frame "00 00 15 00 00 4F" --watch-frame "07 80 45 20 D0 68" --watch-frame "07 80 45 30 D0 78" --log captures/rcp-buttons-call-delay-80ms-frame-gap-50ms.txt
```
For each run, power-cycle first and use the same roughly 2 second CALL hold.

View File

@@ -176,6 +176,12 @@ def parse_args() -> argparse.Namespace:
) )
parser.add_argument("--followup-delay", type=float, default=0.05) parser.add_argument("--followup-delay", type=float, default=0.05)
parser.add_argument("--response-delay", type=float, default=0.05) parser.add_argument("--response-delay", type=float, default=0.05)
parser.add_argument(
"--response-frame-interval",
type=float,
default=0.0,
help="delay between multiple response frames sent for one button event",
)
parser.add_argument("--response-repeat", type=int, default=1) parser.add_argument("--response-repeat", type=int, default=1)
parser.add_argument("--response-interval", type=float, default=0.2) parser.add_argument("--response-interval", type=float, default=0.2)
parser.add_argument( parser.add_argument(
@@ -302,7 +308,9 @@ def main() -> int:
responded = True responded = True
time.sleep(args.response_delay) time.sleep(args.response_delay)
for _ in range(args.response_repeat): for _ in range(args.response_repeat):
for response in response_frames: for response_index, response in enumerate(response_frames):
if response_index and args.response_frame_interval:
time.sleep(args.response_frame_interval)
send_frame(ser, emit, "button response", response) send_frame(ser, emit, "button response", response)
if args.response_repeat > 1: if args.response_repeat > 1:
time.sleep(args.response_interval) time.sleep(args.response_interval)