From d9a9dade4177dc9bbed6f24011fcace68915ec86 Mon Sep 17 00:00:00 2001 From: Aiden <68633820+awils27@users.noreply.github.com> Date: Tue, 26 May 2026 16:01:20 +1000 Subject: [PATCH] copy in progress --- docs/pt2-protocol.md | 1 + scenarios/copy-hold-006d-5x-006c.json | 53 ++++++++++++++++++ scenarios/copy-hold-006d-5x-no-complete.json | 51 +++++++++++++++++ scenarios/copy-repeat-006d-2x-006c.json | 53 ++++++++++++++++++ scenarios/copy-repeat-006d-3x-006c.json | 59 ++++++++++++++++++++ scenarios/copy-step-006d-006c-1500ms.json | 47 ++++++++++++++++ scenarios/copy-step-006d-006c-2000ms.json | 47 ++++++++++++++++ 7 files changed, 311 insertions(+) create mode 100644 scenarios/copy-hold-006d-5x-006c.json create mode 100644 scenarios/copy-hold-006d-5x-no-complete.json create mode 100644 scenarios/copy-repeat-006d-2x-006c.json create mode 100644 scenarios/copy-repeat-006d-3x-006c.json create mode 100644 scenarios/copy-step-006d-006c-1500ms.json create mode 100644 scenarios/copy-step-006d-006c-2000ms.json diff --git a/docs/pt2-protocol.md b/docs/pt2-protocol.md index 9063d8e..505cfb0 100644 --- a/docs/pt2-protocol.md +++ b/docs/pt2-protocol.md @@ -562,6 +562,7 @@ The `0x006D` copy path is now confirmed outside the earlier all-suite ordering c - Selector `0x006D` dispatches to `H'3015`. Forced decoding shows it sets `F731.7`, loads `F798=H'C8`, sets `F795.6/F795.7`, sets display selector `F732=H'1903`, sets `FB02=H'64`, calls `48FA`, then sets `F76E.6`. - The LCD dispatch for these states is now traced: `loc_48FA` reads the high byte at `F732`, so `F732=H'1903/H'1904` selects display page `0x19`, not direct page `0x03/0x04`. `493E[0x19] -> H'930A`; that page's local table at `H'931C` includes `H'9F6A` for `COPY` / `IN PROGRESS` and `H'9FDA` for `COPY` / `COMPLETED`. The low byte at `F733` is the substate selector: `0x03` is in-progress and `0x04` is completed. - This makes the likely copy handshake: `0x006D` starts copy and sets the `F795.6/F795.7` in-progress flags; `0x006C` is the completion/exit sibling only when those flags are live. Sending `0x006C` alone can therefore blank or clear state instead of displaying `COPY COMPLETED`. +- Bench step-through confirmed the sequence model: `006C` alone produced `CONNECT OK -> blank`; `006D` alone produced `CONNECT OK -> COPY IN PROGRESS`; `006D` followed by `006C` after 250 ms produced a brief `COPY IN PROGRESS` then `COPY COMPLETED`; the same after 1.0 s and 1.5 s produced a longer `COPY IN PROGRESS` then `COPY COMPLETED`; after 2.0 s or 2.5 s it fell to `CONNECT:NOT ACT` instead of completing. Repeating `006D` before `006C` also completed successfully in the 2x and 3x repeat tests. This points to an active completion window that can likely be refreshed/restarted by additional in-progress/progress traffic, rather than a stateless command. - The FRT1 timer path decrements `F797` and `F798`; when either reaches zero, it clears `F731.7`. This matches the observed transient display modes falling back to `CONNECT:NOT ACT`. - The string `COPY IN PROGRESS` is present in the ROM LCD resources, so the `006D` result is not a generic serial artifact. - Manual interpretation: the RCP-TX7 operating manual describes `COPY IN PROGRESS` as the LCD state shown during the multi-camera `COPY TO SLAVES` data-transfer operation over the RS232C command-link system. During that state, all linked RCP units display the message and their buttons/knobs are locked until `COPY COMPLETED`. Therefore selector `0x006D` is best treated as entering a command-link copy/data-transfer state, not as a normal CCU connection ACK. diff --git a/scenarios/copy-hold-006d-5x-006c.json b/scenarios/copy-hold-006d-5x-006c.json new file mode 100644 index 0000000..2b85bef --- /dev/null +++ b/scenarios/copy-hold-006d-5x-006c.json @@ -0,0 +1,53 @@ +{ + "name": "copy-hold-006d-5x-006c", + "notes": [ + "Recover to CONNECT OK, send 006D every 1 second for five starts/progress ticks, then send 006C.", + "Tests whether repeated 006D can hold the copy-in-progress state for a longer transfer before completion." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "repeat", + "count": 5, + "steps": [ + { + "action": "send", + "label": "copy_progress_006d", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + } + ] + }, + { + "action": "send", + "label": "copy_complete_candidate_006c", + "frame": "05 00 6C 00 00 33", + "listen": 10.0 + } + ] +} diff --git a/scenarios/copy-hold-006d-5x-no-complete.json b/scenarios/copy-hold-006d-5x-no-complete.json new file mode 100644 index 0000000..0053954 --- /dev/null +++ b/scenarios/copy-hold-006d-5x-no-complete.json @@ -0,0 +1,51 @@ +{ + "name": "copy-hold-006d-5x-no-complete", + "notes": [ + "Recover to CONNECT OK, send 006D every 1 second five times, then do not send 006C.", + "Tests whether the timeout/fallback is measured from the last 006D progress tick." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "repeat", + "count": 5, + "steps": [ + { + "action": "send", + "label": "copy_progress_006d", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + } + ] + }, + { + "action": "listen", + "seconds": 10.0 + } + ] +} diff --git a/scenarios/copy-repeat-006d-2x-006c.json b/scenarios/copy-repeat-006d-2x-006c.json new file mode 100644 index 0000000..b236e4e --- /dev/null +++ b/scenarios/copy-repeat-006d-2x-006c.json @@ -0,0 +1,53 @@ +{ + "name": "copy-repeat-006d-2x-006c", + "notes": [ + "Recover to CONNECT OK, send 006D twice one second apart, then send 006C.", + "Tests whether repeating the in-progress selector extends/resets the completion window or interferes with completion." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d_1", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d_2", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_complete_candidate_006c", + "frame": "05 00 6C 00 00 33", + "listen": 10.0 + } + ] +} diff --git a/scenarios/copy-repeat-006d-3x-006c.json b/scenarios/copy-repeat-006d-3x-006c.json new file mode 100644 index 0000000..b31f574 --- /dev/null +++ b/scenarios/copy-repeat-006d-3x-006c.json @@ -0,0 +1,59 @@ +{ + "name": "copy-repeat-006d-3x-006c", + "notes": [ + "Recover to CONNECT OK, send 006D three times one second apart, then send 006C.", + "Tests whether repeated in-progress selectors can keep the copy state alive longer than the single-start window." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d_1", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d_2", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d_3", + "frame": "05 00 6D 00 00 32", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_complete_candidate_006c", + "frame": "05 00 6C 00 00 33", + "listen": 10.0 + } + ] +} diff --git a/scenarios/copy-step-006d-006c-1500ms.json b/scenarios/copy-step-006d-006c-1500ms.json new file mode 100644 index 0000000..6a7a21f --- /dev/null +++ b/scenarios/copy-step-006d-006c-1500ms.json @@ -0,0 +1,47 @@ +{ + "name": "copy-step-006d-006c-1500ms", + "notes": [ + "Recover to CONNECT OK, send 006D, then send 006C 1.5 seconds later.", + "Narrows the working copy-complete window between the known 1.0s success and 2.5s failure." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d", + "frame": "05 00 6D 00 00 32", + "listen": 1.5 + }, + { + "action": "send", + "label": "copy_complete_candidate_006c", + "frame": "05 00 6C 00 00 33", + "listen": 10.0 + } + ] +} diff --git a/scenarios/copy-step-006d-006c-2000ms.json b/scenarios/copy-step-006d-006c-2000ms.json new file mode 100644 index 0000000..6d64580 --- /dev/null +++ b/scenarios/copy-step-006d-006c-2000ms.json @@ -0,0 +1,47 @@ +{ + "name": "copy-step-006d-006c-2000ms", + "notes": [ + "Recover to CONNECT OK, send 006D, then send 006C 2.0 seconds later.", + "Narrows the copy-complete acceptance window before the known 2.5s failure." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "timeout": 10.0, + "heartbeats": 2, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "ok_baseline_1", + "frame": "04 00 00 80 00 DE", + "listen": 0.7 + }, + { + "action": "send", + "label": "ok_baseline_2", + "frame": "04 00 00 80 00 DE", + "listen": 1.0 + }, + { + "action": "send", + "label": "copy_start_006d", + "frame": "05 00 6D 00 00 32", + "listen": 2.0 + }, + { + "action": "send", + "label": "copy_complete_candidate_006c", + "frame": "05 00 6C 00 00 33", + "listen": 10.0 + } + ] +}