From a187214e06e86f2d4db13000176ef2db20cb61f8 Mon Sep 17 00:00:00 2001 From: Aiden <68633820+awils27@users.noreply.github.com> Date: Tue, 26 May 2026 18:35:13 +1000 Subject: [PATCH] knee auto tests --- docs/pt2-lamp-selector-map.md | 50 +++- docs/pt2-protocol.md | 8 +- scenarios/lamp-isolate-knee-bit-scan.json | 206 ++++++++++++++ .../lamp-isolate-knee-tail-single-boot.json | 260 ++++++++++++++++++ .../lamp-isolate-neighbor-single-boot.json | 238 ++++++++++++++++ 5 files changed, 755 insertions(+), 7 deletions(-) create mode 100644 scenarios/lamp-isolate-knee-bit-scan.json create mode 100644 scenarios/lamp-isolate-knee-tail-single-boot.json create mode 100644 scenarios/lamp-isolate-neighbor-single-boot.json diff --git a/docs/pt2-lamp-selector-map.md b/docs/pt2-lamp-selector-map.md index ef3ca3f..8386ce7 100644 --- a/docs/pt2-lamp-selector-map.md +++ b/docs/pt2-lamp-selector-map.md @@ -43,9 +43,31 @@ Candidate mapping: | Selector/value pair | Current meaning | | --- | --- | -| `0x0007 = 0x8000/0x0000` | strongest CAM POWER lamp candidate | -| `0x0015 = 0x8000/0x0000` | strongest CALL lamp candidate | -| `0x0012`, `0x0013`, `0x0016`, `0x0017`, `0x0018`, `0x001A` | BARS, MASTER, tally red/green candidates; exact assignment still needs isolation | +| `0x0007 = 0x8000/0x0000` | CAM POWER lamp blink confirmed by isolated run | +| `0x0015 = 0x8000/0x0000` | CALL lamp blink confirmed; red tally also blinked in the same phase | +| `0x0012`, `0x0013`, `0x0016`, `0x0017`, `0x0018`, `0x001A` | ordered candidates for SLAVE, green tally, BARS, MASTER, and neighboring lamp states | + +Follow-up `lamp-isolate-cam-call` result: + +- First phase blinked CAM POWER. +- Second phase blinked CALL and red tally. + +Follow-up `lamp-isolate-known-neighbors` result: + +- Visible order was SLAVE, then green tally, then BARS. +- The pattern repeated, and at one point SLAVE and BARS were visible together. +- Treat the ordered mapping as likely but not final until a fresh-boot single-selector run separates latch/persistence effects from the selector under test. + +Follow-up `lamp-isolate-neighbor-single-boot` result: + +| Fresh-boot candidate | Visible result | +| --- | --- | +| `0x0012 = 0x8000/0x0000` | no visible change reported | +| `0x0013 = 0x8000/0x0000` | SLAVE lamp | +| `0x0016 = 0x8000/0x0000` | camera tally green | +| `0x0017 = 0x8000/0x0000` | BARS lamp | +| `0x0018 = 0x8000/0x0000` | no visible result reported yet | +| `0x001A = 0x8000/0x0000` | no visible result reported yet | This confirms that the host/CCU can directly drive panel lamps through selector-table writes. It also validates using the ROM dispatch-neighbor list around `0x0007` and `0x0015` as a high-value lamp map. @@ -55,6 +77,7 @@ Visible result: - KNEE AUTO lamp flashed a few times. - No other new visible result was reported. +- Follow-up isolation saw KNEE AUTO toward the end of the run, then blinking. Candidate selectors in that run: @@ -63,8 +86,25 @@ Candidate selectors in that run: Interpretation: - KNEE AUTO is likely in this broader status cluster. +- Because the visible change happened toward the end, strongest next candidates are `0x00A7`, `0x00B7`, `0x00B9`, and `0x0110`, with `0x0092` kept as a guard candidate. - Exact selector/value still needs isolation because the broad sweep changed several selectors in sequence. +Follow-up `lamp-isolate-knee-tail-single-boot` result: + +| Fresh-boot candidate | Visible result | +| --- | --- | +| `0x0092` | iris AUTO/OFF behavior | +| `0x00A7` | no visible result reported | +| `0x00B7` | no visible result reported | +| `0x00B9` | KNEE AUTO | +| `0x0110` | KNEE AUTO | + +Interpretation: + +- `0x00B9` and `0x0110` are now the strongest KNEE AUTO candidates. +- Because two selectors can light the same lamp, the KNEE status may be split between camera status and panel/display state, or one selector may select the subsystem while the other sets the visible mode. +- The next useful step is a bit scan of `0x00B9` and `0x0110` to see whether `0x8000` is the only live bit or whether lower bits select other KNEE states. + ## Follow-Up Isolation Scenarios Run these with the console visible and record the exact label shown when each lamp changes: @@ -73,6 +113,9 @@ Run these with the console visible and record the exact label shown when each la .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-cam-call.json --parity E --log captures\lamp-isolate-cam-call.txt --result-json captures\lamp-isolate-cam-call-result.json .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-known-neighbors.json --parity E --log captures\lamp-isolate-known-neighbors.txt --result-json captures\lamp-isolate-known-neighbors-result.json .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-status-selectors.json --parity E --log captures\lamp-isolate-knee-status-selectors.txt --result-json captures\lamp-isolate-knee-status-selectors-result.json +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-neighbor-single-boot.json --parity E --log captures\lamp-isolate-neighbor-single-boot.txt --result-json captures\lamp-isolate-neighbor-single-boot-result.json +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-tail-single-boot.json --parity E --log captures\lamp-isolate-knee-tail-single-boot.txt --result-json captures\lamp-isolate-knee-tail-single-boot-result.json +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-bit-scan.json --parity E --log captures\lamp-isolate-knee-bit-scan.txt --result-json captures\lamp-isolate-knee-bit-scan-result.json ``` Method notes: @@ -80,3 +123,4 @@ Method notes: - Record visible changes immediately during each labeled hold. Later `CONNECT: NOT ACT` cleanup is not selector evidence. - If a selector causes a latch or unexpected mode, stop and keep the log instead of continuing the whole sweep. - Prefer exact notes like `selector_0018_high -> tally red`, because the logs already preserve send timestamps and readback frames. +- For the single-boot follow-ups, each candidate gets a fresh power cycle. That is deliberate: it tests whether a lamp is truly driven by that selector rather than retained from a previous write. diff --git a/docs/pt2-protocol.md b/docs/pt2-protocol.md index c9d35c8..17a23ce 100644 --- a/docs/pt2-protocol.md +++ b/docs/pt2-protocol.md @@ -680,10 +680,10 @@ Bench lamp sweeps now prove that several panel outputs are directly driven by co Newest confirmed behavior: - `lamp-known-button-selector-probe` made CAM, CALL, BARS, MASTER, and camera tally outputs flash individually. -- `0x0007 = 0x8000/0x0000` is the strongest CAM POWER lamp candidate. -- `0x0015 = 0x8000/0x0000` is the strongest CALL lamp candidate. -- Neighbor selectors `0x0012`, `0x0013`, `0x0016`, `0x0017`, `0x0018`, and `0x001A` likely contain BARS/MASTER/tally red/green assignments, pending isolation. -- A broader status sweep made KNEE AUTO flash; candidate selectors are `0x0003`, `0x0040`, `0x0081`, `0x0092`, `0x00A7`, `0x00B7`, `0x00B9`, and `0x0110`. +- `0x0007 = 0x8000/0x0000` blinked CAM POWER in isolation. +- `0x0015 = 0x8000/0x0000` blinked CALL and red tally in isolation. +- Fresh-boot isolation maps `0x0013` to SLAVE, `0x0016` to green tally, and `0x0017` to BARS for the `0x8000/0x0000` value pair. +- Fresh-boot isolation maps `0x0092` to iris AUTO/OFF behavior, and maps both `0x00B9` and `0x0110` to KNEE AUTO behavior. ## What Is Still Unknown diff --git a/scenarios/lamp-isolate-knee-bit-scan.json b/scenarios/lamp-isolate-knee-bit-scan.json new file mode 100644 index 0000000..14d7eae --- /dev/null +++ b/scenarios/lamp-isolate-knee-bit-scan.json @@ -0,0 +1,206 @@ +{ + "name": "lamp-isolate-knee-bit-scan", + "notes": [ + "Bit-scan the two fresh-boot KNEE AUTO candidates, 0x00B9 and 0x0110.", + "Each selector gets its own fresh CONNECT OK seed, then high-byte bits are tested one at a time with clears between writes.", + "Record whether KNEE AUTO, KNEE manual, or any neighboring paint/detail lamp changes during each label." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_00b9", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_00b9", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_00b9_bit15_watch", + "frame": "00 01 39 80 00 E2", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_bit15", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_00b9_bit14_watch", + "frame": "00 01 39 40 00 22", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_bit14", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_00b9_bit13_watch", + "frame": "00 01 39 20 00 42", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_bit13", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_00b9_bit12_watch", + "frame": "00 01 39 10 00 72", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_bit12", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_00b9_bit11_watch", + "frame": "00 01 39 08 00 6A", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_bit11", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_00b9_lowff_watch", + "frame": "00 01 39 00 FF 9D", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_lowff", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0110", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0110", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0110_bit15_watch", + "frame": "00 01 90 80 00 4B", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_bit15", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_0110_bit14_watch", + "frame": "00 01 90 40 00 8B", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_bit14", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_0110_bit13_watch", + "frame": "00 01 90 20 00 EB", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_bit13", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_0110_bit12_watch", + "frame": "00 01 90 10 00 DB", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_bit12", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_0110_bit11_watch", + "frame": "00 01 90 08 00 C3", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_bit11", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "candidate_0110_lowff_watch", + "frame": "00 01 90 00 FF 34", + "listen": 1.30 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_lowff", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + } + ] +} diff --git a/scenarios/lamp-isolate-knee-tail-single-boot.json b/scenarios/lamp-isolate-knee-tail-single-boot.json new file mode 100644 index 0000000..df1aff6 --- /dev/null +++ b/scenarios/lamp-isolate-knee-tail-single-boot.json @@ -0,0 +1,260 @@ +{ + "name": "lamp-isolate-knee-tail-single-boot", + "notes": [ + "Fresh-boot isolation for the late broad-status candidates after KNEE AUTO appeared toward the end of the previous run.", + "Selector 0x0092 is included as a guard before the stronger tail candidates 0x00A7, 0x00B7, 0x00B9, and 0x0110.", + "Each candidate tests high, clear, all bits, clear." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0092", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0092", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0092_high_watch", + "frame": "00 01 12 80 00 C9", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_0092_clear_after_high", + "frame": "00 01 12 00 00 49", + "listen": 0.90 + }, + { + "action": "send", + "label": "candidate_0092_all_bits_watch", + "frame": "00 01 12 FF FF 49", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_0092_clear_after_all", + "frame": "00 01 12 00 00 49", + "listen": 0.90 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_00a7", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_00a7", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_00a7_high_watch", + "frame": "00 01 27 80 00 FC", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00a7_clear_after_high", + "frame": "00 01 27 00 00 7C", + "listen": 0.90 + }, + { + "action": "send", + "label": "candidate_00a7_all_bits_watch", + "frame": "00 01 27 FF FF 7C", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00a7_clear_after_all", + "frame": "00 01 27 00 00 7C", + "listen": 0.90 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_00b7", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_00b7", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_00b7_high_watch", + "frame": "00 01 37 80 00 EC", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00b7_clear_after_high", + "frame": "00 01 37 00 00 6C", + "listen": 0.90 + }, + { + "action": "send", + "label": "candidate_00b7_all_bits_watch", + "frame": "00 01 37 FF FF 6C", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00b7_clear_after_all", + "frame": "00 01 37 00 00 6C", + "listen": 0.90 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_00b9", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_00b9", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_00b9_high_watch", + "frame": "00 01 39 80 00 E2", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_high", + "frame": "00 01 39 00 00 62", + "listen": 0.90 + }, + { + "action": "send", + "label": "candidate_00b9_all_bits_watch", + "frame": "00 01 39 FF FF 62", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_00b9_clear_after_all", + "frame": "00 01 39 00 00 62", + "listen": 0.90 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0110", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0110", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0110_high_watch", + "frame": "00 01 90 80 00 4B", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_high", + "frame": "00 01 90 00 00 CB", + "listen": 0.90 + }, + { + "action": "send", + "label": "candidate_0110_all_bits_watch", + "frame": "00 01 90 FF FF CB", + "listen": 1.80 + }, + { + "action": "send", + "label": "candidate_0110_clear_after_all", + "frame": "00 01 90 00 00 CB", + "listen": 0.90 + } + ] +} diff --git a/scenarios/lamp-isolate-neighbor-single-boot.json b/scenarios/lamp-isolate-neighbor-single-boot.json new file mode 100644 index 0000000..2f50a40 --- /dev/null +++ b/scenarios/lamp-isolate-neighbor-single-boot.json @@ -0,0 +1,238 @@ +{ + "name": "lamp-isolate-neighbor-single-boot", + "notes": [ + "Fresh-boot isolation for the selector cluster that produced SLAVE, green tally, BARS, MASTER, and related lamps.", + "Each candidate starts from a fresh power cycle and CONNECT OK seed so latched lamps from the previous selector cannot contaminate the result.", + "Record the visible lamp during the high hold and whether the low write clears it." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0012", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0012", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0012_high_watch", + "frame": "00 00 12 80 00 C8", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_0012_low_clear_watch", + "frame": "00 00 12 00 00 48", + "listen": 1.20 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0013", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0013", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0013_high_watch", + "frame": "00 00 13 80 00 C9", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_0013_low_clear_watch", + "frame": "00 00 13 00 00 49", + "listen": 1.20 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0016", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0016", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0016_high_watch", + "frame": "00 00 16 80 00 CC", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_0016_low_clear_watch", + "frame": "00 00 16 00 00 4C", + "listen": 1.20 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0017", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0017", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0017_high_watch", + "frame": "00 00 17 80 00 CD", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_0017_low_clear_watch", + "frame": "00 00 17 00 00 4D", + "listen": 1.20 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_0018", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_0018", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_0018_high_watch", + "frame": "00 00 18 80 00 C2", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_0018_low_clear_watch", + "frame": "00 00 18 00 00 42", + "listen": 1.20 + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.25 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_1_for_001a", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2_for_001a", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "candidate_001a_high_watch", + "frame": "00 00 1A 80 00 C0", + "listen": 2.00 + }, + { + "action": "send", + "label": "candidate_001a_low_clear_watch", + "frame": "00 00 1A 00 00 40", + "listen": 1.20 + } + ] +}