diff --git a/build/panel_button_trace.json b/build/panel_button_trace.json index 9bd3890..74a949b 100644 --- a/build/panel_button_trace.json +++ b/build/panel_button_trace.json @@ -1820,7 +1820,7 @@ ] }, "is_noop": false, - "known_report": "0x0013", + "known_report": "IRIS/M.BLACK LINK", "shadow": "F6DB", "source": "F006", "table_address": 10180, @@ -2881,6 +2881,38 @@ "table_address_hex": "H'274C", "table_offset": 70 }, + { + "bank": "IRQ3 A8 panel byte path", + "bit": 7, + "dirty": "F6F3.3", + "dispatcher": "1BF8", + "handler": 8206, + "handler_hex": "H'200E", + "handler_summary": { + "instruction_count_scanned": 20, + "level_tests": [ + "F6DB.7" + ], + "report_selectors": [ + 19 + ], + "report_selectors_hex": [ + "0x0013" + ], + "state_writes": [ + "E826" + ] + }, + "is_noop": false, + "known_report": "IRIS/M.BLACK LINK", + "name": "IRIS/M.BLACK LINK", + "selector": 19, + "shadow": "F6DB", + "source": "F006", + "table_address": 10180, + "table_address_hex": "H'27C4", + "table_offset": 190 + }, { "bank": "IRQ3 A8 panel byte path", "bit": 5, diff --git a/build/panel_button_trace.md b/build/panel_button_trace.md index b0f96bd..e15f526 100644 --- a/build/panel_button_trace.md +++ b/build/panel_button_trace.md @@ -15,6 +15,16 @@ The key table is the indirect handler table at `H'2706`, used by `loc_1C0E` afte - Current-level tests: F6D4.3 - State writes: E80E +### IRIS/M.BLACK LINK + +- Emitted selector: `0x0013` +- Handler: `H'200E` +- Edge source: `F006 -> F6DB` via `F6F3.3` +- Trigger bit: `F6DB.7` +- Table slot: `H'27C4` -> `H'200E` +- Current-level tests: F6DB.7 +- State writes: E826 + ### CALL - Emitted selector: `0x0015` diff --git a/build/rom_0013_button_handler_linear.asm b/build/rom_0013_button_handler_linear.asm new file mode 100644 index 0000000..f727206 --- /dev/null +++ b/build/rom_0013_button_handler_linear.asm @@ -0,0 +1,200 @@ +; H8/536 ROM disassembly +; input: ROM\M27C512@DIP28_1.BIN +; bytes: 65536 +; vector mode: min +; analysis: linear sweep +; +; Notes from the manual: +; - H8/536 uses the H8/500 CPU instruction set. +; - In minimum mode the reset vector at H'0000-H'0001 is a 16-bit PC. +; - The register field is H'FE80-H'FFFF; names below come from appendix B. +; - @aa:8 short absolute operands use BR as the upper address byte. +; - SCI baud inference uses section 14.2.8 BRR formulas when SMR/BRR are known. +; - LCD inference treats E-clock H'F200/H'F201 accesses as status/control and data candidates. + +; Memory Map +; H'0000-H'009F exception_vectors vectors +; H'00A0-H'00FF dtc_vectors dtc_vectors +; H'0100-H'F67F program_or_external program +; H'F680-H'FE7F on_chip_ram ram +; H'FE80-H'FFFF register_field registers + +; Vectors +; H'0000 reset -> vec_reset_1000 (H'1000) +; H'0004 invalid_instruction -> vec_reset_1000 (H'1000) +; H'0006 zero_divide -> vec_reset_1000 (H'1000) +; H'0008 trap_vs -> vec_reset_1000 (H'1000) +; H'0010 address_error -> vec_reset_1000 (H'1000) +; H'0012 trace -> vec_reset_1000 (H'1000) +; H'0016 nmi -> vec_nmi_4393 (H'4393) +; H'0020 trapa_0 -> vec_reset_1000 (H'1000) +; H'0022 trapa_1 -> vec_reset_1000 (H'1000) +; H'0024 trapa_2 -> vec_reset_1000 (H'1000) +; H'0026 trapa_3 -> vec_reset_1000 (H'1000) +; H'0028 trapa_4 -> vec_reset_1000 (H'1000) +; H'002A trapa_5 -> vec_reset_1000 (H'1000) +; H'002C trapa_6 -> vec_reset_1000 (H'1000) +; H'002E trapa_7 -> vec_reset_1000 (H'1000) +; H'0030 trapa_8 -> vec_reset_1000 (H'1000) +; H'0032 trapa_9 -> vec_reset_1000 (H'1000) +; H'0034 trapa_a -> vec_reset_1000 (H'1000) +; H'0036 trapa_b -> vec_reset_1000 (H'1000) +; H'0038 trapa_c -> vec_reset_1000 (H'1000) +; H'003A trapa_d -> vec_reset_1000 (H'1000) +; H'003C trapa_e -> vec_reset_1000 (H'1000) +; H'003E trapa_f -> vec_reset_1000 (H'1000) +; H'0040 irq0 -> vec_reset_1000 (H'1000) +; H'0042 interval_timer -> vec_interval_timer_BFC4 (H'BFC4) +; H'0048 irq1 -> vec_reset_1000 (H'1000) +; H'0050 irq2 -> vec_reset_1000 (H'1000) +; H'0052 irq3 -> vec_irq3_3C30 (H'3C30) +; H'0058 irq4 -> vec_irq4_3AC7 (H'3AC7) +; H'005A irq5 -> vec_reset_1000 (H'1000) +; H'0062 frt1_ocia -> vec_frt1_ocia_BEEA (H'BEEA) +; H'006A frt2_ocia -> vec_frt2_ocia_BF23 (H'BF23) +; H'0080 sci1_eri -> vec_sci1_eri_BB57 (H'BB57) +; H'0082 sci1_rxi -> vec_sci1_rxi_BB67 (H'BB67) +; H'0084 sci1_txi -> vec_sci1_txi_BA84 (H'BA84) +; H'0090 ad_adi -> vec_ad_adi_3D99 (H'3D99) + +; Symbols +; mem_E026 H'E026 program_or_external memory r=4 w=0 width=word +; mem_E02A H'E02A program_or_external memory r=1 w=0 width=word +; mem_E046 H'E046 program_or_external memory r=0 w=1 width=word +; mem_E110 H'E110 program_or_external memory r=1 w=0 width=word +; mem_E134 H'E134 program_or_external memory r=1 w=0 width=word +; mem_E824 H'E824 program_or_external memory r=0 w=1 width=word +; mem_E826 H'E826 program_or_external memory r=0 w=4 width=word +; mem_E82A H'E82A program_or_external memory r=0 w=1 width=word +; mem_E8D6 H'E8D6 program_or_external memory r=0 w=1 width=word +; ram_F6D4 H'F6D4 on_chip_ram ram r=1 w=0 width=byte +; ram_F6DB H'F6DB on_chip_ram ram r=3 w=0 width=byte +; ram_F713 H'F713 on_chip_ram ram r=2 w=2 width=byte +; ram_F726 H'F726 on_chip_ram ram r=0 w=1 width=byte +; ram_F730 H'F730 on_chip_ram ram r=1 w=0 width=byte +; ram_F731 H'F731 on_chip_ram ram r=5 w=2 width=byte +; ram_F732 H'F732 on_chip_ram ram r=0 w=1 width=word +; ram_F76A H'F76A on_chip_ram ram r=0 w=1 width=word +; ram_F76E H'F76E on_chip_ram ram r=1 w=1 width=byte +; ram_F791 H'F791 on_chip_ram ram r=2 w=1 width=byte +; ram_F798 H'F798 on_chip_ram ram r=0 w=2 width=byte +; ram_FB03 H'FB03 on_chip_ram ram r=1 w=1 width=byte + +; Board Profile +; Board trace ties the H8/536 SCI1 pins to a MAX202 RS232 transceiver. +; H8 pin 66 P95/TXD (TXD) -> MAX202 pin 11 +; H8 pin 67 P96/RXD (RXD) -> MAX202 pin 12 +; SCI2 pin routing is disabled by SYSCR2.P9SCI2E=0 in the observed setup. + +; LCD/Text Scan +; search 'CONNECT': not literal, hits=0 + +1FC0: F7 13 C5 1D ROTR.B @(H'13C5,R7) +1FC4: E8 24 07 80 00 MOV:G.W #H'8000, @(H'24,R0) +1FC9: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +1FCB: 5B 40 12 MOV:I.W #H'4012, R3 ; dataflow R3=H'4012 +1FCE: 1E 1E 83 BSR loc_3E54 +1FD1: 19 RTS +1FD2: 15 F7 91 D7 BCLR.B #7, @H'F791 ; refs ram_F791 in on_chip_ram +1FD6: 15 F7 13 D5 BCLR.B #5, @H'F713 ; refs ram_F713 in on_chip_ram +1FDA: 1D E8 24 06 00 MOV:G.W #H'00, @H'E824 ; refs mem_E824 in program_or_external +1FDF: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +1FE1: 5B 40 12 MOV:I.W #H'4012, R3 ; dataflow R3=H'4012 +1FE4: 1E 1E 6D BSR loc_3E54 +1FE7: 19 RTS +1FE8: 1D E0 26 80 MOV:G.W @H'E026, R0 ; refs mem_E026 in program_or_external +1FEC: A8 CF BSET.W #15, R0 +1FEE: 1D E8 26 90 MOV:G.W R0, @H'E826 ; refs mem_E826 in program_or_external +1FF2: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +1FF4: 5B 00 13 MOV:I.W #H'0013, R3 ; dataflow R3=H'0013 +1FF7: 1E 1E 5A BSR loc_3E54 +1FFA: 19 RTS +1FFB: 1D E0 26 80 MOV:G.W @H'E026, R0 ; refs mem_E026 in program_or_external +1FFF: A8 DF BCLR.W #15, R0 +2001: 1D E8 26 90 MOV:G.W R0, @H'E826 ; refs mem_E826 in program_or_external +2005: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +2007: 5B 00 13 MOV:I.W #H'0013, R3 ; dataflow R3=H'0013 +200A: 1E 1E 47 BSR loc_3E54 +200D: 19 RTS +200E: 15 F6 DB F7 BTST.B #7, @H'F6DB ; refs ram_F6DB in on_chip_ram +2012: 27 33 BEQ loc_2047 +2014: 15 F7 31 04 03 CMP:G.B #H'03, @H'F731 ; refs ram_F731 in on_chip_ram +2019: 22 2C BHI loc_2047 +201B: 15 F7 91 F5 BTST.B #5, @H'F791 ; refs ram_F791 in on_chip_ram +201F: 26 14 BNE loc_2035 +2021: 1D E0 26 80 MOV:G.W @H'E026, R0 ; refs mem_E026 in program_or_external +2025: A8 CE BSET.W #14, R0 +2027: 1D E8 26 90 MOV:G.W R0, @H'E826 ; refs mem_E826 in program_or_external +202B: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +202D: 5B 00 13 MOV:I.W #H'0013, R3 ; dataflow R3=H'0013 +2030: 1E 1E 21 BSR loc_3E54 +2033: 20 12 BRA loc_2047 + +loc_2035: +2035: 1D E0 26 80 MOV:G.W @H'E026, R0 ; refs mem_E026 in program_or_external +2039: A8 DE BCLR.W #14, R0 +203B: 1D E8 26 90 MOV:G.W R0, @H'E826 ; refs mem_E826 in program_or_external +203F: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +2041: 5B 00 13 MOV:I.W #H'0013, R3 ; dataflow R3=H'0013 +2044: 1E 1E 0D BSR loc_3E54 + +loc_2047: +2047: 19 RTS +2048: 15 F6 D4 F6 BTST.B #6, @H'F6D4 ; refs ram_F6D4 in on_chip_ram +204C: 27 52 BEQ loc_20A0 +204E: 15 F7 31 04 02 CMP:G.B #H'02, @H'F731 ; refs ram_F731 in on_chip_ram +2053: 22 4B BHI loc_20A0 +2055: 15 F7 30 F7 BTST.B #7, @H'F730 ; refs ram_F730 in on_chip_ram +2059: 27 19 BEQ loc_2074 +205B: 1D E8 D6 07 80 00 MOV:G.W #H'8000, @H'E8D6 ; refs mem_E8D6 in program_or_external +2061: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +2063: 5B 00 6B MOV:I.W #H'006B, R3 ; dataflow R3=H'006B +2066: 1E 1D EB BSR loc_3E54 +2069: 15 F7 31 C7 BSET.B #7, @H'F731 ; refs ram_F731 in on_chip_ram +206D: 15 F7 98 06 C8 MOV:G.B #H'C8, @H'F798 ; refs ram_F798 in on_chip_ram +2072: 20 2C BRA loc_20A0 + +loc_2074: +2074: 1D F7 32 13 CLR.W @H'F732 ; refs ram_F732 in on_chip_ram +2078: 15 FB 03 D7 BCLR.B #7, @H'FB03 ; refs ram_FB03 in on_chip_ram +207C: 1D E0 46 13 CLR.W @H'E046 ; refs mem_E046 in program_or_external +2080: 1D F7 6A 13 CLR.W @H'F76A ; refs ram_F76A in on_chip_ram +2084: 1E 28 73 BSR loc_48FA +2087: 15 F7 13 C6 BSET.B #6, @H'F713 ; refs ram_F713 in on_chip_ram +208B: 15 F7 26 06 1E MOV:G.B #H'1E, @H'F726 ; refs ram_F726 in on_chip_ram +2090: 15 F7 6E C6 BSET.B #6, @H'F76E ; refs ram_F76E in on_chip_ram +2094: 15 F7 31 C7 BSET.B #7, @H'F731 ; refs ram_F731 in on_chip_ram +2098: 15 F7 98 06 C8 MOV:G.B #H'C8, @H'F798 ; refs ram_F798 in on_chip_ram +209D: 1E 36 38 BSR loc_56D8 + +loc_20A0: +20A0: 19 RTS +20A1: 1D E0 2A 80 MOV:G.W @H'E02A, R0 ; refs mem_E02A in program_or_external +20A5: 15 F6 DB F5 BTST.B #5, @H'F6DB ; refs ram_F6DB in on_chip_ram +20A9: 27 04 BEQ loc_20AF +20AB: A8 CF BSET.W #15, R0 +20AD: 20 02 BRA loc_20B1 + +loc_20AF: +20AF: A8 DF BCLR.W #15, R0 + +loc_20B1: +20B1: 1D E8 2A 90 MOV:G.W R0, @H'E82A ; refs mem_E82A in program_or_external +20B5: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +20B7: 5B 00 15 MOV:I.W #H'0015, R3 ; dataflow R3=H'0015 +20BA: 1E 1D 97 BSR loc_3E54 +20BD: 19 RTS +20BE: 15 F6 DB F3 BTST.B #3, @H'F6DB ; refs ram_F6DB in on_chip_ram +20C2: 27 2C BEQ loc_20F0 +20C4: 15 F7 31 04 03 CMP:G.B #H'03, @H'F731 ; refs ram_F731 in on_chip_ram +20C9: 22 25 BHI loc_20F0 +20CB: 1D E1 10 16 TST.W @H'E110 ; refs mem_E110 in program_or_external +20CF: 27 05 BEQ loc_20D6 +20D1: 1E 06 14 BSR loc_26E8 +20D4: 20 1A BRA loc_20F0 + +loc_20D6: +20D6: 1D E1 34 80 MOV:G.W @H'E134, R0 ; refs mem_E134 in program_or_external +20DA: A8 FB BTST.W #11, R0 +20DC: 27 04 BEQ loc_20E2 +20DE: A8 DB BCLR.W #11, R0 diff --git a/build/rom_0013_button_handler_linear.json b/build/rom_0013_button_handler_linear.json new file mode 100644 index 0000000..70bdb55 --- /dev/null +++ b/build/rom_0013_button_handler_linear.json @@ -0,0 +1,7108 @@ +{ + "vectors": [ + { + "address": 0, + "name": "reset", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 4, + "name": "invalid_instruction", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 6, + "name": "zero_divide", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 8, + "name": "trap_vs", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 16, + "name": "address_error", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 18, + "name": "trace", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 22, + "name": "nmi", + "target": 17299, + "target_label": "vec_nmi_4393" + }, + { + "address": 32, + "name": "trapa_0", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 34, + "name": "trapa_1", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 36, + "name": "trapa_2", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 38, + "name": "trapa_3", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 40, + "name": "trapa_4", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 42, + "name": "trapa_5", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 44, + "name": "trapa_6", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 46, + "name": "trapa_7", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 48, + "name": "trapa_8", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 50, + "name": "trapa_9", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 52, + "name": "trapa_a", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 54, + "name": "trapa_b", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 56, + "name": "trapa_c", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 58, + "name": "trapa_d", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 60, + "name": "trapa_e", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 62, + "name": "trapa_f", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 64, + "name": "irq0", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 66, + "name": "interval_timer", + "target": 49092, + "target_label": "vec_interval_timer_BFC4" + }, + { + "address": 72, + "name": "irq1", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 80, + "name": "irq2", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 82, + "name": "irq3", + "target": 15408, + "target_label": "vec_irq3_3C30" + }, + { + "address": 88, + "name": "irq4", + "target": 15047, + "target_label": "vec_irq4_3AC7" + }, + { + "address": 90, + "name": "irq5", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 98, + "name": "frt1_ocia", + "target": 48874, + "target_label": "vec_frt1_ocia_BEEA" + }, + { + "address": 106, + "name": "frt2_ocia", + "target": 48931, + "target_label": "vec_frt2_ocia_BF23" + }, + { + "address": 128, + "name": "sci1_eri", + "target": 47959, + "target_label": "vec_sci1_eri_BB57" + }, + { + "address": 130, + "name": "sci1_rxi", + "target": 47975, + "target_label": "vec_sci1_rxi_BB67" + }, + { + "address": 132, + "name": "sci1_txi", + "target": 47748, + "target_label": "vec_sci1_txi_BA84" + }, + { + "address": 144, + "name": "ad_adi", + "target": 15769, + "target_label": "vec_ad_adi_3D99" + } + ], + "dtc_vectors": [], + "memory_regions": [ + { + "name": "exception_vectors", + "start": 0, + "end": 159, + "kind": "vectors", + "manual": "section 2 address space" + }, + { + "name": "dtc_vectors", + "start": 160, + "end": 255, + "kind": "dtc_vectors", + "manual": "section 2 address space" + }, + { + "name": "program_or_external", + "start": 256, + "end": 63103, + "kind": "program", + "manual": "section 2/17 mode-dependent ROM or external space" + }, + { + "name": "on_chip_ram", + "start": 63104, + "end": 65151, + "kind": "ram", + "manual": "section 16 RAM" + }, + { + "name": "register_field", + "start": 65152, + "end": 65535, + "kind": "registers", + "manual": "appendix B register map" + } + ], + "data_candidates": { + "strings": [], + "pointer_tables": [] + }, + "call_graph": { + "nodes": [], + "edges": [] + }, + "timing_summary": { + "blocks": [], + "loops": [] + }, + "sci": { + "clock_hz": 20000000, + "formulas": { + "async": "B = clock_hz / (64 * 2^(2n) * (N + 1))", + "sync": "B = clock_hz / (8 * 2^(2n) * (N + 1))" + }, + "manual_references": [ + "Manual/0900766b802125d0.md:15837 SMR selects SCI mode and CKS1/CKS0 internal clock source", + "Manual/0900766b802125d0.md:16027 SCR.CKE1 selects internal or external clock source", + "Manual/0900766b802125d0.md:16177 BRR and SMR.CKS determine the baud-rate generator", + "Manual/0900766b802125d0.md:16303 asynchronous BRR formula", + "Manual/0900766b802125d0.md:16379 synchronous BRR formula", + "Manual/0900766b802125d0.md:16410 SCI clock source selection tables" + ], + "channels": { + "SCI1": { + "writes": [], + "configurations": [] + }, + "SCI2": { + "writes": [], + "configurations": [] + } + } + }, + "sci_protocol": { + "manual_references": [ + "Manual/0900766b802125d0.md:15748 SCI register map for RDR/TDR/SCR/SSR", + "Manual/0900766b802125d0.md:15794 RDR stores received data and is CPU-readable", + "Manual/0900766b802125d0.md:15823 TDR holds the next byte to transmit", + "Manual/0900766b802125d0.md:15976 SCR.TIE enables/disables TXI on TDRE", + "Manual/0900766b802125d0.md:15993 SCR.RIE enables RXI and ERI", + "Manual/0900766b802125d0.md:16008 SCR.TE enables the transmitter", + "Manual/0900766b802125d0.md:16028 SCR.RE enables the receiver", + "Manual/0900766b802125d0.md:16090 SSR flags are cleared by writing zero", + "Manual/0900766b802125d0.md:16100 SSR.TDRE means TDR can accept the next byte", + "Manual/0900766b802125d0.md:16116 SSR.RDRF means received data reached RDR", + "Manual/0900766b802125d0.md:16127 SSR.ORER reports receive overrun", + "Manual/0900766b802125d0.md:16140 SSR.FER reports framing errors", + "Manual/0900766b802125d0.md:16147 SSR.PER reports parity errors" + ], + "channels": { + "SCI1": { + "events": [] + }, + "SCI2": { + "events": [] + } + }, + "events": [] + }, + "serial_reconstruction": { + "kind": "serial_reconstruction", + "candidates": [], + "ram_roles": [], + "evidence": [], + "required_evidence": { + "tx": [ + "tx_buffer_region", + "tx_checksum_seed", + "checksum_byte", + "xor_checksum_chain", + "initial_send_from_buffer_start", + "tx_index_initialized_to_one", + "tx_isr_indexed_send", + "tx_index_increment", + "tx_index_compare_frame_length" + ], + "rx": [ + "rx_rdr_read", + "rx_indexed_store", + "rx_index_increment_store", + "rx_isr_compare_frame_length", + "rx_complete_timer", + "rx_processor_requires_six_bytes", + "rx_copy_capture_to_frame_buffer", + "rx_checksum_seed", + "rx_xor_checksum_validation" + ] + } + }, + "board_profile": { + "board": "sony_rcp_tx7", + "name": "Sony RCP-TX7", + "summary": "Board trace ties the H8/536 SCI1 pins to a MAX202 RS232 transceiver.", + "manual_references": [ + "Manual/0900766b802125d0.md:2417 FP-80 H8/536 pin 66 is P95/TXD", + "Manual/0900766b802125d0.md:2418 FP-80 H8/536 pin 67 is P96/RXD", + "Manual/0900766b802125d0.md:11192 Port 9 carries SCI1 and SCI2 serial signals", + "Manual/0900766b802125d0.md:11201 P96 is RXD1 input", + "Manual/0900766b802125d0.md:11202 P95 is TXD1 output", + "Manual/0900766b802125d0.md:15725 SCI1 RXD input pin", + "Manual/0900766b802125d0.md:15726 SCI1 TXD output pin", + "Manual/0900766b802125d0.md:15750 SCI register table starts with SCI1 RDR/TDR/SMR/SCR/SSR/BRR", + "Manual/0900766b802125d0.md:15758 SCI register table lists SCI2 RDR/TDR/SMR/SCR/SSR/BRR", + "Manual/0900766b802125d0.md:15794 RDR receive data register", + "Manual/0900766b802125d0.md:15823 TDR transmit data register", + "Manual/0900766b802125d0.md:15969 SCR enables and disables SCI functions", + "Manual/0900766b802125d0.md:16009 SCR.TE makes the TXD pin output", + "Manual/0900766b802125d0.md:16029 SCR.RE makes the RXD pin input", + "Manual/0900766b802125d0.md:16090 SSR contains transmit/receive status flags", + "Manual/0900766b802125d0.md:10560 SYSCR2 controls port 9 pin functions", + "Manual/0900766b802125d0.md:10631 SYSCR2.P9SCI2E controls the SCI2 functions of P92-P94" + ], + "traces": [ + { + "channel": "SCI1", + "signal": "TXD", + "h8_pin": 66, + "h8_pin_name": "P95/TXD", + "h8_function": "TXD1", + "max202_pin": 11, + "evidence": "MAX202 pin 11 traces to H8 pin 66" + }, + { + "channel": "SCI1", + "signal": "RXD", + "h8_pin": 67, + "h8_pin_name": "P96/RXD", + "h8_function": "RXD1", + "max202_pin": 12, + "evidence": "MAX202 pin 12 traces to H8 pin 67" + } + ], + "channels": { + "SCI1": { + "traced_to_max202": true, + "path": "RS232/MAX202", + "pins": [ + { + "channel": "SCI1", + "signal": "TXD", + "h8_pin": 66, + "h8_pin_name": "P95/TXD", + "h8_function": "TXD1", + "max202_pin": 11, + "evidence": "MAX202 pin 11 traces to H8 pin 66" + }, + { + "channel": "SCI1", + "signal": "RXD", + "h8_pin": 67, + "h8_pin_name": "P96/RXD", + "h8_function": "RXD1", + "max202_pin": 12, + "evidence": "MAX202 pin 12 traces to H8 pin 67" + } + ], + "scr": { + "value": 12, + "value_hex": "H'0C", + "tie": false, + "rie": false, + "tx_enabled": false, + "rx_enabled": false + }, + "accesses": [] + }, + "SCI2": { + "traced_to_max202": false, + "path": null, + "note": "Sony RCP-TX7 MAX202 board traces are on SCI1 P95/P96, not SCI2 P92/P93.", + "p9sci2e": false, + "scr": { + "value": 12, + "value_hex": "H'0C", + "tie": false, + "rie": false, + "tx_enabled": false, + "rx_enabled": false + }, + "accesses": [] + } + }, + "instructions": {}, + "state": { + "SYSCR2": { + "value": 128, + "value_hex": "H'80" + }, + "P9SCI2E": false + } + }, + "peripheral_access": { + "manual_references": [ + "Manual/0900766b802125d0.md:12185 FRT FRC/OCRA/OCRB/ICR use TEMP for 16-bit CPU access", + "Manual/0900766b802125d0.md:12193 FRT byte access order is upper byte then lower byte", + "Manual/0900766b802125d0.md:12212 OCRA/OCRB reads are direct; writes still use TEMP", + "Manual/0900766b802125d0.md:17546 A/D ADDRA-ADDRD lower byte is accessed through TEMP", + "Manual/0900766b802125d0.md:17556 A/D full-result byte reads must be upper byte then lower byte" + ], + "warnings": [] + }, + "indirect_flow": { + "sites": [] + }, + "dataflow": { + "blocks": [ + { + "start": 8128, + "instructions": [ + 8128, + 8132, + 8137, + 8139, + 8142, + 8145 + ], + "end": 8145, + "end_exclusive": 8146 + }, + { + "start": 8146, + "instructions": [ + 8146, + 8150, + 8154, + 8159, + 8161, + 8164, + 8167 + ], + "end": 8167, + "end_exclusive": 8168 + }, + { + "start": 8168, + "instructions": [ + 8168, + 8172, + 8174, + 8178, + 8180, + 8183, + 8186 + ], + "end": 8186, + "end_exclusive": 8187 + }, + { + "start": 8187, + "instructions": [ + 8187, + 8191, + 8193, + 8197, + 8199, + 8202, + 8205 + ], + "end": 8205, + "end_exclusive": 8206 + }, + { + "start": 8206, + "instructions": [ + 8206, + 8210 + ], + "end": 8210, + "end_exclusive": 8212 + }, + { + "start": 8212, + "instructions": [ + 8212, + 8217 + ], + "end": 8217, + "end_exclusive": 8219 + }, + { + "start": 8219, + "instructions": [ + 8219, + 8223 + ], + "end": 8223, + "end_exclusive": 8225 + }, + { + "start": 8225, + "instructions": [ + 8225, + 8229, + 8231, + 8235, + 8237, + 8240, + 8243 + ], + "end": 8243, + "end_exclusive": 8245 + }, + { + "start": 8245, + "instructions": [ + 8245, + 8249, + 8251, + 8255, + 8257, + 8260 + ], + "end": 8260, + "end_exclusive": 8263 + }, + { + "start": 8263, + "instructions": [ + 8263 + ], + "end": 8263, + "end_exclusive": 8264 + }, + { + "start": 8264, + "instructions": [ + 8264, + 8268 + ], + "end": 8268, + "end_exclusive": 8270 + }, + { + "start": 8270, + "instructions": [ + 8270, + 8275 + ], + "end": 8275, + "end_exclusive": 8277 + }, + { + "start": 8277, + "instructions": [ + 8277, + 8281 + ], + "end": 8281, + "end_exclusive": 8283 + }, + { + "start": 8283, + "instructions": [ + 8283, + 8289, + 8291, + 8294, + 8297, + 8301, + 8306 + ], + "end": 8306, + "end_exclusive": 8308 + }, + { + "start": 8308, + "instructions": [ + 8308, + 8312, + 8316, + 8320, + 8324, + 8327, + 8331, + 8336, + 8340, + 8344, + 8349 + ], + "end": 8349, + "end_exclusive": 8352 + }, + { + "start": 8352, + "instructions": [ + 8352 + ], + "end": 8352, + "end_exclusive": 8353 + }, + { + "start": 8353, + "instructions": [ + 8353, + 8357, + 8361 + ], + "end": 8361, + "end_exclusive": 8363 + }, + { + "start": 8363, + "instructions": [ + 8363, + 8365 + ], + "end": 8365, + "end_exclusive": 8367 + }, + { + "start": 8367, + "instructions": [ + 8367 + ], + "end": 8367, + "end_exclusive": 8369 + }, + { + "start": 8369, + "instructions": [ + 8369, + 8373, + 8375, + 8378, + 8381 + ], + "end": 8381, + "end_exclusive": 8382 + }, + { + "start": 8382, + "instructions": [ + 8382, + 8386 + ], + "end": 8386, + "end_exclusive": 8388 + }, + { + "start": 8388, + "instructions": [ + 8388, + 8393 + ], + "end": 8393, + "end_exclusive": 8395 + }, + { + "start": 8395, + "instructions": [ + 8395, + 8399 + ], + "end": 8399, + "end_exclusive": 8401 + }, + { + "start": 8401, + "instructions": [ + 8401, + 8404 + ], + "end": 8404, + "end_exclusive": 8406 + }, + { + "start": 8406, + "instructions": [ + 8406, + 8410, + 8412 + ], + "end": 8412, + "end_exclusive": 8414 + }, + { + "start": 8414, + "instructions": [ + 8414 + ], + "end": 8414, + "end_exclusive": 8416 + } + ], + "registers": [ + "R0", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7" + ], + "control_registers": [ + "CCR", + "BR", + "EP", + "DP", + "TP", + "SR" + ] + }, + "symbols": { + "symbols": [ + { + "address": 57382, + "name": "mem_E026", + "region": "program_or_external", + "kind": "memory", + "access_count": 4, + "read_count": 4, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8168, + "last_access": 8245, + "accesses": [ + { + "address": 57382, + "instruction_address": 8168, + "instruction": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E026", + "operand_index": 0 + }, + { + "address": 57382, + "instruction_address": 8187, + "instruction": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E026", + "operand_index": 0 + }, + { + "address": 57382, + "instruction_address": 8225, + "instruction": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E026", + "operand_index": 0 + }, + { + "address": 57382, + "instruction_address": 8245, + "instruction": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E026", + "operand_index": 0 + } + ] + }, + { + "address": 57386, + "name": "mem_E02A", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8353, + "last_access": 8353, + "accesses": [ + { + "address": 57386, + "instruction_address": 8353, + "instruction": "MOV:G.W @H'E02A, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E02A", + "operand_index": 0 + } + ] + }, + { + "address": 57414, + "name": "mem_E046", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8316, + "last_access": 8316, + "accesses": [ + { + "address": 57414, + "instruction_address": 8316, + "instruction": "CLR.W @H'E046", + "mnemonic": "CLR.W", + "direction": "write", + "width": "word", + "operand": "@H'E046", + "operand_index": 0 + } + ] + }, + { + "address": 57616, + "name": "mem_E110", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8395, + "last_access": 8395, + "accesses": [ + { + "address": 57616, + "instruction_address": 8395, + "instruction": "TST.W @H'E110", + "mnemonic": "TST.W", + "direction": "read", + "width": "word", + "operand": "@H'E110", + "operand_index": 0 + } + ] + }, + { + "address": 57652, + "name": "mem_E134", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8406, + "last_access": 8406, + "accesses": [ + { + "address": 57652, + "instruction_address": 8406, + "instruction": "MOV:G.W @H'E134, R0", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E134", + "operand_index": 0 + } + ] + }, + { + "address": 59428, + "name": "mem_E824", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8154, + "last_access": 8154, + "accesses": [ + { + "address": 59428, + "instruction_address": 8154, + "instruction": "MOV:G.W #H'00, @H'E824", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E824", + "operand_index": 1 + } + ] + }, + { + "address": 59430, + "name": "mem_E826", + "region": "program_or_external", + "kind": "memory", + "access_count": 4, + "read_count": 0, + "write_count": 4, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8174, + "last_access": 8251, + "accesses": [ + { + "address": 59430, + "instruction_address": 8174, + "instruction": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + }, + { + "address": 59430, + "instruction_address": 8193, + "instruction": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + }, + { + "address": 59430, + "instruction_address": 8231, + "instruction": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + }, + { + "address": 59430, + "instruction_address": 8251, + "instruction": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + } + ] + }, + { + "address": 59434, + "name": "mem_E82A", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8369, + "last_access": 8369, + "accesses": [ + { + "address": 59434, + "instruction_address": 8369, + "instruction": "MOV:G.W R0, @H'E82A", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E82A", + "operand_index": 1 + } + ] + }, + { + "address": 59606, + "name": "mem_E8D6", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8283, + "last_access": 8283, + "accesses": [ + { + "address": 59606, + "instruction_address": 8283, + "instruction": "MOV:G.W #H'8000, @H'E8D6", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E8D6", + "operand_index": 1 + } + ] + }, + { + "address": 63188, + "name": "ram_F6D4", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8264, + "last_access": 8264, + "accesses": [ + { + "address": 63188, + "instruction_address": 8264, + "instruction": "BTST.B #6, @H'F6D4", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F6D4", + "operand_index": 1 + } + ] + }, + { + "address": 63195, + "name": "ram_F6DB", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 3, + "read_count": 3, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8206, + "last_access": 8382, + "accesses": [ + { + "address": 63195, + "instruction_address": 8206, + "instruction": "BTST.B #7, @H'F6DB", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F6DB", + "operand_index": 1 + }, + { + "address": 63195, + "instruction_address": 8357, + "instruction": "BTST.B #5, @H'F6DB", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F6DB", + "operand_index": 1 + }, + { + "address": 63195, + "instruction_address": 8382, + "instruction": "BTST.B #3, @H'F6DB", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F6DB", + "operand_index": 1 + } + ] + }, + { + "address": 63251, + "name": "ram_F713", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 2, + "read_count": 2, + "write_count": 2, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8150, + "last_access": 8327, + "accesses": [ + { + "address": 63251, + "instruction_address": 8150, + "instruction": "BCLR.B #5, @H'F713", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F713", + "operand_index": 1 + }, + { + "address": 63251, + "instruction_address": 8327, + "instruction": "BSET.B #6, @H'F713", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F713", + "operand_index": 1 + } + ] + }, + { + "address": 63270, + "name": "ram_F726", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8331, + "last_access": 8331, + "accesses": [ + { + "address": 63270, + "instruction_address": 8331, + "instruction": "MOV:G.B #H'1E, @H'F726", + "mnemonic": "MOV:G.B", + "direction": "write", + "width": "byte", + "operand": "@H'F726", + "operand_index": 1 + } + ] + }, + { + "address": 63280, + "name": "ram_F730", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8277, + "last_access": 8277, + "accesses": [ + { + "address": 63280, + "instruction_address": 8277, + "instruction": "BTST.B #7, @H'F730", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F730", + "operand_index": 1 + } + ] + }, + { + "address": 63281, + "name": "ram_F731", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 5, + "read_count": 5, + "write_count": 2, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8212, + "last_access": 8388, + "accesses": [ + { + "address": 63281, + "instruction_address": 8212, + "instruction": "CMP:G.B #H'03, @H'F731", + "mnemonic": "CMP:G.B", + "direction": "read", + "width": "byte", + "operand": "@H'F731", + "operand_index": 1 + }, + { + "address": 63281, + "instruction_address": 8270, + "instruction": "CMP:G.B #H'02, @H'F731", + "mnemonic": "CMP:G.B", + "direction": "read", + "width": "byte", + "operand": "@H'F731", + "operand_index": 1 + }, + { + "address": 63281, + "instruction_address": 8297, + "instruction": "BSET.B #7, @H'F731", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F731", + "operand_index": 1 + }, + { + "address": 63281, + "instruction_address": 8340, + "instruction": "BSET.B #7, @H'F731", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F731", + "operand_index": 1 + }, + { + "address": 63281, + "instruction_address": 8388, + "instruction": "CMP:G.B #H'03, @H'F731", + "mnemonic": "CMP:G.B", + "direction": "read", + "width": "byte", + "operand": "@H'F731", + "operand_index": 1 + } + ] + }, + { + "address": 63282, + "name": "ram_F732", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8308, + "last_access": 8308, + "accesses": [ + { + "address": 63282, + "instruction_address": 8308, + "instruction": "CLR.W @H'F732", + "mnemonic": "CLR.W", + "direction": "write", + "width": "word", + "operand": "@H'F732", + "operand_index": 0 + } + ] + }, + { + "address": 63338, + "name": "ram_F76A", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 8320, + "last_access": 8320, + "accesses": [ + { + "address": 63338, + "instruction_address": 8320, + "instruction": "CLR.W @H'F76A", + "mnemonic": "CLR.W", + "direction": "write", + "width": "word", + "operand": "@H'F76A", + "operand_index": 0 + } + ] + }, + { + "address": 63342, + "name": "ram_F76E", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 1, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8336, + "last_access": 8336, + "accesses": [ + { + "address": 63342, + "instruction_address": 8336, + "instruction": "BSET.B #6, @H'F76E", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F76E", + "operand_index": 1 + } + ] + }, + { + "address": 63377, + "name": "ram_F791", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 2, + "read_count": 2, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8146, + "last_access": 8219, + "accesses": [ + { + "address": 63377, + "instruction_address": 8146, + "instruction": "BCLR.B #7, @H'F791", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + }, + { + "address": 63377, + "instruction_address": 8219, + "instruction": "BTST.B #5, @H'F791", + "mnemonic": "BTST.B", + "direction": "read", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + } + ] + }, + { + "address": 63384, + "name": "ram_F798", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 2, + "read_count": 0, + "write_count": 2, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8301, + "last_access": 8344, + "accesses": [ + { + "address": 63384, + "instruction_address": 8301, + "instruction": "MOV:G.B #H'C8, @H'F798", + "mnemonic": "MOV:G.B", + "direction": "write", + "width": "byte", + "operand": "@H'F798", + "operand_index": 1 + }, + { + "address": 63384, + "instruction_address": 8344, + "instruction": "MOV:G.B #H'C8, @H'F798", + "mnemonic": "MOV:G.B", + "direction": "write", + "width": "byte", + "operand": "@H'F798", + "operand_index": 1 + } + ] + }, + { + "address": 64259, + "name": "ram_FB03", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 1, + "read_count": 1, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 8312, + "last_access": 8312, + "accesses": [ + { + "address": 64259, + "instruction_address": 8312, + "instruction": "BCLR.B #7, @H'FB03", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'FB03", + "operand_index": 1 + } + ] + } + ], + "by_address": { + "57382": "mem_E026", + "57386": "mem_E02A", + "57414": "mem_E046", + "57616": "mem_E110", + "57652": "mem_E134", + "59428": "mem_E824", + "59430": "mem_E826", + "59434": "mem_E82A", + "59606": "mem_E8D6", + "63188": "ram_F6D4", + "63195": "ram_F6DB", + "63251": "ram_F713", + "63270": "ram_F726", + "63280": "ram_F730", + "63281": "ram_F731", + "63282": "ram_F732", + "63338": "ram_F76A", + "63342": "ram_F76E", + "63377": "ram_F791", + "63384": "ram_F798", + "64259": "ram_FB03" + } + }, + "lcd_text": { + "strings": [], + "regions": [], + "searches": [ + { + "term": "CONNECT", + "literal_hits": [], + "candidate_hits": [], + "near_matches": [], + "status": "not_found" + } + ], + "notes": [ + "LCD text scan is byte-oriented and conservative; strings may be inline script fields.", + "Raw xrefs include MOV:I.W immediates to the string address and nearby record prefixes." + ] + }, + "lcd_driver": { + "addresses": [ + { + "address": 61952, + "name": "lcd_status_control", + "role": "status/control register inferred from busy polling and command writes" + }, + { + "address": 61953, + "name": "lcd_data", + "role": "data register inferred from paired data reads/writes" + } + ], + "accesses": [], + "polling_loops": [], + "routines": [], + "instructions": {} + }, + "instructions": [ + { + "address": 8128, + "address_region": "program_or_external", + "bytes": "F713C51D", + "text": "ROTR.B @(H'13C5,R7)", + "mnemonic": "ROTR.B", + "operands": "@(H'13C5,R7)", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8132, + "address_region": "program_or_external", + "bytes": "E824078000", + "text": "MOV:G.W #H'8000, @(H'24,R0)", + "mnemonic": "MOV:G.W", + "operands": "#H'8000, @(H'24,R0)", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 11, + "base_cycles": 9, + "alignment_adjustment": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [], + "notes": [] + } + }, + { + "address": 8137, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8139, + "address_region": "program_or_external", + "bytes": "5B4012", + "text": "MOV:I.W #H'4012, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'4012, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + } + } + ], + "notes": [ + "R3 = 0x4012" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + } + } + } + } + }, + { + "address": 8142, + "address_region": "program_or_external", + "bytes": "1E1E83", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8145, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 13, + "base_cycles": 8, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8128, + "changes": [], + "notes": [] + } + }, + { + "address": 8146, + "address_region": "program_or_external", + "bytes": "15F791D7", + "text": "BCLR.B #7, @H'F791", + "mnemonic": "BCLR.B", + "operands": "#7, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8150, + "address_region": "program_or_external", + "bytes": "15F713D5", + "text": "BCLR.B #5, @H'F713", + "mnemonic": "BCLR.B", + "operands": "#5, @H'F713", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63251, + "name": null, + "symbol": "ram_F713", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [], + "notes": [] + } + }, + { + "address": 8154, + "address_region": "program_or_external", + "bytes": "1DE8240600", + "text": "MOV:G.W #H'00, @H'E824", + "mnemonic": "MOV:G.W", + "operands": "#H'00, @H'E824", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 11, + "base_cycles": 9, + "alignment_adjustment": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59428, + "name": null, + "symbol": "mem_E824", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [], + "notes": [] + } + }, + { + "address": 8159, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8161, + "address_region": "program_or_external", + "bytes": "5B4012", + "text": "MOV:I.W #H'4012, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'4012, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + } + } + ], + "notes": [ + "R3 = 0x4012" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + } + } + } + } + }, + { + "address": 8164, + "address_region": "program_or_external", + "bytes": "1E1E6D", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 16402, + "hex": "0x4012", + "width": 16, + "source": "MOV:I.W #H'4012, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8167, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 13, + "base_cycles": 8, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8146, + "changes": [], + "notes": [] + } + }, + { + "address": 8168, + "address_region": "program_or_external", + "bytes": "1DE02680", + "text": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E026, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57382, + "name": null, + "symbol": "mem_E026", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8172, + "address_region": "program_or_external", + "bytes": "A8CF", + "text": "BSET.W #15, R0", + "mnemonic": "BSET.W", + "operands": "#15, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "memory_load" + }, + "after": { + "known": false, + "reason": "unsupported:BSET.W" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8174, + "address_region": "program_or_external", + "bytes": "1DE82690", + "text": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "operands": "R0, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [], + "notes": [] + } + }, + { + "address": 8178, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8180, + "address_region": "program_or_external", + "bytes": "5B0013", + "text": "MOV:I.W #H'0013, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0013, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + ], + "notes": [ + "R3 = 0x0013" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + } + } + }, + { + "address": 8183, + "address_region": "program_or_external", + "bytes": "1E1E5A", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 14, + "base_cycles": 9, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "unsupported:BSET.W" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8186, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 12, + "base_cycles": 8, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8168, + "changes": [], + "notes": [] + } + }, + { + "address": 8187, + "address_region": "program_or_external", + "bytes": "1DE02680", + "text": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E026, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57382, + "name": null, + "symbol": "mem_E026", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8191, + "address_region": "program_or_external", + "bytes": "A8DF", + "text": "BCLR.W #15, R0", + "mnemonic": "BCLR.W", + "operands": "#15, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "memory_load" + }, + "after": { + "known": false, + "reason": "unsupported:BCLR.W" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8193, + "address_region": "program_or_external", + "bytes": "1DE82690", + "text": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "operands": "R0, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [], + "notes": [] + } + }, + { + "address": 8197, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8199, + "address_region": "program_or_external", + "bytes": "5B0013", + "text": "MOV:I.W #H'0013, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0013, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + ], + "notes": [ + "R3 = 0x0013" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + } + } + }, + { + "address": 8202, + "address_region": "program_or_external", + "bytes": "1E1E47", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "unsupported:BCLR.W" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8205, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 13, + "base_cycles": 8, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8187, + "changes": [], + "notes": [] + } + }, + { + "address": 8206, + "address_region": "program_or_external", + "bytes": "15F6DBF7", + "text": "BTST.B #7, @H'F6DB", + "mnemonic": "BTST.B", + "operands": "#7, @H'F6DB", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63195, + "name": null, + "symbol": "ram_F6DB", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8206, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8210, + "address_region": "program_or_external", + "bytes": "2733", + "text": "BEQ loc_2047", + "mnemonic": "BEQ", + "operands": "loc_2047", + "kind": "branch", + "targets": [ + 8263 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8206, + "changes": [], + "notes": [] + } + }, + { + "address": 8212, + "address_region": "program_or_external", + "bytes": "15F7310403", + "text": "CMP:G.B #H'03, @H'F731", + "mnemonic": "CMP:G.B", + "operands": "#H'03, @H'F731", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63281, + "name": null, + "symbol": "ram_F731", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8212, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8217, + "address_region": "program_or_external", + "bytes": "222C", + "text": "BHI loc_2047", + "mnemonic": "BHI", + "operands": "loc_2047", + "kind": "branch", + "targets": [ + 8263 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8212, + "changes": [], + "notes": [] + } + }, + { + "address": 8219, + "address_region": "program_or_external", + "bytes": "15F791F5", + "text": "BTST.B #5, @H'F791", + "mnemonic": "BTST.B", + "operands": "#5, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8219, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8223, + "address_region": "program_or_external", + "bytes": "2614", + "text": "BNE loc_2035", + "mnemonic": "BNE", + "operands": "loc_2035", + "kind": "branch", + "targets": [ + 8245 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8219, + "changes": [], + "notes": [] + } + }, + { + "address": 8225, + "address_region": "program_or_external", + "bytes": "1DE02680", + "text": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E026, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57382, + "name": null, + "symbol": "mem_E026", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8229, + "address_region": "program_or_external", + "bytes": "A8CE", + "text": "BSET.W #14, R0", + "mnemonic": "BSET.W", + "operands": "#14, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "memory_load" + }, + "after": { + "known": false, + "reason": "unsupported:BSET.W" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8231, + "address_region": "program_or_external", + "bytes": "1DE82690", + "text": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "operands": "R0, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [], + "notes": [] + } + }, + { + "address": 8235, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8237, + "address_region": "program_or_external", + "bytes": "5B0013", + "text": "MOV:I.W #H'0013, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0013, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + ], + "notes": [ + "R3 = 0x0013" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + } + } + }, + { + "address": 8240, + "address_region": "program_or_external", + "bytes": "1E1E21", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "unsupported:BSET.W" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8243, + "address_region": "program_or_external", + "bytes": "2012", + "text": "BRA loc_2047", + "mnemonic": "BRA", + "operands": "loc_2047", + "kind": "jump", + "targets": [ + 8263 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8225, + "changes": [], + "notes": [] + } + }, + { + "address": 8245, + "address_region": "program_or_external", + "bytes": "1DE02680", + "text": "MOV:G.W @H'E026, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E026, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57382, + "name": null, + "symbol": "mem_E026", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8249, + "address_region": "program_or_external", + "bytes": "A8DE", + "text": "BCLR.W #14, R0", + "mnemonic": "BCLR.W", + "operands": "#14, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "memory_load" + }, + "after": { + "known": false, + "reason": "unsupported:BCLR.W" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8251, + "address_region": "program_or_external", + "bytes": "1DE82690", + "text": "MOV:G.W R0, @H'E826", + "mnemonic": "MOV:G.W", + "operands": "R0, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [], + "notes": [] + } + }, + { + "address": 8255, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8257, + "address_region": "program_or_external", + "bytes": "5B0013", + "text": "MOV:I.W #H'0013, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0013, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + ], + "notes": [ + "R3 = 0x0013" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + } + } + } + } + }, + { + "address": 8260, + "address_region": "program_or_external", + "bytes": "1E1E0D", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8245, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "unsupported:BCLR.W" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 19, + "hex": "0x0013", + "width": 16, + "source": "MOV:I.W #H'0013, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8263, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 13, + "base_cycles": 8, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8263, + "changes": [], + "notes": [] + } + }, + { + "address": 8264, + "address_region": "program_or_external", + "bytes": "15F6D4F6", + "text": "BTST.B #6, @H'F6D4", + "mnemonic": "BTST.B", + "operands": "#6, @H'F6D4", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63188, + "name": null, + "symbol": "ram_F6D4", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8264, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8268, + "address_region": "program_or_external", + "bytes": "2752", + "text": "BEQ loc_20A0", + "mnemonic": "BEQ", + "operands": "loc_20A0", + "kind": "branch", + "targets": [ + 8352 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8264, + "changes": [], + "notes": [] + } + }, + { + "address": 8270, + "address_region": "program_or_external", + "bytes": "15F7310402", + "text": "CMP:G.B #H'02, @H'F731", + "mnemonic": "CMP:G.B", + "operands": "#H'02, @H'F731", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63281, + "name": null, + "symbol": "ram_F731", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8270, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8275, + "address_region": "program_or_external", + "bytes": "224B", + "text": "BHI loc_20A0", + "mnemonic": "BHI", + "operands": "loc_20A0", + "kind": "branch", + "targets": [ + 8352 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8270, + "changes": [], + "notes": [] + } + }, + { + "address": 8277, + "address_region": "program_or_external", + "bytes": "15F730F7", + "text": "BTST.B #7, @H'F730", + "mnemonic": "BTST.B", + "operands": "#7, @H'F730", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63280, + "name": null, + "symbol": "ram_F730", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8277, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8281, + "address_region": "program_or_external", + "bytes": "2719", + "text": "BEQ loc_2074", + "mnemonic": "BEQ", + "operands": "loc_2074", + "kind": "branch", + "targets": [ + 8308 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8277, + "changes": [], + "notes": [] + } + }, + { + "address": 8283, + "address_region": "program_or_external", + "bytes": "1DE8D6078000", + "text": "MOV:G.W #H'8000, @H'E8D6", + "mnemonic": "MOV:G.W", + "operands": "#H'8000, @H'E8D6", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 9, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59606, + "name": null, + "symbol": "mem_E8D6", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8289, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8291, + "address_region": "program_or_external", + "bytes": "5B006B", + "text": "MOV:I.W #H'006B, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'006B, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 107, + "hex": "0x006B", + "width": 16, + "source": "MOV:I.W #H'006B, R3" + } + } + ], + "notes": [ + "R3 = 0x006B" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 107, + "hex": "0x006B", + "width": 16, + "source": "MOV:I.W #H'006B, R3" + } + } + } + } + }, + { + "address": 8294, + "address_region": "program_or_external", + "bytes": "1E1DEB", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 107, + "hex": "0x006B", + "width": 16, + "source": "MOV:I.W #H'006B, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8297, + "address_region": "program_or_external", + "bytes": "15F731C7", + "text": "BSET.B #7, @H'F731", + "mnemonic": "BSET.B", + "operands": "#7, @H'F731", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63281, + "name": null, + "symbol": "ram_F731", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "call" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8301, + "address_region": "program_or_external", + "bytes": "15F79806C8", + "text": "MOV:G.B #H'C8, @H'F798", + "mnemonic": "MOV:G.B", + "operands": "#H'C8, @H'F798", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63384, + "name": null, + "symbol": "ram_F798", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [], + "notes": [] + } + }, + { + "address": 8306, + "address_region": "program_or_external", + "bytes": "202C", + "text": "BRA loc_20A0", + "mnemonic": "BRA", + "operands": "loc_20A0", + "kind": "jump", + "targets": [ + 8352 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8283, + "changes": [], + "notes": [] + } + }, + { + "address": 8308, + "address_region": "program_or_external", + "bytes": "1DF73213", + "text": "CLR.W @H'F732", + "mnemonic": "CLR.W", + "operands": "@H'F732", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63282, + "name": null, + "symbol": "ram_F732", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8312, + "address_region": "program_or_external", + "bytes": "15FB03D7", + "text": "BCLR.B #7, @H'FB03", + "mnemonic": "BCLR.B", + "operands": "#7, @H'FB03", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 64259, + "name": null, + "symbol": "ram_FB03", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8316, + "address_region": "program_or_external", + "bytes": "1DE04613", + "text": "CLR.W @H'E046", + "mnemonic": "CLR.W", + "operands": "@H'E046", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57414, + "name": null, + "symbol": "mem_E046", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8320, + "address_region": "program_or_external", + "bytes": "1DF76A13", + "text": "CLR.W @H'F76A", + "mnemonic": "CLR.W", + "operands": "@H'F76A", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63338, + "name": null, + "symbol": "ram_F76A", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8324, + "address_region": "program_or_external", + "bytes": "1E2873", + "text": "BSR loc_48FA", + "mnemonic": "BSR", + "operands": "loc_48FA", + "kind": "call", + "targets": [ + 18682 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8327, + "address_region": "program_or_external", + "bytes": "15F713C6", + "text": "BSET.B #6, @H'F713", + "mnemonic": "BSET.B", + "operands": "#6, @H'F713", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63251, + "name": null, + "symbol": "ram_F713", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "call" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8331, + "address_region": "program_or_external", + "bytes": "15F726061E", + "text": "MOV:G.B #H'1E, @H'F726", + "mnemonic": "MOV:G.B", + "operands": "#H'1E, @H'F726", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63270, + "name": null, + "symbol": "ram_F726", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8336, + "address_region": "program_or_external", + "bytes": "15F76EC6", + "text": "BSET.B #6, @H'F76E", + "mnemonic": "BSET.B", + "operands": "#6, @H'F76E", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63342, + "name": null, + "symbol": "ram_F76E", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8340, + "address_region": "program_or_external", + "bytes": "15F731C7", + "text": "BSET.B #7, @H'F731", + "mnemonic": "BSET.B", + "operands": "#7, @H'F731", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63281, + "name": null, + "symbol": "ram_F731", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8344, + "address_region": "program_or_external", + "bytes": "15F79806C8", + "text": "MOV:G.B #H'C8, @H'F798", + "mnemonic": "MOV:G.B", + "operands": "#H'C8, @H'F798", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63384, + "name": null, + "symbol": "ram_F798", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [], + "notes": [] + } + }, + { + "address": 8349, + "address_region": "program_or_external", + "bytes": "1E3638", + "text": "BSR loc_56D8", + "mnemonic": "BSR", + "operands": "loc_56D8", + "kind": "call", + "targets": [ + 22232 + ], + "cycles": { + "cycles": 14, + "base_cycles": 9, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8308, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8352, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 12, + "base_cycles": 8, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8352, + "changes": [], + "notes": [] + } + }, + { + "address": 8353, + "address_region": "program_or_external", + "bytes": "1DE02A80", + "text": "MOV:G.W @H'E02A, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E02A, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57386, + "name": null, + "symbol": "mem_E02A", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8353, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8357, + "address_region": "program_or_external", + "bytes": "15F6DBF5", + "text": "BTST.B #5, @H'F6DB", + "mnemonic": "BTST.B", + "operands": "#5, @H'F6DB", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63195, + "name": null, + "symbol": "ram_F6DB", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8353, + "changes": [], + "notes": [] + } + }, + { + "address": 8361, + "address_region": "program_or_external", + "bytes": "2704", + "text": "BEQ loc_20AF", + "mnemonic": "BEQ", + "operands": "loc_20AF", + "kind": "branch", + "targets": [ + 8367 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8353, + "changes": [], + "notes": [] + } + }, + { + "address": 8363, + "address_region": "program_or_external", + "bytes": "A8CF", + "text": "BSET.W #15, R0", + "mnemonic": "BSET.W", + "operands": "#15, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8363, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "unsupported:BSET.W" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8365, + "address_region": "program_or_external", + "bytes": "2002", + "text": "BRA loc_20B1", + "mnemonic": "BRA", + "operands": "loc_20B1", + "kind": "jump", + "targets": [ + 8369 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8363, + "changes": [], + "notes": [] + } + }, + { + "address": 8367, + "address_region": "program_or_external", + "bytes": "A8DF", + "text": "BCLR.W #15, R0", + "mnemonic": "BCLR.W", + "operands": "#15, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8367, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "unsupported:BCLR.W" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + }, + { + "address": 8369, + "address_region": "program_or_external", + "bytes": "1DE82A90", + "text": "MOV:G.W R0, @H'E82A", + "mnemonic": "MOV:G.W", + "operands": "R0, @H'E82A", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59434, + "name": null, + "symbol": "mem_E82A", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8369, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8373, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8369, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 8375, + "address_region": "program_or_external", + "bytes": "5B0015", + "text": "MOV:I.W #H'0015, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0015, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8369, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 21, + "hex": "0x0015", + "width": 16, + "source": "MOV:I.W #H'0015, R3" + } + } + ], + "notes": [ + "R3 = 0x0015" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 21, + "hex": "0x0015", + "width": 16, + "source": "MOV:I.W #H'0015, R3" + } + } + } + } + }, + { + "address": 8378, + "address_region": "program_or_external", + "bytes": "1E1D97", + "text": "BSR loc_3E54", + "mnemonic": "BSR", + "operands": "loc_3E54", + "kind": "call", + "targets": [ + 15956 + ], + "cycles": { + "cycles": 13, + "base_cycles": 9, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8369, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": true, + "value": 21, + "hex": "0x0015", + "width": 16, + "source": "MOV:I.W #H'0015, R3" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "flags" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8381, + "address_region": "program_or_external", + "bytes": "19", + "text": "RTS", + "mnemonic": "RTS", + "operands": "", + "kind": "return", + "targets": [], + "cycles": { + "cycles": 13, + "base_cycles": 8, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word pop from stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8369, + "changes": [], + "notes": [] + } + }, + { + "address": 8382, + "address_region": "program_or_external", + "bytes": "15F6DBF3", + "text": "BTST.B #3, @H'F6DB", + "mnemonic": "BTST.B", + "operands": "#3, @H'F6DB", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63195, + "name": null, + "symbol": "ram_F6DB", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8382, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8386, + "address_region": "program_or_external", + "bytes": "272C", + "text": "BEQ loc_20F0", + "mnemonic": "BEQ", + "operands": "loc_20F0", + "kind": "branch", + "targets": [ + 8432 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8382, + "changes": [], + "notes": [] + } + }, + { + "address": 8388, + "address_region": "program_or_external", + "bytes": "15F7310403", + "text": "CMP:G.B #H'03, @H'F731", + "mnemonic": "CMP:G.B", + "operands": "#H'03, @H'F731", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63281, + "name": null, + "symbol": "ram_F731", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8388, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8393, + "address_region": "program_or_external", + "bytes": "2225", + "text": "BHI loc_20F0", + "mnemonic": "BHI", + "operands": "loc_20F0", + "kind": "branch", + "targets": [ + 8432 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8388, + "changes": [], + "notes": [] + } + }, + { + "address": 8395, + "address_region": "program_or_external", + "bytes": "1DE11016", + "text": "TST.W @H'E110", + "mnemonic": "TST.W", + "operands": "@H'E110", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57616, + "name": null, + "symbol": "mem_E110", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8395, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 8399, + "address_region": "program_or_external", + "bytes": "2705", + "text": "BEQ loc_20D6", + "mnemonic": "BEQ", + "operands": "loc_20D6", + "kind": "branch", + "targets": [ + 8406 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8395, + "changes": [], + "notes": [] + } + }, + { + "address": 8401, + "address_region": "program_or_external", + "bytes": "1E0614", + "text": "BSR loc_26E8", + "mnemonic": "BSR", + "operands": "loc_26E8", + "kind": "call", + "targets": [ + 9960 + ], + "cycles": { + "cycles": 14, + "base_cycles": 9, + "alignment_adjustment": 1, + "stack_adjustment": 4, + "note": "PC word push to stack", + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8401, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R4", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R5", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R6", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "register", + "name": "R7", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "BR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "EP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "DP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "TP", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + }, + { + "kind": "control", + "name": "SR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "call" + } + } + ], + "notes": [ + "call clobbers tracked register state" + ] + } + }, + { + "address": 8404, + "address_region": "program_or_external", + "bytes": "201A", + "text": "BRA loc_20F0", + "mnemonic": "BRA", + "operands": "loc_20F0", + "kind": "jump", + "targets": [ + 8432 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8401, + "changes": [], + "notes": [] + } + }, + { + "address": 8406, + "address_region": "program_or_external", + "bytes": "1DE13480", + "text": "MOV:G.W @H'E134, R0", + "mnemonic": "MOV:G.W", + "operands": "@H'E134, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57652, + "name": null, + "symbol": "mem_E134", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 8406, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R0 unknown after memory load" + ] + } + }, + { + "address": 8410, + "address_region": "program_or_external", + "bytes": "A8FB", + "text": "BTST.W #11, R0", + "mnemonic": "BTST.W", + "operands": "#11, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8406, + "changes": [], + "notes": [] + } + }, + { + "address": 8412, + "address_region": "program_or_external", + "bytes": "2704", + "text": "BEQ loc_20E2", + "mnemonic": "BEQ", + "operands": "loc_20E2", + "kind": "branch", + "targets": [ + 8418 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8406, + "changes": [], + "notes": [] + } + }, + { + "address": 8414, + "address_region": "program_or_external", + "bytes": "A8DB", + "text": "BCLR.W #11, R0", + "mnemonic": "BCLR.W", + "operands": "#11, R0", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 8414, + "changes": [ + { + "kind": "register", + "name": "R0", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "unsupported:BCLR.W" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "unsupported operation invalidated R0" + ] + } + } + ], + "decompiler_consistency": { + "kind": "decompiler_pseudocode_consistency", + "summary": "1 byte-immediate-to-word destination case(s) require explicit zero-extension in pseudocode.", + "checks": [ + { + "kind": "byte_immediate_to_word_destination", + "status": "requires_zero_extend8_to16_pseudocode", + "address": 8154, + "address_hex": "H'1FDA", + "instruction": "MOV:G.W #H'00, @H'E824", + "expected_pseudocode_hint": "zero_extend8_to16", + "zero_extended_value_hex": "0x0000", + "summary": "Word-sized MOV with an 8-bit immediate writes a zero-extended word. Pseudocode should not model this as a one-byte write or preserve the old low byte." + } + ] + }, + "serial_semantics": { + "kind": "serial_semantics", + "protocol_semantics": [], + "fields": [], + "command_dispatch": null, + "commands": [], + "command_effects": [], + "response_candidates": [], + "response_schemas": [], + "response_schema": [], + "logical_table_map_candidates": [], + "table_map_candidates": [], + "state_variable_candidates": [], + "retry_error_model": null, + "gate_queue_model": null, + "tx_report_model": null, + "periodic_resend_model": null, + "timer_interrupt_model": null, + "confidence": "low", + "confidence_score": 0.0, + "caveat": "No protocol semantics are emitted without both RX and TX serial reconstruction candidates." + } +} \ No newline at end of file diff --git a/build/rom_0013_handler_linear.asm b/build/rom_0013_handler_linear.asm new file mode 100644 index 0000000..ca6ef7e --- /dev/null +++ b/build/rom_0013_handler_linear.asm @@ -0,0 +1,135 @@ +; H8/536 ROM disassembly +; input: ROM\M27C512@DIP28_1.BIN +; bytes: 65536 +; vector mode: min +; analysis: linear sweep +; +; Notes from the manual: +; - H8/536 uses the H8/500 CPU instruction set. +; - In minimum mode the reset vector at H'0000-H'0001 is a 16-bit PC. +; - The register field is H'FE80-H'FFFF; names below come from appendix B. +; - @aa:8 short absolute operands use BR as the upper address byte. +; - SCI baud inference uses section 14.2.8 BRR formulas when SMR/BRR are known. +; - LCD inference treats E-clock H'F200/H'F201 accesses as status/control and data candidates. + +; Memory Map +; H'0000-H'009F exception_vectors vectors +; H'00A0-H'00FF dtc_vectors dtc_vectors +; H'0100-H'F67F program_or_external program +; H'F680-H'FE7F on_chip_ram ram +; H'FE80-H'FFFF register_field registers + +; Vectors +; H'0000 reset -> vec_reset_1000 (H'1000) +; H'0004 invalid_instruction -> vec_reset_1000 (H'1000) +; H'0006 zero_divide -> vec_reset_1000 (H'1000) +; H'0008 trap_vs -> vec_reset_1000 (H'1000) +; H'0010 address_error -> vec_reset_1000 (H'1000) +; H'0012 trace -> vec_reset_1000 (H'1000) +; H'0016 nmi -> vec_nmi_4393 (H'4393) +; H'0020 trapa_0 -> vec_reset_1000 (H'1000) +; H'0022 trapa_1 -> vec_reset_1000 (H'1000) +; H'0024 trapa_2 -> vec_reset_1000 (H'1000) +; H'0026 trapa_3 -> vec_reset_1000 (H'1000) +; H'0028 trapa_4 -> vec_reset_1000 (H'1000) +; H'002A trapa_5 -> vec_reset_1000 (H'1000) +; H'002C trapa_6 -> vec_reset_1000 (H'1000) +; H'002E trapa_7 -> vec_reset_1000 (H'1000) +; H'0030 trapa_8 -> vec_reset_1000 (H'1000) +; H'0032 trapa_9 -> vec_reset_1000 (H'1000) +; H'0034 trapa_a -> vec_reset_1000 (H'1000) +; H'0036 trapa_b -> vec_reset_1000 (H'1000) +; H'0038 trapa_c -> vec_reset_1000 (H'1000) +; H'003A trapa_d -> vec_reset_1000 (H'1000) +; H'003C trapa_e -> vec_reset_1000 (H'1000) +; H'003E trapa_f -> vec_reset_1000 (H'1000) +; H'0040 irq0 -> vec_reset_1000 (H'1000) +; H'0042 interval_timer -> vec_interval_timer_BFC4 (H'BFC4) +; H'0048 irq1 -> vec_reset_1000 (H'1000) +; H'0050 irq2 -> vec_reset_1000 (H'1000) +; H'0052 irq3 -> vec_irq3_3C30 (H'3C30) +; H'0058 irq4 -> vec_irq4_3AC7 (H'3AC7) +; H'005A irq5 -> vec_reset_1000 (H'1000) +; H'0062 frt1_ocia -> vec_frt1_ocia_BEEA (H'BEEA) +; H'006A frt2_ocia -> vec_frt2_ocia_BF23 (H'BF23) +; H'0080 sci1_eri -> vec_sci1_eri_BB57 (H'BB57) +; H'0082 sci1_rxi -> vec_sci1_rxi_BB67 (H'BB67) +; H'0084 sci1_txi -> vec_sci1_txi_BA84 (H'BA84) +; H'0090 ad_adi -> vec_ad_adi_3D99 (H'3D99) + +; Symbols +; mem_E02E H'E02E program_or_external memory r=1 w=0 width=word +; mem_E030 H'E030 program_or_external memory r=1 w=0 width=word +; mem_E826 H'E826 program_or_external memory r=2 w=0 width=word +; mem_E82E H'E82E program_or_external memory r=0 w=1 width=word +; ram_F711 H'F711 on_chip_ram ram r=4 w=4 width=byte +; ram_F713 H'F713 on_chip_ram ram r=2 w=2 width=byte +; ram_F716 H'F716 on_chip_ram ram r=4 w=4 width=byte +; ram_F791 H'F791 on_chip_ram ram r=4 w=4 width=byte + +; Board Profile +; Board trace ties the H8/536 SCI1 pins to a MAX202 RS232 transceiver. +; H8 pin 66 P95/TXD (TXD) -> MAX202 pin 11 +; H8 pin 67 P96/RXD (RXD) -> MAX202 pin 12 +; SCI2 pin routing is disabled by SYSCR2.P9SCI2E=0 in the observed setup. + +; LCD/Text Scan +; search 'CONNECT': not literal, hits=0 + +2E00: 30 FE A3 BRA loc_2CA6 +2E03: 30 FE A0 BRA loc_2CA6 +2E06: 1D E8 26 FF BTST.W #15, @H'E826 ; refs mem_E826 in program_or_external +2E0A: 27 0A BEQ loc_2E16 +2E0C: 15 F7 91 C6 BSET.B #6, @H'F791 ; refs ram_F791 in on_chip_ram +2E10: 15 F7 13 C4 BSET.B #4, @H'F713 ; refs ram_F713 in on_chip_ram +2E14: 20 08 BRA loc_2E1E + +loc_2E16: +2E16: 15 F7 91 D6 BCLR.B #6, @H'F791 ; refs ram_F791 in on_chip_ram +2E1A: 15 F7 13 D4 BCLR.B #4, @H'F713 ; refs ram_F713 in on_chip_ram + +loc_2E1E: +2E1E: 1D E8 26 FE BTST.W #14, @H'E826 ; refs mem_E826 in program_or_external +2E22: 27 0A BEQ loc_2E2E +2E24: 15 F7 91 C5 BSET.B #5, @H'F791 ; refs ram_F791 in on_chip_ram +2E28: 15 F7 16 C7 BSET.B #7, @H'F716 ; refs ram_F716 in on_chip_ram +2E2C: 20 08 BRA loc_2E36 + +loc_2E2E: +2E2E: 15 F7 91 D5 BCLR.B #5, @H'F791 ; refs ram_F791 in on_chip_ram +2E32: 15 F7 16 D7 BCLR.B #7, @H'F716 ; refs ram_F716 in on_chip_ram + +loc_2E36: +2E36: 30 FE 6D BRA loc_2CA6 +2E39: FC E0 00 81 MOV:G.W @(-H'2000,R4), R1 +2E3D: A9 FF BTST.W #15, R1 +2E3F: 26 0E BNE loc_2E4F +2E41: A9 FE BTST.W #14, R1 +2E43: 26 0A BNE loc_2E4F +2E45: 15 F7 11 D0 BCLR.B #0, @H'F711 ; refs ram_F711 in on_chip_ram +2E49: 15 F7 16 D5 BCLR.B #5, @H'F716 ; refs ram_F716 in on_chip_ram +2E4D: 20 08 BRA loc_2E57 + +loc_2E4F: +2E4F: 15 F7 11 C0 BSET.B #0, @H'F711 ; refs ram_F711 in on_chip_ram +2E53: 15 F7 16 C5 BSET.B #5, @H'F716 ; refs ram_F716 in on_chip_ram + +loc_2E57: +2E57: 30 FE 4C BRA loc_2CA6 +2E5A: FC E0 00 81 MOV:G.W @(-H'2000,R4), R1 +2E5E: A9 FF BTST.W #15, R1 +2E60: 26 06 BNE loc_2E68 +2E62: 15 F7 11 D1 BCLR.B #1, @H'F711 ; refs ram_F711 in on_chip_ram +2E66: 20 04 BRA loc_2E6C + +loc_2E68: +2E68: 15 F7 11 C1 BSET.B #1, @H'F711 ; refs ram_F711 in on_chip_ram + +loc_2E6C: +2E6C: 30 FE 37 BRA loc_2CA6 +2E6F: 1D E0 30 81 MOV:G.W @H'E030, R1 ; refs mem_E030 in program_or_external +2E73: 1D E0 2E 71 CMP:G.W @H'E02E, R1 ; refs mem_E02E in program_or_external +2E77: 27 0C BEQ loc_2E85 +2E79: 1D E8 2E 91 MOV:G.W R1, @H'E82E ; refs mem_E82E in program_or_external +2E7D: 52 80 MOV:E.B #H'80, R2 ; dataflow R2=H'80 +2E7F: 5B 00 17 MOV:I.W #H'0017, R3 ; dataflow R3=H'0017 diff --git a/build/rom_0013_handler_linear.json b/build/rom_0013_handler_linear.json new file mode 100644 index 0000000..4e722ba --- /dev/null +++ b/build/rom_0013_handler_linear.json @@ -0,0 +1,2590 @@ +{ + "vectors": [ + { + "address": 0, + "name": "reset", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 4, + "name": "invalid_instruction", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 6, + "name": "zero_divide", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 8, + "name": "trap_vs", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 16, + "name": "address_error", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 18, + "name": "trace", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 22, + "name": "nmi", + "target": 17299, + "target_label": "vec_nmi_4393" + }, + { + "address": 32, + "name": "trapa_0", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 34, + "name": "trapa_1", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 36, + "name": "trapa_2", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 38, + "name": "trapa_3", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 40, + "name": "trapa_4", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 42, + "name": "trapa_5", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 44, + "name": "trapa_6", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 46, + "name": "trapa_7", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 48, + "name": "trapa_8", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 50, + "name": "trapa_9", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 52, + "name": "trapa_a", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 54, + "name": "trapa_b", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 56, + "name": "trapa_c", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 58, + "name": "trapa_d", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 60, + "name": "trapa_e", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 62, + "name": "trapa_f", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 64, + "name": "irq0", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 66, + "name": "interval_timer", + "target": 49092, + "target_label": "vec_interval_timer_BFC4" + }, + { + "address": 72, + "name": "irq1", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 80, + "name": "irq2", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 82, + "name": "irq3", + "target": 15408, + "target_label": "vec_irq3_3C30" + }, + { + "address": 88, + "name": "irq4", + "target": 15047, + "target_label": "vec_irq4_3AC7" + }, + { + "address": 90, + "name": "irq5", + "target": 4096, + "target_label": "vec_reset_1000" + }, + { + "address": 98, + "name": "frt1_ocia", + "target": 48874, + "target_label": "vec_frt1_ocia_BEEA" + }, + { + "address": 106, + "name": "frt2_ocia", + "target": 48931, + "target_label": "vec_frt2_ocia_BF23" + }, + { + "address": 128, + "name": "sci1_eri", + "target": 47959, + "target_label": "vec_sci1_eri_BB57" + }, + { + "address": 130, + "name": "sci1_rxi", + "target": 47975, + "target_label": "vec_sci1_rxi_BB67" + }, + { + "address": 132, + "name": "sci1_txi", + "target": 47748, + "target_label": "vec_sci1_txi_BA84" + }, + { + "address": 144, + "name": "ad_adi", + "target": 15769, + "target_label": "vec_ad_adi_3D99" + } + ], + "dtc_vectors": [], + "memory_regions": [ + { + "name": "exception_vectors", + "start": 0, + "end": 159, + "kind": "vectors", + "manual": "section 2 address space" + }, + { + "name": "dtc_vectors", + "start": 160, + "end": 255, + "kind": "dtc_vectors", + "manual": "section 2 address space" + }, + { + "name": "program_or_external", + "start": 256, + "end": 63103, + "kind": "program", + "manual": "section 2/17 mode-dependent ROM or external space" + }, + { + "name": "on_chip_ram", + "start": 63104, + "end": 65151, + "kind": "ram", + "manual": "section 16 RAM" + }, + { + "name": "register_field", + "start": 65152, + "end": 65535, + "kind": "registers", + "manual": "appendix B register map" + } + ], + "data_candidates": { + "strings": [], + "pointer_tables": [] + }, + "call_graph": { + "nodes": [], + "edges": [] + }, + "timing_summary": { + "blocks": [], + "loops": [] + }, + "sci": { + "clock_hz": 20000000, + "formulas": { + "async": "B = clock_hz / (64 * 2^(2n) * (N + 1))", + "sync": "B = clock_hz / (8 * 2^(2n) * (N + 1))" + }, + "manual_references": [ + "Manual/0900766b802125d0.md:15837 SMR selects SCI mode and CKS1/CKS0 internal clock source", + "Manual/0900766b802125d0.md:16027 SCR.CKE1 selects internal or external clock source", + "Manual/0900766b802125d0.md:16177 BRR and SMR.CKS determine the baud-rate generator", + "Manual/0900766b802125d0.md:16303 asynchronous BRR formula", + "Manual/0900766b802125d0.md:16379 synchronous BRR formula", + "Manual/0900766b802125d0.md:16410 SCI clock source selection tables" + ], + "channels": { + "SCI1": { + "writes": [], + "configurations": [] + }, + "SCI2": { + "writes": [], + "configurations": [] + } + } + }, + "sci_protocol": { + "manual_references": [ + "Manual/0900766b802125d0.md:15748 SCI register map for RDR/TDR/SCR/SSR", + "Manual/0900766b802125d0.md:15794 RDR stores received data and is CPU-readable", + "Manual/0900766b802125d0.md:15823 TDR holds the next byte to transmit", + "Manual/0900766b802125d0.md:15976 SCR.TIE enables/disables TXI on TDRE", + "Manual/0900766b802125d0.md:15993 SCR.RIE enables RXI and ERI", + "Manual/0900766b802125d0.md:16008 SCR.TE enables the transmitter", + "Manual/0900766b802125d0.md:16028 SCR.RE enables the receiver", + "Manual/0900766b802125d0.md:16090 SSR flags are cleared by writing zero", + "Manual/0900766b802125d0.md:16100 SSR.TDRE means TDR can accept the next byte", + "Manual/0900766b802125d0.md:16116 SSR.RDRF means received data reached RDR", + "Manual/0900766b802125d0.md:16127 SSR.ORER reports receive overrun", + "Manual/0900766b802125d0.md:16140 SSR.FER reports framing errors", + "Manual/0900766b802125d0.md:16147 SSR.PER reports parity errors" + ], + "channels": { + "SCI1": { + "events": [] + }, + "SCI2": { + "events": [] + } + }, + "events": [] + }, + "serial_reconstruction": { + "kind": "serial_reconstruction", + "candidates": [], + "ram_roles": [], + "evidence": [], + "required_evidence": { + "tx": [ + "tx_buffer_region", + "tx_checksum_seed", + "checksum_byte", + "xor_checksum_chain", + "initial_send_from_buffer_start", + "tx_index_initialized_to_one", + "tx_isr_indexed_send", + "tx_index_increment", + "tx_index_compare_frame_length" + ], + "rx": [ + "rx_rdr_read", + "rx_indexed_store", + "rx_index_increment_store", + "rx_isr_compare_frame_length", + "rx_complete_timer", + "rx_processor_requires_six_bytes", + "rx_copy_capture_to_frame_buffer", + "rx_checksum_seed", + "rx_xor_checksum_validation" + ] + } + }, + "board_profile": { + "board": "sony_rcp_tx7", + "name": "Sony RCP-TX7", + "summary": "Board trace ties the H8/536 SCI1 pins to a MAX202 RS232 transceiver.", + "manual_references": [ + "Manual/0900766b802125d0.md:2417 FP-80 H8/536 pin 66 is P95/TXD", + "Manual/0900766b802125d0.md:2418 FP-80 H8/536 pin 67 is P96/RXD", + "Manual/0900766b802125d0.md:11192 Port 9 carries SCI1 and SCI2 serial signals", + "Manual/0900766b802125d0.md:11201 P96 is RXD1 input", + "Manual/0900766b802125d0.md:11202 P95 is TXD1 output", + "Manual/0900766b802125d0.md:15725 SCI1 RXD input pin", + "Manual/0900766b802125d0.md:15726 SCI1 TXD output pin", + "Manual/0900766b802125d0.md:15750 SCI register table starts with SCI1 RDR/TDR/SMR/SCR/SSR/BRR", + "Manual/0900766b802125d0.md:15758 SCI register table lists SCI2 RDR/TDR/SMR/SCR/SSR/BRR", + "Manual/0900766b802125d0.md:15794 RDR receive data register", + "Manual/0900766b802125d0.md:15823 TDR transmit data register", + "Manual/0900766b802125d0.md:15969 SCR enables and disables SCI functions", + "Manual/0900766b802125d0.md:16009 SCR.TE makes the TXD pin output", + "Manual/0900766b802125d0.md:16029 SCR.RE makes the RXD pin input", + "Manual/0900766b802125d0.md:16090 SSR contains transmit/receive status flags", + "Manual/0900766b802125d0.md:10560 SYSCR2 controls port 9 pin functions", + "Manual/0900766b802125d0.md:10631 SYSCR2.P9SCI2E controls the SCI2 functions of P92-P94" + ], + "traces": [ + { + "channel": "SCI1", + "signal": "TXD", + "h8_pin": 66, + "h8_pin_name": "P95/TXD", + "h8_function": "TXD1", + "max202_pin": 11, + "evidence": "MAX202 pin 11 traces to H8 pin 66" + }, + { + "channel": "SCI1", + "signal": "RXD", + "h8_pin": 67, + "h8_pin_name": "P96/RXD", + "h8_function": "RXD1", + "max202_pin": 12, + "evidence": "MAX202 pin 12 traces to H8 pin 67" + } + ], + "channels": { + "SCI1": { + "traced_to_max202": true, + "path": "RS232/MAX202", + "pins": [ + { + "channel": "SCI1", + "signal": "TXD", + "h8_pin": 66, + "h8_pin_name": "P95/TXD", + "h8_function": "TXD1", + "max202_pin": 11, + "evidence": "MAX202 pin 11 traces to H8 pin 66" + }, + { + "channel": "SCI1", + "signal": "RXD", + "h8_pin": 67, + "h8_pin_name": "P96/RXD", + "h8_function": "RXD1", + "max202_pin": 12, + "evidence": "MAX202 pin 12 traces to H8 pin 67" + } + ], + "scr": { + "value": 12, + "value_hex": "H'0C", + "tie": false, + "rie": false, + "tx_enabled": false, + "rx_enabled": false + }, + "accesses": [] + }, + "SCI2": { + "traced_to_max202": false, + "path": null, + "note": "Sony RCP-TX7 MAX202 board traces are on SCI1 P95/P96, not SCI2 P92/P93.", + "p9sci2e": false, + "scr": { + "value": 12, + "value_hex": "H'0C", + "tie": false, + "rie": false, + "tx_enabled": false, + "rx_enabled": false + }, + "accesses": [] + } + }, + "instructions": {}, + "state": { + "SYSCR2": { + "value": 128, + "value_hex": "H'80" + }, + "P9SCI2E": false + } + }, + "peripheral_access": { + "manual_references": [ + "Manual/0900766b802125d0.md:12185 FRT FRC/OCRA/OCRB/ICR use TEMP for 16-bit CPU access", + "Manual/0900766b802125d0.md:12193 FRT byte access order is upper byte then lower byte", + "Manual/0900766b802125d0.md:12212 OCRA/OCRB reads are direct; writes still use TEMP", + "Manual/0900766b802125d0.md:17546 A/D ADDRA-ADDRD lower byte is accessed through TEMP", + "Manual/0900766b802125d0.md:17556 A/D full-result byte reads must be upper byte then lower byte" + ], + "warnings": [] + }, + "indirect_flow": { + "sites": [] + }, + "dataflow": { + "blocks": [ + { + "start": 11776, + "instructions": [ + 11776 + ], + "end": 11776, + "end_exclusive": 11779 + }, + { + "start": 11779, + "instructions": [ + 11779 + ], + "end": 11779, + "end_exclusive": 11782 + }, + { + "start": 11782, + "instructions": [ + 11782, + 11786 + ], + "end": 11786, + "end_exclusive": 11788 + }, + { + "start": 11788, + "instructions": [ + 11788, + 11792, + 11796 + ], + "end": 11796, + "end_exclusive": 11798 + }, + { + "start": 11798, + "instructions": [ + 11798, + 11802 + ], + "end": 11802, + "end_exclusive": 11806 + }, + { + "start": 11806, + "instructions": [ + 11806, + 11810 + ], + "end": 11810, + "end_exclusive": 11812 + }, + { + "start": 11812, + "instructions": [ + 11812, + 11816, + 11820 + ], + "end": 11820, + "end_exclusive": 11822 + }, + { + "start": 11822, + "instructions": [ + 11822, + 11826 + ], + "end": 11826, + "end_exclusive": 11830 + }, + { + "start": 11830, + "instructions": [ + 11830 + ], + "end": 11830, + "end_exclusive": 11833 + }, + { + "start": 11833, + "instructions": [ + 11833, + 11837, + 11839 + ], + "end": 11839, + "end_exclusive": 11841 + }, + { + "start": 11841, + "instructions": [ + 11841, + 11843 + ], + "end": 11843, + "end_exclusive": 11845 + }, + { + "start": 11845, + "instructions": [ + 11845, + 11849, + 11853 + ], + "end": 11853, + "end_exclusive": 11855 + }, + { + "start": 11855, + "instructions": [ + 11855, + 11859 + ], + "end": 11859, + "end_exclusive": 11863 + }, + { + "start": 11863, + "instructions": [ + 11863 + ], + "end": 11863, + "end_exclusive": 11866 + }, + { + "start": 11866, + "instructions": [ + 11866, + 11870, + 11872 + ], + "end": 11872, + "end_exclusive": 11874 + }, + { + "start": 11874, + "instructions": [ + 11874, + 11878 + ], + "end": 11878, + "end_exclusive": 11880 + }, + { + "start": 11880, + "instructions": [ + 11880 + ], + "end": 11880, + "end_exclusive": 11884 + }, + { + "start": 11884, + "instructions": [ + 11884 + ], + "end": 11884, + "end_exclusive": 11887 + }, + { + "start": 11887, + "instructions": [ + 11887, + 11891, + 11895 + ], + "end": 11895, + "end_exclusive": 11897 + }, + { + "start": 11897, + "instructions": [ + 11897, + 11901, + 11903 + ], + "end": 11903, + "end_exclusive": 11906 + } + ], + "registers": [ + "R0", + "R1", + "R2", + "R3", + "R4", + "R5", + "R6", + "R7" + ], + "control_registers": [ + "CCR", + "BR", + "EP", + "DP", + "TP", + "SR" + ] + }, + "symbols": { + "symbols": [ + { + "address": 57390, + "name": "mem_E02E", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 11891, + "last_access": 11891, + "accesses": [ + { + "address": 57390, + "instruction_address": 11891, + "instruction": "CMP:G.W @H'E02E, R1", + "mnemonic": "CMP:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E02E", + "operand_index": 0 + } + ] + }, + { + "address": 57392, + "name": "mem_E030", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 1, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 11887, + "last_access": 11887, + "accesses": [ + { + "address": 57392, + "instruction_address": 11887, + "instruction": "MOV:G.W @H'E030, R1", + "mnemonic": "MOV:G.W", + "direction": "read", + "width": "word", + "operand": "@H'E030", + "operand_index": 0 + } + ] + }, + { + "address": 59430, + "name": "mem_E826", + "region": "program_or_external", + "kind": "memory", + "access_count": 2, + "read_count": 2, + "write_count": 0, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 11782, + "last_access": 11806, + "accesses": [ + { + "address": 59430, + "instruction_address": 11782, + "instruction": "BTST.W #15, @H'E826", + "mnemonic": "BTST.W", + "direction": "read", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + }, + { + "address": 59430, + "instruction_address": 11806, + "instruction": "BTST.W #14, @H'E826", + "mnemonic": "BTST.W", + "direction": "read", + "width": "word", + "operand": "@H'E826", + "operand_index": 1 + } + ] + }, + { + "address": 59438, + "name": "mem_E82E", + "region": "program_or_external", + "kind": "memory", + "access_count": 1, + "read_count": 0, + "write_count": 1, + "unknown_count": 0, + "width_hints": [ + "word" + ], + "width": "word", + "first_access": 11897, + "last_access": 11897, + "accesses": [ + { + "address": 59438, + "instruction_address": 11897, + "instruction": "MOV:G.W R1, @H'E82E", + "mnemonic": "MOV:G.W", + "direction": "write", + "width": "word", + "operand": "@H'E82E", + "operand_index": 1 + } + ] + }, + { + "address": 63249, + "name": "ram_F711", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 4, + "read_count": 4, + "write_count": 4, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 11845, + "last_access": 11880, + "accesses": [ + { + "address": 63249, + "instruction_address": 11845, + "instruction": "BCLR.B #0, @H'F711", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F711", + "operand_index": 1 + }, + { + "address": 63249, + "instruction_address": 11855, + "instruction": "BSET.B #0, @H'F711", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F711", + "operand_index": 1 + }, + { + "address": 63249, + "instruction_address": 11874, + "instruction": "BCLR.B #1, @H'F711", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F711", + "operand_index": 1 + }, + { + "address": 63249, + "instruction_address": 11880, + "instruction": "BSET.B #1, @H'F711", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F711", + "operand_index": 1 + } + ] + }, + { + "address": 63251, + "name": "ram_F713", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 2, + "read_count": 2, + "write_count": 2, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 11792, + "last_access": 11802, + "accesses": [ + { + "address": 63251, + "instruction_address": 11792, + "instruction": "BSET.B #4, @H'F713", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F713", + "operand_index": 1 + }, + { + "address": 63251, + "instruction_address": 11802, + "instruction": "BCLR.B #4, @H'F713", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F713", + "operand_index": 1 + } + ] + }, + { + "address": 63254, + "name": "ram_F716", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 4, + "read_count": 4, + "write_count": 4, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 11816, + "last_access": 11859, + "accesses": [ + { + "address": 63254, + "instruction_address": 11816, + "instruction": "BSET.B #7, @H'F716", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F716", + "operand_index": 1 + }, + { + "address": 63254, + "instruction_address": 11826, + "instruction": "BCLR.B #7, @H'F716", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F716", + "operand_index": 1 + }, + { + "address": 63254, + "instruction_address": 11849, + "instruction": "BCLR.B #5, @H'F716", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F716", + "operand_index": 1 + }, + { + "address": 63254, + "instruction_address": 11859, + "instruction": "BSET.B #5, @H'F716", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F716", + "operand_index": 1 + } + ] + }, + { + "address": 63377, + "name": "ram_F791", + "region": "on_chip_ram", + "kind": "ram", + "access_count": 4, + "read_count": 4, + "write_count": 4, + "unknown_count": 0, + "width_hints": [ + "byte" + ], + "width": "byte", + "first_access": 11788, + "last_access": 11822, + "accesses": [ + { + "address": 63377, + "instruction_address": 11788, + "instruction": "BSET.B #6, @H'F791", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + }, + { + "address": 63377, + "instruction_address": 11798, + "instruction": "BCLR.B #6, @H'F791", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + }, + { + "address": 63377, + "instruction_address": 11812, + "instruction": "BSET.B #5, @H'F791", + "mnemonic": "BSET.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + }, + { + "address": 63377, + "instruction_address": 11822, + "instruction": "BCLR.B #5, @H'F791", + "mnemonic": "BCLR.B", + "direction": "read_write", + "width": "byte", + "operand": "@H'F791", + "operand_index": 1 + } + ] + } + ], + "by_address": { + "57390": "mem_E02E", + "57392": "mem_E030", + "59430": "mem_E826", + "59438": "mem_E82E", + "63249": "ram_F711", + "63251": "ram_F713", + "63254": "ram_F716", + "63377": "ram_F791" + } + }, + "lcd_text": { + "strings": [], + "regions": [], + "searches": [ + { + "term": "CONNECT", + "literal_hits": [], + "candidate_hits": [], + "near_matches": [], + "status": "not_found" + } + ], + "notes": [ + "LCD text scan is byte-oriented and conservative; strings may be inline script fields.", + "Raw xrefs include MOV:I.W immediates to the string address and nearby record prefixes." + ] + }, + "lcd_driver": { + "addresses": [ + { + "address": 61952, + "name": "lcd_status_control", + "role": "status/control register inferred from busy polling and command writes" + }, + { + "address": 61953, + "name": "lcd_data", + "role": "data register inferred from paired data reads/writes" + } + ], + "accesses": [], + "polling_loops": [], + "routines": [], + "instructions": {} + }, + "instructions": [ + { + "address": 11776, + "address_region": "program_or_external", + "bytes": "30FEA3", + "text": "BRA loc_2CA6", + "mnemonic": "BRA", + "operands": "loc_2CA6", + "kind": "jump", + "targets": [ + 11430 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11776, + "changes": [], + "notes": [] + } + }, + { + "address": 11779, + "address_region": "program_or_external", + "bytes": "30FEA0", + "text": "BRA loc_2CA6", + "mnemonic": "BRA", + "operands": "loc_2CA6", + "kind": "jump", + "targets": [ + 11430 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11779, + "changes": [], + "notes": [] + } + }, + { + "address": 11782, + "address_region": "program_or_external", + "bytes": "1DE826FF", + "text": "BTST.W #15, @H'E826", + "mnemonic": "BTST.W", + "operands": "#15, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11782, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11786, + "address_region": "program_or_external", + "bytes": "270A", + "text": "BEQ loc_2E16", + "mnemonic": "BEQ", + "operands": "loc_2E16", + "kind": "branch", + "targets": [ + 11798 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11782, + "changes": [], + "notes": [] + } + }, + { + "address": 11788, + "address_region": "program_or_external", + "bytes": "15F791C6", + "text": "BSET.B #6, @H'F791", + "mnemonic": "BSET.B", + "operands": "#6, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11788, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11792, + "address_region": "program_or_external", + "bytes": "15F713C4", + "text": "BSET.B #4, @H'F713", + "mnemonic": "BSET.B", + "operands": "#4, @H'F713", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63251, + "name": null, + "symbol": "ram_F713", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11788, + "changes": [], + "notes": [] + } + }, + { + "address": 11796, + "address_region": "program_or_external", + "bytes": "2008", + "text": "BRA loc_2E1E", + "mnemonic": "BRA", + "operands": "loc_2E1E", + "kind": "jump", + "targets": [ + 11806 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11788, + "changes": [], + "notes": [] + } + }, + { + "address": 11798, + "address_region": "program_or_external", + "bytes": "15F791D6", + "text": "BCLR.B #6, @H'F791", + "mnemonic": "BCLR.B", + "operands": "#6, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11798, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11802, + "address_region": "program_or_external", + "bytes": "15F713D4", + "text": "BCLR.B #4, @H'F713", + "mnemonic": "BCLR.B", + "operands": "#4, @H'F713", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63251, + "name": null, + "symbol": "ram_F713", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11798, + "changes": [], + "notes": [] + } + }, + { + "address": 11806, + "address_region": "program_or_external", + "bytes": "1DE826FE", + "text": "BTST.W #14, @H'E826", + "mnemonic": "BTST.W", + "operands": "#14, @H'E826", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59430, + "name": null, + "symbol": "mem_E826", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11806, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11810, + "address_region": "program_or_external", + "bytes": "270A", + "text": "BEQ loc_2E2E", + "mnemonic": "BEQ", + "operands": "loc_2E2E", + "kind": "branch", + "targets": [ + 11822 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11806, + "changes": [], + "notes": [] + } + }, + { + "address": 11812, + "address_region": "program_or_external", + "bytes": "15F791C5", + "text": "BSET.B #5, @H'F791", + "mnemonic": "BSET.B", + "operands": "#5, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11812, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11816, + "address_region": "program_or_external", + "bytes": "15F716C7", + "text": "BSET.B #7, @H'F716", + "mnemonic": "BSET.B", + "operands": "#7, @H'F716", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63254, + "name": null, + "symbol": "ram_F716", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11812, + "changes": [], + "notes": [] + } + }, + { + "address": 11820, + "address_region": "program_or_external", + "bytes": "2008", + "text": "BRA loc_2E36", + "mnemonic": "BRA", + "operands": "loc_2E36", + "kind": "jump", + "targets": [ + 11830 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11812, + "changes": [], + "notes": [] + } + }, + { + "address": 11822, + "address_region": "program_or_external", + "bytes": "15F791D5", + "text": "BCLR.B #5, @H'F791", + "mnemonic": "BCLR.B", + "operands": "#5, @H'F791", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63377, + "name": null, + "symbol": "ram_F791", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11822, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11826, + "address_region": "program_or_external", + "bytes": "15F716D7", + "text": "BCLR.B #7, @H'F716", + "mnemonic": "BCLR.B", + "operands": "#7, @H'F716", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63254, + "name": null, + "symbol": "ram_F716", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11822, + "changes": [], + "notes": [] + } + }, + { + "address": 11830, + "address_region": "program_or_external", + "bytes": "30FE6D", + "text": "BRA loc_2CA6", + "mnemonic": "BRA", + "operands": "loc_2CA6", + "kind": "jump", + "targets": [ + 11430 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11830, + "changes": [], + "notes": [] + } + }, + { + "address": 11833, + "address_region": "program_or_external", + "bytes": "FCE00081", + "text": "MOV:G.W @(-H'2000,R4), R1", + "mnemonic": "MOV:G.W", + "operands": "@(-H'2000,R4), R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11833, + "changes": [ + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R1 unknown after memory load" + ] + } + }, + { + "address": 11837, + "address_region": "program_or_external", + "bytes": "A9FF", + "text": "BTST.W #15, R1", + "mnemonic": "BTST.W", + "operands": "#15, R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11833, + "changes": [], + "notes": [] + } + }, + { + "address": 11839, + "address_region": "program_or_external", + "bytes": "260E", + "text": "BNE loc_2E4F", + "mnemonic": "BNE", + "operands": "loc_2E4F", + "kind": "branch", + "targets": [ + 11855 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11833, + "changes": [], + "notes": [] + } + }, + { + "address": 11841, + "address_region": "program_or_external", + "bytes": "A9FE", + "text": "BTST.W #14, R1", + "mnemonic": "BTST.W", + "operands": "#14, R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11841, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11843, + "address_region": "program_or_external", + "bytes": "260A", + "text": "BNE loc_2E4F", + "mnemonic": "BNE", + "operands": "loc_2E4F", + "kind": "branch", + "targets": [ + 11855 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11841, + "changes": [], + "notes": [] + } + }, + { + "address": 11845, + "address_region": "program_or_external", + "bytes": "15F711D0", + "text": "BCLR.B #0, @H'F711", + "mnemonic": "BCLR.B", + "operands": "#0, @H'F711", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63249, + "name": null, + "symbol": "ram_F711", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11845, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11849, + "address_region": "program_or_external", + "bytes": "15F716D5", + "text": "BCLR.B #5, @H'F716", + "mnemonic": "BCLR.B", + "operands": "#5, @H'F716", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63254, + "name": null, + "symbol": "ram_F716", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11845, + "changes": [], + "notes": [] + } + }, + { + "address": 11853, + "address_region": "program_or_external", + "bytes": "2008", + "text": "BRA loc_2E57", + "mnemonic": "BRA", + "operands": "loc_2E57", + "kind": "jump", + "targets": [ + 11863 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11845, + "changes": [], + "notes": [] + } + }, + { + "address": 11855, + "address_region": "program_or_external", + "bytes": "15F711C0", + "text": "BSET.B #0, @H'F711", + "mnemonic": "BSET.B", + "operands": "#0, @H'F711", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63249, + "name": null, + "symbol": "ram_F711", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11855, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11859, + "address_region": "program_or_external", + "bytes": "15F716C5", + "text": "BSET.B #5, @H'F716", + "mnemonic": "BSET.B", + "operands": "#5, @H'F716", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 8, + "base_cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63254, + "name": null, + "symbol": "ram_F716", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11855, + "changes": [], + "notes": [] + } + }, + { + "address": 11863, + "address_region": "program_or_external", + "bytes": "30FE4C", + "text": "BRA loc_2CA6", + "mnemonic": "BRA", + "operands": "loc_2CA6", + "kind": "jump", + "targets": [ + 11430 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "cycles": 8, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11863, + "changes": [], + "notes": [] + } + }, + { + "address": 11866, + "address_region": "program_or_external", + "bytes": "FCE00081", + "text": "MOV:G.W @(-H'2000,R4), R1", + "mnemonic": "MOV:G.W", + "operands": "@(-H'2000,R4), R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 7, + "base_cycles": 6, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11866, + "changes": [ + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R1 unknown after memory load" + ] + } + }, + { + "address": 11870, + "address_region": "program_or_external", + "bytes": "A9FF", + "text": "BTST.W #15, R1", + "mnemonic": "BTST.W", + "operands": "#15, R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "base_cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11866, + "changes": [], + "notes": [] + } + }, + { + "address": 11872, + "address_region": "program_or_external", + "bytes": "2606", + "text": "BNE loc_2E68", + "mnemonic": "BNE", + "operands": "loc_2E68", + "kind": "branch", + "targets": [ + 11880 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11866, + "changes": [], + "notes": [] + } + }, + { + "address": 11874, + "address_region": "program_or_external", + "bytes": "15F711D1", + "text": "BCLR.B #1, @H'F711", + "mnemonic": "BCLR.B", + "operands": "#1, @H'F711", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63249, + "name": null, + "symbol": "ram_F711", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11874, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11878, + "address_region": "program_or_external", + "bytes": "2004", + "text": "BRA loc_2E6C", + "mnemonic": "BRA", + "operands": "loc_2E6C", + "kind": "jump", + "targets": [ + 11884 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11874, + "changes": [], + "notes": [] + } + }, + { + "address": 11880, + "address_region": "program_or_external", + "bytes": "15F711C1", + "text": "BSET.B #1, @H'F711", + "mnemonic": "BSET.B", + "operands": "#1, @H'F711", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 9, + "base_cycles": 8, + "alignment_adjustment": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 63249, + "name": null, + "symbol": "ram_F711", + "region": "on_chip_ram", + "kind": "ram" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11880, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11884, + "address_region": "program_or_external", + "bytes": "30FE37", + "text": "BRA loc_2CA6", + "mnemonic": "BRA", + "operands": "loc_2CA6", + "kind": "jump", + "targets": [ + 11430 + ], + "cycles": { + "not_taken": 3, + "taken": 7, + "base_taken": 7, + "cycles": 7, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11884, + "changes": [], + "notes": [] + } + }, + { + "address": 11887, + "address_region": "program_or_external", + "bytes": "1DE03081", + "text": "MOV:G.W @H'E030, R1", + "mnemonic": "MOV:G.W", + "operands": "@H'E030, R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57392, + "name": null, + "symbol": "mem_E030", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11887, + "changes": [ + { + "kind": "register", + "name": "R1", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "memory_load" + } + }, + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [ + "R1 unknown after memory load" + ] + } + }, + { + "address": 11891, + "address_region": "program_or_external", + "bytes": "1DE02E71", + "text": "CMP:G.W @H'E02E, R1", + "mnemonic": "CMP:G.W", + "operands": "@H'E02E, R1", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 57390, + "name": null, + "symbol": "mem_E02E", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11887, + "changes": [], + "notes": [] + } + }, + { + "address": 11895, + "address_region": "program_or_external", + "bytes": "270C", + "text": "BEQ loc_2E85", + "mnemonic": "BEQ", + "operands": "loc_2E85", + "kind": "branch", + "targets": [ + 11909 + ], + "cycles": { + "not_taken": 3, + "taken": 8, + "base_taken": 7, + "alignment_adjustment_taken": 1, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11887, + "changes": [], + "notes": [] + } + }, + { + "address": 11897, + "address_region": "program_or_external", + "bytes": "1DE82E91", + "text": "MOV:G.W R1, @H'E82E", + "mnemonic": "MOV:G.W", + "operands": "R1, @H'E82E", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 6, + "base_cycles": 6, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [ + { + "address": 59438, + "name": null, + "symbol": "mem_E82E", + "region": "program_or_external", + "kind": "program" + } + ], + "comment": "", + "valid": true, + "dataflow": { + "block": 11897, + "changes": [ + { + "kind": "control", + "name": "CCR", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": false, + "reason": "flags" + } + } + ], + "notes": [] + } + }, + { + "address": 11901, + "address_region": "program_or_external", + "bytes": "5280", + "text": "MOV:E.B #H'80, R2", + "mnemonic": "MOV:E.B", + "operands": "#H'80, R2", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 2, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11897, + "changes": [ + { + "kind": "register", + "name": "R2", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + ], + "notes": [ + "R2 = 0x80" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + } + } + } + } + }, + { + "address": 11903, + "address_region": "program_or_external", + "bytes": "5B0017", + "text": "MOV:I.W #H'0017, R3", + "mnemonic": "MOV:I.W", + "operands": "#H'0017, R3", + "kind": "normal", + "targets": [], + "cycles": { + "cycles": 3, + "source": "manual Appendix A.4, tables A-7/A-8", + "assumption": "on-chip instruction fetch/operand access, no external wait states" + }, + "references": [], + "comment": "", + "valid": true, + "dataflow": { + "block": 11897, + "changes": [ + { + "kind": "register", + "name": "R3", + "before": { + "known": false, + "reason": "block_entry" + }, + "after": { + "known": true, + "value": 23, + "hex": "0x0017", + "width": 16, + "source": "MOV:I.W #H'0017, R3" + } + } + ], + "notes": [ + "R3 = 0x0017" + ], + "known_after": { + "registers": { + "R2": { + "known": true, + "value": 128, + "hex": "0x80", + "width": 8, + "source": "MOV:E.B #H'80, R2" + }, + "R3": { + "known": true, + "value": 23, + "hex": "0x0017", + "width": 16, + "source": "MOV:I.W #H'0017, R3" + } + } + } + } + } + ], + "decompiler_consistency": { + "kind": "decompiler_pseudocode_consistency", + "summary": "No byte-immediate-to-word destination cases found.", + "checks": [] + }, + "serial_semantics": { + "kind": "serial_semantics", + "protocol_semantics": [], + "fields": [], + "command_dispatch": null, + "commands": [], + "command_effects": [], + "response_candidates": [], + "response_schemas": [], + "response_schema": [], + "logical_table_map_candidates": [], + "table_map_candidates": [], + "state_variable_candidates": [], + "retry_error_model": null, + "gate_queue_model": null, + "tx_report_model": null, + "periodic_resend_model": null, + "timer_interrupt_model": null, + "confidence": "low", + "confidence_score": 0.0, + "caveat": "No protocol semantics are emitted without both RX and TX serial reconstruction candidates." + } +} \ No newline at end of file diff --git a/build/rom_0013_table_xrefs.txt b/build/rom_0013_table_xrefs.txt new file mode 100644 index 0000000..cb3aa0a --- /dev/null +++ b/build/rom_0013_table_xrefs.txt @@ -0,0 +1,38 @@ +Table/Index Cross-Reference Report for build\rom_0013_handler_linear.json +========================================================================= + +Static offsets are emitted only when an index register value can be derived from nearby immediate loads in the current JSON. Other indexed accesses are dynamic. + +LCD correlation hints + term 'CONNECT': no LCD/text candidate hits in current decompile + term 'CONNECT: OK': no LCD/text candidate hits in current decompile + term 'CONNECT: NOT ACT': no LCD/text candidate hits in current decompile + term 'NOT ACT': no LCD/text candidate hits in current decompile + term 'COMM LINK': no LCD/text candidate hits in current decompile + term 'COMPLETED': no LCD/text candidate hits in current decompile + caveat: LCD strings can be builder/script output; absence of a literal term does not disprove runtime composition. + +primary_value_table_candidate H'E000-H'E3FF (negative H'2000; direct H'F900-H'F91F) + accesses=4 reads=4 writes=0 dynamic=2 + static offsets: H'002E, H'0030 + functions: :4 + - H'2E39 read index dynamic via R4 operand @(-H'2000,R4); ; MOV:G.W @(-H'2000,R4), R1 + - H'2E5A read index dynamic via R4 operand @(-H'2000,R4); ; MOV:G.W @(-H'2000,R4), R1 + - H'2E6F read offset H'0030 selector 0x018 -> H'E030; ; MOV:G.W @H'E030, R1 + - H'2E73 read offset H'002E selector 0x017 -> H'E02E; ; CMP:G.W @H'E02E, R1 + +secondary_value_table_candidate H'E400-H'E7FF (negative H'1C00; direct H'F940-H'F95F) + accesses=0 reads=0 writes=0 dynamic=0 + no references found in current JSON + +current_value_table_candidate H'E800-H'EBFF (negative H'1800; direct H'F920-H'F93F) + accesses=3 reads=2 writes=1 dynamic=0 + static offsets: H'0026, H'002E + functions: :3 + - H'2E06 read offset H'0026 selector 0x013 -> H'E826; ; BTST.W #15, @H'E826 + - H'2E1E read offset H'0026 selector 0x013 -> H'E826; ; BTST.W #14, @H'E826 + - H'2E79 write offset H'002E selector 0x017 -> H'E82E; ; MOV:G.W R1, @H'E82E + +flag_table_candidate H'EC00-H'EFFF (negative H'1400; direct H'F980-H'F99F) + accesses=0 reads=0 writes=0 dynamic=0 + no references found in current JSON diff --git a/build/rom_ccu_seed_hints.json b/build/rom_ccu_seed_hints.json index 8956384..7606295 100644 --- a/build/rom_ccu_seed_hints.json +++ b/build/rom_ccu_seed_hints.json @@ -793,6 +793,83 @@ ] }, "selector_candidates": [ + { + "accesses": [ + { + "access": "read", + "address_hex": "H'17D0", + "function": "loc_17C9", + "instruction": "BTST.W #12, @H'E126", + "table": "primary_value_table_candidate" + }, + { + "access": "read", + "address_hex": "H'1802", + "function": "loc_17FB", + "instruction": "BTST.W #12, @H'E126", + "table": "primary_value_table_candidate" + }, + { + "access": "read", + "address_hex": "H'183A", + "function": "loc_182D", + "instruction": "BTST.W #5, @H'E126", + "table": "primary_value_table_candidate" + }, + { + "access": "read", + "address_hex": "H'189E", + "function": "loc_1891", + "instruction": "BTST.W #5, @H'E126", + "table": "primary_value_table_candidate" + }, + { + "access": "read", + "address_hex": "H'18F4", + "function": "loc_18E7", + "instruction": "BTST.W #5, @H'E126", + "table": "primary_value_table_candidate" + } + ], + "cmd1_read_frame": "01 01 13 00 00 49", + "name": "white_balance_black_flare_mode_lane", + "reasons": [ + "primary_value_table_candidate read in loc_17C9: BTST.W #12, @H'E126", + "primary_value_table_candidate read in loc_17FB: BTST.W #12, @H'E126", + "primary_value_table_candidate read in loc_182D: BTST.W #5, @H'E126", + "primary_value_table_candidate read in loc_1891: BTST.W #5, @H'E126", + "primary_value_table_candidate read in loc_18E7: BTST.W #5, @H'E126", + "Bench-visible white-balance and black/flare lamp lane." + ], + "score": 19, + "seed_frames": [ + { + "cmd0_frame": "00 01 13 80 00 C8", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 01 13 40 00 08", + "value": 16384, + "value_hex": "0x4000" + }, + { + "cmd0_frame": "00 01 13 20 00 68", + "value": 8192, + "value_hex": "0x2000" + }, + { + "cmd0_frame": "00 01 13 00 00 48", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 147, + "selector_hex": "0x093", + "tables": [ + "primary_value_table_candidate" + ] + }, { "accesses": [ { @@ -859,61 +936,6 @@ "flag_table_candidate" ] }, - { - "accesses": [ - { - "access": "read", - "address_hex": "H'17D0", - "function": "loc_17C9", - "instruction": "BTST.W #12, @H'E126", - "table": "primary_value_table_candidate" - }, - { - "access": "read", - "address_hex": "H'1802", - "function": "loc_17FB", - "instruction": "BTST.W #12, @H'E126", - "table": "primary_value_table_candidate" - }, - { - "access": "read", - "address_hex": "H'183A", - "function": "loc_182D", - "instruction": "BTST.W #5, @H'E126", - "table": "primary_value_table_candidate" - }, - { - "access": "read", - "address_hex": "H'189E", - "function": "loc_1891", - "instruction": "BTST.W #5, @H'E126", - "table": "primary_value_table_candidate" - }, - { - "access": "read", - "address_hex": "H'18F4", - "function": "loc_18E7", - "instruction": "BTST.W #5, @H'E126", - "table": "primary_value_table_candidate" - } - ], - "cmd1_read_frame": "01 01 13 00 00 49", - "name": "state_selector_candidate", - "reasons": [ - "primary_value_table_candidate read in loc_17C9: BTST.W #12, @H'E126", - "primary_value_table_candidate read in loc_17FB: BTST.W #12, @H'E126", - "primary_value_table_candidate read in loc_182D: BTST.W #5, @H'E126", - "primary_value_table_candidate read in loc_1891: BTST.W #5, @H'E126", - "primary_value_table_candidate read in loc_18E7: BTST.W #5, @H'E126" - ], - "score": 15, - "seed_frames": [], - "selector": 147, - "selector_hex": "0x093", - "tables": [ - "primary_value_table_candidate" - ] - }, { "accesses": [ { @@ -1199,6 +1221,85 @@ "selector_hex": "0x06D", "tables": [] }, + { + "accesses": [], + "cmd1_read_frame": "01 00 13 00 00 48", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 19, + "dispatch_index_hex": "0x013", + "entry_address_hex": "H'28CC", + "selector": 19, + "selector_hex": "0x013", + "target": 11782, + "target_hex": "H'2E06", + "target_label_or_hex": "H'2E06" + }, + "name": "slave_and_iris_mblack_link_lamps", + "reasons": [ + "Selector 0x0013 is a two-bit lamp/status word. ROM dispatch H'2E06 reads current table word H'E826 and fans bit 15 and bit 14 into panel latch RAM.", + "0x8000 SLAVE lamp: sets F791.6 and F713.4", + "0x4000 IRIS/M.BLACK LINK lamp: sets F791.5 and F716.7", + "selector dispatches to H'2E06" + ], + "score": 6, + "seed_frames": [ + { + "cmd0_frame": "00 00 13 80 00 C9", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 00 13 40 00 09", + "value": 16384, + "value_hex": "0x4000" + }, + { + "cmd0_frame": "00 00 13 00 00 49", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 19, + "selector_hex": "0x013", + "tables": [] + }, + { + "accesses": [], + "cmd1_read_frame": "01 00 24 00 00 7F", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 36, + "dispatch_index_hex": "0x024", + "entry_address_hex": "H'28EE", + "selector": 36, + "selector_hex": "0x024", + "target": 12044, + "target_hex": "H'2F0C", + "target_label_or_hex": "H'2F0C" + }, + "name": "lcd_selector_button_lamp", + "reasons": [ + "Bench-visible LCD selector-button lamp lane.", + "selector dispatches to H'2F0C" + ], + "score": 6, + "seed_frames": [ + { + "cmd0_frame": "00 00 24 80 00 FE", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 00 24 00 00 7E", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 36, + "selector_hex": "0x024", + "tables": [] + }, { "accesses": [], "cmd1_read_frame": "01 00 07 00 00 5C", @@ -1349,6 +1450,59 @@ "selector_hex": "0x0F8", "tables": [] }, + { + "accesses": [], + "cmd1_read_frame": "01 01 02 00 00 58", + "name": "iris_readout_lane", + "reasons": [ + "Bench-visible IRIS seven-segment/display lane." + ], + "score": 4, + "seed_frames": [ + { + "cmd0_frame": "00 01 02 80 00 D9", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 01 02 40 00 19", + "value": 16384, + "value_hex": "0x4000" + }, + { + "cmd0_frame": "00 01 02 00 00 59", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 130, + "selector_hex": "0x082", + "tables": [] + }, + { + "accesses": [], + "cmd1_read_frame": "01 01 03 00 00 59", + "name": "combined_iris_shutter_master_gain_status_lane", + "reasons": [ + "Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere." + ], + "score": 4, + "seed_frames": [ + { + "cmd0_frame": "00 01 03 80 00 D8", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 01 03 00 00 58", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 131, + "selector_hex": "0x083", + "tables": [] + }, { "accesses": [ { @@ -1488,30 +1642,6 @@ "selector_hex": "0x012", "tables": [] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 13 00 00 48", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 19, - "dispatch_index_hex": "0x013", - "entry_address_hex": "H'28CC", - "selector": 19, - "selector_hex": "0x013", - "target": 11782, - "target_hex": "H'2E06", - "target_label_or_hex": "H'2E06" - }, - "name": "state_selector_candidate", - "reasons": [ - "selector dispatches to H'2E06" - ], - "score": 2, - "seed_frames": [], - "selector": 19, - "selector_hex": "0x013", - "tables": [] - }, { "accesses": [], "cmd1_read_frame": "01 00 16 00 00 4D", @@ -1608,30 +1738,6 @@ "selector_hex": "0x01A", "tables": [] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 24 00 00 7F", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 36, - "dispatch_index_hex": "0x024", - "entry_address_hex": "H'28EE", - "selector": 36, - "selector_hex": "0x024", - "target": 12044, - "target_hex": "H'2F0C", - "target_label_or_hex": "H'2F0C" - }, - "name": "state_selector_candidate", - "reasons": [ - "selector dispatches to H'2F0C" - ], - "score": 2, - "seed_frames": [], - "selector": 36, - "selector_hex": "0x024", - "tables": [] - }, { "accesses": [], "cmd1_read_frame": "01 00 25 00 00 7E", @@ -1898,7 +2004,7 @@ } ], "summary": { - "candidate_count": 41, + "candidate_count": 43, "confidence": "medium", "core_model": "The RCP likely waits for the CCU to seed mirrored state tables, then uses those selector values to update LCD text, panel lamps, and report state changes." }, diff --git a/build/rom_ccu_seed_hints.txt b/build/rom_ccu_seed_hints.txt index c9ba4ee..39f2273 100644 --- a/build/rom_ccu_seed_hints.txt +++ b/build/rom_ccu_seed_hints.txt @@ -10,6 +10,13 @@ Table Model: - flag_table_candidate: H'EC00-H'EFFF; accesses=6 static selectors=0x000 Highest-Value Selector Candidates: +- 0x093 white_balance_black_flare_mode_lane: score=19 tables=primary_value_table_candidate + - primary_value_table_candidate read in loc_17C9: BTST.W #12, @H'E126 + - primary_value_table_candidate read in loc_17FB: BTST.W #12, @H'E126 + - primary_value_table_candidate read in loc_182D: BTST.W #5, @H'E126 + - primary_value_table_candidate read in loc_1891: BTST.W #5, @H'E126 + seed frames: 0x8000 -> 00 01 13 80 00 C8; 0x4000 -> 00 01 13 40 00 08; 0x2000 -> 00 01 13 20 00 68 + readback frame: 01 01 13 00 00 49 - 0x000 heartbeat_or_idle_report_candidate: score=18 tables=primary_value_table_candidate, current_value_table_candidate, flag_table_candidate - primary_value_table_candidate write in loc_4096: MOV:G.W #H'0080, @H'E000 - current_value_table_candidate write in loc_4096: MOV:G.W #H'0080, @H'E800 @@ -17,12 +24,6 @@ Highest-Value Selector Candidates: - idle report selector and CONNECT OK emulator condition both center on selector zero seed frames: 0x0080 -> 00 00 00 00 80 DA; 0x8080 -> 00 00 00 80 80 5A readback frame: 01 00 00 00 00 5B -- 0x093 state_selector_candidate: score=15 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_17C9: BTST.W #12, @H'E126 - - primary_value_table_candidate read in loc_17FB: BTST.W #12, @H'E126 - - primary_value_table_candidate read in loc_182D: BTST.W #5, @H'E126 - - primary_value_table_candidate read in loc_1891: BTST.W #5, @H'E126 - readback frame: 01 01 13 00 00 49 - 0x0F6 active_status_bridge_candidate: score=14 tables=primary_value_table_candidate, current_value_table_candidate - primary_value_table_candidate read in loc_48FA: BTST.W #13, @H'E1EC - primary_value_table_candidate read in loc_48FA: MOV:G.W @H'E1EC, R0 @@ -64,6 +65,18 @@ Highest-Value Selector Candidates: - continuation command 5 calls BE70 for selector 0x006D - selector dispatches to H'3015 readback frame: 01 00 6D 00 00 36 +- 0x013 slave_and_iris_mblack_link_lamps: score=6 tables=none + - Selector 0x0013 is a two-bit lamp/status word. ROM dispatch H'2E06 reads current table word H'E826 and fans bit 15 and bit 14 into panel latch RAM. + - 0x8000 SLAVE lamp: sets F791.6 and F713.4 + - 0x4000 IRIS/M.BLACK LINK lamp: sets F791.5 and F716.7 + - selector dispatches to H'2E06 + seed frames: 0x8000 -> 00 00 13 80 00 C9; 0x4000 -> 00 00 13 40 00 09; 0x0000 -> 00 00 13 00 00 49 + readback frame: 01 00 13 00 00 48 +- 0x024 lcd_selector_button_lamp: score=6 tables=none + - Bench-visible LCD selector-button lamp lane. + - selector dispatches to H'2F0C + seed frames: 0x8000 -> 00 00 24 80 00 FE; 0x0000 -> 00 00 24 00 00 7E + readback frame: 01 00 24 00 00 7F - 0x007 camera_power_report_candidate: score=5 tables=none - observed RCP autonomous report frame(s): 00 00 07 80 00 DD - selector dispatches to H'2DC3 @@ -91,24 +104,20 @@ Highest-Value Selector Candidates: - 0x0F8 connection_latch_clear_candidate: score=5 tables=none - when F731.7 is set, command 5 on this selector clears F731.7/F790.7 readback frame: 01 01 78 00 00 22 +- 0x082 iris_readout_lane: score=4 tables=none + - Bench-visible IRIS seven-segment/display lane. + seed frames: 0x8000 -> 00 01 02 80 00 D9; 0x4000 -> 00 01 02 40 00 19; 0x0000 -> 00 01 02 00 00 59 + readback frame: 01 01 02 00 00 58 +- 0x083 combined_iris_shutter_master_gain_status_lane: score=4 tables=none + - Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere. + seed frames: 0x8000 -> 00 01 03 80 00 D8; 0x0000 -> 00 01 03 00 00 58 + readback frame: 01 01 03 00 00 59 - 0x002 state_selector_candidate: score=3 tables=primary_value_table_candidate - primary_value_table_candidate read in loc_2650: BTST.W #13, @H'E004 readback frame: 01 00 02 00 00 59 - 0x0A7 state_selector_candidate: score=3 tables=primary_value_table_candidate - primary_value_table_candidate read in loc_1705: BTST.W #15, @H'E14E readback frame: 01 01 27 00 00 7D -- 0x0B7 state_selector_candidate: score=3 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_174D: BTST.W #13, @H'E16E - readback frame: 01 01 37 00 00 6D -- 0x0B9 state_selector_candidate: score=3 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_1795: BTST.W #13, @H'E172 - readback frame: 01 01 39 00 00 63 -- 0x110 state_selector_candidate: score=3 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_1795: BTST.W #15, @H'E220 - readback frame: 01 01 90 00 00 CA -- 0x012 state_selector_candidate: score=2 tables=none - - selector dispatches to H'2E03 - readback frame: 01 00 12 00 00 49 Display Text Hints: - CONNECT: 0 hit(s) diff --git a/build/rom_serial_pseudocode.c b/build/rom_serial_pseudocode.c index e010109..1a03dd4 100644 --- a/build/rom_serial_pseudocode.c +++ b/build/rom_serial_pseudocode.c @@ -67,6 +67,7 @@ typedef uint8_t u8; typedef uint16_t u16; +#define BIT(n) (1u << (n)) extern volatile u8 MEM8[0x10000]; #define SCI1_SCR MEM8[0xFEDAu] @@ -193,6 +194,28 @@ extern volatile u8 MEM8[0x10000]; * evidence: H'1A09, H'1A71, H'3F90, H'407F, H'BB35, H'BC79, H'BC99, H'BD1E * - flag_table_candidate at H'EC00 (bit_flags); observed write * evidence: H'4088, H'BC82, H'BC9D, H'BD22, H'BD39, H'BDE9 + * panel selector semantics: + * - 0x0013 slave_and_iris_mblack_link_lamps: Selector 0x0013 is a two-bit lamp/status word. ROM dispatch H'2E06 reads current table word H'E826 and fans bit 15 and bit 14 into panel latch RAM. + * current word: H'E826; dispatch: H'2E06 + * 0x8000 -> SLAVE lamp: sets F791.6 and F713.4; RAM F791.6, F713.4 + * 0x4000 -> IRIS/M.BLACK LINK lamp: sets F791.5 and F716.7; RAM F791.5, F716.7 + * observed values: 0x8000 SLAVE lamp on; 0x4000 IRIS/M.BLACK LINK lamp on; 0x0000 SLAVE and IRIS/M.BLACK LINK latch bits clear through H'2E06 + * state machine: iris_mblack_link_closed_loop_state_candidate: Bench-proven closed loop: the RCP reports local IRIS/M.BLACK LINK intent, the CCU ACKs selector 0x0013, then the CCU mirrors the accepted selector state back with command 0. The mirrored state controls the next toggle direction. + * frames: active report 00 00 13 40 00 09; clear report 00 00 13 00 00 49; ACK 05 00 13 00 00 4C; mirror active 00 00 13 40 00 09; mirror clear 00 00 13 00 00 49 + * local trigger candidates: provisional_iris_mblack_link_button_toggle_report F006.7 / F6DB.7: When F6DB.7 is asserted and F731 <= 3, the ROM toggles current-table bit 14 at H'E826 based on F791.5, then queues selector 0x0013 through loc_3E54.; H'1FE8/H'1FFB: Adjacent local helpers set or clear current-table bit 15 at H'E826 and queue selector 0x0013. + * evidence: bench: 00 00 13 80 00 C9 lights far-right SLAVE lamp, bench: 00 00 13 40 00 09 lights IRIS/M.BLACK LINK lamp, ROM: H'2E06-H'2E32 tests H'E826 bits 15/14 and sets/clears F791/F713/F716 latch bits + * - 0x0024 lcd_selector_button_lamp: Bench-visible LCD selector-button lamp lane. + * current word: H'E848; dispatch: dispatch unknown + * observed values: 0x8000 LCD selector-button lamp visible; 0x0000 lamp remained visible at 0.5 s in isolation run + * - 0x0082 iris_readout_lane: Bench-visible IRIS seven-segment/display lane. + * current word: H'E904; dispatch: dispatch unknown + * observed values: 0x8000 IRIS display OP; 0x4000 IRIS display 1.4; 0x0000 IRIS display blank + * - 0x0083 combined_iris_shutter_master_gain_status_lane: Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere. + * current word: H'E906; dispatch: dispatch unknown + * observed values: 0x8000 IRIS AUTO, SHUTTER OFF, MASTER GAIN -3; 0x0000 same visible state remained at 0.5 s + * - 0x0093 white_balance_black_flare_mode_lane: Bench-visible white-balance and black/flare lamp lane. + * current word: H'E926; dispatch: dispatch unknown + * observed values: 0x8000 BLACK/FLARE MANUAL plus white-balance PRESET; 0x4000 BLACK/FLARE MANUAL plus white-balance AUTO; 0x2000 BLACK/FLARE MANUAL plus white-balance MANUAL; 0x0000 BLACK/FLARE MANUAL plus white-balance MANUAL * state variable candidates: * - event_queue_read_cursor_candidate H'F9B4: reads 1, writes 2; bits 5 * evidence: H'BE78, H'BE95, H'BE99 @@ -357,12 +380,110 @@ void frt2_ocia_candidate_tick_isr(void) } +static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 value) +{ + /* Known bench/ROM selector labels. This helper is commentary for the decompile. */ + switch (logical_index) { + case 0x0013u: + /* 0x0013 slave_and_iris_mblack_link_lamps; current word H'E826; H'2E06. */ + if ((value & 0x8000u) != 0u) { + /* SLAVE lamp: sets F791.6 and F713.4. */ + } else { + /* SLAVE lamp: clears F791.6 and F713.4. */ + } + if ((value & 0x4000u) != 0u) { + /* IRIS/M.BLACK LINK lamp: sets F791.5 and F716.7. */ + } else { + /* IRIS/M.BLACK LINK lamp: clears F791.5 and F716.7. */ + } + if (value == 0x8000u) { + /* SLAVE lamp on. */ + } + if (value == 0x4000u) { + /* IRIS/M.BLACK LINK lamp on. */ + } + if (value == 0x0000u) { + /* SLAVE and IRIS/M.BLACK LINK latch bits clear through H'2E06. */ + } + break; + case 0x0024u: + /* 0x0024 lcd_selector_button_lamp; current word H'E848; dispatch unknown. */ + if (value == 0x8000u) { + /* LCD selector-button lamp visible. */ + } + if (value == 0x0000u) { + /* lamp remained visible at 0.5 s in isolation run. */ + } + break; + case 0x0082u: + /* 0x0082 iris_readout_lane; current word H'E904; dispatch unknown. */ + if (value == 0x8000u) { + /* IRIS display OP. */ + } + if (value == 0x4000u) { + /* IRIS display 1.4. */ + } + if (value == 0x0000u) { + /* IRIS display blank. */ + } + break; + case 0x0083u: + /* 0x0083 combined_iris_shutter_master_gain_status_lane; current word H'E906; dispatch unknown. */ + if (value == 0x8000u) { + /* IRIS AUTO, SHUTTER OFF, MASTER GAIN -3. */ + } + if (value == 0x0000u) { + /* same visible state remained at 0.5 s. */ + } + break; + case 0x0093u: + /* 0x0093 white_balance_black_flare_mode_lane; current word H'E926; dispatch unknown. */ + if (value == 0x8000u) { + /* BLACK/FLARE MANUAL plus white-balance PRESET. */ + } + if (value == 0x4000u) { + /* BLACK/FLARE MANUAL plus white-balance AUTO. */ + } + if (value == 0x2000u) { + /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ + } + if (value == 0x0000u) { + /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ + } + break; + default: + break; + } +} + +void provisional_iris_mblack_link_button_toggle_report(void) +{ + /* Provisional name for ROM H'200E: When F6DB.7 is asserted and F731 <= 3, the ROM toggles current-table bit 14 at H'E826 based on F791.5, then queues selector 0x0013 through loc_3E54. */ + /* Source F006.7 / F6DB.7; gate F731 <= 3; current state F791.5. */ + if ((MEM8[0xF6DBu] & BIT(7)) == 0u) { + return; + } + if (MEM8[0xF731u] > 3u) { + return; + } + + if ((MEM8[0xF791u] & BIT(5)) == 0u) { + /* Requests selector 0x0013=0x4000: 00 00 13 40 00 09. */ + /* CCU should ACK 05 00 13 00 00 4C, then mirror 00 00 13 40 00 09. */ + } else { + /* Requests selector 0x0013=0x0000: 00 00 13 00 00 49. */ + /* CCU should ACK 05 00 13 00 00 4C, then mirror 00 00 13 00 00 49. */ + } +} + void sci1_process_candidate_protocol_command(void) { u8 command = sci1_rx_candidate_command(); u16 logical_index = sci1_rx_candidate_logical_index(); u16 value = sci1_rx_candidate_value(); + sci1_candidate_panel_selector_annotation(logical_index, value); + bool session_active = MEM8[0xFAA2u] != 0u; if (!session_active) { diff --git a/build/rom_table_xrefs.txt b/build/rom_table_xrefs.txt index 602fb43..6872cb0 100644 --- a/build/rom_table_xrefs.txt +++ b/build/rom_table_xrefs.txt @@ -18,32 +18,32 @@ primary_value_table_candidate H'E000-H'E3FF (negative H'2000; direct H'F900-H'F9 accesses=31 reads=21 writes=10 dynamic=11 static offsets: H'0000, H'0004, H'0006, H'0046, H'0080, H'0102, H'0124, H'0126, H'014E, H'016E, H'0172, H'01EC, H'0220 functions: loc_BBAB:5, loc_2650:3, loc_4096:3, loc_1795:2, loc_19DB:2, loc_1A35:2, loc_48FA:2, vec_ad_adi_3D99:2, :1, loc_1705:1, loc_174D:1, loc_17C9:1 - - H'170C read offset H'014E -> H'E14E; loc_1705; BTST.W #15, @H'E14E - - H'175A read offset H'016E -> H'E16E; loc_174D; BTST.W #13, @H'E16E - - H'179C read offset H'0172 -> H'E172; loc_1795; BTST.W #13, @H'E172 - - H'17A7 read offset H'0220 -> H'E220; loc_1795; BTST.W #15, @H'E220 - - H'17D0 read offset H'0126 -> H'E126; loc_17C9; BTST.W #12, @H'E126 - - H'1802 read offset H'0126 -> H'E126; loc_17FB; BTST.W #12, @H'E126 - - H'183A read offset H'0126 -> H'E126; loc_182D; BTST.W #5, @H'E126 - - H'189E read offset H'0126 -> H'E126; loc_1891; BTST.W #5, @H'E126 - - H'18F4 read offset H'0126 -> H'E126; loc_18E7; BTST.W #5, @H'E126 + - H'170C read offset H'014E selector 0x0A7 -> H'E14E; loc_1705; BTST.W #15, @H'E14E + - H'175A read offset H'016E selector 0x0B7 -> H'E16E; loc_174D; BTST.W #13, @H'E16E + - H'179C read offset H'0172 selector 0x0B9 -> H'E172; loc_1795; BTST.W #13, @H'E172 + - H'17A7 read offset H'0220 selector 0x110 -> H'E220; loc_1795; BTST.W #15, @H'E220 + - H'17D0 read offset H'0126 selector 0x093 -> H'E126; loc_17C9; BTST.W #12, @H'E126 + - H'1802 read offset H'0126 selector 0x093 -> H'E126; loc_17FB; BTST.W #12, @H'E126 + - H'183A read offset H'0126 selector 0x093 -> H'E126; loc_182D; BTST.W #5, @H'E126 + - H'189E read offset H'0126 selector 0x093 -> H'E126; loc_1891; BTST.W #5, @H'E126 + - H'18F4 read offset H'0126 selector 0x093 -> H'E126; loc_18E7; BTST.W #5, @H'E126 - H'19E3 read index dynamic via R3 operand @(-H'2000,R3); loc_19DB; MOV:G.W @(-H'2000,R3), R0 - H'1A03 read index dynamic via R3 operand @(-H'2000,R3); loc_19DB; CMP:G.W @(-H'2000,R3), R1 - H'1A3D read index dynamic via R3 operand @(-H'2000,R3); loc_1A35; MOV:G.W @(-H'2000,R3), R0 - H'1A6B read index dynamic via R3 operand @(-H'2000,R3); loc_1A35; CMP:G.W @(-H'2000,R3), R0 - - H'2657 read offset H'0124 -> H'E124; loc_2650; MOV:G.W @H'E124, R0 - - H'266F read offset H'0004 -> H'E004; loc_2650; BTST.W #13, @H'E004 - - H'268B read offset H'0124 -> H'E124; loc_2650; CMP:G.W @H'E124, R0 - - H'3DDA read offset H'0102 -> H'E102; vec_ad_adi_3D99; MOV:G.W @H'E102, R0 - - H'3DFA read offset H'0102 -> H'E102; vec_ad_adi_3D99; CMP:G.W @H'E102, R1 + - H'2657 read offset H'0124 selector 0x092 -> H'E124; loc_2650; MOV:G.W @H'E124, R0 + - H'266F read offset H'0004 selector 0x002 -> H'E004; loc_2650; BTST.W #13, @H'E004 + - H'268B read offset H'0124 selector 0x092 -> H'E124; loc_2650; CMP:G.W @H'E124, R0 + - H'3DDA read offset H'0102 selector 0x081 -> H'E102; vec_ad_adi_3D99; MOV:G.W @H'E102, R0 + - H'3DFA read offset H'0102 selector 0x081 -> H'E102; vec_ad_adi_3D99; CMP:G.W @H'E102, R1 - H'3F8C write index dynamic via R0 operand @(-H'2000,R0); ; CLR.W @(-H'2000,R0) - - H'402C write offset H'0046 -> H'E046; loc_400C; CLR.W @H'E046 + - H'402C write offset H'0046 selector 0x023 -> H'E046; loc_400C; CLR.W @H'E046 - H'4077 write index dynamic via R0 operand @(-H'2000,R0); loc_4075; CLR.W @(-H'2000,R0) - - H'4096 write offset H'0000 -> H'E000; loc_4096; MOV:G.W #H'0080, @H'E000 - - H'409C write offset H'0006 -> H'E006; loc_4096; MOV:G.W #H'8000, @H'E006 - - H'40A2 write offset H'0080 -> H'E080; loc_4096; MOV:G.W #H'FFFF, @H'E080 - - H'490F read offset H'01EC -> H'E1EC; loc_48FA; BTST.W #13, @H'E1EC - - H'4915 read offset H'01EC -> H'E1EC; loc_48FA; MOV:G.W @H'E1EC, R0 + - H'4096 write offset H'0000 selector 0x000 -> H'E000; loc_4096; MOV:G.W #H'0080, @H'E000 + - H'409C write offset H'0006 selector 0x003 -> H'E006; loc_4096; MOV:G.W #H'8000, @H'E006 + - H'40A2 write offset H'0080 selector 0x040 -> H'E080; loc_4096; MOV:G.W #H'FFFF, @H'E080 + - H'490F read offset H'01EC selector 0x0F6 -> H'E1EC; loc_48FA; BTST.W #13, @H'E1EC + - H'4915 read offset H'01EC selector 0x0F6 -> H'E1EC; loc_48FA; MOV:G.W @H'E1EC, R0 - H'BC75 write index dynamic via R4 operand @(-H'2000,R4); loc_BBAB; MOV:G.W R0, @(-H'2000,R4) - H'BC95 write index dynamic via R4 operand @(-H'2000,R4); loc_BBAB; MOV:G.W R0, @(-H'2000,R4) - H'BCEC read index dynamic via R4 operand @(-H'2000,R4); loc_BBAB; MOV:G.W @(-H'2000,R4), R0 @@ -66,16 +66,16 @@ current_value_table_candidate H'E800-H'EBFF (negative H'1800; direct H'F920-H'F9 accesses=14 reads=1 writes=13 dynamic=8 static offsets: H'0000, H'0006, H'0080, H'0102, H'0124, H'01EC functions: loc_4096:3, loc_BBAB:3, :1, loc_15E0:1, loc_19DB:1, loc_1A35:1, loc_2650:1, loc_4075:1, loc_48FA:1, loc_BAF2:1 - - H'15ED write offset H'0102 -> H'E902; loc_15E0; MOV:G.W R1, @H'E902 + - H'15ED write offset H'0102 selector 0x081 -> H'E902; loc_15E0; MOV:G.W R1, @H'E902 - H'1A09 write index dynamic via R3 operand @(-H'1800,R3); loc_19DB; MOV:G.W R1, @(-H'1800,R3) - H'1A71 write index dynamic via R3 operand @(-H'1800,R3); loc_1A35; MOV:G.W R0, @(-H'1800,R3) - - H'2691 write offset H'0124 -> H'E924; loc_2650; MOV:G.W R0, @H'E924 + - H'2691 write offset H'0124 selector 0x092 -> H'E924; loc_2650; MOV:G.W R0, @H'E924 - H'3F90 write index dynamic via R0 operand @(-H'1800,R0); ; CLR.W @(-H'1800,R0) - H'407F write index dynamic via R0 operand @(-H'1800,R0); loc_4075; CLR.W @(-H'1800,R0) - - H'40A8 write offset H'0000 -> H'E800; loc_4096; MOV:G.W #H'0080, @H'E800 - - H'40AE write offset H'0006 -> H'E806; loc_4096; MOV:G.W #H'8000, @H'E806 - - H'40B4 write offset H'0080 -> H'E880; loc_4096; MOV:G.W #H'FFFF, @H'E880 - - H'491D write offset H'01EC -> H'E9EC; loc_48FA; MOV:G.W R0, @H'E9EC + - H'40A8 write offset H'0000 selector 0x000 -> H'E800; loc_4096; MOV:G.W #H'0080, @H'E800 + - H'40AE write offset H'0006 selector 0x003 -> H'E806; loc_4096; MOV:G.W #H'8000, @H'E806 + - H'40B4 write offset H'0080 selector 0x040 -> H'E880; loc_4096; MOV:G.W #H'FFFF, @H'E880 + - H'491D write offset H'01EC selector 0x0F6 -> H'E9EC; loc_48FA; MOV:G.W R0, @H'E9EC - H'BB35 read index dynamic via R0 operand @(-H'1800,R0); loc_BAF2; MOV:G.W @(-H'1800,R0), R4 - H'BC79 write index dynamic via R4 operand @(-H'1800,R4); loc_BBAB; MOV:G.W R0, @(-H'1800,R4) - H'BC99 write index dynamic via R4 operand @(-H'1800,R4); loc_BBAB; MOV:G.W R0, @(-H'1800,R4) @@ -85,7 +85,7 @@ flag_table_candidate H'EC00-H'EFFF (negative H'1400; direct H'F980-H'F99F) accesses=6 reads=0 writes=6 dynamic=5 static offsets: H'0200 functions: loc_BBAB:5, loc_4075:1 - - H'4088 write offset H'0200 -> H'EE00; loc_4075; CLR.W @(-H'1400,R0) + - H'4088 write offset H'0200 selector 0x000 -> H'EE00; loc_4075; CLR.W @(-H'1400,R0) - H'BC82 write index dynamic via R5 operand @(-H'1400,R5); loc_BBAB; BSET.B #7, @(-H'1400,R5) - H'BC9D write index dynamic via R5 operand @(-H'1400,R5); loc_BBAB; BSET.B #7, @(-H'1400,R5) - H'BD22 write index dynamic via R5 operand @(-H'1400,R5); loc_BBAB; BSET.B #7, @(-H'1400,R5) diff --git a/ccu_emulator/README.md b/ccu_emulator/README.md index a61e14e..5c4bd12 100644 --- a/ccu_emulator/README.md +++ b/ccu_emulator/README.md @@ -48,9 +48,26 @@ Optionally add periodic state refresh traffic: .\.venv\Scripts\python.exe scripts\ccu_emulator.py --refresh-active --refresh-interval 0.600 --duration 30 ``` +Enable the bench-proven IRIS/M.BLACK LINK closed-loop module: + +```powershell +.\.venv\Scripts\python.exe scripts\ccu_emulator.py --iris-mblack-link --duration 60 --log captures\ccu-iris-mblack-link.txt +``` + +When the RCP reports selector `0x0013` as `0x4000` or `0x0000`, this module sends: + +```text +05 00 13 00 00 4C ; ACK selector 0x0013 +00 00 13 40 00 09 ; mirror active, or 00 00 13 00 00 49 for clear +``` + +That matches the bench-proven IRIS/M.BLACK LINK state machine: the RCP reports local intent, the CCU acknowledges the selector, then the CCU mirrors the accepted state back so the next physical press toggles the other way. + ## Layout - `frames.py`: checksums, built-in frames, and simple host-frame builders. +- `iris_mblack_link.py`: selector `0x0013` ACK-and-mirror state-machine module. +- `modules.py`: small protocol-module interface for feature-specific CCU behavior. - `policy.py`: decides whether an RCP frame should be ACKed. - `refresh.py`: optional periodic state-refresh scheduling. - `serial_link.py`: serial read/write plus checksum-resync frame detection. diff --git a/ccu_emulator/__init__.py b/ccu_emulator/__init__.py index 553b632..78d04f9 100644 --- a/ccu_emulator/__init__.py +++ b/ccu_emulator/__init__.py @@ -11,6 +11,7 @@ from .frames import ( frame_checksum_ok, parse_frame, ) +from .iris_mblack_link import IrisMblackLinkModule from .policy import AckPolicy __all__ = [ @@ -19,6 +20,7 @@ __all__ = [ "CcuEmulator", "CcuStats", "HEARTBEAT_FRAME", + "IrisMblackLinkModule", "NEUTRAL_ACK_FRAME", "AckPolicy", "format_frame", diff --git a/ccu_emulator/cli.py b/ccu_emulator/cli.py index 8cc532a..5b11337 100644 --- a/ccu_emulator/cli.py +++ b/ccu_emulator/cli.py @@ -20,6 +20,8 @@ from h8536.bench_connect_lcd import ( from .controller import CcuConfig, CcuEmulator from .frames import ACTIVE_SEED_COMMAND0, CONNECT_CADENCE_SEQUENCE, NEUTRAL_ACK_FRAME, format_frame, parse_frame +from .iris_mblack_link import IrisMblackLinkModule +from .modules import CcuModule from .policy import AckPolicy from .refresh import PeriodicRefresh from .serial_link import SerialLink @@ -64,6 +66,18 @@ def build_arg_parser() -> argparse.ArgumentParser: parser.add_argument("--refresh-interval", type=float, default=0.0, help="seconds between optional refresh frames") parser.add_argument("--loop-poll", type=float, default=0.001, help="sleep between service loop iterations") + parser.add_argument( + "--iris-mblack-link", + action="store_true", + help="enable the selector 0x0013 IRIS/M.BLACK LINK ACK-and-mirror module", + ) + parser.add_argument( + "--iris-mblack-link-mirror-delay", + type=float, + default=0.050, + help="seconds between the selector 0x0013 ACK and command-0 mirror", + ) + parser.add_argument("--power-cycle", action="store_true", help="power-cycle DUT through relay before starting") parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port") parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate") @@ -80,10 +94,11 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int: args = build_arg_parser().parse_args(argv) seed_frames = _seed_frames(args) refresh_frames = _refresh_frames(args) + modules = _modules(args) log_path = args.log or _default_log_path() if args.dry_run: - _print_dry_run(args, seed_frames, refresh_frames, log_path, stdout) + _print_dry_run(args, seed_frames, refresh_frames, modules, log_path, stdout) return 0 serial = _import_serial() @@ -100,6 +115,8 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int: f"refresh_interval={args.refresh_interval:.3f}s frames=" + " | ".join(format_frame(frame) for frame in refresh_frames) ) + if modules: + logger.emit("modules=" + " | ".join(module.name for module in modules)) with open_device_serial(serial, args) as device: if args.power_cycle: @@ -128,7 +145,9 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int: ack_unlabeled_checksum_frames=not args.no_ack_unlabeled, ) refresh = PeriodicRefresh(frames=refresh_frames, interval=args.refresh_interval) - CcuEmulator(link, logger, config=config, ack_policy=policy, refresh=refresh).run(args.duration) + CcuEmulator(link, logger, config=config, ack_policy=policy, refresh=refresh, modules=modules).run( + args.duration + ) return 0 finally: if relay is not None: @@ -153,10 +172,18 @@ def _refresh_frames(args: argparse.Namespace) -> list[bytes]: return frames +def _modules(args: argparse.Namespace) -> tuple[CcuModule, ...]: + modules: list[CcuModule] = [] + if args.iris_mblack_link: + modules.append(IrisMblackLinkModule(mirror_delay=max(0.0, args.iris_mblack_link_mirror_delay))) + return tuple(modules) + + def _print_dry_run( args: argparse.Namespace, seed_frames: list[bytes], refresh_frames: list[bytes], + modules: tuple[CcuModule, ...], log_path: Path, stdout: TextIO, ) -> None: @@ -170,6 +197,7 @@ def _print_dry_run( + (" | ".join(format_frame(frame) for frame in refresh_frames) or "none"), file=stdout, ) + print("modules=" + (" | ".join(module.name for module in modules) or "none"), file=stdout) def _default_log_path() -> Path: diff --git a/ccu_emulator/controller.py b/ccu_emulator/controller.py index 7d4db14..e329d52 100644 --- a/ccu_emulator/controller.py +++ b/ccu_emulator/controller.py @@ -6,6 +6,7 @@ from dataclasses import dataclass from h8536.bench_connect_lcd import BenchLogger, format_frame from .frames import ACTIVE_SEED_COMMAND0 +from .modules import CcuModule, ModuleDecision from .policy import AckPolicy from .refresh import PeriodicRefresh from .serial_link import RxFrame, SerialLink @@ -16,6 +17,7 @@ class CcuStats: rx_frames: int = 0 tx_frames: int = 0 ack_frames: int = 0 + module_frames: int = 0 seed_frames: int = 0 refresh_frames: int = 0 started_at: float = 0.0 @@ -48,12 +50,14 @@ class CcuEmulator: config: CcuConfig | None = None, ack_policy: AckPolicy | None = None, refresh: PeriodicRefresh | None = None, + modules: tuple[CcuModule, ...] = (), ) -> None: self.link = link self.logger = logger self.config = config or CcuConfig() self.ack_policy = ack_policy or AckPolicy() self.refresh = refresh or PeriodicRefresh() + self.modules = modules self.stats = CcuStats() def run(self, duration: float) -> CcuStats: @@ -61,7 +65,7 @@ class CcuEmulator: self.logger.event( "CCU_START " f"duration={duration:.3f}s seed_frames={len(self.config.seed_frames)} " - f"ack={format_frame(self.ack_policy.ack_frame)}" + f"ack={format_frame(self.ack_policy.ack_frame)} modules={len(self.modules)}" ) self._wait_ready() self._send_seed_frames() @@ -115,6 +119,9 @@ class CcuEmulator: def _service_rx(self) -> None: for item in self.link.read_available(): self._record_rx(item) + suppress_default_ack = self._service_modules(item) + if suppress_default_ack: + continue decision = self.ack_policy.decide(item.frame, item.label) if not decision.should_ack: self.logger.event(f"ACK_SKIP reason={decision.reason} frame={format_frame(item.frame)}") @@ -125,6 +132,28 @@ class CcuEmulator: self.stats.ack_frames += 1 self.stats.tx_frames += 1 + def _service_modules(self, item: RxFrame) -> bool: + suppress_default_ack = False + for module in self.modules: + decision = module.on_rx(item.frame, item.label) + if decision is None: + continue + if decision.reason: + self.logger.event( + f"MODULE {module.name} reason={decision.reason} frame={format_frame(item.frame)}" + ) + self._send_module_decision(decision) + suppress_default_ack = suppress_default_ack or decision.suppress_default_ack + return suppress_default_ack + + def _send_module_decision(self, decision: ModuleDecision) -> None: + for tx in decision.tx: + if tx.delay > 0: + time.sleep(tx.delay) + self.link.send(tx.frame, tx.label) + self.stats.module_frames += 1 + self.stats.tx_frames += 1 + def _service_refresh(self) -> None: for frame in self.refresh.due_frames(): self.link.send(frame, "refresh") @@ -141,6 +170,7 @@ class CcuEmulator: self.logger.emit(f"rx_frames={self.stats.rx_frames}") self.logger.emit(f"tx_frames={self.stats.tx_frames}") self.logger.emit(f"ack_frames={self.stats.ack_frames}") + self.logger.emit(f"module_frames={self.stats.module_frames}") self.logger.emit(f"seed_frames={self.stats.seed_frames}") self.logger.emit(f"refresh_frames={self.stats.refresh_frames}") self.logger.emit(f"resync_events={self.link.detector.resync_events}") diff --git a/ccu_emulator/iris_mblack_link.py b/ccu_emulator/iris_mblack_link.py new file mode 100644 index 0000000..f98dbbd --- /dev/null +++ b/ccu_emulator/iris_mblack_link.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from .frames import build_frame, frame_checksum_ok +from .modules import ModuleDecision, ModuleTx + + +SELECTOR_IRIS_MBLACK_LINK = 0x0013 +IRIS_MBLACK_LINK_CLEAR = 0x0000 +IRIS_MBLACK_LINK_ACTIVE = 0x4000 + + +def selector_from_frame(frame: bytes) -> int | None: + if len(frame) != 6: + return None + if frame[1] == 0x00: + return frame[2] + if frame[1] == 0x01: + return 0x0080 + frame[2] + if frame[1] == 0x02: + return 0x0180 + frame[2] + return None + + +def value_from_frame(frame: bytes) -> int | None: + if len(frame) != 6: + return None + return ((frame[3] << 8) | frame[4]) & 0xFFFF + + +@dataclass +class IrisMblackLinkModule: + """Closed-loop CCU side for the IRIS/M.BLACK LINK button/report path.""" + + mirror_delay: float = 0.050 + report_commands: frozenset[int] = frozenset({0x00, 0x01, 0x02}) + handled_values: frozenset[int] = frozenset({IRIS_MBLACK_LINK_CLEAR, IRIS_MBLACK_LINK_ACTIVE}) + name: str = "iris_mblack_link" + + def on_rx(self, frame: bytes, label: str = "") -> ModuleDecision | None: + if not frame_checksum_ok(frame) or frame[0] not in self.report_commands: + return None + selector = selector_from_frame(frame) + if selector != SELECTOR_IRIS_MBLACK_LINK: + return None + value = value_from_frame(frame) + if value not in self.handled_values: + return None + + state = "active" if value == IRIS_MBLACK_LINK_ACTIVE else "clear" + ack = build_frame(0x05, SELECTOR_IRIS_MBLACK_LINK, 0x0000) + mirror = build_frame(0x00, SELECTOR_IRIS_MBLACK_LINK, value) + return ModuleDecision( + tx=( + ModuleTx(ack, f"{self.name} ack selector=0x0013 value=0x{value:04X}"), + ModuleTx( + mirror, + f"{self.name} mirror {state} selector=0x0013 value=0x{value:04X}", + delay=self.mirror_delay, + ), + ), + suppress_default_ack=True, + reason=f"{self.name}_{state}_report", + ) diff --git a/ccu_emulator/modules.py b/ccu_emulator/modules.py new file mode 100644 index 0000000..5cdd20f --- /dev/null +++ b/ccu_emulator/modules.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Protocol + + +@dataclass(frozen=True) +class ModuleTx: + frame: bytes + label: str + delay: float = 0.0 + + +@dataclass(frozen=True) +class ModuleDecision: + tx: tuple[ModuleTx, ...] = () + suppress_default_ack: bool = False + reason: str = "" + + +class CcuModule(Protocol): + name: str + + def on_rx(self, frame: bytes, label: str = "") -> ModuleDecision | None: + """Inspect an RCP frame and optionally provide CCU response frames.""" diff --git a/docs/pt2-iris-mblack-link-rom-trace.md b/docs/pt2-iris-mblack-link-rom-trace.md new file mode 100644 index 0000000..17a594a --- /dev/null +++ b/docs/pt2-iris-mblack-link-rom-trace.md @@ -0,0 +1,78 @@ +# PT2 IRIS/M.BLACK LINK ROM Trace + +This note records the ROM evidence for the bench-visible +`IRIS/M.BLACK LINK` lamp. + +## Confirmed Host Trigger + +The isolated bench trigger is: + +```text +00 00 13 40 00 09 ; command 0, selector 0x0013, value 0x4000 +``` + +Command 0 mirrors nonzero selector writes into both `E000[selector]` and +`E800[selector]`, then queues the selector for internal processing. For this +frame that means: + +```text +E000[0x0013] = 0x4000 +E800[0x0013] = 0x4000 +``` + +The current-table word is `E800 + 2 * 0x0013 = H'E826`. + +## Selector Handler + +The selector dispatch table maps selector `0x0013` to `H'2E06`. + +Focused linear decode: + +```text +H'2E06 BTST.W #15, @H'E826 + set/clear F791.6 and F713.4 + +H'2E1E BTST.W #14, @H'E826 + set/clear F791.5 and F716.7 +``` + +Bench labels: + +| Selector value | ROM latch bits | Visible result | +| --- | --- | --- | +| `0x8000` | `F791.6`, `F713.4` | far-right `SLAVE` lamp | +| `0x4000` | `F791.5`, `F716.7` | `IRIS/M.BLACK LINK` lamp | +| `0x0000` | clears both bit groups through `H'2E06` | both latch groups clear | + +## Other Trigger Path + +There is also a local panel-input path: + +```text +F006.7 / F6DB.7 -> H'200E -> H'E826 bit14 -> loc_3E54 queues selector 0x0013 +``` + +At `H'200E`, the ROM checks `F6DB.7` and requires `F731 <= 3`. It then uses +`F791.5` as a current-state toggle: + +- if `F791.5` is clear, it sets `H'E826.14`, +- if `F791.5` is set, it clears `H'E826.14`, +- in both cases it calls `loc_3E54` with selector `0x0013`. + +This is not a separate lamp driver. It feeds the same `E800[0x0013].14` +state consumed by the selector handler. + +## Practical Meaning + +The strongest current model is: + +- CCU/host can drive the lamp directly by sending selector `0x0013` value + `0x4000` through command 0. +- The panel can also toggle/report the same state through a local input lane, + but only when the relevant session/page gate is open. +- No other decoded selector currently appears to directly set the same + `F791.5` plus `F716.7` latch pair. + +Generated semantics now label selector `0x0013`, `E800[0x0013]`, and the +`IRIS/M.BLACK LINK` / `SLAVE` bit meanings so pseudo-code output does not leave +this as a generic table write. diff --git a/docs/pt2-iris-mblack-link-state-machine.md b/docs/pt2-iris-mblack-link-state-machine.md new file mode 100644 index 0000000..07967f6 --- /dev/null +++ b/docs/pt2-iris-mblack-link-state-machine.md @@ -0,0 +1,193 @@ +# PT2 IRIS/M.BLACK LINK State Machine + +Date: 2026-05-27 + +This note records the bench-proven closed loop for the `IRIS/M.BLACK LINK` +button/lamp path. + +## Short Answer + +There is no current evidence that the CCU first sends a separate +"this function exists" capability command for `IRIS/M.BLACK LINK`. + +The stronger model is: + +1. The CCU/RCP session must be awake/active. +2. The CCU must service the RCP report queue. +3. The CCU is the authoritative owner of selector state. +4. When the RCP reports a local button intent, the CCU ACKs the report and + mirrors the resulting selector value back to the RCP. + +For this control, selector `0x0013` bit `0x4000` is the +`IRIS/M.BLACK LINK` state. + +## Proven Frames + +Selector value frames: + +```text +00 00 13 40 00 09 ; command 0, selector 0x0013, value 0x4000, active +00 00 13 00 00 49 ; command 0, selector 0x0013, value 0x0000, clear +``` + +Report ACK: + +```text +05 00 13 00 00 4C ; command 5 ACK/continuation for selector 0x0013 +``` + +Readback request: + +```text +01 00 13 00 00 48 ; command 1 read selector 0x0013 +``` + +Observed readback shapes: + +```text +04 00 13 40 00 0D ; command-0 write response, selector 0x0013 active +04 00 13 00 00 4D ; command-0 write response, selector 0x0013 clear +04 13 00 40 00 0D ; command-1 readback response, selector 0x0013 active +04 13 00 00 00 4D ; command-1 readback response, selector 0x0013 clear +``` + +## Successful Closed Loop + +Capture: + +```text +captures/iris-mblack-link-mirror-state-machine.txt +captures/iris-mblack-link-mirror-state-machine-result.json +``` + +Scenario: + +```text +scenarios/iris-mblack-link-mirror-state-machine.json +``` + +The visible panel behavior was: + +```text +press 1: lamp on +press 2: lamp off +press 3: lamp on +``` + +The serial behavior matched that cycle. + +### Baseline Clear + +```text +TX 00 00 13 00 00 49 +RX 04 00 13 00 00 4D +``` + +### Press 1: Active + +```text +RX 00 00 13 40 00 09 +TX 05 00 13 00 00 4C ; ACK report +TX 00 00 13 40 00 09 ; mirror active back +RX 04 00 13 40 00 0D +TX 01 00 13 00 00 48 ; readback +RX 04 13 00 40 00 0D +``` + +### Press 2: Clear + +```text +RX 00 00 13 00 00 49 +TX 05 00 13 00 00 4C ; ACK report +TX 00 00 13 00 00 49 ; mirror clear back +RX 04 00 13 00 00 4D +TX 01 00 13 00 00 48 ; readback +RX 04 13 00 00 00 4D +``` + +### Press 3: Active Again + +```text +RX 00 00 13 40 00 09 +TX 05 00 13 00 00 4C +TX 00 00 13 40 00 09 +RX 04 00 13 40 00 0D +TX 01 00 13 00 00 48 +RX 04 13 00 40 00 0D +``` + +## Interpretation + +The RCP does not appear to treat the local button press as final local state. +It reports local intent to the CCU. + +The CCU then: + +1. ACKs the selector report with command `5`. +2. Applies the chosen state back to the RCP with command `0`. + +The RCP uses the mirrored/current selector state to decide the next toggle +direction. This explains the earlier failed/incomplete behavior: + +- Without mirroring `0x0013=0x4000` back, repeated presses could keep reporting + active because the RCP still believed the selector was clear. +- Once the CCU mirrored active back, the next press reported clear. +- Once the CCU mirrored clear back, the next press reported active again. + +## Wakeup Versus Capability + +The successful test also had active session traffic: + +```text +00 00 00 80 80 5A ; active selector-zero keepalive/report +05 00 00 00 00 5F ; ACK for selector zero +``` + +That traffic looks like general session/connected behavior, not a +per-function enable for `IRIS/M.BLACK LINK`. + +So the current working model is: + +- `CONNECT: OK` / active rhythm opens the report path and keeps the panel from + falling back to `CONNECT: NOT ACT`. +- Selector `0x0013` state tells the RCP the current value of this specific + control/lamp. +- There may still be feature-specific gates for other controls, but this test + did not require a distinct `IRIS/M.BLACK LINK exists` command. + +## ROM Correlation + +The ROM trace in `docs/pt2-iris-mblack-link-rom-trace.md` matches the bench +behavior: + +```text +F006.7 / F6DB.7 -> H'200E -> H'E826 bit14 -> loc_3E54 queues selector 0x0013 +``` + +At `H'200E`, the ROM reads `F791.5` as the current `IRIS/M.BLACK LINK` state: + +- if `F791.5` is clear, the local press queues/set reports `0x0013=0x4000`; +- if `F791.5` is set, the local press queues/clear reports `0x0013=0x0000`. + +The selector handler for `0x0013` updates `F791.5` from `E800[0x0013].14`. +That is why mirroring command-0 selector state back to the RCP completes the +toggle loop. + +## Implications + +For a CCU emulator: + +- Maintain an authoritative selector table. +- Treat RCP button reports as requested state changes, not just notifications. +- ACK each report with command `5`. +- Write the accepted selector value back with command `0`. +- Keep the selector-zero/session rhythm alive separately. + +For other latched buttons: + +- The same pattern is likely: RCP emits a selector report, then expects the CCU + to mirror the accepted state back. +- A button that only reports "active" repeatedly may not be broken; it may be + waiting for the CCU to update the selector state that controls its next + toggle direction. + diff --git a/docs/pt2-lamp-selector-map.md b/docs/pt2-lamp-selector-map.md index 3912e72..cd74e12 100644 --- a/docs/pt2-lamp-selector-map.md +++ b/docs/pt2-lamp-selector-map.md @@ -71,6 +71,69 @@ Follow-up `lamp-isolate-neighbor-single-boot` result: 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. +Follow-up `panel-atlas-standard-master-*` webcam runs: + +- `0x0012`, `0x0013`, and `0x0014` high-nibble/selected-bit sweeps did not + produce a clean STANDARD or MASTER lamp trigger. The `0x0013=0x8000` SLAVE + positive control still worked. +- `0x0010`, `0x0011`, `0x0015`, `0x0016`, `0x0017`, `0x0018`, `0x0019`, and + `0x001A` high-nibble sweeps did not produce a clean STANDARD or MASTER lamp + trigger. +- `0x0008` through `0x000F` high-nibble sweeps did not produce a clean + STANDARD or MASTER lamp trigger. +- `0x0017=0x4000` lit the same far-right bottom BARS lamp/latch as the known + `0x0017=0x8000` family. Later `0x0018` rows in that run were latch-contaminated + and need fresh-boot isolation before assigning a separate meaning. + +Current implication: STANDARD and MASTER are probably not simple direct +command-0 high-nibble writes in the `0x0008`-`0x001A` pocket, despite the older +broad run that made MASTER flash. Treat that older observation as a real +bench-visible event but not yet an isolated selector mapping. + +### `panel-atlas-big-visual-sweep-0001-017f-highbits` + +The broad webcam sweep and fresh-boot isolation pass produced these confirmed +or near-confirmed panel-output mappings: + +| Selector/value | Current meaning | +| --- | --- | +| `0x0013 = 0x4000` | `IRIS/M.BLACK LINK` lamp | +| `0x0024 = 0x8000` | LCD selector-button lamp | +| `0x0024 = 0x0000` | LCD selector-button lamp remained visible at 0.5 s; not a simple clear in this timing window | +| `0x0082 = 0x8000` | IRIS readout `OP` | +| `0x0082 = 0x4000` | IRIS readout `1.4` | +| `0x0082 = 0x0000` | IRIS readout blank | +| `0x0083 = 0x8000` | MASTER GAIN `-3`, SHUTTER `OFF`, and IRIS AUTO | +| `0x0083 = 0x0000` | same visible state remained at 0.5 s; likely latched/copied elsewhere | +| `0x0093 = 0x8000` | BLACK/FLARE MANUAL plus white-balance PRESET | +| `0x0093 = 0x4000` | BLACK/FLARE MANUAL plus white-balance AUTO | +| `0x0093 = 0x2000` | BLACK/FLARE MANUAL plus white-balance MANUAL | +| `0x0093 = 0x0000` | BLACK/FLARE MANUAL plus white-balance MANUAL | + +Run health was good: no resync events, no dropped bytes, and command-4 +readbacks appeared for the listed writes. + +ROM trace now confirms the `0x0013` bit split: + +- `E800[0x0013]` is `H'E826`. +- Selector `0x0013` dispatches to `H'2E06`. +- `H'E826.15` sets/clears `F791.6` and `F713.4`, matching SLAVE. +- `H'E826.14` sets/clears `F791.5` and `F716.7`, matching + `IRIS/M.BLACK LINK`. +- Local handler `H'200E` can also toggle `H'E826.14` from panel input + `F006.7/F6DB.7` when its session gate allows it. + +Interpretation: + +- `0x0082` is the cleanest direct readout lane found so far: set values update + the IRIS display and `0x0000` blanks it. +- `0x0083` appears to be a combined status/display lane rather than only the + MASTER GAIN display. Its `0x8000` state also brings up SHUTTER `OFF` and IRIS + AUTO, and the clear write did not visually clear it at 0.5 s. +- `0x0093` selects white-balance mode. In this run, `0x2000` and `0x0000` both + presented white-balance MANUAL, so bit 13 may be redundant in this context or + may need another gate to show a distinct state. + ### `lamp-broad-status-selector-sweep` Visible result: diff --git a/docs/pt2-panel-atlas.md b/docs/pt2-panel-atlas.md new file mode 100644 index 0000000..57c6854 --- /dev/null +++ b/docs/pt2-panel-atlas.md @@ -0,0 +1,285 @@ +# PT2 Panel Atlas + +This note tracks bench tests that intentionally drive visible panel outputs from +PT2/command-0 table writes. + +## Scenario Files + +Current compact atlas scenarios: + +```text +scenarios/panel-atlas-operator-lamps-v1.json +scenarios/panel-atlas-readout-status-v1.json +scenarios/panel-atlas-right-stack-isolation-v1.json +scenarios/panel-atlas-right-stack-fresh-latch-v1.json +scenarios/panel-atlas-standard-master-bit-sweep-v1.json +scenarios/panel-atlas-standard-master-neighbor-sweep-v2.json +scenarios/panel-atlas-standard-master-lower-neighbor-sweep-v3.json +``` + +Both are designed for webcam capture with the calibrated bench settings: + +```text +--parity E --camera-index 4 --snapshot-delays 0.5 +``` + +## Run: 2026-05-27 + +Logs: + +```text +captures/panel-atlas-operator-lamps-v1-webcam.txt +captures/panel-atlas-readout-status-v1-webcam.txt +captures/panel-atlas-right-stack-isolation-v1-webcam.txt +captures/panel-atlas-right-stack-fresh-latch-v1-webcam.txt +captures/panel-atlas-standard-master-bit-sweep-v1-webcam.txt +captures/panel-atlas-standard-master-neighbor-sweep-v2-webcam.txt +captures/panel-atlas-standard-master-lower-neighbor-sweep-v3-webcam.txt +``` + +Snapshots: + +```text +captures/panel-atlas-operator-lamps-v1-webcam-shots/ +captures/panel-atlas-readout-status-v1-webcam-shots/ +captures/panel-atlas-right-stack-isolation-v1-webcam-shots/ +captures/panel-atlas-right-stack-fresh-latch-v1-webcam-shots/ +captures/panel-atlas-standard-master-bit-sweep-v1-webcam-shots/ +captures/panel-atlas-standard-master-neighbor-sweep-v2-webcam-shots/ +captures/panel-atlas-standard-master-lower-neighbor-sweep-v3-webcam-shots/ +``` + +Serial health: + +| Run | RX frames | TX frames | Resync | Dropped bytes | +| --- | ---: | ---: | ---: | ---: | +| operator lamps | 82 | 19 | 0 | 0 | +| readout/status | 76 | 16 | 0 | 0 | +| right-stack isolation | 115 | 26 | 0 | 0 | +| right-stack fresh latch | 20 | 12 | 0 | 0 | +| standard/master bit sweep v1 | 144 | 34 | 0 | 0 | +| standard/master neighbor sweep v2 | 188 | 47 | 0 | 0 | +| standard/master lower-neighbor sweep v3 | 188 | 47 | 0 | 0 | + +The compact and isolation runs stayed in the expected table-readback plus +`02 00 02 00 00 5A` CONNECT-OK response rhythm. + +The fresh-latch run ended with one trailing unframed byte after the final send. +There were no resync events or dropped bytes; this is consistent with the run +ending while the next response frame was just beginning. + +## Confirmed Visible Effects + +## Far-Right Stack Reference + +The physical far-right stack, top to bottom, is: + +```text +TALLY light, with camera number +STANDARD +MASTER +SLAVE +CAM POWER +BARS +``` + +Use these names instead of generic "right-side status" labels when reviewing +webcam crops. + +Readout/status run: + +| Frame | Selector/value | Visible effect | +| --- | --- | --- | +| `00 01 0F 08 00 5C` | `E000[0x008F]=0x0800` | SHUTTER display shows `EUS`/likely `EVS`; iris AUTO lamp is lit | +| `00 01 0F 10 00 44` | `E000[0x008F]=0x1000` | SHUTTER display shows `OFF`; iris AUTO lamp remains lit | +| `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | white-balance / black-flare lamp cluster changes, consistent with prior preset/manual observation | +| `00 01 13 90 20 F8` | `E000[0x0093]=0x9020` | black-flare manual-context candidate remains visible | +| `00 01 13 90 FF 27` | `E000[0x0093]=0x90FF` | black-flare auto-context candidate remains visible | +| `00 01 90 80 00 4B` | `E000[0x0110]=0x8000` | KNEE AUTO lamp lights | + +The `0x00B9` gate writes in this compact run did not light KNEE AUTO by +themselves at the 0.5 s snapshot point. That matches the ROM model where +`0x00B9.13` is more of a report-path gate, while `0x0110.15` is the stronger +visible KNEE AUTO source. + +Operator-lamp run: + +| Frame | Selector/value | Visible effect | +| --- | --- | --- | +| `00 00 13 80 00 C9` | `E000[0x0013]=0x8000` | far-right SLAVE lamp lights, based on stack order and crop position | +| `00 00 17 80 00 CD` | `E000[0x0017]=0x8000` | far-right bottom white BARS lamp lights | +| `00 00 1A 80 00 C0` | `E000[0x001A]=0x8000` | lower right white lamp appeared lit in the compact run, later refined as likely `0x0017` carryover | + +Right-stack isolation/fresh-latch refinement: + +| Frame | Selector/value | Visible effect | +| --- | --- | --- | +| `00 00 15 80 00 CF` | `E000[0x0015]=0x8000` | CALL lamp lights | +| `00 00 15 00 00 4F` | `E000[0x0015]=0x0000` | CALL lamp clears | +| `00 00 13 80 00 C9` | `E000[0x0013]=0x8000` | far-right SLAVE lamp lights | +| `00 00 13 00 00 49` | `E000[0x0013]=0x0000` | SLAVE lamp clears | +| `00 00 17 80 00 CD` | `E000[0x0017]=0x8000` | far-right bottom white BARS lamp lights | +| `00 00 17 00 00 4D` | `E000[0x0017]=0x0000` | lamp remains lit; low write does not clear it | +| `00 00 1A 80 00 C0` | `E000[0x001A]=0x8000` | no independent BARS-lamp effect from fresh boot | +| `00 00 07 80 00 DD` / `00 00 07 00 00 5D` | `E000[0x0007]` high/low | no clear visible delta from CONNECT-OK baseline | + +So `0x0017` is currently the strongest BARS lamp-on/latch selector. +`0x001A` should not be labeled as the same lamp source from the prior compact +run; that was likely carryover after `0x0017` had latched the white lamp on. +`0x0007` is still protocol-relevant because the real panel emits the matching +CAM POWER event frame, but the host-write visible lamp mapping is not separated +from the CONNECT-OK baseline yet. + +ROM trace refinement: selector `0x0013` dispatches to `H'2E06`, reads current +table word `E800[0x0013]` at `H'E826`, and maps bit 15 to SLAVE while bit 14 +maps to `IRIS/M.BLACK LINK`. See `docs/pt2-iris-mblack-link-rom-trace.md`. + +STANDARD/MASTER hunt: + +| Run | Tested selector/value pocket | Result | +| --- | --- | --- | +| `panel-atlas-standard-master-bit-sweep-v1` | `0x0012`, `0x0013`, `0x0014` with high-bit/high-nibble candidates | no clean STANDARD or MASTER lamp trigger; positive SLAVE control worked | +| `panel-atlas-standard-master-neighbor-sweep-v2` | `0x0010`, `0x0011`, `0x0015`, `0x0016`, `0x0017`, `0x0018`, `0x0019`, `0x001A` high-nibble candidates | no clean STANDARD or MASTER trigger | +| `panel-atlas-standard-master-lower-neighbor-sweep-v3` | `0x0008` through `0x000F` high-nibble candidates | no clean STANDARD or MASTER trigger | + +The `v2` sweep did show the far-right bottom BARS lamp/latch from the +`0x0017` family when using non-`0x8000` high-nibble values. The clearest +transition is `00 00 17 40 00 0D` (`E000[0x0017]=0x4000`) lighting the same +bottom white BARS lamp that `0x0017=0x8000` can light. The lamp persisted after +`0x0017=0x0000`, matching the existing BARS latch behavior. Later `0x0018` +rows are contaminated by that latch and need a fresh-boot isolation run before +labeling `0x0018` as a separate BARS source. + +## Next Atlas Step + +The next useful run is still a clear/ack/state-transition probe for the +`0x0017` BARS latch, now including `0x0017=0x4000`: + +- test likely sibling selectors around `0x0016`, `0x0018`, `0x0019`, and `0x001A` + from a fresh boot after `0x0017` has latched on, +- try command-7 repeat/ack and selector-zero refreshes to see whether the lamp + clears through a state-machine transition rather than a simple low write, +- test `0x0007` with an alternate baseline, because CONNECT OK already lights + CAM POWER and masks any host-write lamp delta. +- do not re-run `0x0008` through `0x0014` high-nibble values for + STANDARD/MASTER unless the ROM trace points back there; the webcam sweeps did + not show those lamps in that pocket. + +## ROM-Derived Button Output Sweep + +To skip the physical RCP button-press side and directly test likely "on" states +from ROM handlers, use: + +```powershell +.\.venv\Scripts\python.exe scripts\build_rom_button_output_sweep.py +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-rom-button-output-candidates-v1.json --parity E --quiet-console --log captures\panel-atlas-rom-button-output-candidates-v1-webcam.txt --result-json captures\panel-atlas-rom-button-output-candidates-v1-webcam-result.json --snapshot-dir captures\panel-atlas-rom-button-output-candidates-v1-webcam-shots --camera-index 4 --snapshot-delays 0.5 +``` + +This scenario power-cycles before every candidate, seeds `CONNECT: OK`, sends +one command-0 selector/value from the ROM-derived candidate list, and captures a +single webcam image 0.5 s later. It is intentionally slower than a continuous +sweep but should avoid most latch/carryover ambiguity. + +## Broad Visual Sweep Workflow + +For exploratory lamp/readout mining, use the generated big sweep rather than +hand-writing thousands of frames: + +```powershell +.\.venv\Scripts\python.exe scripts\build_panel_visual_sweep.py scenarios\panel-atlas-big-visual-sweep-0001-017f-highbits.json --start 0x0001 --end 0x017F --values 0x8000,0x4000,0x2000,0x1000,0x0800 --power-cycle-every 32 --ok-every 8 --listen 0.65 --clear-listen 0.15 --ok-listen 0.30 +``` + +Run the generated scenario with webcam snapshots: + +```powershell +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-big-visual-sweep-0001-017f-highbits.json --parity E --quiet-console --log captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam.txt --result-json captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-result.json --snapshot-dir captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots --camera-index 4 --snapshot-delays 0.5 +``` + +The generated high-bit sweep covers selectors `0x0001` through `0x017F` with +five candidate values per selector, for 1,915 candidate snapshots. It power +cycles every 32 selectors to reduce latch contamination. Selector zero is +omitted because it controls the CONNECT OK baseline. + +After the run, create labeled review sheets: + +```powershell +.\.venv\Scripts\python.exe scripts\make_panel_sweep_contact_sheets.py captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots --output-dir captures\panel-atlas-big-visual-sweep-0001-017f-highbits-sheets --only-candidates --crop panel --cols 4 --rows 5 --thumb-width 360 +``` + +If a sheet shows a visible change, the image label has the exact trigger form: +`candidate_XXXX_YYYY` means command-0 wrote `E000[0xXXXX]=0xYYYY`. Use that +selector/value in a smaller fresh-boot isolation scenario. + +## Broad Sweep Findings + +Run: + +```text +captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam.txt +captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-result.json +captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots/ +``` + +Serial health: + +| RX frames | TX frames | Resync | Dropped bytes | Snapshots | +| ---: | ---: | ---: | ---: | ---: | +| 706 | 2372 | 0 | 0 | 1916 | + +User-reviewed new visible hits from the broad sweep: + +| Candidate label | Frame | Selector/value | Reported visible effect | +| --- | --- | --- | --- | +| `candidate_0013_4000` | `00 00 13 40 00 09` | `E000[0x0013]=0x4000` | `IRIS/M.BLACK LINK` area/lamp | +| `candidate_0024_8000` | `00 00 24 80 00 FE` | `E000[0x0024]=0x8000` | LCD selector button/lamp | +| `candidate_0082_8000` | `00 01 02 80 00 D9` | `E000[0x0082]=0x8000` | IRIS readout shows `OP` | +| `candidate_0082_4000` | `00 01 02 40 00 19` | `E000[0x0082]=0x4000` | IRIS readout shows `1.4` | +| `candidate_0083_8000` | `00 01 03 80 00 D8` | `E000[0x0083]=0x8000` | MASTER GAIN readout shows `-3` | +| `candidate_0093_8000` | `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | white-balance PRESET lamp | +| `candidate_0093_4000` | `00 01 13 40 00 08` | `E000[0x0093]=0x4000` | white-balance AUTO lamp | +| `candidate_0093_2000` | `00 01 13 20 00 68` | `E000[0x0093]=0x2000` | white-balance MANUAL lamp | + +The serial log shows immediate command-4 table readback frames for these writes, +so the RCP accepted the selector updates. + +Fresh-boot isolation scenario: + +```powershell +.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-big-hits-isolation-v1.json --parity E --quiet-console --log captures\panel-atlas-big-hits-isolation-v1-webcam.txt --result-json captures\panel-atlas-big-hits-isolation-v1-webcam-result.json --snapshot-dir captures\panel-atlas-big-hits-isolation-v1-webcam-shots --camera-index 4 --snapshot-delays 0.5 +``` + +Create review sheets for that isolation run: + +```powershell +.\.venv\Scripts\python.exe scripts\make_panel_sweep_contact_sheets.py captures\panel-atlas-big-hits-isolation-v1-webcam-shots --output-dir captures\panel-atlas-big-hits-isolation-v1-sheets --crop panel --cols 3 --rows 4 --thumb-width 420 +``` + +Fresh-boot isolation results: + +| Frame | Selector/value | Confirmed visible effect | +| --- | --- | --- | +| `00 00 13 40 00 09` | `E000[0x0013]=0x4000` | `IRIS/M.BLACK LINK` lamp | +| `00 00 24 80 00 FE` | `E000[0x0024]=0x8000` | LCD selector-button lamp | +| `00 00 24 00 00 7E` | `E000[0x0024]=0x0000` | same LCD selector-button lamp remained visible at 0.5 s | +| `00 01 02 80 00 D9` | `E000[0x0082]=0x8000` | IRIS readout `OP` | +| `00 01 02 40 00 19` | `E000[0x0082]=0x4000` | IRIS readout `1.4` | +| `00 01 02 00 00 59` | `E000[0x0082]=0x0000` | IRIS readout blank | +| `00 01 03 80 00 D8` | `E000[0x0083]=0x8000` | IRIS AUTO lamp, SHUTTER `OFF`, MASTER GAIN `-3` | +| `00 01 03 00 00 58` | `E000[0x0083]=0x0000` | same IRIS AUTO / SHUTTER `OFF` / MASTER GAIN `-3` state remained visible at 0.5 s | +| `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | BLACK/FLARE MANUAL plus white-balance PRESET | +| `00 01 13 40 00 08` | `E000[0x0093]=0x4000` | BLACK/FLARE MANUAL plus white-balance AUTO | +| `00 01 13 20 00 68` | `E000[0x0093]=0x2000` | BLACK/FLARE MANUAL plus white-balance MANUAL | +| `00 01 13 00 00 48` | `E000[0x0093]=0x0000` | BLACK/FLARE MANUAL plus white-balance MANUAL | + +Interpretation: + +- `0x0082` is a direct IRIS display/status selector. Clearing it blanks the IRIS + readout, so this one behaves like a simple display source. +- `0x0083=0x8000` drives a combined state: MASTER GAIN `-3`, SHUTTER `OFF`, and + IRIS AUTO. Clearing the selector did not visibly clear that state in the + isolation run, so it may be latched or copied into another display bank. +- `0x0093` is now a confirmed white-balance mode selector with + `0x8000=PRESET`, `0x4000=AUTO`, and `0x0000/0x2000=MANUAL` under this test + context. BLACK/FLARE MANUAL was also present for all tested `0x0093` states. +- `0x0024=0x8000` lights an LCD selector-button lamp, but `0x0024=0x0000` did + not clear it in this timing window. diff --git a/h8536/bench_connect_lcd.py b/h8536/bench_connect_lcd.py index 71dfde6..f726109 100644 --- a/h8536/bench_connect_lcd.py +++ b/h8536/bench_connect_lcd.py @@ -154,9 +154,21 @@ def label_frame(frame: bytes) -> str: bytes.fromhex("0000158000CF"): "known_call_button_active_report", bytes.fromhex("00001500004F"): "known_call_button_inactive_report", bytes.fromhex("0000078000DD"): "known_cam_power_button_report", + bytes.fromhex("000013000049"): "known_iris_mblack_link_clear_report_candidate", + bytes.fromhex("000013400009"): "known_iris_mblack_link_active_report_candidate", + bytes.fromhex("0000138000C9"): "known_selector_0013_bit15_report_candidate", + bytes.fromhex("000013C00089"): "known_selector_0013_bit15_plus_iris_mblack_link_report_candidate", bytes.fromhex("00010F8000D4"): "known_shutter_onoff_bit7_report_candidate", bytes.fromhex("00010F200074"): "known_shutter_onoff_bit6_report_candidate", bytes.fromhex("00010F000054"): "known_shutter_onoff_clear_report_candidate", + bytes.fromhex("010013000048"): "queued_iris_mblack_link_clear_report_candidate", + bytes.fromhex("02001300004B"): "queued_iris_mblack_link_clear_report_candidate", + bytes.fromhex("010013400008"): "queued_iris_mblack_link_active_report_candidate", + bytes.fromhex("02001340000B"): "queued_iris_mblack_link_active_report_candidate", + bytes.fromhex("0100138000C8"): "queued_selector_0013_bit15_report_candidate", + bytes.fromhex("0200138000CB"): "queued_selector_0013_bit15_report_candidate", + bytes.fromhex("010013C00088"): "queued_selector_0013_bit15_plus_iris_mblack_link_report_candidate", + bytes.fromhex("020013C0008B"): "queued_selector_0013_bit15_plus_iris_mblack_link_report_candidate", bytes.fromhex("01010F8000D5"): "queued_shutter_onoff_bit7_report_candidate", bytes.fromhex("02010F8000D6"): "queued_shutter_onoff_bit7_report_candidate", bytes.fromhex("01010F200075"): "queued_shutter_onoff_bit6_report_candidate", diff --git a/h8536/ccu_seed_hints.py b/h8536/ccu_seed_hints.py index d4f0ddd..4537829 100644 --- a/h8536/ccu_seed_hints.py +++ b/h8536/ccu_seed_hints.py @@ -9,6 +9,7 @@ from typing import Any from .formatting import h16 from .lcd_text import analyze_lcd_text +from .panel_selectors import panel_selector_semantics_payload from .rom import Rom from .serial_semantics import OBSERVED_TX_REPORT_OVERLAY from .table_xrefs import analyze_table_xrefs @@ -125,6 +126,7 @@ def analyze_ccu_seed_hints(payload: Mapping[str, Any], *, rom_path: Path | None selector_hints = _selector_hints_from_tables(table_analysis) _merge_special_selectors(selector_hints) _merge_observed_reports(selector_hints) + _merge_panel_selector_semantics(selector_hints) dispatch = _dispatch_table_summary(payload, rom_path) for entry in dispatch.get("interesting_entries", []): @@ -362,6 +364,30 @@ def _merge_observed_reports(hints: dict[int, JsonObject]) -> None: hint["reasons"].append(f"observed RCP autonomous report frame(s): {frames}") +def _merge_panel_selector_semantics(hints: dict[int, JsonObject]) -> None: + for item in panel_selector_semantics_payload(): + selector = int(item["selector"]) + hint = hints.setdefault(selector, _new_selector_hint(selector)) + hint["score"] += 4 + hint["name"] = str(item.get("name") or hint["name"]) + summary = str(item.get("summary") or "").strip() + if summary: + hint["reasons"].append(summary) + for effect in item.get("effects", []): + if not isinstance(effect, Mapping): + continue + name = effect.get("name") or "panel effect" + mask = effect.get("mask_hex") or "mask?" + when_set = effect.get("when_set") or "set" + hint["reasons"].append(f"{mask} {name}: {when_set}") + for meaning in item.get("value_meanings", []): + if not isinstance(meaning, Mapping): + continue + value = meaning.get("value") + if isinstance(value, int): + _add_seed_value(hint, value) + + def _seed_plan(hints: Mapping[int, JsonObject]) -> JsonObject: planned = [ (0x000, 0x8080, "selector zero active/connect candidate from emulator state search"), @@ -595,3 +621,7 @@ __all__ = [ "selector_bytes", "write_ccu_seed_hints", ] + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/h8536/panel_button_trace.py b/h8536/panel_button_trace.py index a258b3e..a9abc32 100644 --- a/h8536/panel_button_trace.py +++ b/h8536/panel_button_trace.py @@ -105,6 +105,7 @@ INPUT_BYTES = [ KNOWN_REPORTS = { 0x0007: "CAM POWER", + 0x0013: "IRIS/M.BLACK LINK", 0x0015: "CALL", } diff --git a/h8536/panel_selectors.py b/h8536/panel_selectors.py new file mode 100644 index 0000000..7c5ad09 --- /dev/null +++ b/h8536/panel_selectors.py @@ -0,0 +1,213 @@ +from __future__ import annotations + +from copy import deepcopy +from typing import Any + + +JsonObject = dict[str, Any] + +CURRENT_TABLE_BASE = 0xE800 +PRIMARY_TABLE_BASE = 0xE000 +SECONDARY_TABLE_BASE = 0xE400 + + +PANEL_SELECTOR_SEMANTICS: tuple[JsonObject, ...] = ( + { + "selector": 0x0013, + "selector_hex": "0x0013", + "name": "slave_and_iris_mblack_link_lamps", + "summary": ( + "Selector 0x0013 is a two-bit lamp/status word. ROM dispatch H'2E06 " + "reads current table word H'E826 and fans bit 15 and bit 14 into panel latch RAM." + ), + "state_machine": { + "name_candidate": "iris_mblack_link_closed_loop_state_candidate", + "summary": ( + "Bench-proven closed loop: the RCP reports local IRIS/M.BLACK LINK intent, " + "the CCU ACKs selector 0x0013, then the CCU mirrors the accepted selector " + "state back with command 0. The mirrored state controls the next toggle direction." + ), + "active_report_frame": "00 00 13 40 00 09", + "clear_report_frame": "00 00 13 00 00 49", + "ack_frame": "05 00 13 00 00 4C", + "active_mirror_frame": "00 00 13 40 00 09", + "clear_mirror_frame": "00 00 13 00 00 49", + "confidence": "bench-high", + }, + "primary_word_address": PRIMARY_TABLE_BASE + 0x0013 * 2, + "primary_word_address_hex": "H'E026", + "current_word_address": CURRENT_TABLE_BASE + 0x0013 * 2, + "current_word_address_hex": "H'E826", + "dispatch_handler": "H'2E06", + "confidence": "high", + "evidence": [ + "bench: 00 00 13 80 00 C9 lights far-right SLAVE lamp", + "bench: 00 00 13 40 00 09 lights IRIS/M.BLACK LINK lamp", + "ROM: H'2E06-H'2E32 tests H'E826 bits 15/14 and sets/clears F791/F713/F716 latch bits", + ], + "effects": [ + { + "bit": 15, + "mask": 0x8000, + "mask_hex": "0x8000", + "name": "SLAVE lamp", + "when_set": "sets F791.6 and F713.4", + "when_clear": "clears F791.6 and F713.4", + "ram_bits": ["F791.6", "F713.4"], + "handler_range": "H'2E06-H'2E1A", + "confidence": "high", + }, + { + "bit": 14, + "mask": 0x4000, + "mask_hex": "0x4000", + "name": "IRIS/M.BLACK LINK lamp", + "when_set": "sets F791.5 and F716.7", + "when_clear": "clears F791.5 and F716.7", + "ram_bits": ["F791.5", "F716.7"], + "handler_range": "H'2E1E-H'2E32", + "confidence": "high", + }, + ], + "local_triggers": [ + { + "kind": "panel_input_toggle", + "source": "F006.7 / F6DB.7", + "handler": "H'200E", + "name_candidate": "provisional_iris_mblack_link_button_toggle_report", + "summary": ( + "When F6DB.7 is asserted and F731 <= 3, the ROM toggles current-table " + "bit 14 at H'E826 based on F791.5, then queues selector 0x0013 through loc_3E54." + ), + "gate": "F731 <= 3", + "current_state_bit": "F791.5", + "active_value": 0x4000, + "active_value_hex": "0x4000", + "clear_value": 0x0000, + "clear_value_hex": "0x0000", + "writes": ["H'E826 bit14"], + "queue_call": "loc_3E54", + "confidence": "medium-high", + }, + { + "kind": "local_helper_set_clear", + "source": "H'1FE8/H'1FFB", + "handler": "H'1FE8-H'200D", + "summary": "Adjacent local helpers set or clear current-table bit 15 at H'E826 and queue selector 0x0013.", + "writes": ["H'E826 bit15"], + "queue_call": "loc_3E54", + "confidence": "medium", + }, + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "SLAVE lamp on", "confidence": "high"}, + {"value": 0x4000, "value_hex": "0x4000", "meaning": "IRIS/M.BLACK LINK lamp on", "confidence": "high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "SLAVE and IRIS/M.BLACK LINK latch bits clear through H'2E06", "confidence": "high"}, + ], + }, + { + "selector": 0x0024, + "selector_hex": "0x0024", + "name": "lcd_selector_button_lamp", + "summary": "Bench-visible LCD selector-button lamp lane.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0024 * 2, + "primary_word_address_hex": "H'E048", + "current_word_address": CURRENT_TABLE_BASE + 0x0024 * 2, + "current_word_address_hex": "H'E848", + "confidence": "bench-medium", + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "LCD selector-button lamp visible", "confidence": "bench-medium"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "lamp remained visible at 0.5 s in isolation run", "confidence": "bench-low"}, + ], + }, + { + "selector": 0x0082, + "selector_hex": "0x0082", + "name": "iris_readout_lane", + "summary": "Bench-visible IRIS seven-segment/display lane.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0082 * 2, + "primary_word_address_hex": "H'E104", + "current_word_address": CURRENT_TABLE_BASE + 0x0082 * 2, + "current_word_address_hex": "H'E904", + "confidence": "bench-high", + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "IRIS display OP", "confidence": "bench-high"}, + {"value": 0x4000, "value_hex": "0x4000", "meaning": "IRIS display 1.4", "confidence": "bench-high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "IRIS display blank", "confidence": "bench-high"}, + ], + }, + { + "selector": 0x0083, + "selector_hex": "0x0083", + "name": "combined_iris_shutter_master_gain_status_lane", + "summary": "Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0083 * 2, + "primary_word_address_hex": "H'E106", + "current_word_address": CURRENT_TABLE_BASE + 0x0083 * 2, + "current_word_address_hex": "H'E906", + "confidence": "bench-medium-high", + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "IRIS AUTO, SHUTTER OFF, MASTER GAIN -3", "confidence": "bench-medium-high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "same visible state remained at 0.5 s", "confidence": "bench-low"}, + ], + }, + { + "selector": 0x0093, + "selector_hex": "0x0093", + "name": "white_balance_black_flare_mode_lane", + "summary": "Bench-visible white-balance and black/flare lamp lane.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0093 * 2, + "primary_word_address_hex": "H'E126", + "current_word_address": CURRENT_TABLE_BASE + 0x0093 * 2, + "current_word_address_hex": "H'E926", + "confidence": "bench-high", + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "BLACK/FLARE MANUAL plus white-balance PRESET", "confidence": "bench-high"}, + {"value": 0x4000, "value_hex": "0x4000", "meaning": "BLACK/FLARE MANUAL plus white-balance AUTO", "confidence": "bench-high"}, + {"value": 0x2000, "value_hex": "0x2000", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, + ], + }, +) + + +def panel_selector_semantics_payload() -> list[JsonObject]: + return deepcopy(list(PANEL_SELECTOR_SEMANTICS)) + + +def known_panel_selector(selector: int) -> JsonObject | None: + normalized = selector & 0x01FF + for item in PANEL_SELECTOR_SEMANTICS: + if int(item["selector"]) == normalized: + return deepcopy(item) + return None + + +def selector_word_address(table_base: int, selector: int) -> int: + return (table_base + ((selector & 0x01FF) * 2)) & 0xFFFF + + +def describe_selector_value(selector: int, value: int) -> list[str]: + item = known_panel_selector(selector) + if item is None: + return [] + + normalized_value = value & 0xFFFF + lines: list[str] = [] + for meaning in item.get("value_meanings", []): + if not isinstance(meaning, dict) or meaning.get("value") != normalized_value: + continue + lines.append(str(meaning.get("meaning") or "known panel selector value")) + + for effect in item.get("effects", []): + if not isinstance(effect, dict) or not isinstance(effect.get("mask"), int): + continue + mask = int(effect["mask"]) & 0xFFFF + state = "set" if normalized_value & mask else "clear" + action = effect.get("when_set") if state == "set" else effect.get("when_clear") + name = str(effect.get("name") or f"bit {effect.get('bit', '?')}") + if action: + lines.append(f"{name}: bit {effect.get('bit', '?')} {state}; {action}") + else: + lines.append(f"{name}: bit {effect.get('bit', '?')} {state}") + return lines diff --git a/h8536/serial_pseudocode.py b/h8536/serial_pseudocode.py index 4f52b1d..08be59e 100644 --- a/h8536/serial_pseudocode.py +++ b/h8536/serial_pseudocode.py @@ -278,6 +278,7 @@ def _declarations(tx_candidate: JsonObject | None, rx_candidate: JsonObject | No "typedef uint8_t u8;", "typedef uint16_t u16;", "", + "#define BIT(n) (1u << (n))", "extern volatile u8 MEM8[0x10000];", "", f"#define {channel}_SCR MEM8[{_c_hex(scr)}]", @@ -424,6 +425,7 @@ def _semantics_lines( lines.extend(_command_effect_comment_lines(protocol.get("command_effects"), opts, prefix=" * ")) lines.extend(_response_schema_comment_lines(_schema_list(protocol), opts, prefix=" * ")) lines.extend(_table_map_comment_lines(_table_map_list(protocol), opts, prefix=" * ")) + lines.extend(_panel_selector_comment_lines(protocol.get("panel_selector_semantics"), opts, prefix=" * ")) lines.extend(_state_variable_comment_lines(protocol.get("state_variable_candidates"), opts, prefix=" * ")) lines.extend(_retry_error_comment_lines(protocol.get("retry_error_model"), opts, prefix=" * ")) lines.extend(_gate_queue_comment_lines(protocol.get("gate_queue_model"), opts, prefix=" * ")) @@ -466,6 +468,8 @@ def _semantics_lines( ) lines.extend(_gate_queue_predicate_function_lines(protocol.get("gate_queue_model"))) lines.extend(_timer_architecture_function_lines(protocol)) + lines.extend(_panel_selector_function_lines(protocol.get("panel_selector_semantics"))) + lines.extend(_panel_selector_provisional_function_lines(protocol.get("panel_selector_semantics"))) lines.extend( [ "void sci1_process_candidate_protocol_command(void)", @@ -474,6 +478,8 @@ def _semantics_lines( " u16 logical_index = sci1_rx_candidate_logical_index();", " u16 value = sci1_rx_candidate_value();", "", + " sci1_candidate_panel_selector_annotation(logical_index, value);", + "", ], ) lines.extend(_command_dispatch_switch_lines(commands, opts)) @@ -644,6 +650,70 @@ def _table_map_comment_lines( return lines +def _panel_selector_comment_lines( + value: object, + opts: SerialPseudocodeOptions, + *, + prefix: str, +) -> list[str]: + selectors = _object_list(value) + if not selectors: + return [] + lines = [f"{prefix}panel selector semantics:"] + for selector in selectors[:6]: + selector_hex = selector.get("selector_hex") or _selector_hex(selector.get("selector")) + name = selector.get("name") or "panel_selector" + current = selector.get("current_word_address_hex") or "current table" + dispatch = selector.get("dispatch_handler") or "dispatch unknown" + summary = _comment_text(str(selector.get("summary") or "bench/ROM selector annotation")) + lines.append(f"{prefix}- {selector_hex} {name}: {summary}") + lines.append(f"{prefix} current word: {current}; dispatch: {dispatch}") + for effect in _object_list(selector.get("effects"))[:4]: + mask = effect.get("mask_hex") or _selector_hex(effect.get("mask")) + effect_name = effect.get("name") or "effect" + when_set = _comment_text(str(effect.get("when_set") or "set")) + bits = ", ".join(str(item) for item in effect.get("ram_bits", [])) + suffix = f"; RAM {bits}" if bits else "" + lines.append(f"{prefix} {mask} -> {effect_name}: {when_set}{suffix}") + meanings = [] + for meaning in _object_list(selector.get("value_meanings"))[:4]: + value_hex = meaning.get("value_hex") or _selector_hex(meaning.get("value")) + label = _comment_text(str(meaning.get("meaning") or "known panel value")) + meanings.append(f"{value_hex} {label}") + if meanings: + lines.append(f"{prefix} observed values: {'; '.join(meanings)}") + state_machine = selector.get("state_machine") + if isinstance(state_machine, dict): + name_candidate = state_machine.get("name_candidate") or "selector_state_machine_candidate" + summary = _comment_text(str(state_machine.get("summary") or "bench-proven selector state-machine candidate")) + lines.append(f"{prefix} state machine: {name_candidate}: {summary}") + active = state_machine.get("active_report_frame") + clear = state_machine.get("clear_report_frame") + ack = state_machine.get("ack_frame") + mirror_active = state_machine.get("active_mirror_frame") + mirror_clear = state_machine.get("clear_mirror_frame") + if active or clear or ack: + lines.append( + f"{prefix} frames: active report {active or '?'}; clear report {clear or '?'}; " + f"ACK {ack or '?'}; mirror active {mirror_active or '?'}; mirror clear {mirror_clear or '?'}" + ) + triggers = [] + for trigger in _object_list(selector.get("local_triggers"))[:3]: + source = trigger.get("source") or trigger.get("handler") or "local path" + summary = _comment_text(str(trigger.get("summary") or "local trigger candidate")) + name_candidate = trigger.get("name_candidate") + prefix_text = f"{name_candidate} " if name_candidate else "" + triggers.append(f"{prefix_text}{source}: {summary}") + if triggers: + lines.append(f"{prefix} local trigger candidates: {'; '.join(triggers)}") + evidence = ", ".join(str(item) for item in selector.get("evidence", []) if item) + if opts.include_evidence and evidence: + lines.append(f"{prefix} evidence: {_comment_text(evidence)}") + if len(selectors) > 6: + lines.append(f"{prefix}- ... {len(selectors) - 6} more panel selector annotations") + return lines + + def _state_variable_comment_lines( value: object, opts: SerialPseudocodeOptions, @@ -955,6 +1025,121 @@ def _timer_architecture_function_lines(protocol: JsonObject) -> list[str]: ) +def _panel_selector_function_lines(value: object) -> list[str]: + selectors = _object_list(value) + if not selectors: + return [ + "static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 value)", + "{", + " (void)logical_index;", + " (void)value;", + "}", + "", + ] + + lines = [ + "static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 value)", + "{", + " /* Known bench/ROM selector labels. This helper is commentary for the decompile. */", + " switch (logical_index) {", + ] + for selector in selectors: + selector_value = selector.get("selector") + if not isinstance(selector_value, int): + continue + selector_hex = selector.get("selector_hex") or f"0x{selector_value:04X}" + name = _comment_text(str(selector.get("name") or "panel selector")) + current = selector.get("current_word_address_hex") or "current table" + dispatch = selector.get("dispatch_handler") or "dispatch unknown" + lines.append(f" case 0x{selector_value & 0x01FF:04X}u:") + lines.append(f" /* {selector_hex} {name}; current word {current}; {dispatch}. */") + for effect in _object_list(selector.get("effects")): + mask = effect.get("mask") + if not isinstance(mask, int): + continue + effect_name = _comment_text(str(effect.get("name") or "panel effect")) + when_set = _comment_text(str(effect.get("when_set") or "set")) + when_clear = _comment_text(str(effect.get("when_clear") or "clear")) + lines.append(f" if ((value & 0x{mask & 0xFFFF:04X}u) != 0u) {{") + lines.append(f" /* {effect_name}: {when_set}. */") + lines.append(" } else {") + lines.append(f" /* {effect_name}: {when_clear}. */") + lines.append(" }") + for meaning in _object_list(selector.get("value_meanings")): + known_value = meaning.get("value") + if not isinstance(known_value, int): + continue + label = _comment_text(str(meaning.get("meaning") or "known panel value")) + lines.append(f" if (value == 0x{known_value & 0xFFFF:04X}u) {{") + lines.append(f" /* {label}. */") + lines.append(" }") + lines.append(" break;") + lines.extend( + [ + " default:", + " break;", + " }", + "}", + "", + ], + ) + return lines + + +def _panel_selector_provisional_function_lines(value: object) -> list[str]: + selectors = _object_list(value) + lines: list[str] = [] + for selector in selectors: + selector_value = selector.get("selector") + if not isinstance(selector_value, int): + continue + state_machine = selector.get("state_machine") + if not isinstance(state_machine, dict): + continue + for trigger in _object_list(selector.get("local_triggers")): + name = str(trigger.get("name_candidate") or "").strip() + if not name: + continue + handler = _comment_text(str(trigger.get("handler") or "handler unknown")) + source = _comment_text(str(trigger.get("source") or "source unknown")) + gate = _comment_text(str(trigger.get("gate") or "gate unknown")) + current_bit = _comment_text(str(trigger.get("current_state_bit") or "current state bit unknown")) + summary = _comment_text(str(trigger.get("summary") or "local trigger candidate")) + active_value = _int_from_object(trigger.get("active_value"), 0x4000) + clear_value = _int_from_object(trigger.get("clear_value"), 0x0000) + active_report = _comment_text(str(state_machine.get("active_report_frame") or "active report unknown")) + clear_report = _comment_text(str(state_machine.get("clear_report_frame") or "clear report unknown")) + ack_frame = _comment_text(str(state_machine.get("ack_frame") or "ACK unknown")) + active_mirror = _comment_text(str(state_machine.get("active_mirror_frame") or "active mirror unknown")) + clear_mirror = _comment_text(str(state_machine.get("clear_mirror_frame") or "clear mirror unknown")) + safe_name = _safe_identifier(name) + lines.extend( + [ + f"void {safe_name}(void)", + "{", + f" /* Provisional name for ROM {handler}: {summary} */", + f" /* Source {source}; gate {gate}; current state {current_bit}. */", + " if ((MEM8[0xF6DBu] & BIT(7)) == 0u) {", + " return;", + " }", + " if (MEM8[0xF731u] > 3u) {", + " return;", + " }", + "", + " if ((MEM8[0xF791u] & BIT(5)) == 0u) {", + f" /* Requests selector 0x{selector_value & 0x01FF:04X}=0x{active_value & 0xFFFF:04X}: {active_report}. */", + f" /* CCU should ACK {ack_frame}, then mirror {active_mirror}. */", + " } else {", + f" /* Requests selector 0x{selector_value & 0x01FF:04X}=0x{clear_value & 0xFFFF:04X}: {clear_report}. */", + f" /* CCU should ACK {ack_frame}, then mirror {clear_mirror}. */", + " }", + "}", + "", + ], + ) + return lines + + def _timer_tick_function_lines(function_name: str, counters: list[JsonObject], summary: str) -> list[str]: lines = [ f"void {function_name}(void)", @@ -1130,6 +1315,16 @@ def _command_hex(value: object) -> str: return "?" +def _selector_hex(value: object) -> str: + if isinstance(value, int): + return f"0x{value & 0xFFFF:04X}" + return "?" + + +def _int_from_object(value: object, default: int) -> int: + return value if isinstance(value, int) else default + + def _tx_functions(candidate: JsonObject, opts: SerialPseudocodeOptions) -> list[str]: length = _int_field(candidate, "frame_length", 6) seed = _int_field(candidate, "checksum_seed", 0x5A) @@ -1386,3 +1581,7 @@ def _safe_identifier(value: str) -> str: def _comment_text(text: str) -> str: return text.replace("*/", "* /").replace("\r", " ").replace("\n", " ") + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/h8536/serial_scenario.py b/h8536/serial_scenario.py index b0ae874..e9591f2 100644 --- a/h8536/serial_scenario.py +++ b/h8536/serial_scenario.py @@ -270,6 +270,8 @@ def _run_step(ctx: ScenarioContext, action: str, spec: dict[str, Any]) -> None: _listen(ctx, float(spec.get("seconds", spec.get("value", 0.0)))) elif action == "listen_ack": _step_listen_ack(ctx, spec) + elif action == "listen_ack_until_quiet": + _step_listen_ack_until_quiet(ctx, spec) elif action == "send": frame = _parse_required_frame(spec.get("frame")) label = str(spec.get("label", "send")) @@ -378,7 +380,38 @@ def _step_table_sweep(ctx: ScenarioContext, spec: dict[str, Any]) -> None: def _step_listen_ack(ctx: ScenarioContext, spec: dict[str, Any]) -> None: seconds = float(spec.get("seconds", spec.get("value", 1.0))) - ack = _ack_config( + ack = _ack_config_from_step(spec) + ack_text = ( + f"ack_frame={format_frame(ack['frame'])}" + if ack["ack_mode"] == "fixed" + else f"ack_mode={ack['ack_mode']}" + ) + ctx.logger.event( + f"LISTEN_ACK seconds={seconds:.3f} target_mode={ack['target_mode']} targets={len(ack['targets'])} " + f"{ack_text} limit_scope={ack['limit_scope']} max_acks={ack['max_acks']}" + ) + _listen_with_ack(ctx, seconds, None, ack) + + +def _step_listen_ack_until_quiet(ctx: ScenarioContext, spec: dict[str, Any]) -> None: + seconds = float(spec.get("seconds", spec.get("value", 10.0))) + quiet_seconds = float(spec.get("quiet_seconds", spec.get("quiet", 0.750))) + ack = _ack_config_from_step(spec) + ack_text = ( + f"ack_frame={format_frame(ack['frame'])}" + if ack["ack_mode"] == "fixed" + else f"ack_mode={ack['ack_mode']}" + ) + ctx.logger.event( + f"LISTEN_ACK_UNTIL_QUIET seconds={seconds:.3f} quiet={quiet_seconds:.3f} " + f"target_mode={ack['target_mode']} targets={len(ack['targets'])} " + f"{ack_text} limit_scope={ack['limit_scope']} max_acks={ack['max_acks']}" + ) + _listen_with_ack(ctx, seconds, None, ack, quiet_seconds=quiet_seconds) + + +def _ack_config_from_step(spec: dict[str, Any]) -> dict[str, Any]: + return _ack_config( { "enabled": spec.get("enabled", True), "frames": spec.get("frames", spec.get("frame")), @@ -393,18 +426,9 @@ def _step_listen_ack(ctx: ScenarioContext, spec: dict[str, Any]) -> None: "ack_mode": spec.get("ack_mode", spec.get("mode", "fixed")), "target_mode": spec.get("target_mode", spec.get("match", "explicit")), "limit_scope": spec.get("limit_scope", spec.get("scope", "local")), + "respond_on": spec.get("respond_on", spec.get("send_on", [])), } ) - ack_text = ( - f"ack_frame={format_frame(ack['frame'])}" - if ack["ack_mode"] == "fixed" - else f"ack_mode={ack['ack_mode']}" - ) - ctx.logger.event( - f"LISTEN_ACK seconds={seconds:.3f} target_mode={ack['target_mode']} targets={len(ack['targets'])} " - f"{ack_text} limit_scope={ack['limit_scope']} max_acks={ack['max_acks']}" - ) - _listen_with_ack(ctx, seconds, None, ack) def _ack_config(raw: Any) -> dict[str, Any]: @@ -438,6 +462,7 @@ def _ack_config(raw: Any) -> dict[str, Any]: "ack_mode": ack_mode, "target_mode": target_mode, "limit_scope": limit_scope, + "respond_on": _response_rules(spec.get("respond_on", [])), } @@ -458,28 +483,71 @@ def _ack_matches(frame: bytes, ack: dict[str, Any]) -> bool: return frame[0] in {0x00, 0x01, 0x02} and not (frame[1] & 0x80) +def _response_rules(raw: Any) -> list[dict[str, Any]]: + values = raw if isinstance(raw, list) else ([raw] if raw else []) + rules: list[dict[str, Any]] = [] + for index, value in enumerate(values): + if not isinstance(value, dict): + raise SystemExit("respond_on entries must be objects") + targets = _parse_frame_list(value.get("frames", value.get("frame"))) + response_frame = _parse_required_frame(value.get("send", value.get("response"))) + label = str(value.get("label", f"respond_on_{index + 1}")) + rules.append( + { + "targets": targets, + "frame": response_frame, + "label": label, + "delay": float(value.get("delay", 0.0)), + "listen": float(value.get("listen", 0.0)), + "once": bool(value.get("once", True)), + } + ) + return rules + + def _listen_with_ack( ctx: ScenarioContext, seconds: float, - selector: int, + selector: int | None, ack: dict[str, Any], + *, + quiet_seconds: float | None = None, ) -> list[bytes]: deadline = time.monotonic() + max(0.0, seconds) observed: list[bytes] = [] + pending: list[bytes] = [] + pending_index = 0 + last_activity = time.monotonic() acked_targets: set[bytes] = set() + fired_responses: set[int] = set() ack_start = ctx.ack_sent target_start = sum(ctx.target_counts.values()) + + def enqueue(frames: list[bytes]) -> None: + nonlocal last_activity + if not frames: + return + observed.extend(frames) + pending.extend(frames) + last_activity = time.monotonic() + while time.monotonic() < deadline: frames = _read_available(ctx, selector=selector) - observed.extend(frames) - if not frames: + enqueue(frames) + if not frames and pending_index >= len(pending): + if quiet_seconds is not None and time.monotonic() - last_activity >= quiet_seconds: + ctx.logger.event(f"LISTEN_ACK_QUIET quiet={quiet_seconds:.3f}s") + break sleep_for = min(max(0.001, ack["poll_interval"]), max(0.0, deadline - time.monotonic())) if sleep_for > 0: time.sleep(sleep_for) continue if not ack["enabled"]: + pending_index = len(pending) continue - for frame in frames: + while pending_index < len(pending): + frame = pending[pending_index] + pending_index += 1 if not _ack_matches(frame, ack): continue _count_target(ctx, frame) @@ -493,7 +561,7 @@ def _listen_with_ack( continue acked_targets.add(frame) if ack["guard"] > 0: - observed.extend(_listen(ctx, ack["guard"], selector=selector)) + enqueue(_listen(ctx, ack["guard"], selector=selector)) _send_and_record(ctx, _ack_frame_for_target(frame, ack), "ack", capture=ctx.args.snapshot_acks) ctx.ack_sent += 1 if _ack_limit_reached(ctx, ack, ack_start=ack_start, target_start=target_start): @@ -501,7 +569,22 @@ def _listen_with_ack( if ack["abort_on_limit"]: ctx.abort_requested = True if ack["post_read"] > 0: - observed.extend(_listen(ctx, ack["post_read"], selector=selector)) + enqueue(_listen(ctx, ack["post_read"], selector=selector)) + for rule_index, rule in enumerate(ack["respond_on"]): + if frame not in rule["targets"]: + continue + if rule["once"] and rule_index in fired_responses: + continue + fired_responses.add(rule_index) + if rule["delay"] > 0: + time.sleep(rule["delay"]) + ctx.logger.event( + f"RESPOND_ON target={format_frame(frame)} " + f"send={format_frame(rule['frame'])} label={rule['label']}" + ) + _send_and_record(ctx, rule["frame"], rule["label"], capture=ctx.args.snapshot_acks) + if rule["listen"] > 0: + enqueue(_listen(ctx, rule["listen"], selector=selector)) if ctx.abort_requested: return observed return observed @@ -753,6 +836,7 @@ def _quiet_console_line(line: str) -> bool: "NOTE ", "SNAPSHOT_SCHEDULE ", "SNAPSHOT_ERROR ", + "RESPOND_ON ", "Summary", "rx_frames=", "resync_events=", @@ -760,6 +844,8 @@ def _quiet_console_line(line: str) -> bool: "abort_requested=", "known_shutter", "queued_shutter", + "iris_mblack", + "selector_0013", ) return any(fragment in line for fragment in keep_fragments) @@ -772,25 +858,14 @@ def _print_step_dry_run(action: str, spec: dict[str, Any], stdout: TextIO, *, in print(f"{indent}listen={float(spec.get('listen', 0.0)):.3f}s", file=stdout) elif action in {"drain", "listen", "wait"}: print(f"{indent}seconds={float(spec.get('seconds', spec.get('value', 0.0))):.3f}", file=stdout) - elif action == "listen_ack": - ack = _ack_config( - { - "enabled": spec.get("enabled", True), - "frames": spec.get("frames", spec.get("frame")), - "ack_frame": spec.get("ack_frame"), - "ack_guard": spec.get("ack_guard", 0.020), - "poll_interval": spec.get("poll_interval", 0.005), - "post_ack_read": spec.get("post_ack_read", 0.250), - "once_per_selector": spec.get("once_per_frame", False), - "max_acks": spec.get("max_acks"), - "max_target_hits": spec.get("max_target_hits"), - "abort_on_limit": spec.get("abort_on_limit", False), - "ack_mode": spec.get("ack_mode", spec.get("mode", "fixed")), - "target_mode": spec.get("target_mode", spec.get("match", "explicit")), - "limit_scope": spec.get("limit_scope", spec.get("scope", "local")), - } - ) + elif action in {"listen_ack", "listen_ack_until_quiet"}: + ack = _ack_config_from_step(spec) print(f"{indent}seconds={float(spec.get('seconds', spec.get('value', 1.0))):.3f}", file=stdout) + if action == "listen_ack_until_quiet": + print( + f"{indent}quiet={float(spec.get('quiet_seconds', spec.get('quiet', 0.750))):.3f}s", + file=stdout, + ) if not ack["enabled"]: print(f"{indent}ack=disabled", file=stdout) else: @@ -805,6 +880,13 @@ def _print_step_dry_run(action: str, spec: dict[str, Any], stdout: TextIO, *, in f"max_target_hits={ack['max_target_hits']}", file=stdout, ) + for rule in ack["respond_on"]: + print( + f"{indent}respond_on={len(rule['targets'])} " + f"send={format_frame(rule['frame'])} label={rule['label']} " + f"once={int(rule['once'])}", + file=stdout, + ) elif action in {"prompt", "note"}: message = str(spec.get("message", spec.get("value", "Press Enter to continue."))) print(f"{indent}message={message}", file=stdout) diff --git a/h8536/serial_scenario_unexpected.py b/h8536/serial_scenario_unexpected.py index dca6f61..9ba6341 100644 --- a/h8536/serial_scenario_unexpected.py +++ b/h8536/serial_scenario_unexpected.py @@ -31,6 +31,18 @@ KNOWN_FRAME_LABELS = { "00 00 15 80 00 CF": "known_call_button_active_report", "00 00 15 00 00 4F": "known_call_button_inactive_report", "00 00 07 80 00 DD": "known_cam_power_button_report", + "00 00 13 00 00 49": "known_iris_mblack_link_clear_report_candidate", + "00 00 13 40 00 09": "known_iris_mblack_link_active_report_candidate", + "00 00 13 80 00 C9": "known_selector_0013_bit15_report_candidate", + "00 00 13 C0 00 89": "known_selector_0013_bit15_plus_iris_mblack_link_report_candidate", + "01 00 13 00 00 48": "queued_iris_mblack_link_clear_report_candidate", + "02 00 13 00 00 4B": "queued_iris_mblack_link_clear_report_candidate", + "01 00 13 40 00 08": "queued_iris_mblack_link_active_report_candidate", + "02 00 13 40 00 0B": "queued_iris_mblack_link_active_report_candidate", + "01 00 13 80 00 C8": "queued_selector_0013_bit15_report_candidate", + "02 00 13 80 00 CB": "queued_selector_0013_bit15_report_candidate", + "01 00 13 C0 00 88": "queued_selector_0013_bit15_plus_iris_mblack_link_report_candidate", + "02 00 13 C0 00 8B": "queued_selector_0013_bit15_plus_iris_mblack_link_report_candidate", "01 00 17 80 00 CC": "queued_bars_button_selector_0017_active_candidate", "02 00 17 80 00 CF": "queued_bars_button_selector_0017_active_candidate", "01 00 18 80 00 C3": "queued_bars_button_selector_0018_active_candidate", diff --git a/h8536/serial_semantics.py b/h8536/serial_semantics.py index 92167eb..15a93ab 100644 --- a/h8536/serial_semantics.py +++ b/h8536/serial_semantics.py @@ -4,6 +4,8 @@ import re from collections.abc import Iterable, Mapping from typing import Any +from .panel_selectors import panel_selector_semantics_payload + JsonObject = dict[str, Any] @@ -140,6 +142,7 @@ def analyze_serial_semantics(payload: Mapping[str, Any]) -> JsonObject: "tx_report_model": None, "periodic_resend_model": None, "timer_interrupt_model": None, + "panel_selector_semantics": [], "confidence": "low", "confidence_score": 0.0, "caveat": "No protocol semantics are emitted without both RX and TX serial reconstruction candidates.", @@ -212,6 +215,7 @@ def analyze_serial_semantics(payload: Mapping[str, Any]) -> JsonObject: "tx_report_model": tx_report_model, "periodic_resend_model": periodic_resend_model, "timer_interrupt_model": timer_interrupt_model, + "panel_selector_semantics": panel_selector_semantics_payload(), "evidence": evidence, } return { @@ -233,6 +237,7 @@ def analyze_serial_semantics(payload: Mapping[str, Any]) -> JsonObject: "tx_report_model": protocol["tx_report_model"], "periodic_resend_model": protocol["periodic_resend_model"], "timer_interrupt_model": protocol["timer_interrupt_model"], + "panel_selector_semantics": protocol["panel_selector_semantics"], "confidence": protocol["confidence"], "confidence_score": protocol["confidence_score"], "caveat": protocol["caveat"], diff --git a/h8536/table_xrefs.py b/h8536/table_xrefs.py index 4d211d3..79112aa 100644 --- a/h8536/table_xrefs.py +++ b/h8536/table_xrefs.py @@ -287,6 +287,7 @@ def _logical_operand_accesses( logical_address: int | None = None if isinstance(offset, int): logical_address = (int(table["logical_base_address"]) + offset) & 0xFFFF + selector = _selector_for_table_offset(table, offset) access = _base_access(ins, functions, semantic_accesses) access.update( { @@ -306,6 +307,9 @@ def _logical_operand_accesses( if logical_address is not None: access["logical_address"] = logical_address access["logical_address_hex"] = h16(logical_address) + if selector is not None: + access["selector"] = selector + access["selector_hex"] = f"0x{selector:03X}" accesses.append(access) return accesses @@ -342,6 +346,7 @@ def _direct_logical_address_access( ) -> JsonObject: base = int(table["logical_base_address"]) offset = address - base + selector = _selector_for_table_offset(table, offset) access = _base_access(ins, functions, semantic_accesses) access.update( { @@ -359,6 +364,9 @@ def _direct_logical_address_access( "access": _access_direction(ins, address) or "read_write_candidate", } ) + if selector is not None: + access["selector"] = selector + access["selector_hex"] = f"0x{selector:03X}" return access @@ -373,6 +381,7 @@ def _direct_candidate_address_access( offset = address - base access = _base_access(ins, functions, semantic_accesses) logical_offset = DIRECT_TABLE_TO_LOGICAL_OFFSET.get(base) + selector = _selector_for_table_offset(table, offset) access.update( { "table": table["name"], @@ -392,6 +401,9 @@ def _direct_candidate_address_access( if logical_offset is not None: access["semantic_negative_offset"] = logical_offset access["semantic_negative_offset_hex"] = h16(logical_offset) + if selector is not None: + access["selector"] = selector + access["selector_hex"] = f"0x{selector:03X}" return access @@ -564,6 +576,8 @@ def _format_access_line(access: Mapping[str, Any]) -> str: index_text = f"index dynamic via {access.get('index_register')} operand {operand}" else: index_text = f"offset {h16(int(index or 0))}" + if access.get("selector_hex"): + index_text += f" selector {access['selector_hex']}" if access.get("logical_address_hex"): index_text += f" -> {access['logical_address_hex']}" elif access.get("direct_address_hex"): @@ -599,6 +613,19 @@ def _summarize_functions(accesses: Iterable[Mapping[str, Any]]) -> list[JsonObje return sorted(summaries.values(), key=lambda item: (-int(item["access_count"]), str(item["label"]))) +def _selector_for_table_offset(table: Mapping[str, Any], offset: int | str) -> int | None: + if not isinstance(offset, int): + return None + element = str(table.get("element_candidate") or "") + if element == "word_value": + if offset % 2: + return None + return (offset // 2) & 0x01FF + if element == "bit_flags": + return offset & 0x01FF + return None + + def _function_ranges(payload: Mapping[str, Any]) -> list[JsonObject]: call_graph = payload.get("call_graph") if not isinstance(call_graph, Mapping): diff --git a/scenarios/iris-mblack-link-mirror-state-machine.json b/scenarios/iris-mblack-link-mirror-state-machine.json new file mode 100644 index 0000000..125f0eb --- /dev/null +++ b/scenarios/iris-mblack-link-mirror-state-machine.json @@ -0,0 +1,227 @@ +{ + "name": "iris-mblack-link-mirror-state-machine", + "notes": [ + "IRIS/M.BLACK LINK closed-loop state-machine probe.", + "The RCP reports local button intent as selector 0x0013. This scenario ACKs the report and mirrors the reported selector value back as a command-0 CCU table update.", + "Expected cycle if the CCU owns the latched state: press 1 emits 00 00 13 40 00 09, mirror active, press 2 emits 00 00 13 00 00 49, mirror clear, press 3 emits active again.", + "If every press still emits active, the local handler is not seeing the mirrored E800/F791 state or the physical input path is level-style rather than toggle-style." + ], + "steps": [ + { + "action": "prompt", + "message": "Prepare to test the closed-loop IRIS/M.BLACK LINK state machine. Press Enter to power-cycle and start." + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.20 + }, + { + "action": "send", + "label": "selector_zero_connect_seed", + "frame": "00 00 00 80 00 DA", + "listen": 0.20 + }, + { + "action": "send", + "label": "cmd5_latch_clear_0096", + "frame": "05 01 16 00 00 48", + "listen": 0.02 + }, + { + "action": "listen_ack_until_quiet", + "seconds": 28.00, + "quiet_seconds": 0.90, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 180, + "abort_on_limit": false + }, + { + "action": "send", + "label": "force_selector_0013_clear_baseline", + "frame": "00 00 13 00 00 49", + "listen": 0.40 + }, + { + "action": "send", + "label": "recover_connect_ok_seed_before_press_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.20 + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK ONCE NOW. The script will mirror selector 0x0013 back to the RCP when it sees the report.", + "banner": true + }, + { + "action": "listen_ack", + "seconds": 9.00, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 80, + "abort_on_limit": false, + "respond_on": [ + { + "frames": [ + "00 00 13 40 00 09", + "01 00 13 40 00 08", + "02 00 13 40 00 0B" + ], + "send": "00 00 13 40 00 09", + "label": "mirror_selector_0013_active_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + }, + { + "frames": [ + "00 00 13 00 00 49", + "01 00 13 00 00 48", + "02 00 13 00 00 4B" + ], + "send": "00 00 13 00 00 49", + "label": "mirror_selector_0013_clear_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + } + ] + }, + { + "action": "send", + "label": "readback_selector_0013_after_press_1", + "frame": "01 00 13 00 00 48", + "listen": 0.60 + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK A SECOND TIME NOW. If the mirror completed the latch, this should report clear.", + "banner": true + }, + { + "action": "listen_ack", + "seconds": 9.00, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 80, + "abort_on_limit": false, + "respond_on": [ + { + "frames": [ + "00 00 13 40 00 09", + "01 00 13 40 00 08", + "02 00 13 40 00 0B" + ], + "send": "00 00 13 40 00 09", + "label": "mirror_selector_0013_active_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + }, + { + "frames": [ + "00 00 13 00 00 49", + "01 00 13 00 00 48", + "02 00 13 00 00 4B" + ], + "send": "00 00 13 00 00 49", + "label": "mirror_selector_0013_clear_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + } + ] + }, + { + "action": "send", + "label": "readback_selector_0013_after_press_2", + "frame": "01 00 13 00 00 48", + "listen": 0.60 + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK A THIRD TIME NOW to check that active returns after a mirrored clear.", + "banner": true + }, + { + "action": "listen_ack", + "seconds": 9.00, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 80, + "abort_on_limit": false, + "respond_on": [ + { + "frames": [ + "00 00 13 40 00 09", + "01 00 13 40 00 08", + "02 00 13 40 00 0B" + ], + "send": "00 00 13 40 00 09", + "label": "mirror_selector_0013_active_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + }, + { + "frames": [ + "00 00 13 00 00 49", + "01 00 13 00 00 48", + "02 00 13 00 00 4B" + ], + "send": "00 00 13 00 00 49", + "label": "mirror_selector_0013_clear_from_button", + "delay": 0.050, + "listen": 0.20, + "once": true + } + ] + }, + { + "action": "send", + "label": "readback_selector_0013_after_press_3", + "frame": "01 00 13 00 00 48", + "listen": 0.60 + }, + { + "action": "send", + "label": "repeat_last_for_hidden_report_check", + "frame": "07 00 00 00 00 5D", + "listen": 0.60 + }, + { + "action": "listen", + "seconds": 1.00 + } + ] +} diff --git a/scenarios/iris-mblack-link-report-after-quiet-press.json b/scenarios/iris-mblack-link-report-after-quiet-press.json new file mode 100644 index 0000000..7a255da --- /dev/null +++ b/scenarios/iris-mblack-link-report-after-quiet-press.json @@ -0,0 +1,114 @@ +{ + "name": "iris-mblack-link-report-after-quiet-press", + "notes": [ + "Second-pass IRIS/M.BLACK LINK button report test.", + "This drains the startup/current-state report queue until it goes quiet before asking for a physical press, so a fresh selector-0013 report is easier to separate from boot backlog.", + "Expected fresh report shapes are 00/01/02 00 13 40 00 for active, or 00/01/02 00 13 00 00 for clear. Page-1 selector 01 13 is not this button; it is selector 0x0093." + ], + "steps": [ + { + "action": "prompt", + "message": "Prepare to test IRIS/M.BLACK LINK after the report queue drains. Press Enter to power-cycle and start." + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.20 + }, + { + "action": "send", + "label": "selector_zero_connect_seed", + "frame": "00 00 00 80 00 DA", + "listen": 0.20 + }, + { + "action": "send", + "label": "cmd5_latch_clear_0096", + "frame": "05 01 16 00 00 48", + "listen": 0.02 + }, + { + "action": "listen_ack_until_quiet", + "seconds": 28.00, + "quiet_seconds": 0.90, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 180, + "abort_on_limit": false + }, + { + "action": "send", + "label": "recover_connect_ok_seed_before_press", + "frame": "00 00 00 80 00 DA", + "listen": 0.20 + }, + { + "action": "note", + "message": "QUEUE IS QUIET. PRESS IRIS/M.BLACK LINK ONCE NOW; fresh-report ACK window is running.", + "banner": true + }, + { + "action": "listen_ack_until_quiet", + "seconds": 14.00, + "quiet_seconds": 1.20, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 64, + "abort_on_limit": false + }, + { + "action": "send", + "label": "recover_connect_ok_seed_before_second_press", + "frame": "00 00 00 80 00 DA", + "listen": 0.20 + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK A SECOND TIME NOW to test the opposite toggle state.", + "banner": true + }, + { + "action": "listen_ack_until_quiet", + "seconds": 14.00, + "quiet_seconds": 1.20, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.005, + "post_ack_read": 0.035, + "poll_interval": 0.003, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 64, + "abort_on_limit": false + }, + { + "action": "send", + "label": "repeat_last_for_hidden_report_check", + "frame": "07 00 00 00 00 5D", + "listen": 0.60 + }, + { + "action": "listen", + "seconds": 1.00 + } + ] +} diff --git a/scenarios/iris-mblack-link-report-press.json b/scenarios/iris-mblack-link-report-press.json new file mode 100644 index 0000000..b947a38 --- /dev/null +++ b/scenarios/iris-mblack-link-report-press.json @@ -0,0 +1,125 @@ +{ + "name": "iris-mblack-link-report-press", + "notes": [ + "Focused queued-report test for the IRIS/M.BLACK LINK physical button.", + "The ROM path at H'200E toggles E800[0x0013].14 when F006.7/F6DB.7 is active and F731 <= 3, then calls loc_3E54 with R2=0x80 R3=0x0013.", + "This scenario services the local report queue by ACKing checksum-valid 00/01/02 report frames with command 5 for the observed selector.", + "Expected selector-0013 report shapes include 00 00 13 40 00 09 for active, 00 00 13 00 00 49 for clear, and bit15 variants 00 00 13 80 00 C9 / 00 00 13 C0 00 89. Queued 01/02 variants are also valid evidence." + ], + "steps": [ + { + "action": "prompt", + "message": "Prepare to test the IRIS/M.BLACK LINK button. Press Enter to power-cycle and start the live ACK windows." + }, + { + "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_connect_seed", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "cmd5_latch_clear_0096", + "frame": "05 01 16 00 00 48", + "listen": 0.05 + }, + { + "action": "listen_ack", + "seconds": 3.20, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.010, + "post_ack_read": 0.070, + "poll_interval": 0.004, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 48, + "abort_on_limit": false + }, + { + "action": "send", + "label": "recover_connect_ok_seed", + "frame": "00 00 00 80 00 DA", + "listen": 0.45 + }, + { + "action": "listen_ack", + "seconds": 1.20, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.010, + "post_ack_read": 0.070, + "poll_interval": 0.004, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 32, + "abort_on_limit": false + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK ONCE NOW; live queued-report ACK window is running.", + "banner": true + }, + { + "action": "listen_ack", + "seconds": 10.00, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.010, + "post_ack_read": 0.070, + "poll_interval": 0.004, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 96, + "abort_on_limit": false + }, + { + "action": "send", + "label": "refresh_connect_ok_seed_before_second_press", + "frame": "00 00 00 80 00 DA", + "listen": 0.35 + }, + { + "action": "note", + "message": "PRESS IRIS/M.BLACK LINK A SECOND TIME NOW to test the toggle-clear report.", + "banner": true + }, + { + "action": "listen_ack", + "seconds": 10.00, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "ack_guard": 0.010, + "post_ack_read": 0.070, + "poll_interval": 0.004, + "once_per_frame": false, + "limit_scope": "local", + "max_acks": 96, + "abort_on_limit": false + }, + { + "action": "send", + "label": "repeat_last_for_hidden_report_check", + "frame": "07 00 00 00 00 5D", + "listen": 0.80 + }, + { + "action": "listen", + "seconds": 1.50 + } + ] +} diff --git a/scenarios/panel-atlas-big-hits-isolation-v1.json b/scenarios/panel-atlas-big-hits-isolation-v1.json new file mode 100644 index 0000000..75bfd8a --- /dev/null +++ b/scenarios/panel-atlas-big-hits-isolation-v1.json @@ -0,0 +1,74 @@ +{ + "name": "panel-atlas-big-hits-isolation-v1", + "notes": [ + "Fresh-boot isolation pass for user-reviewed hits from panel-atlas-big-visual-sweep-0001-017f-highbits.", + "Each case power-cycles, seeds CONNECT OK, captures a baseline image, sends the candidate, then captures a clear/low write.", + "Expected observations are from the first broad image review and must be confirmed here." + ], + "steps": [ + {"action": "note", "message": "Case 1: 0x0013=0x4000, reported Iris/MBlack Link", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case001_baseline_before_0013_4000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case001_candidate_0013_4000_iris_mblack_link", "frame": "00 00 13 40 00 09", "listen": 1.0}, + {"action": "send", "label": "case001_clear_0013", "frame": "00 00 13 00 00 49", "listen": 0.7}, + + {"action": "note", "message": "Case 2: 0x0024=0x8000, reported LCD selector button", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case002_baseline_before_0024_8000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case002_candidate_0024_8000_lcd_selector_button", "frame": "00 00 24 80 00 FE", "listen": 1.0}, + {"action": "send", "label": "case002_clear_0024", "frame": "00 00 24 00 00 7E", "listen": 0.7}, + + {"action": "note", "message": "Case 3: 0x0082=0x8000, reported IRIS display OP", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case003_baseline_before_0082_8000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case003_candidate_0082_8000_iris_op", "frame": "00 01 02 80 00 D9", "listen": 1.0}, + {"action": "send", "label": "case003_clear_0082", "frame": "00 01 02 00 00 59", "listen": 0.7}, + + {"action": "note", "message": "Case 4: 0x0082=0x4000, reported IRIS display 1.4", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case004_baseline_before_0082_4000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case004_candidate_0082_4000_iris_1_4", "frame": "00 01 02 40 00 19", "listen": 1.0}, + {"action": "send", "label": "case004_clear_0082", "frame": "00 01 02 00 00 59", "listen": 0.7}, + + {"action": "note", "message": "Case 5: 0x0083=0x8000, reported MASTER GAIN display -3", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case005_baseline_before_0083_8000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case005_candidate_0083_8000_master_gain_minus_3", "frame": "00 01 03 80 00 D8", "listen": 1.0}, + {"action": "send", "label": "case005_clear_0083", "frame": "00 01 03 00 00 58", "listen": 0.7}, + + {"action": "note", "message": "Case 6: 0x0093=0x8000, reported white balance PRESET", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case006_baseline_before_0093_8000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case006_candidate_0093_8000_white_balance_preset", "frame": "00 01 13 80 00 C8", "listen": 1.0}, + {"action": "send", "label": "case006_clear_0093", "frame": "00 01 13 00 00 48", "listen": 0.7}, + + {"action": "note", "message": "Case 7: 0x0093=0x4000, reported white balance AUTO", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case007_baseline_before_0093_4000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case007_candidate_0093_4000_white_balance_auto", "frame": "00 01 13 40 00 08", "listen": 1.0}, + {"action": "send", "label": "case007_clear_0093", "frame": "00 01 13 00 00 48", "listen": 0.7}, + + {"action": "note", "message": "Case 8: 0x0093=0x2000, reported white balance MANUAL", "banner": true}, + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.5}, + {"action": "send", "label": "case008_baseline_before_0093_2000", "frame": "00 00 00 80 00 DA", "listen": 0.7}, + {"action": "send", "label": "case008_candidate_0093_2000_white_balance_manual", "frame": "00 01 13 20 00 68", "listen": 1.0}, + {"action": "send", "label": "case008_clear_0093", "frame": "00 01 13 00 00 48", "listen": 0.7}, + {"action": "listen", "seconds": 1.0} + ] +} diff --git a/scenarios/panel-atlas-big-visual-sweep-0001-017f-highbits.json b/scenarios/panel-atlas-big-visual-sweep-0001-017f-highbits.json new file mode 100644 index 0000000..1dddccd --- /dev/null +++ b/scenarios/panel-atlas-big-visual-sweep-0001-017f-highbits.json @@ -0,0 +1,14871 @@ +{ + "name": "panel-atlas-big-visual-sweep-001-17F", + "notes": [ + "Broad visible-output sweep generated by scripts/build_panel_visual_sweep.py.", + "Candidate selector/value sends have webcam snapshots enabled; CONNECT OK refreshes and clears do not.", + "Use image filenames candidate_XXXX_YYYY to refine any visible trigger into a smaller follow-up scenario.", + "Values: 0x8000,0x4000,0x2000,0x1000,0x0800" + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_001_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_001_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "positive_control_0013_8000_slave_on", + "frame": "00 00 13 80 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0013_after_slave", + "frame": "00 00 13 00 00 49", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0001", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0001_8000", + "frame": "00 00 01 80 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0001_4000", + "frame": "00 00 01 40 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0001_2000", + "frame": "00 00 01 20 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0001_1000", + "frame": "00 00 01 10 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0001_0800", + "frame": "00 00 01 08 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0001", + "frame": "00 00 01 00 00 5B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0002_8000", + "frame": "00 00 02 80 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0002_4000", + "frame": "00 00 02 40 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0002_2000", + "frame": "00 00 02 20 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0002_1000", + "frame": "00 00 02 10 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0002_0800", + "frame": "00 00 02 08 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0002", + "frame": "00 00 02 00 00 58", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0003_8000", + "frame": "00 00 03 80 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0003_4000", + "frame": "00 00 03 40 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0003_2000", + "frame": "00 00 03 20 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0003_1000", + "frame": "00 00 03 10 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0003_0800", + "frame": "00 00 03 08 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0003", + "frame": "00 00 03 00 00 59", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0004_8000", + "frame": "00 00 04 80 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0004_4000", + "frame": "00 00 04 40 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0004_2000", + "frame": "00 00 04 20 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0004_1000", + "frame": "00 00 04 10 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0004_0800", + "frame": "00 00 04 08 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0004", + "frame": "00 00 04 00 00 5E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0005_8000", + "frame": "00 00 05 80 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0005_4000", + "frame": "00 00 05 40 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0005_2000", + "frame": "00 00 05 20 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0005_1000", + "frame": "00 00 05 10 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0005_0800", + "frame": "00 00 05 08 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0005", + "frame": "00 00 05 00 00 5F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0006_8000", + "frame": "00 00 06 80 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0006_4000", + "frame": "00 00 06 40 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0006_2000", + "frame": "00 00 06 20 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0006_1000", + "frame": "00 00 06 10 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0006_0800", + "frame": "00 00 06 08 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0006", + "frame": "00 00 06 00 00 5C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0007_8000", + "frame": "00 00 07 80 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0007_4000", + "frame": "00 00 07 40 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0007_2000", + "frame": "00 00 07 20 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0007_1000", + "frame": "00 00 07 10 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0007_0800", + "frame": "00 00 07 08 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0007", + "frame": "00 00 07 00 00 5D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0008_8000", + "frame": "00 00 08 80 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0008_4000", + "frame": "00 00 08 40 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0008_2000", + "frame": "00 00 08 20 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0008_1000", + "frame": "00 00 08 10 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0008_0800", + "frame": "00 00 08 08 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0008", + "frame": "00 00 08 00 00 52", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0009", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0009_8000", + "frame": "00 00 09 80 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0009_4000", + "frame": "00 00 09 40 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0009_2000", + "frame": "00 00 09 20 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0009_1000", + "frame": "00 00 09 10 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0009_0800", + "frame": "00 00 09 08 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0009", + "frame": "00 00 09 00 00 53", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000A_8000", + "frame": "00 00 0A 80 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000A_4000", + "frame": "00 00 0A 40 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000A_2000", + "frame": "00 00 0A 20 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000A_1000", + "frame": "00 00 0A 10 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000A_0800", + "frame": "00 00 0A 08 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000A", + "frame": "00 00 0A 00 00 50", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000B_8000", + "frame": "00 00 0B 80 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000B_4000", + "frame": "00 00 0B 40 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000B_2000", + "frame": "00 00 0B 20 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000B_1000", + "frame": "00 00 0B 10 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000B_0800", + "frame": "00 00 0B 08 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000B", + "frame": "00 00 0B 00 00 51", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000C_8000", + "frame": "00 00 0C 80 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000C_4000", + "frame": "00 00 0C 40 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000C_2000", + "frame": "00 00 0C 20 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000C_1000", + "frame": "00 00 0C 10 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000C_0800", + "frame": "00 00 0C 08 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000C", + "frame": "00 00 0C 00 00 56", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000D_8000", + "frame": "00 00 0D 80 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000D_4000", + "frame": "00 00 0D 40 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000D_2000", + "frame": "00 00 0D 20 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000D_1000", + "frame": "00 00 0D 10 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000D_0800", + "frame": "00 00 0D 08 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000D", + "frame": "00 00 0D 00 00 57", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000E_8000", + "frame": "00 00 0E 80 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000E_4000", + "frame": "00 00 0E 40 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000E_2000", + "frame": "00 00 0E 20 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000E_1000", + "frame": "00 00 0E 10 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000E_0800", + "frame": "00 00 0E 08 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000E", + "frame": "00 00 0E 00 00 54", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_000F_8000", + "frame": "00 00 0F 80 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000F_4000", + "frame": "00 00 0F 40 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000F_2000", + "frame": "00 00 0F 20 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000F_1000", + "frame": "00 00 0F 10 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_000F_0800", + "frame": "00 00 0F 08 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_000F", + "frame": "00 00 0F 00 00 55", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0010_8000", + "frame": "00 00 10 80 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0010_4000", + "frame": "00 00 10 40 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0010_2000", + "frame": "00 00 10 20 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0010_1000", + "frame": "00 00 10 10 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0010_0800", + "frame": "00 00 10 08 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0010", + "frame": "00 00 10 00 00 4A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0011", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0011_8000", + "frame": "00 00 11 80 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0011_4000", + "frame": "00 00 11 40 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0011_2000", + "frame": "00 00 11 20 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0011_1000", + "frame": "00 00 11 10 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0011_0800", + "frame": "00 00 11 08 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0011", + "frame": "00 00 11 00 00 4B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0012_8000", + "frame": "00 00 12 80 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0012_4000", + "frame": "00 00 12 40 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0012_2000", + "frame": "00 00 12 20 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0012_1000", + "frame": "00 00 12 10 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0012_0800", + "frame": "00 00 12 08 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0012", + "frame": "00 00 12 00 00 48", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0013_8000", + "frame": "00 00 13 80 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0013_4000", + "frame": "00 00 13 40 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0013_2000", + "frame": "00 00 13 20 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0013_1000", + "frame": "00 00 13 10 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0013_0800", + "frame": "00 00 13 08 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0013", + "frame": "00 00 13 00 00 49", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0014_8000", + "frame": "00 00 14 80 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0014_4000", + "frame": "00 00 14 40 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0014_2000", + "frame": "00 00 14 20 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0014_1000", + "frame": "00 00 14 10 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0014_0800", + "frame": "00 00 14 08 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0014", + "frame": "00 00 14 00 00 4E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0015_8000", + "frame": "00 00 15 80 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0015_4000", + "frame": "00 00 15 40 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0015_2000", + "frame": "00 00 15 20 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0015_1000", + "frame": "00 00 15 10 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0015_0800", + "frame": "00 00 15 08 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0015", + "frame": "00 00 15 00 00 4F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0016_8000", + "frame": "00 00 16 80 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0016_4000", + "frame": "00 00 16 40 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0016_2000", + "frame": "00 00 16 20 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0016_1000", + "frame": "00 00 16 10 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0016_0800", + "frame": "00 00 16 08 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0016", + "frame": "00 00 16 00 00 4C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0017_8000", + "frame": "00 00 17 80 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0017_4000", + "frame": "00 00 17 40 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0017_2000", + "frame": "00 00 17 20 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0017_1000", + "frame": "00 00 17 10 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0017_0800", + "frame": "00 00 17 08 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0017", + "frame": "00 00 17 00 00 4D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0018_8000", + "frame": "00 00 18 80 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0018_4000", + "frame": "00 00 18 40 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0018_2000", + "frame": "00 00 18 20 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0018_1000", + "frame": "00 00 18 10 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0018_0800", + "frame": "00 00 18 08 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0018", + "frame": "00 00 18 00 00 42", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0019", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0019_8000", + "frame": "00 00 19 80 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0019_4000", + "frame": "00 00 19 40 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0019_2000", + "frame": "00 00 19 20 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0019_1000", + "frame": "00 00 19 10 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0019_0800", + "frame": "00 00 19 08 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0019", + "frame": "00 00 19 00 00 43", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001A_8000", + "frame": "00 00 1A 80 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001A_4000", + "frame": "00 00 1A 40 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001A_2000", + "frame": "00 00 1A 20 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001A_1000", + "frame": "00 00 1A 10 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001A_0800", + "frame": "00 00 1A 08 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001A", + "frame": "00 00 1A 00 00 40", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001B_8000", + "frame": "00 00 1B 80 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001B_4000", + "frame": "00 00 1B 40 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001B_2000", + "frame": "00 00 1B 20 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001B_1000", + "frame": "00 00 1B 10 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001B_0800", + "frame": "00 00 1B 08 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001B", + "frame": "00 00 1B 00 00 41", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001C_8000", + "frame": "00 00 1C 80 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001C_4000", + "frame": "00 00 1C 40 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001C_2000", + "frame": "00 00 1C 20 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001C_1000", + "frame": "00 00 1C 10 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001C_0800", + "frame": "00 00 1C 08 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001C", + "frame": "00 00 1C 00 00 46", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001D_8000", + "frame": "00 00 1D 80 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001D_4000", + "frame": "00 00 1D 40 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001D_2000", + "frame": "00 00 1D 20 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001D_1000", + "frame": "00 00 1D 10 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001D_0800", + "frame": "00 00 1D 08 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001D", + "frame": "00 00 1D 00 00 47", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001E_8000", + "frame": "00 00 1E 80 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001E_4000", + "frame": "00 00 1E 40 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001E_2000", + "frame": "00 00 1E 20 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001E_1000", + "frame": "00 00 1E 10 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001E_0800", + "frame": "00 00 1E 08 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001E", + "frame": "00 00 1E 00 00 44", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_001F_8000", + "frame": "00 00 1F 80 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001F_4000", + "frame": "00 00 1F 40 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001F_2000", + "frame": "00 00 1F 20 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001F_1000", + "frame": "00 00 1F 10 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_001F_0800", + "frame": "00 00 1F 08 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_001F", + "frame": "00 00 1F 00 00 45", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0020_8000", + "frame": "00 00 20 80 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0020_4000", + "frame": "00 00 20 40 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0020_2000", + "frame": "00 00 20 20 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0020_1000", + "frame": "00 00 20 10 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0020_0800", + "frame": "00 00 20 08 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0020", + "frame": "00 00 20 00 00 7A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_002_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_002_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0021", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0021_8000", + "frame": "00 00 21 80 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0021_4000", + "frame": "00 00 21 40 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0021_2000", + "frame": "00 00 21 20 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0021_1000", + "frame": "00 00 21 10 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0021_0800", + "frame": "00 00 21 08 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0021", + "frame": "00 00 21 00 00 7B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0022_8000", + "frame": "00 00 22 80 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0022_4000", + "frame": "00 00 22 40 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0022_2000", + "frame": "00 00 22 20 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0022_1000", + "frame": "00 00 22 10 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0022_0800", + "frame": "00 00 22 08 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0022", + "frame": "00 00 22 00 00 78", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0023_8000", + "frame": "00 00 23 80 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0023_4000", + "frame": "00 00 23 40 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0023_2000", + "frame": "00 00 23 20 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0023_1000", + "frame": "00 00 23 10 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0023_0800", + "frame": "00 00 23 08 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0023", + "frame": "00 00 23 00 00 79", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0024_8000", + "frame": "00 00 24 80 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0024_4000", + "frame": "00 00 24 40 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0024_2000", + "frame": "00 00 24 20 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0024_1000", + "frame": "00 00 24 10 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0024_0800", + "frame": "00 00 24 08 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0024", + "frame": "00 00 24 00 00 7E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0025_8000", + "frame": "00 00 25 80 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0025_4000", + "frame": "00 00 25 40 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0025_2000", + "frame": "00 00 25 20 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0025_1000", + "frame": "00 00 25 10 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0025_0800", + "frame": "00 00 25 08 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0025", + "frame": "00 00 25 00 00 7F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0026_8000", + "frame": "00 00 26 80 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0026_4000", + "frame": "00 00 26 40 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0026_2000", + "frame": "00 00 26 20 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0026_1000", + "frame": "00 00 26 10 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0026_0800", + "frame": "00 00 26 08 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0026", + "frame": "00 00 26 00 00 7C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0027_8000", + "frame": "00 00 27 80 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0027_4000", + "frame": "00 00 27 40 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0027_2000", + "frame": "00 00 27 20 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0027_1000", + "frame": "00 00 27 10 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0027_0800", + "frame": "00 00 27 08 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0027", + "frame": "00 00 27 00 00 7D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0028_8000", + "frame": "00 00 28 80 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0028_4000", + "frame": "00 00 28 40 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0028_2000", + "frame": "00 00 28 20 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0028_1000", + "frame": "00 00 28 10 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0028_0800", + "frame": "00 00 28 08 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0028", + "frame": "00 00 28 00 00 72", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0029", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0029_8000", + "frame": "00 00 29 80 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0029_4000", + "frame": "00 00 29 40 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0029_2000", + "frame": "00 00 29 20 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0029_1000", + "frame": "00 00 29 10 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0029_0800", + "frame": "00 00 29 08 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0029", + "frame": "00 00 29 00 00 73", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002A_8000", + "frame": "00 00 2A 80 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002A_4000", + "frame": "00 00 2A 40 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002A_2000", + "frame": "00 00 2A 20 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002A_1000", + "frame": "00 00 2A 10 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002A_0800", + "frame": "00 00 2A 08 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002A", + "frame": "00 00 2A 00 00 70", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002B_8000", + "frame": "00 00 2B 80 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002B_4000", + "frame": "00 00 2B 40 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002B_2000", + "frame": "00 00 2B 20 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002B_1000", + "frame": "00 00 2B 10 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002B_0800", + "frame": "00 00 2B 08 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002B", + "frame": "00 00 2B 00 00 71", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002C_8000", + "frame": "00 00 2C 80 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002C_4000", + "frame": "00 00 2C 40 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002C_2000", + "frame": "00 00 2C 20 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002C_1000", + "frame": "00 00 2C 10 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002C_0800", + "frame": "00 00 2C 08 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002C", + "frame": "00 00 2C 00 00 76", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002D_8000", + "frame": "00 00 2D 80 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002D_4000", + "frame": "00 00 2D 40 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002D_2000", + "frame": "00 00 2D 20 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002D_1000", + "frame": "00 00 2D 10 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002D_0800", + "frame": "00 00 2D 08 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002D", + "frame": "00 00 2D 00 00 77", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002E_8000", + "frame": "00 00 2E 80 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002E_4000", + "frame": "00 00 2E 40 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002E_2000", + "frame": "00 00 2E 20 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002E_1000", + "frame": "00 00 2E 10 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002E_0800", + "frame": "00 00 2E 08 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002E", + "frame": "00 00 2E 00 00 74", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_002F_8000", + "frame": "00 00 2F 80 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002F_4000", + "frame": "00 00 2F 40 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002F_2000", + "frame": "00 00 2F 20 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002F_1000", + "frame": "00 00 2F 10 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_002F_0800", + "frame": "00 00 2F 08 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_002F", + "frame": "00 00 2F 00 00 75", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0030_8000", + "frame": "00 00 30 80 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0030_4000", + "frame": "00 00 30 40 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0030_2000", + "frame": "00 00 30 20 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0030_1000", + "frame": "00 00 30 10 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0030_0800", + "frame": "00 00 30 08 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0030", + "frame": "00 00 30 00 00 6A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0031", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0031_8000", + "frame": "00 00 31 80 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0031_4000", + "frame": "00 00 31 40 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0031_2000", + "frame": "00 00 31 20 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0031_1000", + "frame": "00 00 31 10 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0031_0800", + "frame": "00 00 31 08 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0031", + "frame": "00 00 31 00 00 6B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0032_8000", + "frame": "00 00 32 80 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0032_4000", + "frame": "00 00 32 40 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0032_2000", + "frame": "00 00 32 20 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0032_1000", + "frame": "00 00 32 10 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0032_0800", + "frame": "00 00 32 08 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0032", + "frame": "00 00 32 00 00 68", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0033_8000", + "frame": "00 00 33 80 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0033_4000", + "frame": "00 00 33 40 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0033_2000", + "frame": "00 00 33 20 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0033_1000", + "frame": "00 00 33 10 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0033_0800", + "frame": "00 00 33 08 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0033", + "frame": "00 00 33 00 00 69", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0034_8000", + "frame": "00 00 34 80 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0034_4000", + "frame": "00 00 34 40 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0034_2000", + "frame": "00 00 34 20 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0034_1000", + "frame": "00 00 34 10 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0034_0800", + "frame": "00 00 34 08 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0034", + "frame": "00 00 34 00 00 6E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0035_8000", + "frame": "00 00 35 80 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0035_4000", + "frame": "00 00 35 40 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0035_2000", + "frame": "00 00 35 20 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0035_1000", + "frame": "00 00 35 10 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0035_0800", + "frame": "00 00 35 08 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0035", + "frame": "00 00 35 00 00 6F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0036_8000", + "frame": "00 00 36 80 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0036_4000", + "frame": "00 00 36 40 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0036_2000", + "frame": "00 00 36 20 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0036_1000", + "frame": "00 00 36 10 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0036_0800", + "frame": "00 00 36 08 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0036", + "frame": "00 00 36 00 00 6C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0037_8000", + "frame": "00 00 37 80 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0037_4000", + "frame": "00 00 37 40 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0037_2000", + "frame": "00 00 37 20 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0037_1000", + "frame": "00 00 37 10 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0037_0800", + "frame": "00 00 37 08 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0037", + "frame": "00 00 37 00 00 6D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0038_8000", + "frame": "00 00 38 80 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0038_4000", + "frame": "00 00 38 40 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0038_2000", + "frame": "00 00 38 20 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0038_1000", + "frame": "00 00 38 10 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0038_0800", + "frame": "00 00 38 08 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0038", + "frame": "00 00 38 00 00 62", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0039", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0039_8000", + "frame": "00 00 39 80 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0039_4000", + "frame": "00 00 39 40 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0039_2000", + "frame": "00 00 39 20 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0039_1000", + "frame": "00 00 39 10 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0039_0800", + "frame": "00 00 39 08 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0039", + "frame": "00 00 39 00 00 63", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003A_8000", + "frame": "00 00 3A 80 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003A_4000", + "frame": "00 00 3A 40 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003A_2000", + "frame": "00 00 3A 20 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003A_1000", + "frame": "00 00 3A 10 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003A_0800", + "frame": "00 00 3A 08 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003A", + "frame": "00 00 3A 00 00 60", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003B_8000", + "frame": "00 00 3B 80 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003B_4000", + "frame": "00 00 3B 40 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003B_2000", + "frame": "00 00 3B 20 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003B_1000", + "frame": "00 00 3B 10 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003B_0800", + "frame": "00 00 3B 08 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003B", + "frame": "00 00 3B 00 00 61", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003C_8000", + "frame": "00 00 3C 80 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003C_4000", + "frame": "00 00 3C 40 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003C_2000", + "frame": "00 00 3C 20 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003C_1000", + "frame": "00 00 3C 10 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003C_0800", + "frame": "00 00 3C 08 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003C", + "frame": "00 00 3C 00 00 66", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003D_8000", + "frame": "00 00 3D 80 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003D_4000", + "frame": "00 00 3D 40 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003D_2000", + "frame": "00 00 3D 20 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003D_1000", + "frame": "00 00 3D 10 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003D_0800", + "frame": "00 00 3D 08 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003D", + "frame": "00 00 3D 00 00 67", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003E_8000", + "frame": "00 00 3E 80 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003E_4000", + "frame": "00 00 3E 40 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003E_2000", + "frame": "00 00 3E 20 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003E_1000", + "frame": "00 00 3E 10 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003E_0800", + "frame": "00 00 3E 08 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003E", + "frame": "00 00 3E 00 00 64", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_003F_8000", + "frame": "00 00 3F 80 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003F_4000", + "frame": "00 00 3F 40 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003F_2000", + "frame": "00 00 3F 20 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003F_1000", + "frame": "00 00 3F 10 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_003F_0800", + "frame": "00 00 3F 08 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_003F", + "frame": "00 00 3F 00 00 65", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0040_8000", + "frame": "00 00 40 80 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0040_4000", + "frame": "00 00 40 40 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0040_2000", + "frame": "00 00 40 20 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0040_1000", + "frame": "00 00 40 10 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0040_0800", + "frame": "00 00 40 08 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0040", + "frame": "00 00 40 00 00 1A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_003_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_003_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0041", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0041_8000", + "frame": "00 00 41 80 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0041_4000", + "frame": "00 00 41 40 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0041_2000", + "frame": "00 00 41 20 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0041_1000", + "frame": "00 00 41 10 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0041_0800", + "frame": "00 00 41 08 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0041", + "frame": "00 00 41 00 00 1B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0042_8000", + "frame": "00 00 42 80 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0042_4000", + "frame": "00 00 42 40 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0042_2000", + "frame": "00 00 42 20 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0042_1000", + "frame": "00 00 42 10 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0042_0800", + "frame": "00 00 42 08 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0042", + "frame": "00 00 42 00 00 18", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0043_8000", + "frame": "00 00 43 80 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0043_4000", + "frame": "00 00 43 40 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0043_2000", + "frame": "00 00 43 20 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0043_1000", + "frame": "00 00 43 10 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0043_0800", + "frame": "00 00 43 08 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0043", + "frame": "00 00 43 00 00 19", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0044_8000", + "frame": "00 00 44 80 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0044_4000", + "frame": "00 00 44 40 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0044_2000", + "frame": "00 00 44 20 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0044_1000", + "frame": "00 00 44 10 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0044_0800", + "frame": "00 00 44 08 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0044", + "frame": "00 00 44 00 00 1E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0045_8000", + "frame": "00 00 45 80 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0045_4000", + "frame": "00 00 45 40 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0045_2000", + "frame": "00 00 45 20 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0045_1000", + "frame": "00 00 45 10 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0045_0800", + "frame": "00 00 45 08 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0045", + "frame": "00 00 45 00 00 1F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0046_8000", + "frame": "00 00 46 80 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0046_4000", + "frame": "00 00 46 40 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0046_2000", + "frame": "00 00 46 20 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0046_1000", + "frame": "00 00 46 10 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0046_0800", + "frame": "00 00 46 08 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0046", + "frame": "00 00 46 00 00 1C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0047_8000", + "frame": "00 00 47 80 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0047_4000", + "frame": "00 00 47 40 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0047_2000", + "frame": "00 00 47 20 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0047_1000", + "frame": "00 00 47 10 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0047_0800", + "frame": "00 00 47 08 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0047", + "frame": "00 00 47 00 00 1D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0048_8000", + "frame": "00 00 48 80 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0048_4000", + "frame": "00 00 48 40 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0048_2000", + "frame": "00 00 48 20 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0048_1000", + "frame": "00 00 48 10 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0048_0800", + "frame": "00 00 48 08 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0048", + "frame": "00 00 48 00 00 12", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0049", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0049_8000", + "frame": "00 00 49 80 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0049_4000", + "frame": "00 00 49 40 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0049_2000", + "frame": "00 00 49 20 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0049_1000", + "frame": "00 00 49 10 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0049_0800", + "frame": "00 00 49 08 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0049", + "frame": "00 00 49 00 00 13", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004A_8000", + "frame": "00 00 4A 80 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004A_4000", + "frame": "00 00 4A 40 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004A_2000", + "frame": "00 00 4A 20 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004A_1000", + "frame": "00 00 4A 10 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004A_0800", + "frame": "00 00 4A 08 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004A", + "frame": "00 00 4A 00 00 10", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004B_8000", + "frame": "00 00 4B 80 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004B_4000", + "frame": "00 00 4B 40 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004B_2000", + "frame": "00 00 4B 20 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004B_1000", + "frame": "00 00 4B 10 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004B_0800", + "frame": "00 00 4B 08 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004B", + "frame": "00 00 4B 00 00 11", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004C_8000", + "frame": "00 00 4C 80 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004C_4000", + "frame": "00 00 4C 40 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004C_2000", + "frame": "00 00 4C 20 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004C_1000", + "frame": "00 00 4C 10 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004C_0800", + "frame": "00 00 4C 08 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004C", + "frame": "00 00 4C 00 00 16", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004D_8000", + "frame": "00 00 4D 80 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004D_4000", + "frame": "00 00 4D 40 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004D_2000", + "frame": "00 00 4D 20 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004D_1000", + "frame": "00 00 4D 10 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004D_0800", + "frame": "00 00 4D 08 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004D", + "frame": "00 00 4D 00 00 17", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004E_8000", + "frame": "00 00 4E 80 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004E_4000", + "frame": "00 00 4E 40 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004E_2000", + "frame": "00 00 4E 20 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004E_1000", + "frame": "00 00 4E 10 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004E_0800", + "frame": "00 00 4E 08 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004E", + "frame": "00 00 4E 00 00 14", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_004F_8000", + "frame": "00 00 4F 80 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004F_4000", + "frame": "00 00 4F 40 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004F_2000", + "frame": "00 00 4F 20 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004F_1000", + "frame": "00 00 4F 10 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_004F_0800", + "frame": "00 00 4F 08 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_004F", + "frame": "00 00 4F 00 00 15", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0050_8000", + "frame": "00 00 50 80 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0050_4000", + "frame": "00 00 50 40 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0050_2000", + "frame": "00 00 50 20 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0050_1000", + "frame": "00 00 50 10 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0050_0800", + "frame": "00 00 50 08 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0050", + "frame": "00 00 50 00 00 0A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0051", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0051_8000", + "frame": "00 00 51 80 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0051_4000", + "frame": "00 00 51 40 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0051_2000", + "frame": "00 00 51 20 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0051_1000", + "frame": "00 00 51 10 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0051_0800", + "frame": "00 00 51 08 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0051", + "frame": "00 00 51 00 00 0B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0052_8000", + "frame": "00 00 52 80 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0052_4000", + "frame": "00 00 52 40 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0052_2000", + "frame": "00 00 52 20 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0052_1000", + "frame": "00 00 52 10 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0052_0800", + "frame": "00 00 52 08 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0052", + "frame": "00 00 52 00 00 08", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0053_8000", + "frame": "00 00 53 80 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0053_4000", + "frame": "00 00 53 40 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0053_2000", + "frame": "00 00 53 20 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0053_1000", + "frame": "00 00 53 10 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0053_0800", + "frame": "00 00 53 08 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0053", + "frame": "00 00 53 00 00 09", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0054_8000", + "frame": "00 00 54 80 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0054_4000", + "frame": "00 00 54 40 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0054_2000", + "frame": "00 00 54 20 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0054_1000", + "frame": "00 00 54 10 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0054_0800", + "frame": "00 00 54 08 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0054", + "frame": "00 00 54 00 00 0E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0055_8000", + "frame": "00 00 55 80 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0055_4000", + "frame": "00 00 55 40 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0055_2000", + "frame": "00 00 55 20 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0055_1000", + "frame": "00 00 55 10 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0055_0800", + "frame": "00 00 55 08 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0055", + "frame": "00 00 55 00 00 0F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0056_8000", + "frame": "00 00 56 80 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0056_4000", + "frame": "00 00 56 40 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0056_2000", + "frame": "00 00 56 20 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0056_1000", + "frame": "00 00 56 10 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0056_0800", + "frame": "00 00 56 08 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0056", + "frame": "00 00 56 00 00 0C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0057_8000", + "frame": "00 00 57 80 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0057_4000", + "frame": "00 00 57 40 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0057_2000", + "frame": "00 00 57 20 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0057_1000", + "frame": "00 00 57 10 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0057_0800", + "frame": "00 00 57 08 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0057", + "frame": "00 00 57 00 00 0D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0058_8000", + "frame": "00 00 58 80 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0058_4000", + "frame": "00 00 58 40 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0058_2000", + "frame": "00 00 58 20 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0058_1000", + "frame": "00 00 58 10 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0058_0800", + "frame": "00 00 58 08 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0058", + "frame": "00 00 58 00 00 02", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0059", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0059_8000", + "frame": "00 00 59 80 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0059_4000", + "frame": "00 00 59 40 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0059_2000", + "frame": "00 00 59 20 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0059_1000", + "frame": "00 00 59 10 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0059_0800", + "frame": "00 00 59 08 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0059", + "frame": "00 00 59 00 00 03", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005A_8000", + "frame": "00 00 5A 80 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005A_4000", + "frame": "00 00 5A 40 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005A_2000", + "frame": "00 00 5A 20 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005A_1000", + "frame": "00 00 5A 10 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005A_0800", + "frame": "00 00 5A 08 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005A", + "frame": "00 00 5A 00 00 00", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005B_8000", + "frame": "00 00 5B 80 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005B_4000", + "frame": "00 00 5B 40 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005B_2000", + "frame": "00 00 5B 20 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005B_1000", + "frame": "00 00 5B 10 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005B_0800", + "frame": "00 00 5B 08 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005B", + "frame": "00 00 5B 00 00 01", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005C_8000", + "frame": "00 00 5C 80 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005C_4000", + "frame": "00 00 5C 40 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005C_2000", + "frame": "00 00 5C 20 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005C_1000", + "frame": "00 00 5C 10 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005C_0800", + "frame": "00 00 5C 08 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005C", + "frame": "00 00 5C 00 00 06", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005D_8000", + "frame": "00 00 5D 80 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005D_4000", + "frame": "00 00 5D 40 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005D_2000", + "frame": "00 00 5D 20 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005D_1000", + "frame": "00 00 5D 10 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005D_0800", + "frame": "00 00 5D 08 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005D", + "frame": "00 00 5D 00 00 07", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005E_8000", + "frame": "00 00 5E 80 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005E_4000", + "frame": "00 00 5E 40 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005E_2000", + "frame": "00 00 5E 20 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005E_1000", + "frame": "00 00 5E 10 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005E_0800", + "frame": "00 00 5E 08 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005E", + "frame": "00 00 5E 00 00 04", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_005F_8000", + "frame": "00 00 5F 80 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005F_4000", + "frame": "00 00 5F 40 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005F_2000", + "frame": "00 00 5F 20 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005F_1000", + "frame": "00 00 5F 10 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_005F_0800", + "frame": "00 00 5F 08 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_005F", + "frame": "00 00 5F 00 00 05", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0060_8000", + "frame": "00 00 60 80 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0060_4000", + "frame": "00 00 60 40 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0060_2000", + "frame": "00 00 60 20 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0060_1000", + "frame": "00 00 60 10 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0060_0800", + "frame": "00 00 60 08 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0060", + "frame": "00 00 60 00 00 3A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_004_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_004_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0061", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0061_8000", + "frame": "00 00 61 80 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0061_4000", + "frame": "00 00 61 40 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0061_2000", + "frame": "00 00 61 20 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0061_1000", + "frame": "00 00 61 10 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0061_0800", + "frame": "00 00 61 08 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0061", + "frame": "00 00 61 00 00 3B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0062_8000", + "frame": "00 00 62 80 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0062_4000", + "frame": "00 00 62 40 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0062_2000", + "frame": "00 00 62 20 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0062_1000", + "frame": "00 00 62 10 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0062_0800", + "frame": "00 00 62 08 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0062", + "frame": "00 00 62 00 00 38", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0063_8000", + "frame": "00 00 63 80 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0063_4000", + "frame": "00 00 63 40 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0063_2000", + "frame": "00 00 63 20 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0063_1000", + "frame": "00 00 63 10 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0063_0800", + "frame": "00 00 63 08 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0063", + "frame": "00 00 63 00 00 39", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0064_8000", + "frame": "00 00 64 80 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0064_4000", + "frame": "00 00 64 40 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0064_2000", + "frame": "00 00 64 20 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0064_1000", + "frame": "00 00 64 10 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0064_0800", + "frame": "00 00 64 08 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0064", + "frame": "00 00 64 00 00 3E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0065_8000", + "frame": "00 00 65 80 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0065_4000", + "frame": "00 00 65 40 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0065_2000", + "frame": "00 00 65 20 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0065_1000", + "frame": "00 00 65 10 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0065_0800", + "frame": "00 00 65 08 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0065", + "frame": "00 00 65 00 00 3F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0066_8000", + "frame": "00 00 66 80 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0066_4000", + "frame": "00 00 66 40 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0066_2000", + "frame": "00 00 66 20 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0066_1000", + "frame": "00 00 66 10 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0066_0800", + "frame": "00 00 66 08 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0066", + "frame": "00 00 66 00 00 3C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0067_8000", + "frame": "00 00 67 80 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0067_4000", + "frame": "00 00 67 40 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0067_2000", + "frame": "00 00 67 20 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0067_1000", + "frame": "00 00 67 10 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0067_0800", + "frame": "00 00 67 08 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0067", + "frame": "00 00 67 00 00 3D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0068_8000", + "frame": "00 00 68 80 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0068_4000", + "frame": "00 00 68 40 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0068_2000", + "frame": "00 00 68 20 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0068_1000", + "frame": "00 00 68 10 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0068_0800", + "frame": "00 00 68 08 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0068", + "frame": "00 00 68 00 00 32", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0069", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0069_8000", + "frame": "00 00 69 80 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0069_4000", + "frame": "00 00 69 40 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0069_2000", + "frame": "00 00 69 20 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0069_1000", + "frame": "00 00 69 10 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0069_0800", + "frame": "00 00 69 08 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0069", + "frame": "00 00 69 00 00 33", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006A_8000", + "frame": "00 00 6A 80 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006A_4000", + "frame": "00 00 6A 40 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006A_2000", + "frame": "00 00 6A 20 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006A_1000", + "frame": "00 00 6A 10 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006A_0800", + "frame": "00 00 6A 08 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006A", + "frame": "00 00 6A 00 00 30", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006B_8000", + "frame": "00 00 6B 80 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006B_4000", + "frame": "00 00 6B 40 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006B_2000", + "frame": "00 00 6B 20 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006B_1000", + "frame": "00 00 6B 10 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006B_0800", + "frame": "00 00 6B 08 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006B", + "frame": "00 00 6B 00 00 31", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006C_8000", + "frame": "00 00 6C 80 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006C_4000", + "frame": "00 00 6C 40 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006C_2000", + "frame": "00 00 6C 20 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006C_1000", + "frame": "00 00 6C 10 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006C_0800", + "frame": "00 00 6C 08 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006C", + "frame": "00 00 6C 00 00 36", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006D_8000", + "frame": "00 00 6D 80 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006D_4000", + "frame": "00 00 6D 40 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006D_2000", + "frame": "00 00 6D 20 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006D_1000", + "frame": "00 00 6D 10 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006D_0800", + "frame": "00 00 6D 08 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006D", + "frame": "00 00 6D 00 00 37", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006E_8000", + "frame": "00 00 6E 80 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006E_4000", + "frame": "00 00 6E 40 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006E_2000", + "frame": "00 00 6E 20 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006E_1000", + "frame": "00 00 6E 10 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006E_0800", + "frame": "00 00 6E 08 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006E", + "frame": "00 00 6E 00 00 34", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_006F_8000", + "frame": "00 00 6F 80 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006F_4000", + "frame": "00 00 6F 40 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006F_2000", + "frame": "00 00 6F 20 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006F_1000", + "frame": "00 00 6F 10 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_006F_0800", + "frame": "00 00 6F 08 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_006F", + "frame": "00 00 6F 00 00 35", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0070_8000", + "frame": "00 00 70 80 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0070_4000", + "frame": "00 00 70 40 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0070_2000", + "frame": "00 00 70 20 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0070_1000", + "frame": "00 00 70 10 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0070_0800", + "frame": "00 00 70 08 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0070", + "frame": "00 00 70 00 00 2A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0071", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0071_8000", + "frame": "00 00 71 80 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0071_4000", + "frame": "00 00 71 40 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0071_2000", + "frame": "00 00 71 20 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0071_1000", + "frame": "00 00 71 10 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0071_0800", + "frame": "00 00 71 08 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0071", + "frame": "00 00 71 00 00 2B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0072_8000", + "frame": "00 00 72 80 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0072_4000", + "frame": "00 00 72 40 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0072_2000", + "frame": "00 00 72 20 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0072_1000", + "frame": "00 00 72 10 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0072_0800", + "frame": "00 00 72 08 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0072", + "frame": "00 00 72 00 00 28", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0073_8000", + "frame": "00 00 73 80 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0073_4000", + "frame": "00 00 73 40 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0073_2000", + "frame": "00 00 73 20 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0073_1000", + "frame": "00 00 73 10 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0073_0800", + "frame": "00 00 73 08 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0073", + "frame": "00 00 73 00 00 29", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0074_8000", + "frame": "00 00 74 80 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0074_4000", + "frame": "00 00 74 40 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0074_2000", + "frame": "00 00 74 20 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0074_1000", + "frame": "00 00 74 10 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0074_0800", + "frame": "00 00 74 08 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0074", + "frame": "00 00 74 00 00 2E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0075_8000", + "frame": "00 00 75 80 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0075_4000", + "frame": "00 00 75 40 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0075_2000", + "frame": "00 00 75 20 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0075_1000", + "frame": "00 00 75 10 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0075_0800", + "frame": "00 00 75 08 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0075", + "frame": "00 00 75 00 00 2F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0076_8000", + "frame": "00 00 76 80 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0076_4000", + "frame": "00 00 76 40 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0076_2000", + "frame": "00 00 76 20 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0076_1000", + "frame": "00 00 76 10 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0076_0800", + "frame": "00 00 76 08 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0076", + "frame": "00 00 76 00 00 2C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0077_8000", + "frame": "00 00 77 80 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0077_4000", + "frame": "00 00 77 40 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0077_2000", + "frame": "00 00 77 20 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0077_1000", + "frame": "00 00 77 10 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0077_0800", + "frame": "00 00 77 08 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0077", + "frame": "00 00 77 00 00 2D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0078_8000", + "frame": "00 00 78 80 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0078_4000", + "frame": "00 00 78 40 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0078_2000", + "frame": "00 00 78 20 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0078_1000", + "frame": "00 00 78 10 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0078_0800", + "frame": "00 00 78 08 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0078", + "frame": "00 00 78 00 00 22", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0079", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0079_8000", + "frame": "00 00 79 80 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0079_4000", + "frame": "00 00 79 40 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0079_2000", + "frame": "00 00 79 20 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0079_1000", + "frame": "00 00 79 10 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0079_0800", + "frame": "00 00 79 08 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0079", + "frame": "00 00 79 00 00 23", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007A_8000", + "frame": "00 00 7A 80 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007A_4000", + "frame": "00 00 7A 40 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007A_2000", + "frame": "00 00 7A 20 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007A_1000", + "frame": "00 00 7A 10 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007A_0800", + "frame": "00 00 7A 08 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007A", + "frame": "00 00 7A 00 00 20", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007B_8000", + "frame": "00 00 7B 80 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007B_4000", + "frame": "00 00 7B 40 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007B_2000", + "frame": "00 00 7B 20 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007B_1000", + "frame": "00 00 7B 10 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007B_0800", + "frame": "00 00 7B 08 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007B", + "frame": "00 00 7B 00 00 21", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007C_8000", + "frame": "00 00 7C 80 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007C_4000", + "frame": "00 00 7C 40 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007C_2000", + "frame": "00 00 7C 20 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007C_1000", + "frame": "00 00 7C 10 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007C_0800", + "frame": "00 00 7C 08 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007C", + "frame": "00 00 7C 00 00 26", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007D_8000", + "frame": "00 00 7D 80 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007D_4000", + "frame": "00 00 7D 40 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007D_2000", + "frame": "00 00 7D 20 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007D_1000", + "frame": "00 00 7D 10 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007D_0800", + "frame": "00 00 7D 08 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007D", + "frame": "00 00 7D 00 00 27", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007E_8000", + "frame": "00 00 7E 80 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007E_4000", + "frame": "00 00 7E 40 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007E_2000", + "frame": "00 00 7E 20 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007E_1000", + "frame": "00 00 7E 10 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007E_0800", + "frame": "00 00 7E 08 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007E", + "frame": "00 00 7E 00 00 24", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_007F_8000", + "frame": "00 00 7F 80 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007F_4000", + "frame": "00 00 7F 40 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007F_2000", + "frame": "00 00 7F 20 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007F_1000", + "frame": "00 00 7F 10 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_007F_0800", + "frame": "00 00 7F 08 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_007F", + "frame": "00 00 7F 00 00 25", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0080_8000", + "frame": "00 01 00 80 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0080_4000", + "frame": "00 01 00 40 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0080_2000", + "frame": "00 01 00 20 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0080_1000", + "frame": "00 01 00 10 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0080_0800", + "frame": "00 01 00 08 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0080", + "frame": "00 01 00 00 00 5B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_005_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_005_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0081", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0081_8000", + "frame": "00 01 01 80 00 DA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0081_4000", + "frame": "00 01 01 40 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0081_2000", + "frame": "00 01 01 20 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0081_1000", + "frame": "00 01 01 10 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0081_0800", + "frame": "00 01 01 08 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0081", + "frame": "00 01 01 00 00 5A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0082_8000", + "frame": "00 01 02 80 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0082_4000", + "frame": "00 01 02 40 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0082_2000", + "frame": "00 01 02 20 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0082_1000", + "frame": "00 01 02 10 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0082_0800", + "frame": "00 01 02 08 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0082", + "frame": "00 01 02 00 00 59", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0083_8000", + "frame": "00 01 03 80 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0083_4000", + "frame": "00 01 03 40 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0083_2000", + "frame": "00 01 03 20 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0083_1000", + "frame": "00 01 03 10 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0083_0800", + "frame": "00 01 03 08 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0083", + "frame": "00 01 03 00 00 58", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0084_8000", + "frame": "00 01 04 80 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0084_4000", + "frame": "00 01 04 40 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0084_2000", + "frame": "00 01 04 20 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0084_1000", + "frame": "00 01 04 10 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0084_0800", + "frame": "00 01 04 08 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0084", + "frame": "00 01 04 00 00 5F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0085_8000", + "frame": "00 01 05 80 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0085_4000", + "frame": "00 01 05 40 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0085_2000", + "frame": "00 01 05 20 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0085_1000", + "frame": "00 01 05 10 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0085_0800", + "frame": "00 01 05 08 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0085", + "frame": "00 01 05 00 00 5E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0086_8000", + "frame": "00 01 06 80 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0086_4000", + "frame": "00 01 06 40 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0086_2000", + "frame": "00 01 06 20 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0086_1000", + "frame": "00 01 06 10 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0086_0800", + "frame": "00 01 06 08 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0086", + "frame": "00 01 06 00 00 5D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0087_8000", + "frame": "00 01 07 80 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0087_4000", + "frame": "00 01 07 40 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0087_2000", + "frame": "00 01 07 20 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0087_1000", + "frame": "00 01 07 10 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0087_0800", + "frame": "00 01 07 08 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0087", + "frame": "00 01 07 00 00 5C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0088_8000", + "frame": "00 01 08 80 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0088_4000", + "frame": "00 01 08 40 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0088_2000", + "frame": "00 01 08 20 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0088_1000", + "frame": "00 01 08 10 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0088_0800", + "frame": "00 01 08 08 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0088", + "frame": "00 01 08 00 00 53", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0089", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0089_8000", + "frame": "00 01 09 80 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0089_4000", + "frame": "00 01 09 40 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0089_2000", + "frame": "00 01 09 20 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0089_1000", + "frame": "00 01 09 10 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0089_0800", + "frame": "00 01 09 08 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0089", + "frame": "00 01 09 00 00 52", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008A_8000", + "frame": "00 01 0A 80 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008A_4000", + "frame": "00 01 0A 40 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008A_2000", + "frame": "00 01 0A 20 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008A_1000", + "frame": "00 01 0A 10 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008A_0800", + "frame": "00 01 0A 08 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008A", + "frame": "00 01 0A 00 00 51", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008B_8000", + "frame": "00 01 0B 80 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008B_4000", + "frame": "00 01 0B 40 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008B_2000", + "frame": "00 01 0B 20 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008B_1000", + "frame": "00 01 0B 10 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008B_0800", + "frame": "00 01 0B 08 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008B", + "frame": "00 01 0B 00 00 50", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008C_8000", + "frame": "00 01 0C 80 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008C_4000", + "frame": "00 01 0C 40 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008C_2000", + "frame": "00 01 0C 20 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008C_1000", + "frame": "00 01 0C 10 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008C_0800", + "frame": "00 01 0C 08 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008C", + "frame": "00 01 0C 00 00 57", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008D_8000", + "frame": "00 01 0D 80 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008D_4000", + "frame": "00 01 0D 40 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008D_2000", + "frame": "00 01 0D 20 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008D_1000", + "frame": "00 01 0D 10 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008D_0800", + "frame": "00 01 0D 08 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008D", + "frame": "00 01 0D 00 00 56", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008E_8000", + "frame": "00 01 0E 80 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008E_4000", + "frame": "00 01 0E 40 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008E_2000", + "frame": "00 01 0E 20 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008E_1000", + "frame": "00 01 0E 10 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008E_0800", + "frame": "00 01 0E 08 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008E", + "frame": "00 01 0E 00 00 55", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_008F_8000", + "frame": "00 01 0F 80 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008F_4000", + "frame": "00 01 0F 40 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008F_2000", + "frame": "00 01 0F 20 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008F_1000", + "frame": "00 01 0F 10 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_008F_0800", + "frame": "00 01 0F 08 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_008F", + "frame": "00 01 0F 00 00 54", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0090_8000", + "frame": "00 01 10 80 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0090_4000", + "frame": "00 01 10 40 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0090_2000", + "frame": "00 01 10 20 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0090_1000", + "frame": "00 01 10 10 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0090_0800", + "frame": "00 01 10 08 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0090", + "frame": "00 01 10 00 00 4B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0091", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0091_8000", + "frame": "00 01 11 80 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0091_4000", + "frame": "00 01 11 40 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0091_2000", + "frame": "00 01 11 20 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0091_1000", + "frame": "00 01 11 10 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0091_0800", + "frame": "00 01 11 08 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0091", + "frame": "00 01 11 00 00 4A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0092_8000", + "frame": "00 01 12 80 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0092_4000", + "frame": "00 01 12 40 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0092_2000", + "frame": "00 01 12 20 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0092_1000", + "frame": "00 01 12 10 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0092_0800", + "frame": "00 01 12 08 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0092", + "frame": "00 01 12 00 00 49", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0093_8000", + "frame": "00 01 13 80 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0093_4000", + "frame": "00 01 13 40 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0093_2000", + "frame": "00 01 13 20 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0093_1000", + "frame": "00 01 13 10 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0093_0800", + "frame": "00 01 13 08 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0093", + "frame": "00 01 13 00 00 48", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0094_8000", + "frame": "00 01 14 80 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0094_4000", + "frame": "00 01 14 40 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0094_2000", + "frame": "00 01 14 20 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0094_1000", + "frame": "00 01 14 10 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0094_0800", + "frame": "00 01 14 08 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0094", + "frame": "00 01 14 00 00 4F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0095_8000", + "frame": "00 01 15 80 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0095_4000", + "frame": "00 01 15 40 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0095_2000", + "frame": "00 01 15 20 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0095_1000", + "frame": "00 01 15 10 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0095_0800", + "frame": "00 01 15 08 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0095", + "frame": "00 01 15 00 00 4E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0096_8000", + "frame": "00 01 16 80 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0096_4000", + "frame": "00 01 16 40 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0096_2000", + "frame": "00 01 16 20 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0096_1000", + "frame": "00 01 16 10 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0096_0800", + "frame": "00 01 16 08 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0096", + "frame": "00 01 16 00 00 4D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0097_8000", + "frame": "00 01 17 80 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0097_4000", + "frame": "00 01 17 40 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0097_2000", + "frame": "00 01 17 20 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0097_1000", + "frame": "00 01 17 10 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0097_0800", + "frame": "00 01 17 08 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0097", + "frame": "00 01 17 00 00 4C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0098_8000", + "frame": "00 01 18 80 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0098_4000", + "frame": "00 01 18 40 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0098_2000", + "frame": "00 01 18 20 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0098_1000", + "frame": "00 01 18 10 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0098_0800", + "frame": "00 01 18 08 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0098", + "frame": "00 01 18 00 00 43", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0099", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0099_8000", + "frame": "00 01 19 80 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0099_4000", + "frame": "00 01 19 40 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0099_2000", + "frame": "00 01 19 20 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0099_1000", + "frame": "00 01 19 10 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0099_0800", + "frame": "00 01 19 08 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0099", + "frame": "00 01 19 00 00 42", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009A_8000", + "frame": "00 01 1A 80 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009A_4000", + "frame": "00 01 1A 40 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009A_2000", + "frame": "00 01 1A 20 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009A_1000", + "frame": "00 01 1A 10 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009A_0800", + "frame": "00 01 1A 08 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009A", + "frame": "00 01 1A 00 00 41", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009B_8000", + "frame": "00 01 1B 80 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009B_4000", + "frame": "00 01 1B 40 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009B_2000", + "frame": "00 01 1B 20 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009B_1000", + "frame": "00 01 1B 10 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009B_0800", + "frame": "00 01 1B 08 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009B", + "frame": "00 01 1B 00 00 40", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009C_8000", + "frame": "00 01 1C 80 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009C_4000", + "frame": "00 01 1C 40 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009C_2000", + "frame": "00 01 1C 20 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009C_1000", + "frame": "00 01 1C 10 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009C_0800", + "frame": "00 01 1C 08 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009C", + "frame": "00 01 1C 00 00 47", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009D_8000", + "frame": "00 01 1D 80 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009D_4000", + "frame": "00 01 1D 40 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009D_2000", + "frame": "00 01 1D 20 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009D_1000", + "frame": "00 01 1D 10 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009D_0800", + "frame": "00 01 1D 08 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009D", + "frame": "00 01 1D 00 00 46", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009E_8000", + "frame": "00 01 1E 80 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009E_4000", + "frame": "00 01 1E 40 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009E_2000", + "frame": "00 01 1E 20 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009E_1000", + "frame": "00 01 1E 10 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009E_0800", + "frame": "00 01 1E 08 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009E", + "frame": "00 01 1E 00 00 45", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_009F_8000", + "frame": "00 01 1F 80 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009F_4000", + "frame": "00 01 1F 40 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009F_2000", + "frame": "00 01 1F 20 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009F_1000", + "frame": "00 01 1F 10 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_009F_0800", + "frame": "00 01 1F 08 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_009F", + "frame": "00 01 1F 00 00 44", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A0_8000", + "frame": "00 01 20 80 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A0_4000", + "frame": "00 01 20 40 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A0_2000", + "frame": "00 01 20 20 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A0_1000", + "frame": "00 01 20 10 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A0_0800", + "frame": "00 01 20 08 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A0", + "frame": "00 01 20 00 00 7B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_006_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_006_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00A1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A1_8000", + "frame": "00 01 21 80 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A1_4000", + "frame": "00 01 21 40 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A1_2000", + "frame": "00 01 21 20 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A1_1000", + "frame": "00 01 21 10 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A1_0800", + "frame": "00 01 21 08 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A1", + "frame": "00 01 21 00 00 7A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A2_8000", + "frame": "00 01 22 80 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A2_4000", + "frame": "00 01 22 40 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A2_2000", + "frame": "00 01 22 20 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A2_1000", + "frame": "00 01 22 10 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A2_0800", + "frame": "00 01 22 08 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A2", + "frame": "00 01 22 00 00 79", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A3_8000", + "frame": "00 01 23 80 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A3_4000", + "frame": "00 01 23 40 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A3_2000", + "frame": "00 01 23 20 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A3_1000", + "frame": "00 01 23 10 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A3_0800", + "frame": "00 01 23 08 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A3", + "frame": "00 01 23 00 00 78", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A4_8000", + "frame": "00 01 24 80 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A4_4000", + "frame": "00 01 24 40 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A4_2000", + "frame": "00 01 24 20 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A4_1000", + "frame": "00 01 24 10 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A4_0800", + "frame": "00 01 24 08 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A4", + "frame": "00 01 24 00 00 7F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A5_8000", + "frame": "00 01 25 80 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A5_4000", + "frame": "00 01 25 40 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A5_2000", + "frame": "00 01 25 20 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A5_1000", + "frame": "00 01 25 10 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A5_0800", + "frame": "00 01 25 08 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A5", + "frame": "00 01 25 00 00 7E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A6_8000", + "frame": "00 01 26 80 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A6_4000", + "frame": "00 01 26 40 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A6_2000", + "frame": "00 01 26 20 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A6_1000", + "frame": "00 01 26 10 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A6_0800", + "frame": "00 01 26 08 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A6", + "frame": "00 01 26 00 00 7D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A7_8000", + "frame": "00 01 27 80 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A7_4000", + "frame": "00 01 27 40 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A7_2000", + "frame": "00 01 27 20 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A7_1000", + "frame": "00 01 27 10 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A7_0800", + "frame": "00 01 27 08 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A7", + "frame": "00 01 27 00 00 7C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A8_8000", + "frame": "00 01 28 80 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A8_4000", + "frame": "00 01 28 40 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A8_2000", + "frame": "00 01 28 20 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A8_1000", + "frame": "00 01 28 10 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A8_0800", + "frame": "00 01 28 08 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A8", + "frame": "00 01 28 00 00 73", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00A9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00A9_8000", + "frame": "00 01 29 80 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A9_4000", + "frame": "00 01 29 40 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A9_2000", + "frame": "00 01 29 20 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A9_1000", + "frame": "00 01 29 10 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00A9_0800", + "frame": "00 01 29 08 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00A9", + "frame": "00 01 29 00 00 72", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AA_8000", + "frame": "00 01 2A 80 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AA_4000", + "frame": "00 01 2A 40 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AA_2000", + "frame": "00 01 2A 20 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AA_1000", + "frame": "00 01 2A 10 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AA_0800", + "frame": "00 01 2A 08 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AA", + "frame": "00 01 2A 00 00 71", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AB_8000", + "frame": "00 01 2B 80 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AB_4000", + "frame": "00 01 2B 40 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AB_2000", + "frame": "00 01 2B 20 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AB_1000", + "frame": "00 01 2B 10 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AB_0800", + "frame": "00 01 2B 08 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AB", + "frame": "00 01 2B 00 00 70", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AC_8000", + "frame": "00 01 2C 80 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AC_4000", + "frame": "00 01 2C 40 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AC_2000", + "frame": "00 01 2C 20 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AC_1000", + "frame": "00 01 2C 10 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AC_0800", + "frame": "00 01 2C 08 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AC", + "frame": "00 01 2C 00 00 77", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AD_8000", + "frame": "00 01 2D 80 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AD_4000", + "frame": "00 01 2D 40 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AD_2000", + "frame": "00 01 2D 20 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AD_1000", + "frame": "00 01 2D 10 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AD_0800", + "frame": "00 01 2D 08 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AD", + "frame": "00 01 2D 00 00 76", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AE_8000", + "frame": "00 01 2E 80 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AE_4000", + "frame": "00 01 2E 40 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AE_2000", + "frame": "00 01 2E 20 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AE_1000", + "frame": "00 01 2E 10 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AE_0800", + "frame": "00 01 2E 08 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AE", + "frame": "00 01 2E 00 00 75", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00AF_8000", + "frame": "00 01 2F 80 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AF_4000", + "frame": "00 01 2F 40 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AF_2000", + "frame": "00 01 2F 20 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AF_1000", + "frame": "00 01 2F 10 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00AF_0800", + "frame": "00 01 2F 08 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00AF", + "frame": "00 01 2F 00 00 74", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B0_8000", + "frame": "00 01 30 80 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B0_4000", + "frame": "00 01 30 40 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B0_2000", + "frame": "00 01 30 20 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B0_1000", + "frame": "00 01 30 10 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B0_0800", + "frame": "00 01 30 08 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B0", + "frame": "00 01 30 00 00 6B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00B1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B1_8000", + "frame": "00 01 31 80 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B1_4000", + "frame": "00 01 31 40 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B1_2000", + "frame": "00 01 31 20 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B1_1000", + "frame": "00 01 31 10 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B1_0800", + "frame": "00 01 31 08 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B1", + "frame": "00 01 31 00 00 6A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B2_8000", + "frame": "00 01 32 80 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B2_4000", + "frame": "00 01 32 40 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B2_2000", + "frame": "00 01 32 20 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B2_1000", + "frame": "00 01 32 10 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B2_0800", + "frame": "00 01 32 08 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B2", + "frame": "00 01 32 00 00 69", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B3_8000", + "frame": "00 01 33 80 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B3_4000", + "frame": "00 01 33 40 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B3_2000", + "frame": "00 01 33 20 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B3_1000", + "frame": "00 01 33 10 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B3_0800", + "frame": "00 01 33 08 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B3", + "frame": "00 01 33 00 00 68", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B4_8000", + "frame": "00 01 34 80 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B4_4000", + "frame": "00 01 34 40 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B4_2000", + "frame": "00 01 34 20 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B4_1000", + "frame": "00 01 34 10 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B4_0800", + "frame": "00 01 34 08 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B4", + "frame": "00 01 34 00 00 6F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B5_8000", + "frame": "00 01 35 80 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B5_4000", + "frame": "00 01 35 40 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B5_2000", + "frame": "00 01 35 20 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B5_1000", + "frame": "00 01 35 10 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B5_0800", + "frame": "00 01 35 08 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B5", + "frame": "00 01 35 00 00 6E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B6_8000", + "frame": "00 01 36 80 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B6_4000", + "frame": "00 01 36 40 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B6_2000", + "frame": "00 01 36 20 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B6_1000", + "frame": "00 01 36 10 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B6_0800", + "frame": "00 01 36 08 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B6", + "frame": "00 01 36 00 00 6D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B7_8000", + "frame": "00 01 37 80 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B7_4000", + "frame": "00 01 37 40 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B7_2000", + "frame": "00 01 37 20 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B7_1000", + "frame": "00 01 37 10 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B7_0800", + "frame": "00 01 37 08 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B7", + "frame": "00 01 37 00 00 6C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B8_8000", + "frame": "00 01 38 80 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B8_4000", + "frame": "00 01 38 40 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B8_2000", + "frame": "00 01 38 20 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B8_1000", + "frame": "00 01 38 10 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B8_0800", + "frame": "00 01 38 08 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B8", + "frame": "00 01 38 00 00 63", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00B9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00B9_8000", + "frame": "00 01 39 80 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B9_4000", + "frame": "00 01 39 40 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B9_2000", + "frame": "00 01 39 20 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B9_1000", + "frame": "00 01 39 10 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00B9_0800", + "frame": "00 01 39 08 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00B9", + "frame": "00 01 39 00 00 62", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BA_8000", + "frame": "00 01 3A 80 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BA_4000", + "frame": "00 01 3A 40 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BA_2000", + "frame": "00 01 3A 20 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BA_1000", + "frame": "00 01 3A 10 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BA_0800", + "frame": "00 01 3A 08 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BA", + "frame": "00 01 3A 00 00 61", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BB_8000", + "frame": "00 01 3B 80 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BB_4000", + "frame": "00 01 3B 40 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BB_2000", + "frame": "00 01 3B 20 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BB_1000", + "frame": "00 01 3B 10 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BB_0800", + "frame": "00 01 3B 08 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BB", + "frame": "00 01 3B 00 00 60", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BC_8000", + "frame": "00 01 3C 80 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BC_4000", + "frame": "00 01 3C 40 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BC_2000", + "frame": "00 01 3C 20 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BC_1000", + "frame": "00 01 3C 10 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BC_0800", + "frame": "00 01 3C 08 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BC", + "frame": "00 01 3C 00 00 67", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BD_8000", + "frame": "00 01 3D 80 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BD_4000", + "frame": "00 01 3D 40 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BD_2000", + "frame": "00 01 3D 20 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BD_1000", + "frame": "00 01 3D 10 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BD_0800", + "frame": "00 01 3D 08 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BD", + "frame": "00 01 3D 00 00 66", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BE_8000", + "frame": "00 01 3E 80 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BE_4000", + "frame": "00 01 3E 40 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BE_2000", + "frame": "00 01 3E 20 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BE_1000", + "frame": "00 01 3E 10 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BE_0800", + "frame": "00 01 3E 08 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BE", + "frame": "00 01 3E 00 00 65", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00BF_8000", + "frame": "00 01 3F 80 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BF_4000", + "frame": "00 01 3F 40 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BF_2000", + "frame": "00 01 3F 20 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BF_1000", + "frame": "00 01 3F 10 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00BF_0800", + "frame": "00 01 3F 08 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00BF", + "frame": "00 01 3F 00 00 64", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C0_8000", + "frame": "00 01 40 80 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C0_4000", + "frame": "00 01 40 40 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C0_2000", + "frame": "00 01 40 20 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C0_1000", + "frame": "00 01 40 10 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C0_0800", + "frame": "00 01 40 08 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C0", + "frame": "00 01 40 00 00 1B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_007_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_007_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00C1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C1_8000", + "frame": "00 01 41 80 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C1_4000", + "frame": "00 01 41 40 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C1_2000", + "frame": "00 01 41 20 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C1_1000", + "frame": "00 01 41 10 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C1_0800", + "frame": "00 01 41 08 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C1", + "frame": "00 01 41 00 00 1A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C2_8000", + "frame": "00 01 42 80 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C2_4000", + "frame": "00 01 42 40 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C2_2000", + "frame": "00 01 42 20 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C2_1000", + "frame": "00 01 42 10 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C2_0800", + "frame": "00 01 42 08 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C2", + "frame": "00 01 42 00 00 19", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C3_8000", + "frame": "00 01 43 80 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C3_4000", + "frame": "00 01 43 40 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C3_2000", + "frame": "00 01 43 20 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C3_1000", + "frame": "00 01 43 10 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C3_0800", + "frame": "00 01 43 08 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C3", + "frame": "00 01 43 00 00 18", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C4_8000", + "frame": "00 01 44 80 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C4_4000", + "frame": "00 01 44 40 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C4_2000", + "frame": "00 01 44 20 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C4_1000", + "frame": "00 01 44 10 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C4_0800", + "frame": "00 01 44 08 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C4", + "frame": "00 01 44 00 00 1F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C5_8000", + "frame": "00 01 45 80 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C5_4000", + "frame": "00 01 45 40 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C5_2000", + "frame": "00 01 45 20 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C5_1000", + "frame": "00 01 45 10 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C5_0800", + "frame": "00 01 45 08 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C5", + "frame": "00 01 45 00 00 1E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C6_8000", + "frame": "00 01 46 80 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C6_4000", + "frame": "00 01 46 40 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C6_2000", + "frame": "00 01 46 20 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C6_1000", + "frame": "00 01 46 10 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C6_0800", + "frame": "00 01 46 08 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C6", + "frame": "00 01 46 00 00 1D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C7_8000", + "frame": "00 01 47 80 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C7_4000", + "frame": "00 01 47 40 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C7_2000", + "frame": "00 01 47 20 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C7_1000", + "frame": "00 01 47 10 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C7_0800", + "frame": "00 01 47 08 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C7", + "frame": "00 01 47 00 00 1C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C8_8000", + "frame": "00 01 48 80 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C8_4000", + "frame": "00 01 48 40 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C8_2000", + "frame": "00 01 48 20 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C8_1000", + "frame": "00 01 48 10 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C8_0800", + "frame": "00 01 48 08 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C8", + "frame": "00 01 48 00 00 13", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00C9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00C9_8000", + "frame": "00 01 49 80 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C9_4000", + "frame": "00 01 49 40 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C9_2000", + "frame": "00 01 49 20 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C9_1000", + "frame": "00 01 49 10 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00C9_0800", + "frame": "00 01 49 08 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00C9", + "frame": "00 01 49 00 00 12", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CA_8000", + "frame": "00 01 4A 80 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CA_4000", + "frame": "00 01 4A 40 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CA_2000", + "frame": "00 01 4A 20 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CA_1000", + "frame": "00 01 4A 10 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CA_0800", + "frame": "00 01 4A 08 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CA", + "frame": "00 01 4A 00 00 11", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CB_8000", + "frame": "00 01 4B 80 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CB_4000", + "frame": "00 01 4B 40 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CB_2000", + "frame": "00 01 4B 20 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CB_1000", + "frame": "00 01 4B 10 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CB_0800", + "frame": "00 01 4B 08 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CB", + "frame": "00 01 4B 00 00 10", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CC_8000", + "frame": "00 01 4C 80 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CC_4000", + "frame": "00 01 4C 40 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CC_2000", + "frame": "00 01 4C 20 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CC_1000", + "frame": "00 01 4C 10 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CC_0800", + "frame": "00 01 4C 08 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CC", + "frame": "00 01 4C 00 00 17", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CD_8000", + "frame": "00 01 4D 80 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CD_4000", + "frame": "00 01 4D 40 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CD_2000", + "frame": "00 01 4D 20 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CD_1000", + "frame": "00 01 4D 10 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CD_0800", + "frame": "00 01 4D 08 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CD", + "frame": "00 01 4D 00 00 16", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CE_8000", + "frame": "00 01 4E 80 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CE_4000", + "frame": "00 01 4E 40 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CE_2000", + "frame": "00 01 4E 20 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CE_1000", + "frame": "00 01 4E 10 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CE_0800", + "frame": "00 01 4E 08 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CE", + "frame": "00 01 4E 00 00 15", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00CF_8000", + "frame": "00 01 4F 80 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CF_4000", + "frame": "00 01 4F 40 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CF_2000", + "frame": "00 01 4F 20 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CF_1000", + "frame": "00 01 4F 10 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00CF_0800", + "frame": "00 01 4F 08 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00CF", + "frame": "00 01 4F 00 00 14", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D0_8000", + "frame": "00 01 50 80 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D0_4000", + "frame": "00 01 50 40 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D0_2000", + "frame": "00 01 50 20 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D0_1000", + "frame": "00 01 50 10 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D0_0800", + "frame": "00 01 50 08 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D0", + "frame": "00 01 50 00 00 0B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00D1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D1_8000", + "frame": "00 01 51 80 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D1_4000", + "frame": "00 01 51 40 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D1_2000", + "frame": "00 01 51 20 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D1_1000", + "frame": "00 01 51 10 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D1_0800", + "frame": "00 01 51 08 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D1", + "frame": "00 01 51 00 00 0A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D2_8000", + "frame": "00 01 52 80 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D2_4000", + "frame": "00 01 52 40 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D2_2000", + "frame": "00 01 52 20 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D2_1000", + "frame": "00 01 52 10 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D2_0800", + "frame": "00 01 52 08 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D2", + "frame": "00 01 52 00 00 09", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D3_8000", + "frame": "00 01 53 80 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D3_4000", + "frame": "00 01 53 40 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D3_2000", + "frame": "00 01 53 20 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D3_1000", + "frame": "00 01 53 10 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D3_0800", + "frame": "00 01 53 08 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D3", + "frame": "00 01 53 00 00 08", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D4_8000", + "frame": "00 01 54 80 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D4_4000", + "frame": "00 01 54 40 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D4_2000", + "frame": "00 01 54 20 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D4_1000", + "frame": "00 01 54 10 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D4_0800", + "frame": "00 01 54 08 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D4", + "frame": "00 01 54 00 00 0F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D5_8000", + "frame": "00 01 55 80 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D5_4000", + "frame": "00 01 55 40 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D5_2000", + "frame": "00 01 55 20 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D5_1000", + "frame": "00 01 55 10 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D5_0800", + "frame": "00 01 55 08 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D5", + "frame": "00 01 55 00 00 0E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D6_8000", + "frame": "00 01 56 80 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D6_4000", + "frame": "00 01 56 40 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D6_2000", + "frame": "00 01 56 20 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D6_1000", + "frame": "00 01 56 10 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D6_0800", + "frame": "00 01 56 08 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D6", + "frame": "00 01 56 00 00 0D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D7_8000", + "frame": "00 01 57 80 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D7_4000", + "frame": "00 01 57 40 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D7_2000", + "frame": "00 01 57 20 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D7_1000", + "frame": "00 01 57 10 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D7_0800", + "frame": "00 01 57 08 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D7", + "frame": "00 01 57 00 00 0C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D8_8000", + "frame": "00 01 58 80 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D8_4000", + "frame": "00 01 58 40 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D8_2000", + "frame": "00 01 58 20 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D8_1000", + "frame": "00 01 58 10 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D8_0800", + "frame": "00 01 58 08 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D8", + "frame": "00 01 58 00 00 03", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00D9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00D9_8000", + "frame": "00 01 59 80 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D9_4000", + "frame": "00 01 59 40 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D9_2000", + "frame": "00 01 59 20 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D9_1000", + "frame": "00 01 59 10 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00D9_0800", + "frame": "00 01 59 08 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00D9", + "frame": "00 01 59 00 00 02", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DA_8000", + "frame": "00 01 5A 80 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DA_4000", + "frame": "00 01 5A 40 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DA_2000", + "frame": "00 01 5A 20 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DA_1000", + "frame": "00 01 5A 10 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DA_0800", + "frame": "00 01 5A 08 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DA", + "frame": "00 01 5A 00 00 01", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DB_8000", + "frame": "00 01 5B 80 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DB_4000", + "frame": "00 01 5B 40 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DB_2000", + "frame": "00 01 5B 20 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DB_1000", + "frame": "00 01 5B 10 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DB_0800", + "frame": "00 01 5B 08 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DB", + "frame": "00 01 5B 00 00 00", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DC_8000", + "frame": "00 01 5C 80 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DC_4000", + "frame": "00 01 5C 40 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DC_2000", + "frame": "00 01 5C 20 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DC_1000", + "frame": "00 01 5C 10 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DC_0800", + "frame": "00 01 5C 08 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DC", + "frame": "00 01 5C 00 00 07", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DD_8000", + "frame": "00 01 5D 80 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DD_4000", + "frame": "00 01 5D 40 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DD_2000", + "frame": "00 01 5D 20 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DD_1000", + "frame": "00 01 5D 10 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DD_0800", + "frame": "00 01 5D 08 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DD", + "frame": "00 01 5D 00 00 06", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DE_8000", + "frame": "00 01 5E 80 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DE_4000", + "frame": "00 01 5E 40 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DE_2000", + "frame": "00 01 5E 20 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DE_1000", + "frame": "00 01 5E 10 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DE_0800", + "frame": "00 01 5E 08 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DE", + "frame": "00 01 5E 00 00 05", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00DF_8000", + "frame": "00 01 5F 80 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DF_4000", + "frame": "00 01 5F 40 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DF_2000", + "frame": "00 01 5F 20 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DF_1000", + "frame": "00 01 5F 10 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00DF_0800", + "frame": "00 01 5F 08 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00DF", + "frame": "00 01 5F 00 00 04", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E0_8000", + "frame": "00 01 60 80 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E0_4000", + "frame": "00 01 60 40 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E0_2000", + "frame": "00 01 60 20 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E0_1000", + "frame": "00 01 60 10 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E0_0800", + "frame": "00 01 60 08 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E0", + "frame": "00 01 60 00 00 3B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_008_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_008_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00E1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E1_8000", + "frame": "00 01 61 80 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E1_4000", + "frame": "00 01 61 40 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E1_2000", + "frame": "00 01 61 20 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E1_1000", + "frame": "00 01 61 10 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E1_0800", + "frame": "00 01 61 08 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E1", + "frame": "00 01 61 00 00 3A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E2_8000", + "frame": "00 01 62 80 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E2_4000", + "frame": "00 01 62 40 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E2_2000", + "frame": "00 01 62 20 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E2_1000", + "frame": "00 01 62 10 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E2_0800", + "frame": "00 01 62 08 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E2", + "frame": "00 01 62 00 00 39", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E3_8000", + "frame": "00 01 63 80 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E3_4000", + "frame": "00 01 63 40 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E3_2000", + "frame": "00 01 63 20 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E3_1000", + "frame": "00 01 63 10 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E3_0800", + "frame": "00 01 63 08 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E3", + "frame": "00 01 63 00 00 38", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E4_8000", + "frame": "00 01 64 80 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E4_4000", + "frame": "00 01 64 40 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E4_2000", + "frame": "00 01 64 20 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E4_1000", + "frame": "00 01 64 10 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E4_0800", + "frame": "00 01 64 08 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E4", + "frame": "00 01 64 00 00 3F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E5_8000", + "frame": "00 01 65 80 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E5_4000", + "frame": "00 01 65 40 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E5_2000", + "frame": "00 01 65 20 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E5_1000", + "frame": "00 01 65 10 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E5_0800", + "frame": "00 01 65 08 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E5", + "frame": "00 01 65 00 00 3E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E6_8000", + "frame": "00 01 66 80 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E6_4000", + "frame": "00 01 66 40 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E6_2000", + "frame": "00 01 66 20 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E6_1000", + "frame": "00 01 66 10 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E6_0800", + "frame": "00 01 66 08 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E6", + "frame": "00 01 66 00 00 3D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E7_8000", + "frame": "00 01 67 80 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E7_4000", + "frame": "00 01 67 40 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E7_2000", + "frame": "00 01 67 20 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E7_1000", + "frame": "00 01 67 10 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E7_0800", + "frame": "00 01 67 08 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E7", + "frame": "00 01 67 00 00 3C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E8_8000", + "frame": "00 01 68 80 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E8_4000", + "frame": "00 01 68 40 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E8_2000", + "frame": "00 01 68 20 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E8_1000", + "frame": "00 01 68 10 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E8_0800", + "frame": "00 01 68 08 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E8", + "frame": "00 01 68 00 00 33", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00E9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00E9_8000", + "frame": "00 01 69 80 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E9_4000", + "frame": "00 01 69 40 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E9_2000", + "frame": "00 01 69 20 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E9_1000", + "frame": "00 01 69 10 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00E9_0800", + "frame": "00 01 69 08 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00E9", + "frame": "00 01 69 00 00 32", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00EA_8000", + "frame": "00 01 6A 80 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EA_4000", + "frame": "00 01 6A 40 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EA_2000", + "frame": "00 01 6A 20 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EA_1000", + "frame": "00 01 6A 10 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EA_0800", + "frame": "00 01 6A 08 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00EA", + "frame": "00 01 6A 00 00 31", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00EB_8000", + "frame": "00 01 6B 80 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EB_4000", + "frame": "00 01 6B 40 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EB_2000", + "frame": "00 01 6B 20 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EB_1000", + "frame": "00 01 6B 10 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EB_0800", + "frame": "00 01 6B 08 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00EB", + "frame": "00 01 6B 00 00 30", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00EC_8000", + "frame": "00 01 6C 80 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EC_4000", + "frame": "00 01 6C 40 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EC_2000", + "frame": "00 01 6C 20 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EC_1000", + "frame": "00 01 6C 10 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EC_0800", + "frame": "00 01 6C 08 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00EC", + "frame": "00 01 6C 00 00 37", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00ED_8000", + "frame": "00 01 6D 80 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00ED_4000", + "frame": "00 01 6D 40 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00ED_2000", + "frame": "00 01 6D 20 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00ED_1000", + "frame": "00 01 6D 10 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00ED_0800", + "frame": "00 01 6D 08 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00ED", + "frame": "00 01 6D 00 00 36", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00EE_8000", + "frame": "00 01 6E 80 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EE_4000", + "frame": "00 01 6E 40 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EE_2000", + "frame": "00 01 6E 20 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EE_1000", + "frame": "00 01 6E 10 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EE_0800", + "frame": "00 01 6E 08 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00EE", + "frame": "00 01 6E 00 00 35", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00EF_8000", + "frame": "00 01 6F 80 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EF_4000", + "frame": "00 01 6F 40 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EF_2000", + "frame": "00 01 6F 20 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EF_1000", + "frame": "00 01 6F 10 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00EF_0800", + "frame": "00 01 6F 08 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00EF", + "frame": "00 01 6F 00 00 34", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F0_8000", + "frame": "00 01 70 80 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F0_4000", + "frame": "00 01 70 40 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F0_2000", + "frame": "00 01 70 20 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F0_1000", + "frame": "00 01 70 10 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F0_0800", + "frame": "00 01 70 08 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F0", + "frame": "00 01 70 00 00 2B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00F1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F1_8000", + "frame": "00 01 71 80 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F1_4000", + "frame": "00 01 71 40 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F1_2000", + "frame": "00 01 71 20 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F1_1000", + "frame": "00 01 71 10 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F1_0800", + "frame": "00 01 71 08 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F1", + "frame": "00 01 71 00 00 2A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F2_8000", + "frame": "00 01 72 80 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F2_4000", + "frame": "00 01 72 40 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F2_2000", + "frame": "00 01 72 20 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F2_1000", + "frame": "00 01 72 10 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F2_0800", + "frame": "00 01 72 08 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F2", + "frame": "00 01 72 00 00 29", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F3_8000", + "frame": "00 01 73 80 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F3_4000", + "frame": "00 01 73 40 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F3_2000", + "frame": "00 01 73 20 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F3_1000", + "frame": "00 01 73 10 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F3_0800", + "frame": "00 01 73 08 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F3", + "frame": "00 01 73 00 00 28", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F4_8000", + "frame": "00 01 74 80 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F4_4000", + "frame": "00 01 74 40 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F4_2000", + "frame": "00 01 74 20 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F4_1000", + "frame": "00 01 74 10 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F4_0800", + "frame": "00 01 74 08 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F4", + "frame": "00 01 74 00 00 2F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F5_8000", + "frame": "00 01 75 80 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F5_4000", + "frame": "00 01 75 40 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F5_2000", + "frame": "00 01 75 20 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F5_1000", + "frame": "00 01 75 10 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F5_0800", + "frame": "00 01 75 08 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F5", + "frame": "00 01 75 00 00 2E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F6_8000", + "frame": "00 01 76 80 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F6_4000", + "frame": "00 01 76 40 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F6_2000", + "frame": "00 01 76 20 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F6_1000", + "frame": "00 01 76 10 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F6_0800", + "frame": "00 01 76 08 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F6", + "frame": "00 01 76 00 00 2D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F7_8000", + "frame": "00 01 77 80 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F7_4000", + "frame": "00 01 77 40 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F7_2000", + "frame": "00 01 77 20 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F7_1000", + "frame": "00 01 77 10 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F7_0800", + "frame": "00 01 77 08 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F7", + "frame": "00 01 77 00 00 2C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F8_8000", + "frame": "00 01 78 80 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F8_4000", + "frame": "00 01 78 40 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F8_2000", + "frame": "00 01 78 20 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F8_1000", + "frame": "00 01 78 10 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F8_0800", + "frame": "00 01 78 08 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F8", + "frame": "00 01 78 00 00 23", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_00F9", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00F9_8000", + "frame": "00 01 79 80 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F9_4000", + "frame": "00 01 79 40 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F9_2000", + "frame": "00 01 79 20 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F9_1000", + "frame": "00 01 79 10 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00F9_0800", + "frame": "00 01 79 08 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00F9", + "frame": "00 01 79 00 00 22", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FA_8000", + "frame": "00 01 7A 80 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FA_4000", + "frame": "00 01 7A 40 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FA_2000", + "frame": "00 01 7A 20 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FA_1000", + "frame": "00 01 7A 10 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FA_0800", + "frame": "00 01 7A 08 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FA", + "frame": "00 01 7A 00 00 21", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FB_8000", + "frame": "00 01 7B 80 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FB_4000", + "frame": "00 01 7B 40 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FB_2000", + "frame": "00 01 7B 20 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FB_1000", + "frame": "00 01 7B 10 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FB_0800", + "frame": "00 01 7B 08 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FB", + "frame": "00 01 7B 00 00 20", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FC_8000", + "frame": "00 01 7C 80 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FC_4000", + "frame": "00 01 7C 40 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FC_2000", + "frame": "00 01 7C 20 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FC_1000", + "frame": "00 01 7C 10 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FC_0800", + "frame": "00 01 7C 08 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FC", + "frame": "00 01 7C 00 00 27", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FD_8000", + "frame": "00 01 7D 80 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FD_4000", + "frame": "00 01 7D 40 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FD_2000", + "frame": "00 01 7D 20 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FD_1000", + "frame": "00 01 7D 10 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FD_0800", + "frame": "00 01 7D 08 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FD", + "frame": "00 01 7D 00 00 26", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FE_8000", + "frame": "00 01 7E 80 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FE_4000", + "frame": "00 01 7E 40 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FE_2000", + "frame": "00 01 7E 20 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FE_1000", + "frame": "00 01 7E 10 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FE_0800", + "frame": "00 01 7E 08 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FE", + "frame": "00 01 7E 00 00 25", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_00FF_8000", + "frame": "00 01 7F 80 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FF_4000", + "frame": "00 01 7F 40 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FF_2000", + "frame": "00 01 7F 20 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FF_1000", + "frame": "00 01 7F 10 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_00FF_0800", + "frame": "00 01 7F 08 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_00FF", + "frame": "00 01 7F 00 00 24", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0100_8000", + "frame": "00 01 80 80 00 5B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0100_4000", + "frame": "00 01 80 40 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0100_2000", + "frame": "00 01 80 20 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0100_1000", + "frame": "00 01 80 10 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0100_0800", + "frame": "00 01 80 08 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0100", + "frame": "00 01 80 00 00 DB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_009_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_009_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0101", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0101_8000", + "frame": "00 01 81 80 00 5A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0101_4000", + "frame": "00 01 81 40 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0101_2000", + "frame": "00 01 81 20 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0101_1000", + "frame": "00 01 81 10 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0101_0800", + "frame": "00 01 81 08 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0101", + "frame": "00 01 81 00 00 DA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0102_8000", + "frame": "00 01 82 80 00 59", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0102_4000", + "frame": "00 01 82 40 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0102_2000", + "frame": "00 01 82 20 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0102_1000", + "frame": "00 01 82 10 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0102_0800", + "frame": "00 01 82 08 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0102", + "frame": "00 01 82 00 00 D9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0103_8000", + "frame": "00 01 83 80 00 58", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0103_4000", + "frame": "00 01 83 40 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0103_2000", + "frame": "00 01 83 20 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0103_1000", + "frame": "00 01 83 10 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0103_0800", + "frame": "00 01 83 08 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0103", + "frame": "00 01 83 00 00 D8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0104_8000", + "frame": "00 01 84 80 00 5F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0104_4000", + "frame": "00 01 84 40 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0104_2000", + "frame": "00 01 84 20 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0104_1000", + "frame": "00 01 84 10 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0104_0800", + "frame": "00 01 84 08 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0104", + "frame": "00 01 84 00 00 DF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0105_8000", + "frame": "00 01 85 80 00 5E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0105_4000", + "frame": "00 01 85 40 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0105_2000", + "frame": "00 01 85 20 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0105_1000", + "frame": "00 01 85 10 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0105_0800", + "frame": "00 01 85 08 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0105", + "frame": "00 01 85 00 00 DE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0106_8000", + "frame": "00 01 86 80 00 5D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0106_4000", + "frame": "00 01 86 40 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0106_2000", + "frame": "00 01 86 20 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0106_1000", + "frame": "00 01 86 10 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0106_0800", + "frame": "00 01 86 08 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0106", + "frame": "00 01 86 00 00 DD", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0107_8000", + "frame": "00 01 87 80 00 5C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0107_4000", + "frame": "00 01 87 40 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0107_2000", + "frame": "00 01 87 20 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0107_1000", + "frame": "00 01 87 10 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0107_0800", + "frame": "00 01 87 08 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0107", + "frame": "00 01 87 00 00 DC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0108_8000", + "frame": "00 01 88 80 00 53", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0108_4000", + "frame": "00 01 88 40 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0108_2000", + "frame": "00 01 88 20 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0108_1000", + "frame": "00 01 88 10 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0108_0800", + "frame": "00 01 88 08 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0108", + "frame": "00 01 88 00 00 D3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0109", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0109_8000", + "frame": "00 01 89 80 00 52", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0109_4000", + "frame": "00 01 89 40 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0109_2000", + "frame": "00 01 89 20 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0109_1000", + "frame": "00 01 89 10 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0109_0800", + "frame": "00 01 89 08 00 DA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0109", + "frame": "00 01 89 00 00 D2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010A_8000", + "frame": "00 01 8A 80 00 51", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010A_4000", + "frame": "00 01 8A 40 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010A_2000", + "frame": "00 01 8A 20 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010A_1000", + "frame": "00 01 8A 10 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010A_0800", + "frame": "00 01 8A 08 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010A", + "frame": "00 01 8A 00 00 D1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010B_8000", + "frame": "00 01 8B 80 00 50", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010B_4000", + "frame": "00 01 8B 40 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010B_2000", + "frame": "00 01 8B 20 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010B_1000", + "frame": "00 01 8B 10 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010B_0800", + "frame": "00 01 8B 08 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010B", + "frame": "00 01 8B 00 00 D0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010C_8000", + "frame": "00 01 8C 80 00 57", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010C_4000", + "frame": "00 01 8C 40 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010C_2000", + "frame": "00 01 8C 20 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010C_1000", + "frame": "00 01 8C 10 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010C_0800", + "frame": "00 01 8C 08 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010C", + "frame": "00 01 8C 00 00 D7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010D_8000", + "frame": "00 01 8D 80 00 56", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010D_4000", + "frame": "00 01 8D 40 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010D_2000", + "frame": "00 01 8D 20 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010D_1000", + "frame": "00 01 8D 10 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010D_0800", + "frame": "00 01 8D 08 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010D", + "frame": "00 01 8D 00 00 D6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010E_8000", + "frame": "00 01 8E 80 00 55", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010E_4000", + "frame": "00 01 8E 40 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010E_2000", + "frame": "00 01 8E 20 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010E_1000", + "frame": "00 01 8E 10 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010E_0800", + "frame": "00 01 8E 08 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010E", + "frame": "00 01 8E 00 00 D5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_010F_8000", + "frame": "00 01 8F 80 00 54", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010F_4000", + "frame": "00 01 8F 40 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010F_2000", + "frame": "00 01 8F 20 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010F_1000", + "frame": "00 01 8F 10 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_010F_0800", + "frame": "00 01 8F 08 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_010F", + "frame": "00 01 8F 00 00 D4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0110_8000", + "frame": "00 01 90 80 00 4B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0110_4000", + "frame": "00 01 90 40 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0110_2000", + "frame": "00 01 90 20 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0110_1000", + "frame": "00 01 90 10 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0110_0800", + "frame": "00 01 90 08 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0110", + "frame": "00 01 90 00 00 CB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0111", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0111_8000", + "frame": "00 01 91 80 00 4A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0111_4000", + "frame": "00 01 91 40 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0111_2000", + "frame": "00 01 91 20 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0111_1000", + "frame": "00 01 91 10 00 DA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0111_0800", + "frame": "00 01 91 08 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0111", + "frame": "00 01 91 00 00 CA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0112_8000", + "frame": "00 01 92 80 00 49", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0112_4000", + "frame": "00 01 92 40 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0112_2000", + "frame": "00 01 92 20 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0112_1000", + "frame": "00 01 92 10 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0112_0800", + "frame": "00 01 92 08 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0112", + "frame": "00 01 92 00 00 C9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0113_8000", + "frame": "00 01 93 80 00 48", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0113_4000", + "frame": "00 01 93 40 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0113_2000", + "frame": "00 01 93 20 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0113_1000", + "frame": "00 01 93 10 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0113_0800", + "frame": "00 01 93 08 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0113", + "frame": "00 01 93 00 00 C8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0114_8000", + "frame": "00 01 94 80 00 4F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0114_4000", + "frame": "00 01 94 40 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0114_2000", + "frame": "00 01 94 20 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0114_1000", + "frame": "00 01 94 10 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0114_0800", + "frame": "00 01 94 08 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0114", + "frame": "00 01 94 00 00 CF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0115_8000", + "frame": "00 01 95 80 00 4E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0115_4000", + "frame": "00 01 95 40 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0115_2000", + "frame": "00 01 95 20 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0115_1000", + "frame": "00 01 95 10 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0115_0800", + "frame": "00 01 95 08 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0115", + "frame": "00 01 95 00 00 CE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0116_8000", + "frame": "00 01 96 80 00 4D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0116_4000", + "frame": "00 01 96 40 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0116_2000", + "frame": "00 01 96 20 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0116_1000", + "frame": "00 01 96 10 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0116_0800", + "frame": "00 01 96 08 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0116", + "frame": "00 01 96 00 00 CD", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0117_8000", + "frame": "00 01 97 80 00 4C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0117_4000", + "frame": "00 01 97 40 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0117_2000", + "frame": "00 01 97 20 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0117_1000", + "frame": "00 01 97 10 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0117_0800", + "frame": "00 01 97 08 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0117", + "frame": "00 01 97 00 00 CC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0118_8000", + "frame": "00 01 98 80 00 43", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0118_4000", + "frame": "00 01 98 40 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0118_2000", + "frame": "00 01 98 20 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0118_1000", + "frame": "00 01 98 10 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0118_0800", + "frame": "00 01 98 08 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0118", + "frame": "00 01 98 00 00 C3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0119", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0119_8000", + "frame": "00 01 99 80 00 42", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0119_4000", + "frame": "00 01 99 40 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0119_2000", + "frame": "00 01 99 20 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0119_1000", + "frame": "00 01 99 10 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0119_0800", + "frame": "00 01 99 08 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0119", + "frame": "00 01 99 00 00 C2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011A_8000", + "frame": "00 01 9A 80 00 41", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011A_4000", + "frame": "00 01 9A 40 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011A_2000", + "frame": "00 01 9A 20 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011A_1000", + "frame": "00 01 9A 10 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011A_0800", + "frame": "00 01 9A 08 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011A", + "frame": "00 01 9A 00 00 C1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011B_8000", + "frame": "00 01 9B 80 00 40", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011B_4000", + "frame": "00 01 9B 40 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011B_2000", + "frame": "00 01 9B 20 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011B_1000", + "frame": "00 01 9B 10 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011B_0800", + "frame": "00 01 9B 08 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011B", + "frame": "00 01 9B 00 00 C0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011C_8000", + "frame": "00 01 9C 80 00 47", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011C_4000", + "frame": "00 01 9C 40 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011C_2000", + "frame": "00 01 9C 20 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011C_1000", + "frame": "00 01 9C 10 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011C_0800", + "frame": "00 01 9C 08 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011C", + "frame": "00 01 9C 00 00 C7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011D_8000", + "frame": "00 01 9D 80 00 46", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011D_4000", + "frame": "00 01 9D 40 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011D_2000", + "frame": "00 01 9D 20 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011D_1000", + "frame": "00 01 9D 10 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011D_0800", + "frame": "00 01 9D 08 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011D", + "frame": "00 01 9D 00 00 C6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011E_8000", + "frame": "00 01 9E 80 00 45", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011E_4000", + "frame": "00 01 9E 40 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011E_2000", + "frame": "00 01 9E 20 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011E_1000", + "frame": "00 01 9E 10 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011E_0800", + "frame": "00 01 9E 08 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011E", + "frame": "00 01 9E 00 00 C5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_011F_8000", + "frame": "00 01 9F 80 00 44", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011F_4000", + "frame": "00 01 9F 40 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011F_2000", + "frame": "00 01 9F 20 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011F_1000", + "frame": "00 01 9F 10 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_011F_0800", + "frame": "00 01 9F 08 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_011F", + "frame": "00 01 9F 00 00 C4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0120_8000", + "frame": "00 01 A0 80 00 7B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0120_4000", + "frame": "00 01 A0 40 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0120_2000", + "frame": "00 01 A0 20 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0120_1000", + "frame": "00 01 A0 10 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0120_0800", + "frame": "00 01 A0 08 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0120", + "frame": "00 01 A0 00 00 FB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_010_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_010_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0121", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0121_8000", + "frame": "00 01 A1 80 00 7A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0121_4000", + "frame": "00 01 A1 40 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0121_2000", + "frame": "00 01 A1 20 00 DA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0121_1000", + "frame": "00 01 A1 10 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0121_0800", + "frame": "00 01 A1 08 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0121", + "frame": "00 01 A1 00 00 FA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0122_8000", + "frame": "00 01 A2 80 00 79", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0122_4000", + "frame": "00 01 A2 40 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0122_2000", + "frame": "00 01 A2 20 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0122_1000", + "frame": "00 01 A2 10 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0122_0800", + "frame": "00 01 A2 08 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0122", + "frame": "00 01 A2 00 00 F9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0123_8000", + "frame": "00 01 A3 80 00 78", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0123_4000", + "frame": "00 01 A3 40 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0123_2000", + "frame": "00 01 A3 20 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0123_1000", + "frame": "00 01 A3 10 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0123_0800", + "frame": "00 01 A3 08 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0123", + "frame": "00 01 A3 00 00 F8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0124_8000", + "frame": "00 01 A4 80 00 7F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0124_4000", + "frame": "00 01 A4 40 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0124_2000", + "frame": "00 01 A4 20 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0124_1000", + "frame": "00 01 A4 10 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0124_0800", + "frame": "00 01 A4 08 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0124", + "frame": "00 01 A4 00 00 FF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0125_8000", + "frame": "00 01 A5 80 00 7E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0125_4000", + "frame": "00 01 A5 40 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0125_2000", + "frame": "00 01 A5 20 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0125_1000", + "frame": "00 01 A5 10 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0125_0800", + "frame": "00 01 A5 08 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0125", + "frame": "00 01 A5 00 00 FE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0126_8000", + "frame": "00 01 A6 80 00 7D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0126_4000", + "frame": "00 01 A6 40 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0126_2000", + "frame": "00 01 A6 20 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0126_1000", + "frame": "00 01 A6 10 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0126_0800", + "frame": "00 01 A6 08 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0126", + "frame": "00 01 A6 00 00 FD", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0127_8000", + "frame": "00 01 A7 80 00 7C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0127_4000", + "frame": "00 01 A7 40 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0127_2000", + "frame": "00 01 A7 20 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0127_1000", + "frame": "00 01 A7 10 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0127_0800", + "frame": "00 01 A7 08 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0127", + "frame": "00 01 A7 00 00 FC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0128_8000", + "frame": "00 01 A8 80 00 73", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0128_4000", + "frame": "00 01 A8 40 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0128_2000", + "frame": "00 01 A8 20 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0128_1000", + "frame": "00 01 A8 10 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0128_0800", + "frame": "00 01 A8 08 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0128", + "frame": "00 01 A8 00 00 F3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0129", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0129_8000", + "frame": "00 01 A9 80 00 72", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0129_4000", + "frame": "00 01 A9 40 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0129_2000", + "frame": "00 01 A9 20 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0129_1000", + "frame": "00 01 A9 10 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0129_0800", + "frame": "00 01 A9 08 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0129", + "frame": "00 01 A9 00 00 F2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012A_8000", + "frame": "00 01 AA 80 00 71", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012A_4000", + "frame": "00 01 AA 40 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012A_2000", + "frame": "00 01 AA 20 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012A_1000", + "frame": "00 01 AA 10 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012A_0800", + "frame": "00 01 AA 08 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012A", + "frame": "00 01 AA 00 00 F1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012B_8000", + "frame": "00 01 AB 80 00 70", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012B_4000", + "frame": "00 01 AB 40 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012B_2000", + "frame": "00 01 AB 20 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012B_1000", + "frame": "00 01 AB 10 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012B_0800", + "frame": "00 01 AB 08 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012B", + "frame": "00 01 AB 00 00 F0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012C_8000", + "frame": "00 01 AC 80 00 77", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012C_4000", + "frame": "00 01 AC 40 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012C_2000", + "frame": "00 01 AC 20 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012C_1000", + "frame": "00 01 AC 10 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012C_0800", + "frame": "00 01 AC 08 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012C", + "frame": "00 01 AC 00 00 F7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012D_8000", + "frame": "00 01 AD 80 00 76", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012D_4000", + "frame": "00 01 AD 40 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012D_2000", + "frame": "00 01 AD 20 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012D_1000", + "frame": "00 01 AD 10 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012D_0800", + "frame": "00 01 AD 08 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012D", + "frame": "00 01 AD 00 00 F6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012E_8000", + "frame": "00 01 AE 80 00 75", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012E_4000", + "frame": "00 01 AE 40 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012E_2000", + "frame": "00 01 AE 20 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012E_1000", + "frame": "00 01 AE 10 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012E_0800", + "frame": "00 01 AE 08 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012E", + "frame": "00 01 AE 00 00 F5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_012F_8000", + "frame": "00 01 AF 80 00 74", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012F_4000", + "frame": "00 01 AF 40 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012F_2000", + "frame": "00 01 AF 20 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012F_1000", + "frame": "00 01 AF 10 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_012F_0800", + "frame": "00 01 AF 08 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_012F", + "frame": "00 01 AF 00 00 F4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0130_8000", + "frame": "00 01 B0 80 00 6B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0130_4000", + "frame": "00 01 B0 40 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0130_2000", + "frame": "00 01 B0 20 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0130_1000", + "frame": "00 01 B0 10 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0130_0800", + "frame": "00 01 B0 08 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0130", + "frame": "00 01 B0 00 00 EB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0131", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0131_8000", + "frame": "00 01 B1 80 00 6A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0131_4000", + "frame": "00 01 B1 40 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0131_2000", + "frame": "00 01 B1 20 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0131_1000", + "frame": "00 01 B1 10 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0131_0800", + "frame": "00 01 B1 08 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0131", + "frame": "00 01 B1 00 00 EA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0132_8000", + "frame": "00 01 B2 80 00 69", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0132_4000", + "frame": "00 01 B2 40 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0132_2000", + "frame": "00 01 B2 20 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0132_1000", + "frame": "00 01 B2 10 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0132_0800", + "frame": "00 01 B2 08 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0132", + "frame": "00 01 B2 00 00 E9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0133_8000", + "frame": "00 01 B3 80 00 68", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0133_4000", + "frame": "00 01 B3 40 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0133_2000", + "frame": "00 01 B3 20 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0133_1000", + "frame": "00 01 B3 10 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0133_0800", + "frame": "00 01 B3 08 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0133", + "frame": "00 01 B3 00 00 E8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0134_8000", + "frame": "00 01 B4 80 00 6F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0134_4000", + "frame": "00 01 B4 40 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0134_2000", + "frame": "00 01 B4 20 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0134_1000", + "frame": "00 01 B4 10 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0134_0800", + "frame": "00 01 B4 08 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0134", + "frame": "00 01 B4 00 00 EF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0135_8000", + "frame": "00 01 B5 80 00 6E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0135_4000", + "frame": "00 01 B5 40 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0135_2000", + "frame": "00 01 B5 20 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0135_1000", + "frame": "00 01 B5 10 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0135_0800", + "frame": "00 01 B5 08 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0135", + "frame": "00 01 B5 00 00 EE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0136_8000", + "frame": "00 01 B6 80 00 6D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0136_4000", + "frame": "00 01 B6 40 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0136_2000", + "frame": "00 01 B6 20 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0136_1000", + "frame": "00 01 B6 10 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0136_0800", + "frame": "00 01 B6 08 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0136", + "frame": "00 01 B6 00 00 ED", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0137_8000", + "frame": "00 01 B7 80 00 6C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0137_4000", + "frame": "00 01 B7 40 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0137_2000", + "frame": "00 01 B7 20 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0137_1000", + "frame": "00 01 B7 10 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0137_0800", + "frame": "00 01 B7 08 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0137", + "frame": "00 01 B7 00 00 EC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0138_8000", + "frame": "00 01 B8 80 00 63", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0138_4000", + "frame": "00 01 B8 40 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0138_2000", + "frame": "00 01 B8 20 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0138_1000", + "frame": "00 01 B8 10 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0138_0800", + "frame": "00 01 B8 08 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0138", + "frame": "00 01 B8 00 00 E3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0139", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0139_8000", + "frame": "00 01 B9 80 00 62", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0139_4000", + "frame": "00 01 B9 40 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0139_2000", + "frame": "00 01 B9 20 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0139_1000", + "frame": "00 01 B9 10 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0139_0800", + "frame": "00 01 B9 08 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0139", + "frame": "00 01 B9 00 00 E2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013A_8000", + "frame": "00 01 BA 80 00 61", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013A_4000", + "frame": "00 01 BA 40 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013A_2000", + "frame": "00 01 BA 20 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013A_1000", + "frame": "00 01 BA 10 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013A_0800", + "frame": "00 01 BA 08 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013A", + "frame": "00 01 BA 00 00 E1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013B_8000", + "frame": "00 01 BB 80 00 60", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013B_4000", + "frame": "00 01 BB 40 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013B_2000", + "frame": "00 01 BB 20 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013B_1000", + "frame": "00 01 BB 10 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013B_0800", + "frame": "00 01 BB 08 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013B", + "frame": "00 01 BB 00 00 E0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013C_8000", + "frame": "00 01 BC 80 00 67", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013C_4000", + "frame": "00 01 BC 40 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013C_2000", + "frame": "00 01 BC 20 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013C_1000", + "frame": "00 01 BC 10 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013C_0800", + "frame": "00 01 BC 08 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013C", + "frame": "00 01 BC 00 00 E7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013D_8000", + "frame": "00 01 BD 80 00 66", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013D_4000", + "frame": "00 01 BD 40 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013D_2000", + "frame": "00 01 BD 20 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013D_1000", + "frame": "00 01 BD 10 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013D_0800", + "frame": "00 01 BD 08 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013D", + "frame": "00 01 BD 00 00 E6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013E_8000", + "frame": "00 01 BE 80 00 65", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013E_4000", + "frame": "00 01 BE 40 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013E_2000", + "frame": "00 01 BE 20 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013E_1000", + "frame": "00 01 BE 10 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013E_0800", + "frame": "00 01 BE 08 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013E", + "frame": "00 01 BE 00 00 E5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_013F_8000", + "frame": "00 01 BF 80 00 64", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013F_4000", + "frame": "00 01 BF 40 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013F_2000", + "frame": "00 01 BF 20 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013F_1000", + "frame": "00 01 BF 10 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_013F_0800", + "frame": "00 01 BF 08 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_013F", + "frame": "00 01 BF 00 00 E4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0140_8000", + "frame": "00 01 C0 80 00 1B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0140_4000", + "frame": "00 01 C0 40 00 DB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0140_2000", + "frame": "00 01 C0 20 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0140_1000", + "frame": "00 01 C0 10 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0140_0800", + "frame": "00 01 C0 08 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0140", + "frame": "00 01 C0 00 00 9B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_011_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_011_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0141", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0141_8000", + "frame": "00 01 C1 80 00 1A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0141_4000", + "frame": "00 01 C1 40 00 DA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0141_2000", + "frame": "00 01 C1 20 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0141_1000", + "frame": "00 01 C1 10 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0141_0800", + "frame": "00 01 C1 08 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0141", + "frame": "00 01 C1 00 00 9A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0142_8000", + "frame": "00 01 C2 80 00 19", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0142_4000", + "frame": "00 01 C2 40 00 D9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0142_2000", + "frame": "00 01 C2 20 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0142_1000", + "frame": "00 01 C2 10 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0142_0800", + "frame": "00 01 C2 08 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0142", + "frame": "00 01 C2 00 00 99", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0143_8000", + "frame": "00 01 C3 80 00 18", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0143_4000", + "frame": "00 01 C3 40 00 D8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0143_2000", + "frame": "00 01 C3 20 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0143_1000", + "frame": "00 01 C3 10 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0143_0800", + "frame": "00 01 C3 08 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0143", + "frame": "00 01 C3 00 00 98", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0144_8000", + "frame": "00 01 C4 80 00 1F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0144_4000", + "frame": "00 01 C4 40 00 DF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0144_2000", + "frame": "00 01 C4 20 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0144_1000", + "frame": "00 01 C4 10 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0144_0800", + "frame": "00 01 C4 08 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0144", + "frame": "00 01 C4 00 00 9F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0145_8000", + "frame": "00 01 C5 80 00 1E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0145_4000", + "frame": "00 01 C5 40 00 DE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0145_2000", + "frame": "00 01 C5 20 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0145_1000", + "frame": "00 01 C5 10 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0145_0800", + "frame": "00 01 C5 08 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0145", + "frame": "00 01 C5 00 00 9E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0146_8000", + "frame": "00 01 C6 80 00 1D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0146_4000", + "frame": "00 01 C6 40 00 DD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0146_2000", + "frame": "00 01 C6 20 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0146_1000", + "frame": "00 01 C6 10 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0146_0800", + "frame": "00 01 C6 08 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0146", + "frame": "00 01 C6 00 00 9D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0147_8000", + "frame": "00 01 C7 80 00 1C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0147_4000", + "frame": "00 01 C7 40 00 DC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0147_2000", + "frame": "00 01 C7 20 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0147_1000", + "frame": "00 01 C7 10 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0147_0800", + "frame": "00 01 C7 08 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0147", + "frame": "00 01 C7 00 00 9C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0148_8000", + "frame": "00 01 C8 80 00 13", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0148_4000", + "frame": "00 01 C8 40 00 D3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0148_2000", + "frame": "00 01 C8 20 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0148_1000", + "frame": "00 01 C8 10 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0148_0800", + "frame": "00 01 C8 08 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0148", + "frame": "00 01 C8 00 00 93", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0149", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0149_8000", + "frame": "00 01 C9 80 00 12", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0149_4000", + "frame": "00 01 C9 40 00 D2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0149_2000", + "frame": "00 01 C9 20 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0149_1000", + "frame": "00 01 C9 10 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0149_0800", + "frame": "00 01 C9 08 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0149", + "frame": "00 01 C9 00 00 92", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014A_8000", + "frame": "00 01 CA 80 00 11", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014A_4000", + "frame": "00 01 CA 40 00 D1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014A_2000", + "frame": "00 01 CA 20 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014A_1000", + "frame": "00 01 CA 10 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014A_0800", + "frame": "00 01 CA 08 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014A", + "frame": "00 01 CA 00 00 91", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014B_8000", + "frame": "00 01 CB 80 00 10", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014B_4000", + "frame": "00 01 CB 40 00 D0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014B_2000", + "frame": "00 01 CB 20 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014B_1000", + "frame": "00 01 CB 10 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014B_0800", + "frame": "00 01 CB 08 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014B", + "frame": "00 01 CB 00 00 90", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014C_8000", + "frame": "00 01 CC 80 00 17", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014C_4000", + "frame": "00 01 CC 40 00 D7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014C_2000", + "frame": "00 01 CC 20 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014C_1000", + "frame": "00 01 CC 10 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014C_0800", + "frame": "00 01 CC 08 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014C", + "frame": "00 01 CC 00 00 97", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014D_8000", + "frame": "00 01 CD 80 00 16", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014D_4000", + "frame": "00 01 CD 40 00 D6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014D_2000", + "frame": "00 01 CD 20 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014D_1000", + "frame": "00 01 CD 10 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014D_0800", + "frame": "00 01 CD 08 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014D", + "frame": "00 01 CD 00 00 96", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014E_8000", + "frame": "00 01 CE 80 00 15", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014E_4000", + "frame": "00 01 CE 40 00 D5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014E_2000", + "frame": "00 01 CE 20 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014E_1000", + "frame": "00 01 CE 10 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014E_0800", + "frame": "00 01 CE 08 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014E", + "frame": "00 01 CE 00 00 95", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_014F_8000", + "frame": "00 01 CF 80 00 14", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014F_4000", + "frame": "00 01 CF 40 00 D4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014F_2000", + "frame": "00 01 CF 20 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014F_1000", + "frame": "00 01 CF 10 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_014F_0800", + "frame": "00 01 CF 08 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_014F", + "frame": "00 01 CF 00 00 94", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0150_8000", + "frame": "00 01 D0 80 00 0B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0150_4000", + "frame": "00 01 D0 40 00 CB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0150_2000", + "frame": "00 01 D0 20 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0150_1000", + "frame": "00 01 D0 10 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0150_0800", + "frame": "00 01 D0 08 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0150", + "frame": "00 01 D0 00 00 8B", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0151", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0151_8000", + "frame": "00 01 D1 80 00 0A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0151_4000", + "frame": "00 01 D1 40 00 CA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0151_2000", + "frame": "00 01 D1 20 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0151_1000", + "frame": "00 01 D1 10 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0151_0800", + "frame": "00 01 D1 08 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0151", + "frame": "00 01 D1 00 00 8A", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0152_8000", + "frame": "00 01 D2 80 00 09", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0152_4000", + "frame": "00 01 D2 40 00 C9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0152_2000", + "frame": "00 01 D2 20 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0152_1000", + "frame": "00 01 D2 10 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0152_0800", + "frame": "00 01 D2 08 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0152", + "frame": "00 01 D2 00 00 89", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0153_8000", + "frame": "00 01 D3 80 00 08", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0153_4000", + "frame": "00 01 D3 40 00 C8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0153_2000", + "frame": "00 01 D3 20 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0153_1000", + "frame": "00 01 D3 10 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0153_0800", + "frame": "00 01 D3 08 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0153", + "frame": "00 01 D3 00 00 88", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0154_8000", + "frame": "00 01 D4 80 00 0F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0154_4000", + "frame": "00 01 D4 40 00 CF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0154_2000", + "frame": "00 01 D4 20 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0154_1000", + "frame": "00 01 D4 10 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0154_0800", + "frame": "00 01 D4 08 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0154", + "frame": "00 01 D4 00 00 8F", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0155_8000", + "frame": "00 01 D5 80 00 0E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0155_4000", + "frame": "00 01 D5 40 00 CE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0155_2000", + "frame": "00 01 D5 20 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0155_1000", + "frame": "00 01 D5 10 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0155_0800", + "frame": "00 01 D5 08 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0155", + "frame": "00 01 D5 00 00 8E", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0156_8000", + "frame": "00 01 D6 80 00 0D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0156_4000", + "frame": "00 01 D6 40 00 CD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0156_2000", + "frame": "00 01 D6 20 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0156_1000", + "frame": "00 01 D6 10 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0156_0800", + "frame": "00 01 D6 08 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0156", + "frame": "00 01 D6 00 00 8D", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0157_8000", + "frame": "00 01 D7 80 00 0C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0157_4000", + "frame": "00 01 D7 40 00 CC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0157_2000", + "frame": "00 01 D7 20 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0157_1000", + "frame": "00 01 D7 10 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0157_0800", + "frame": "00 01 D7 08 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0157", + "frame": "00 01 D7 00 00 8C", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0158_8000", + "frame": "00 01 D8 80 00 03", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0158_4000", + "frame": "00 01 D8 40 00 C3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0158_2000", + "frame": "00 01 D8 20 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0158_1000", + "frame": "00 01 D8 10 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0158_0800", + "frame": "00 01 D8 08 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0158", + "frame": "00 01 D8 00 00 83", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0159", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0159_8000", + "frame": "00 01 D9 80 00 02", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0159_4000", + "frame": "00 01 D9 40 00 C2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0159_2000", + "frame": "00 01 D9 20 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0159_1000", + "frame": "00 01 D9 10 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0159_0800", + "frame": "00 01 D9 08 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0159", + "frame": "00 01 D9 00 00 82", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015A_8000", + "frame": "00 01 DA 80 00 01", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015A_4000", + "frame": "00 01 DA 40 00 C1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015A_2000", + "frame": "00 01 DA 20 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015A_1000", + "frame": "00 01 DA 10 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015A_0800", + "frame": "00 01 DA 08 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015A", + "frame": "00 01 DA 00 00 81", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015B_8000", + "frame": "00 01 DB 80 00 00", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015B_4000", + "frame": "00 01 DB 40 00 C0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015B_2000", + "frame": "00 01 DB 20 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015B_1000", + "frame": "00 01 DB 10 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015B_0800", + "frame": "00 01 DB 08 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015B", + "frame": "00 01 DB 00 00 80", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015C_8000", + "frame": "00 01 DC 80 00 07", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015C_4000", + "frame": "00 01 DC 40 00 C7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015C_2000", + "frame": "00 01 DC 20 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015C_1000", + "frame": "00 01 DC 10 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015C_0800", + "frame": "00 01 DC 08 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015C", + "frame": "00 01 DC 00 00 87", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015D_8000", + "frame": "00 01 DD 80 00 06", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015D_4000", + "frame": "00 01 DD 40 00 C6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015D_2000", + "frame": "00 01 DD 20 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015D_1000", + "frame": "00 01 DD 10 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015D_0800", + "frame": "00 01 DD 08 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015D", + "frame": "00 01 DD 00 00 86", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015E_8000", + "frame": "00 01 DE 80 00 05", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015E_4000", + "frame": "00 01 DE 40 00 C5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015E_2000", + "frame": "00 01 DE 20 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015E_1000", + "frame": "00 01 DE 10 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015E_0800", + "frame": "00 01 DE 08 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015E", + "frame": "00 01 DE 00 00 85", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_015F_8000", + "frame": "00 01 DF 80 00 04", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015F_4000", + "frame": "00 01 DF 40 00 C4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015F_2000", + "frame": "00 01 DF 20 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015F_1000", + "frame": "00 01 DF 10 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_015F_0800", + "frame": "00 01 DF 08 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_015F", + "frame": "00 01 DF 00 00 84", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0160_8000", + "frame": "00 01 E0 80 00 3B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0160_4000", + "frame": "00 01 E0 40 00 FB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0160_2000", + "frame": "00 01 E0 20 00 9B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0160_1000", + "frame": "00 01 E0 10 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0160_0800", + "frame": "00 01 E0 08 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0160", + "frame": "00 01 E0 00 00 BB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.5 + }, + { + "action": "send", + "label": "window_012_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "window_012_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0161", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0161_8000", + "frame": "00 01 E1 80 00 3A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0161_4000", + "frame": "00 01 E1 40 00 FA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0161_2000", + "frame": "00 01 E1 20 00 9A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0161_1000", + "frame": "00 01 E1 10 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0161_0800", + "frame": "00 01 E1 08 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0161", + "frame": "00 01 E1 00 00 BA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0162_8000", + "frame": "00 01 E2 80 00 39", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0162_4000", + "frame": "00 01 E2 40 00 F9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0162_2000", + "frame": "00 01 E2 20 00 99", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0162_1000", + "frame": "00 01 E2 10 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0162_0800", + "frame": "00 01 E2 08 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0162", + "frame": "00 01 E2 00 00 B9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0163_8000", + "frame": "00 01 E3 80 00 38", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0163_4000", + "frame": "00 01 E3 40 00 F8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0163_2000", + "frame": "00 01 E3 20 00 98", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0163_1000", + "frame": "00 01 E3 10 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0163_0800", + "frame": "00 01 E3 08 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0163", + "frame": "00 01 E3 00 00 B8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0164_8000", + "frame": "00 01 E4 80 00 3F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0164_4000", + "frame": "00 01 E4 40 00 FF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0164_2000", + "frame": "00 01 E4 20 00 9F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0164_1000", + "frame": "00 01 E4 10 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0164_0800", + "frame": "00 01 E4 08 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0164", + "frame": "00 01 E4 00 00 BF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0165_8000", + "frame": "00 01 E5 80 00 3E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0165_4000", + "frame": "00 01 E5 40 00 FE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0165_2000", + "frame": "00 01 E5 20 00 9E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0165_1000", + "frame": "00 01 E5 10 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0165_0800", + "frame": "00 01 E5 08 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0165", + "frame": "00 01 E5 00 00 BE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0166_8000", + "frame": "00 01 E6 80 00 3D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0166_4000", + "frame": "00 01 E6 40 00 FD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0166_2000", + "frame": "00 01 E6 20 00 9D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0166_1000", + "frame": "00 01 E6 10 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0166_0800", + "frame": "00 01 E6 08 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0166", + "frame": "00 01 E6 00 00 BD", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0167_8000", + "frame": "00 01 E7 80 00 3C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0167_4000", + "frame": "00 01 E7 40 00 FC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0167_2000", + "frame": "00 01 E7 20 00 9C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0167_1000", + "frame": "00 01 E7 10 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0167_0800", + "frame": "00 01 E7 08 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0167", + "frame": "00 01 E7 00 00 BC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0168_8000", + "frame": "00 01 E8 80 00 33", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0168_4000", + "frame": "00 01 E8 40 00 F3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0168_2000", + "frame": "00 01 E8 20 00 93", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0168_1000", + "frame": "00 01 E8 10 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0168_0800", + "frame": "00 01 E8 08 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0168", + "frame": "00 01 E8 00 00 B3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0169", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0169_8000", + "frame": "00 01 E9 80 00 32", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0169_4000", + "frame": "00 01 E9 40 00 F2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0169_2000", + "frame": "00 01 E9 20 00 92", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0169_1000", + "frame": "00 01 E9 10 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0169_0800", + "frame": "00 01 E9 08 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0169", + "frame": "00 01 E9 00 00 B2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016A_8000", + "frame": "00 01 EA 80 00 31", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016A_4000", + "frame": "00 01 EA 40 00 F1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016A_2000", + "frame": "00 01 EA 20 00 91", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016A_1000", + "frame": "00 01 EA 10 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016A_0800", + "frame": "00 01 EA 08 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016A", + "frame": "00 01 EA 00 00 B1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016B_8000", + "frame": "00 01 EB 80 00 30", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016B_4000", + "frame": "00 01 EB 40 00 F0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016B_2000", + "frame": "00 01 EB 20 00 90", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016B_1000", + "frame": "00 01 EB 10 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016B_0800", + "frame": "00 01 EB 08 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016B", + "frame": "00 01 EB 00 00 B0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016C_8000", + "frame": "00 01 EC 80 00 37", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016C_4000", + "frame": "00 01 EC 40 00 F7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016C_2000", + "frame": "00 01 EC 20 00 97", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016C_1000", + "frame": "00 01 EC 10 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016C_0800", + "frame": "00 01 EC 08 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016C", + "frame": "00 01 EC 00 00 B7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016D_8000", + "frame": "00 01 ED 80 00 36", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016D_4000", + "frame": "00 01 ED 40 00 F6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016D_2000", + "frame": "00 01 ED 20 00 96", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016D_1000", + "frame": "00 01 ED 10 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016D_0800", + "frame": "00 01 ED 08 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016D", + "frame": "00 01 ED 00 00 B6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016E_8000", + "frame": "00 01 EE 80 00 35", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016E_4000", + "frame": "00 01 EE 40 00 F5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016E_2000", + "frame": "00 01 EE 20 00 95", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016E_1000", + "frame": "00 01 EE 10 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016E_0800", + "frame": "00 01 EE 08 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016E", + "frame": "00 01 EE 00 00 B5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_016F_8000", + "frame": "00 01 EF 80 00 34", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016F_4000", + "frame": "00 01 EF 40 00 F4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016F_2000", + "frame": "00 01 EF 20 00 94", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016F_1000", + "frame": "00 01 EF 10 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_016F_0800", + "frame": "00 01 EF 08 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_016F", + "frame": "00 01 EF 00 00 B4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0170_8000", + "frame": "00 01 F0 80 00 2B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0170_4000", + "frame": "00 01 F0 40 00 EB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0170_2000", + "frame": "00 01 F0 20 00 8B", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0170_1000", + "frame": "00 01 F0 10 00 BB", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0170_0800", + "frame": "00 01 F0 08 00 A3", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0170", + "frame": "00 01 F0 00 00 AB", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0171", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0171_8000", + "frame": "00 01 F1 80 00 2A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0171_4000", + "frame": "00 01 F1 40 00 EA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0171_2000", + "frame": "00 01 F1 20 00 8A", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0171_1000", + "frame": "00 01 F1 10 00 BA", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0171_0800", + "frame": "00 01 F1 08 00 A2", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0171", + "frame": "00 01 F1 00 00 AA", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0172_8000", + "frame": "00 01 F2 80 00 29", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0172_4000", + "frame": "00 01 F2 40 00 E9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0172_2000", + "frame": "00 01 F2 20 00 89", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0172_1000", + "frame": "00 01 F2 10 00 B9", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0172_0800", + "frame": "00 01 F2 08 00 A1", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0172", + "frame": "00 01 F2 00 00 A9", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0173_8000", + "frame": "00 01 F3 80 00 28", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0173_4000", + "frame": "00 01 F3 40 00 E8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0173_2000", + "frame": "00 01 F3 20 00 88", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0173_1000", + "frame": "00 01 F3 10 00 B8", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0173_0800", + "frame": "00 01 F3 08 00 A0", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0173", + "frame": "00 01 F3 00 00 A8", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0174_8000", + "frame": "00 01 F4 80 00 2F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0174_4000", + "frame": "00 01 F4 40 00 EF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0174_2000", + "frame": "00 01 F4 20 00 8F", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0174_1000", + "frame": "00 01 F4 10 00 BF", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0174_0800", + "frame": "00 01 F4 08 00 A7", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0174", + "frame": "00 01 F4 00 00 AF", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0175_8000", + "frame": "00 01 F5 80 00 2E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0175_4000", + "frame": "00 01 F5 40 00 EE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0175_2000", + "frame": "00 01 F5 20 00 8E", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0175_1000", + "frame": "00 01 F5 10 00 BE", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0175_0800", + "frame": "00 01 F5 08 00 A6", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0175", + "frame": "00 01 F5 00 00 AE", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0176_8000", + "frame": "00 01 F6 80 00 2D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0176_4000", + "frame": "00 01 F6 40 00 ED", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0176_2000", + "frame": "00 01 F6 20 00 8D", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0176_1000", + "frame": "00 01 F6 10 00 BD", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0176_0800", + "frame": "00 01 F6 08 00 A5", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0176", + "frame": "00 01 F6 00 00 AD", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0177_8000", + "frame": "00 01 F7 80 00 2C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0177_4000", + "frame": "00 01 F7 40 00 EC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0177_2000", + "frame": "00 01 F7 20 00 8C", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0177_1000", + "frame": "00 01 F7 10 00 BC", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0177_0800", + "frame": "00 01 F7 08 00 A4", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0177", + "frame": "00 01 F7 00 00 AC", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0178_8000", + "frame": "00 01 F8 80 00 23", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0178_4000", + "frame": "00 01 F8 40 00 E3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0178_2000", + "frame": "00 01 F8 20 00 83", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0178_1000", + "frame": "00 01 F8 10 00 B3", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0178_0800", + "frame": "00 01 F8 08 00 AB", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0178", + "frame": "00 01 F8 00 00 A3", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "ok_refresh_before_0179", + "frame": "00 00 00 80 00 DA", + "listen": 0.3, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_0179_8000", + "frame": "00 01 F9 80 00 22", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0179_4000", + "frame": "00 01 F9 40 00 E2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0179_2000", + "frame": "00 01 F9 20 00 82", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0179_1000", + "frame": "00 01 F9 10 00 B2", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_0179_0800", + "frame": "00 01 F9 08 00 AA", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_0179", + "frame": "00 01 F9 00 00 A2", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017A_8000", + "frame": "00 01 FA 80 00 21", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017A_4000", + "frame": "00 01 FA 40 00 E1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017A_2000", + "frame": "00 01 FA 20 00 81", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017A_1000", + "frame": "00 01 FA 10 00 B1", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017A_0800", + "frame": "00 01 FA 08 00 A9", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017A", + "frame": "00 01 FA 00 00 A1", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017B_8000", + "frame": "00 01 FB 80 00 20", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017B_4000", + "frame": "00 01 FB 40 00 E0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017B_2000", + "frame": "00 01 FB 20 00 80", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017B_1000", + "frame": "00 01 FB 10 00 B0", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017B_0800", + "frame": "00 01 FB 08 00 A8", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017B", + "frame": "00 01 FB 00 00 A0", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017C_8000", + "frame": "00 01 FC 80 00 27", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017C_4000", + "frame": "00 01 FC 40 00 E7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017C_2000", + "frame": "00 01 FC 20 00 87", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017C_1000", + "frame": "00 01 FC 10 00 B7", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017C_0800", + "frame": "00 01 FC 08 00 AF", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017C", + "frame": "00 01 FC 00 00 A7", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017D_8000", + "frame": "00 01 FD 80 00 26", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017D_4000", + "frame": "00 01 FD 40 00 E6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017D_2000", + "frame": "00 01 FD 20 00 86", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017D_1000", + "frame": "00 01 FD 10 00 B6", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017D_0800", + "frame": "00 01 FD 08 00 AE", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017D", + "frame": "00 01 FD 00 00 A6", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017E_8000", + "frame": "00 01 FE 80 00 25", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017E_4000", + "frame": "00 01 FE 40 00 E5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017E_2000", + "frame": "00 01 FE 20 00 85", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017E_1000", + "frame": "00 01 FE 10 00 B5", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017E_0800", + "frame": "00 01 FE 08 00 AD", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017E", + "frame": "00 01 FE 00 00 A5", + "listen": 0.15, + "snapshot": false + }, + { + "action": "send", + "label": "candidate_017F_8000", + "frame": "00 01 FF 80 00 24", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017F_4000", + "frame": "00 01 FF 40 00 E4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017F_2000", + "frame": "00 01 FF 20 00 84", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017F_1000", + "frame": "00 01 FF 10 00 B4", + "listen": 0.65 + }, + { + "action": "send", + "label": "candidate_017F_0800", + "frame": "00 01 FF 08 00 AC", + "listen": 0.65 + }, + { + "action": "send", + "label": "clear_017F", + "frame": "00 01 FF 00 00 A4", + "listen": 0.15, + "snapshot": false + }, + { + "action": "listen", + "seconds": 1.0 + } + ] +} diff --git a/scenarios/panel-atlas-operator-lamps-v1.json b/scenarios/panel-atlas-operator-lamps-v1.json new file mode 100644 index 0000000..6dc9a44 --- /dev/null +++ b/scenarios/panel-atlas-operator-lamps-v1.json @@ -0,0 +1,142 @@ +{ + "name": "panel-atlas-operator-lamps-v1", + "notes": [ + "Compact visible-output atlas for operator lamps and tally-adjacent selectors.", + "Use webcam snapshots to tie each selector/value write to the panel state.", + "This intentionally stays on command-0 primary-table writes and avoids COPY/menu latch selectors." + ], + "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", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "cam_power_candidate_0007_high", + "frame": "00 00 07 80 00 DD", + "listen": 0.90 + }, + { + "action": "send", + "label": "cam_power_candidate_0007_low", + "frame": "00 00 07 00 00 5D", + "listen": 0.50 + }, + { + "action": "send", + "label": "call_candidate_0015_high", + "frame": "00 00 15 80 00 CF", + "listen": 0.90 + }, + { + "action": "send", + "label": "call_candidate_0015_low", + "frame": "00 00 15 00 00 4F", + "listen": 0.50 + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_neighbors", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "send", + "label": "neighbor_0012_high", + "frame": "00 00 12 80 00 C8", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_0012_low", + "frame": "00 00 12 00 00 48", + "listen": 0.45 + }, + { + "action": "send", + "label": "neighbor_0013_high", + "frame": "00 00 13 80 00 C9", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_0013_low", + "frame": "00 00 13 00 00 49", + "listen": 0.45 + }, + { + "action": "send", + "label": "neighbor_0016_high", + "frame": "00 00 16 80 00 CC", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_0016_low", + "frame": "00 00 16 00 00 4C", + "listen": 0.45 + }, + { + "action": "send", + "label": "neighbor_0017_high", + "frame": "00 00 17 80 00 CD", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_0017_low", + "frame": "00 00 17 00 00 4D", + "listen": 0.45 + }, + { + "action": "send", + "label": "neighbor_0018_high", + "frame": "00 00 18 80 00 C2", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_0018_low", + "frame": "00 00 18 00 00 42", + "listen": 0.45 + }, + { + "action": "send", + "label": "neighbor_001a_high", + "frame": "00 00 1A 80 00 C0", + "listen": 0.90 + }, + { + "action": "send", + "label": "neighbor_001a_low", + "frame": "00 00 1A 00 00 40", + "listen": 0.45 + }, + { + "action": "listen", + "seconds": 0.80 + } + ] +} diff --git a/scenarios/panel-atlas-readout-status-v1.json b/scenarios/panel-atlas-readout-status-v1.json new file mode 100644 index 0000000..549da1d --- /dev/null +++ b/scenarios/panel-atlas-readout-status-v1.json @@ -0,0 +1,124 @@ +{ + "name": "panel-atlas-readout-status-v1", + "notes": [ + "Compact visible-output atlas for readouts and status clusters.", + "Targets known shutter display, white-balance/black-flare, and KNEE candidate selectors.", + "Use webcam snapshots to tie each selector/value write to visible LCD, lamp, and seven-segment states." + ], + "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", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "shutter_008f_evs_bit11", + "frame": "00 01 0F 08 00 5C", + "listen": 0.90 + }, + { + "action": "send", + "label": "shutter_008f_off_bit12", + "frame": "00 01 0F 10 00 44", + "listen": 0.90 + }, + { + "action": "send", + "label": "shutter_008f_clear", + "frame": "00 01 0F 00 00 54", + "listen": 0.50 + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_0093", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "send", + "label": "status_0093_bit15_wb_preset_black_manual", + "frame": "00 01 13 80 00 C8", + "listen": 0.90 + }, + { + "action": "send", + "label": "status_0093_9020_black_manual_context", + "frame": "00 01 13 90 20 F8", + "listen": 0.90 + }, + { + "action": "send", + "label": "status_0093_90ff_black_auto_candidate", + "frame": "00 01 13 90 FF 27", + "listen": 0.90 + }, + { + "action": "send", + "label": "status_0093_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.50 + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_knee", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "send", + "label": "knee_00b9_bit13_report_gate", + "frame": "00 01 39 20 00 42", + "listen": 0.90 + }, + { + "action": "send", + "label": "knee_00b9_bits15_13_label_gate", + "frame": "00 01 39 A0 00 C2", + "listen": 0.90 + }, + { + "action": "send", + "label": "knee_0110_bit15_auto_or_dl_candidate", + "frame": "00 01 90 80 00 4B", + "listen": 1.10 + }, + { + "action": "send", + "label": "knee_0110_clear", + "frame": "00 01 90 00 00 CB", + "listen": 0.70 + }, + { + "action": "send", + "label": "knee_00b9_clear", + "frame": "00 01 39 00 00 62", + "listen": 0.70 + }, + { + "action": "listen", + "seconds": 0.80 + } + ] +} diff --git a/scenarios/panel-atlas-right-stack-fresh-latch-v1.json b/scenarios/panel-atlas-right-stack-fresh-latch-v1.json new file mode 100644 index 0000000..cc36d09 --- /dev/null +++ b/scenarios/panel-atlas-right-stack-fresh-latch-v1.json @@ -0,0 +1,124 @@ +{ + "name": "panel-atlas-right-stack-fresh-latch-v1", + "notes": [ + "Fresh-boot isolation for right-side status selectors that looked latched in the compact run.", + "Each selector gets its own power cycle before high/low testing so 0x0017 cannot contaminate 0x001A.", + "Use webcam snapshots to compare CONNECT OK baseline, high write, and low write." + ], + "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": "case_0017_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_0017_ok_seed_2_baseline", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_0017_high_bars_family", + "frame": "00 00 17 80 00 CD", + "listen": 0.90 + }, + { + "action": "send", + "label": "case_0017_low_clear_attempt", + "frame": "00 00 17 00 00 4D", + "listen": 1.00 + }, + { + "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": "case_001a_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_001a_ok_seed_2_baseline", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_001a_high_bars_family", + "frame": "00 00 1A 80 00 C0", + "listen": 0.90 + }, + { + "action": "send", + "label": "case_001a_low_clear_attempt", + "frame": "00 00 1A 00 00 40", + "listen": 1.00 + }, + { + "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": "case_0007_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_0007_ok_seed_2_baseline", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "case_0007_high_cam_power", + "frame": "00 00 07 80 00 DD", + "listen": 0.90 + }, + { + "action": "send", + "label": "case_0007_low_clear_attempt", + "frame": "00 00 07 00 00 5D", + "listen": 1.00 + } + ] +} diff --git a/scenarios/panel-atlas-right-stack-isolation-v1.json b/scenarios/panel-atlas-right-stack-isolation-v1.json new file mode 100644 index 0000000..4fe1fb0 --- /dev/null +++ b/scenarios/panel-atlas-right-stack-isolation-v1.json @@ -0,0 +1,154 @@ +{ + "name": "panel-atlas-right-stack-isolation-v1", + "notes": [ + "Tight right-side lamp isolation for CAM POWER/CALL/BARS/status candidates.", + "Each candidate is held high then low twice so webcam frames can be compared against the same baseline.", + "Watch the right-side CAM POWER/BARS/status stack and the CALL/CAM POWER lamps; CONNECT OK traffic is kept alive throughout." + ], + "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", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "send", + "label": "selector_zero_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.60 + }, + { + "action": "repeat", + "count": 2, + "steps": [ + { + "action": "send", + "label": "candidate_0007_high_cam_power", + "frame": "00 00 07 80 00 DD", + "listen": 0.85 + }, + { + "action": "send", + "label": "candidate_0007_low_cam_power", + "frame": "00 00 07 00 00 5D", + "listen": 0.65 + } + ] + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_0015", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "repeat", + "count": 2, + "steps": [ + { + "action": "send", + "label": "candidate_0015_high_call", + "frame": "00 00 15 80 00 CF", + "listen": 0.85 + }, + { + "action": "send", + "label": "candidate_0015_low_call", + "frame": "00 00 15 00 00 4F", + "listen": 0.65 + } + ] + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_0013", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "repeat", + "count": 2, + "steps": [ + { + "action": "send", + "label": "candidate_0013_high_orange_status", + "frame": "00 00 13 80 00 C9", + "listen": 0.85 + }, + { + "action": "send", + "label": "candidate_0013_low_orange_status", + "frame": "00 00 13 00 00 49", + "listen": 0.65 + } + ] + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_0017", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "repeat", + "count": 2, + "steps": [ + { + "action": "send", + "label": "candidate_0017_high_bars_family", + "frame": "00 00 17 80 00 CD", + "listen": 0.85 + }, + { + "action": "send", + "label": "candidate_0017_low_bars_family", + "frame": "00 00 17 00 00 4D", + "listen": 0.65 + } + ] + }, + { + "action": "send", + "label": "selector_zero_ok_refresh_before_001a", + "frame": "00 00 00 80 00 DA", + "listen": 0.40 + }, + { + "action": "repeat", + "count": 2, + "steps": [ + { + "action": "send", + "label": "candidate_001a_high_bars_family", + "frame": "00 00 1A 80 00 C0", + "listen": 0.85 + }, + { + "action": "send", + "label": "candidate_001a_low_bars_family", + "frame": "00 00 1A 00 00 40", + "listen": 0.65 + } + ] + }, + { + "action": "listen", + "seconds": 0.80 + } + ] +} diff --git a/scenarios/panel-atlas-rom-button-output-candidates-v1.json b/scenarios/panel-atlas-rom-button-output-candidates-v1.json new file mode 100644 index 0000000..dbbe908 --- /dev/null +++ b/scenarios/panel-atlas-rom-button-output-candidates-v1.json @@ -0,0 +1,1276 @@ +{ + "name": "panel-atlas-rom-button-output-candidates-v1", + "notes": [ + "Fresh-boot webcam sweep for ROM-derived button/report output candidates.", + "This deliberately skips physical RCP button presses: each candidate sends command 0 directly.", + "Each candidate gets its own power-cycle/CONNECT-OK baseline to reduce latch contamination.", + "Candidate snapshots only are enabled; setup, CONNECT OK seeds, and clears should not produce webcam images.", + "Run with --camera-index 4 --snapshot-delays 0.5 on the current bench." + ], + "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": "case001_positive_0013_4000_iris_mblack_link_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case001_positive_0013_4000_iris_mblack_link_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case001_positive_0013_4000_iris_mblack_link: selector 0x0013=0x4000; known IRIS/M.BLACK LINK lamp positive control" + }, + { + "action": "send", + "label": "case001_positive_0013_4000_iris_mblack_link", + "frame": "00 00 13 40 00 09", + "listen": 0.75 + }, + { + "action": "send", + "label": "case001_positive_0013_4000_iris_mblack_link_clear", + "frame": "00 00 13 00 00 49", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case002_positive_0013_8000_slave_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case002_positive_0013_8000_slave_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case002_positive_0013_8000_slave: selector 0x0013=0x8000; known SLAVE lamp positive control" + }, + { + "action": "send", + "label": "case002_positive_0013_8000_slave", + "frame": "00 00 13 80 00 C9", + "listen": 0.75 + }, + { + "action": "send", + "label": "case002_positive_0013_8000_slave_clear", + "frame": "00 00 13 00 00 49", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case003_positive_0015_8000_call_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case003_positive_0015_8000_call_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case003_positive_0015_8000_call: selector 0x0015=0x8000; known CALL lamp positive control" + }, + { + "action": "send", + "label": "case003_positive_0015_8000_call", + "frame": "00 00 15 80 00 CF", + "listen": 0.75 + }, + { + "action": "send", + "label": "case003_positive_0015_8000_call_clear", + "frame": "00 00 15 00 00 4F", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case004_positive_0017_8000_bars_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case004_positive_0017_8000_bars_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case004_positive_0017_8000_bars: selector 0x0017=0x8000; known BARS lamp positive control" + }, + { + "action": "send", + "label": "case004_positive_0017_8000_bars", + "frame": "00 00 17 80 00 CD", + "listen": 0.75 + }, + { + "action": "send", + "label": "case004_positive_0017_8000_bars_clear", + "frame": "00 00 17 00 00 4D", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case005_positive_0110_8000_knee_auto_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case005_positive_0110_8000_knee_auto_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case005_positive_0110_8000_knee_auto: selector 0x0110=0x8000; known KNEE AUTO positive control" + }, + { + "action": "send", + "label": "case005_positive_0110_8000_knee_auto", + "frame": "00 01 90 80 00 4B", + "listen": 0.75 + }, + { + "action": "send", + "label": "case005_positive_0110_8000_knee_auto_clear", + "frame": "00 01 90 00 00 CB", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case006_rom_001a_0808_multi_button_default_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case006_rom_001a_0808_multi_button_default_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case006_rom_001a_0808_multi_button_default: selector 0x001A=0x0808; F6D3 group default/fallback value" + }, + { + "action": "send", + "label": "case006_rom_001a_0808_multi_button_default", + "frame": "00 00 1A 08 08 40", + "listen": 0.75 + }, + { + "action": "send", + "label": "case006_rom_001a_0808_multi_button_default_clear", + "frame": "00 00 1A 00 00 40", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case007_rom_001a_2020_f6d3_bit3_family_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case007_rom_001a_2020_f6d3_bit3_family_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case007_rom_001a_2020_f6d3_bit3_family: selector 0x001A=0x2020; F6D3.3-style packed state candidate" + }, + { + "action": "send", + "label": "case007_rom_001a_2020_f6d3_bit3_family", + "frame": "00 00 1A 20 20 40", + "listen": 0.75 + }, + { + "action": "send", + "label": "case007_rom_001a_2020_f6d3_bit3_family_clear", + "frame": "00 00 1A 00 00 40", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case008_rom_001a_4040_f6d3_bit4_family_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case008_rom_001a_4040_f6d3_bit4_family_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case008_rom_001a_4040_f6d3_bit4_family: selector 0x001A=0x4040; F6D3.4-style packed state candidate" + }, + { + "action": "send", + "label": "case008_rom_001a_4040_f6d3_bit4_family", + "frame": "00 00 1A 40 40 40", + "listen": 0.75 + }, + { + "action": "send", + "label": "case008_rom_001a_4040_f6d3_bit4_family_clear", + "frame": "00 00 1A 00 00 40", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case009_rom_001a_8080_f6d3_bit5_family_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case009_rom_001a_8080_f6d3_bit5_family_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case009_rom_001a_8080_f6d3_bit5_family: selector 0x001A=0x8080; F6D3.5-style packed state candidate" + }, + { + "action": "send", + "label": "case009_rom_001a_8080_f6d3_bit5_family", + "frame": "00 00 1A 80 80 40", + "listen": 0.75 + }, + { + "action": "send", + "label": "case009_rom_001a_8080_f6d3_bit5_family_clear", + "frame": "00 00 1A 00 00 40", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case010_rom_006b_8000_f6d4_bit6_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case010_rom_006b_8000_f6d4_bit6_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case010_rom_006b_8000_f6d4_bit6_candidate: selector 0x006B=0x8000; F6D4.6 handler report value" + }, + { + "action": "send", + "label": "case010_rom_006b_8000_f6d4_bit6_candidate", + "frame": "00 00 6B 80 00 B1", + "listen": 0.75 + }, + { + "action": "send", + "label": "case010_rom_006b_8000_f6d4_bit6_candidate_clear", + "frame": "00 00 6B 00 00 31", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case011_rom_0083_0004_f6d0_step_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case011_rom_0083_0004_f6d0_step_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case011_rom_0083_0004_f6d0_step_candidate: selector 0x0083=0x0004; F6D0.1 lower-step value candidate" + }, + { + "action": "send", + "label": "case011_rom_0083_0004_f6d0_step_candidate", + "frame": "00 01 03 00 04 5C", + "listen": 0.75 + }, + { + "action": "send", + "label": "case011_rom_0083_0004_f6d0_step_candidate_clear", + "frame": "00 01 03 00 00 58", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case012_rom_0083_4000_high_tag_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case012_rom_0083_4000_high_tag_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case012_rom_0083_4000_high_tag_candidate: selector 0x0083=0x4000; 0x0083 high-bit/tag candidate" + }, + { + "action": "send", + "label": "case012_rom_0083_4000_high_tag_candidate", + "frame": "00 01 03 40 00 18", + "listen": 0.75 + }, + { + "action": "send", + "label": "case012_rom_0083_4000_high_tag_candidate_clear", + "frame": "00 01 03 00 00 58", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case013_rom_0083_2000_high_tag_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case013_rom_0083_2000_high_tag_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case013_rom_0083_2000_high_tag_candidate: selector 0x0083=0x2000; 0x0083 high-bit/tag candidate" + }, + { + "action": "send", + "label": "case013_rom_0083_2000_high_tag_candidate", + "frame": "00 01 03 20 00 78", + "listen": 0.75 + }, + { + "action": "send", + "label": "case013_rom_0083_2000_high_tag_candidate_clear", + "frame": "00 01 03 00 00 58", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case014_rom_008f_8000_f6d0_bit7_local_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case014_rom_008f_8000_f6d0_bit7_local_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case014_rom_008f_8000_f6d0_bit7_local: selector 0x008F=0x8000; F6D0.7 local SHUTTER/OTHERS report bit" + }, + { + "action": "send", + "label": "case014_rom_008f_8000_f6d0_bit7_local", + "frame": "00 01 0F 80 00 D4", + "listen": 0.75 + }, + { + "action": "send", + "label": "case014_rom_008f_8000_f6d0_bit7_local_clear", + "frame": "00 01 0F 00 00 54", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case015_rom_008f_2000_f6d0_bit6_local_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case015_rom_008f_2000_f6d0_bit6_local_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case015_rom_008f_2000_f6d0_bit6_local: selector 0x008F=0x2000; F6D0.6 local SHUTTER/OTHERS report bit" + }, + { + "action": "send", + "label": "case015_rom_008f_2000_f6d0_bit6_local", + "frame": "00 01 0F 20 00 74", + "listen": 0.75 + }, + { + "action": "send", + "label": "case015_rom_008f_2000_f6d0_bit6_local_clear", + "frame": "00 01 0F 00 00 54", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case016_known_008f_0800_evs_display_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case016_known_008f_0800_evs_display_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case016_known_008f_0800_evs_display: selector 0x008F=0x0800; known EVS/shutter display positive control" + }, + { + "action": "send", + "label": "case016_known_008f_0800_evs_display", + "frame": "00 01 0F 08 00 5C", + "listen": 0.75 + }, + { + "action": "send", + "label": "case016_known_008f_0800_evs_display_clear", + "frame": "00 01 0F 00 00 54", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case017_known_008f_1000_off_display_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case017_known_008f_1000_off_display_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case017_known_008f_1000_off_display: selector 0x008F=0x1000; known OFF/shutter display positive control" + }, + { + "action": "send", + "label": "case017_known_008f_1000_off_display", + "frame": "00 01 0F 10 00 44", + "listen": 0.75 + }, + { + "action": "send", + "label": "case017_known_008f_1000_off_display_clear", + "frame": "00 01 0F 00 00 54", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case018_rom_0093_1020_f6dc_bit5_context_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case018_rom_0093_1020_f6dc_bit5_context_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case018_rom_0093_1020_f6dc_bit5_context: selector 0x0093=0x1020; F6DC.5 handler context candidate" + }, + { + "action": "send", + "label": "case018_rom_0093_1020_f6dc_bit5_context", + "frame": "00 01 13 10 20 78", + "listen": 0.75 + }, + { + "action": "send", + "label": "case018_rom_0093_1020_f6dc_bit5_context_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case019_rom_0093_4040_f6dc_bit4_context_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case019_rom_0093_4040_f6dc_bit4_context_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case019_rom_0093_4040_f6dc_bit4_context: selector 0x0093=0x4040; F6DC.4 handler context candidate" + }, + { + "action": "send", + "label": "case019_rom_0093_4040_f6dc_bit4_context", + "frame": "00 01 13 40 40 48", + "listen": 0.75 + }, + { + "action": "send", + "label": "case019_rom_0093_4040_f6dc_bit4_context_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case020_rom_0093_8040_f6dc_bit3_context_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case020_rom_0093_8040_f6dc_bit3_context_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case020_rom_0093_8040_f6dc_bit3_context: selector 0x0093=0x8040; F6DC.3 handler context candidate" + }, + { + "action": "send", + "label": "case020_rom_0093_8040_f6dc_bit3_context", + "frame": "00 01 13 80 40 88", + "listen": 0.75 + }, + { + "action": "send", + "label": "case020_rom_0093_8040_f6dc_bit3_context_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case021_rom_0093_0020_f6dc_bit1_context_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case021_rom_0093_0020_f6dc_bit1_context_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case021_rom_0093_0020_f6dc_bit1_context: selector 0x0093=0x0020; F6DC.1 handler low-field candidate" + }, + { + "action": "send", + "label": "case021_rom_0093_0020_f6dc_bit1_context", + "frame": "00 01 13 00 20 68", + "listen": 0.75 + }, + { + "action": "send", + "label": "case021_rom_0093_0020_f6dc_bit1_context_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case022_rom_0093_0040_f6dc_bit0_context_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case022_rom_0093_0040_f6dc_bit0_context_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case022_rom_0093_0040_f6dc_bit0_context: selector 0x0093=0x0040; F6DC.0 handler low-field candidate" + }, + { + "action": "send", + "label": "case022_rom_0093_0040_f6dc_bit0_context", + "frame": "00 01 13 00 40 08", + "listen": 0.75 + }, + { + "action": "send", + "label": "case022_rom_0093_0040_f6dc_bit0_context_clear", + "frame": "00 01 13 00 00 48", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case023_rom_009a_0800_iris_auto_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case023_rom_009a_0800_iris_auto_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case023_rom_009a_0800_iris_auto_candidate: selector 0x009A=0x0800; F6DB.3 IRIS AUTO report candidate" + }, + { + "action": "send", + "label": "case023_rom_009a_0800_iris_auto_candidate", + "frame": "00 01 1A 08 00 49", + "listen": 0.75 + }, + { + "action": "send", + "label": "case023_rom_009a_0800_iris_auto_candidate_clear", + "frame": "00 01 1A 00 00 41", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case024_rom_00b7_2000_f6d4_bit0_bundle_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case024_rom_00b7_2000_f6d4_bit0_bundle_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case024_rom_00b7_2000_f6d4_bit0_bundle: selector 0x00B7=0x2000; F6D4.0 bundle selector candidate" + }, + { + "action": "send", + "label": "case024_rom_00b7_2000_f6d4_bit0_bundle", + "frame": "00 01 37 20 00 4C", + "listen": 0.75 + }, + { + "action": "send", + "label": "case024_rom_00b7_2000_f6d4_bit0_bundle_clear", + "frame": "00 01 37 00 00 6C", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case025_rom_00b9_4000_f6dc_bit7_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case025_rom_00b9_4000_f6dc_bit7_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case025_rom_00b9_4000_f6dc_bit7_candidate: selector 0x00B9=0x4000; F6DC.7 handler value candidate" + }, + { + "action": "send", + "label": "case025_rom_00b9_4000_f6dc_bit7_candidate", + "frame": "00 01 39 40 00 22", + "listen": 0.75 + }, + { + "action": "send", + "label": "case025_rom_00b9_4000_f6dc_bit7_candidate_clear", + "frame": "00 01 39 00 00 62", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case026_rom_00c4_8000_f6d4_bit0_bundle_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case026_rom_00c4_8000_f6d4_bit0_bundle_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case026_rom_00c4_8000_f6d4_bit0_bundle: selector 0x00C4=0x8000; F6D4.0 bundle selector candidate" + }, + { + "action": "send", + "label": "case026_rom_00c4_8000_f6d4_bit0_bundle", + "frame": "00 01 44 80 00 9F", + "listen": 0.75 + }, + { + "action": "send", + "label": "case026_rom_00c4_8000_f6d4_bit0_bundle_clear", + "frame": "00 01 44 00 00 1F", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case027_rom_00c6_8000_f6d4_bit0_bundle_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case027_rom_00c6_8000_f6d4_bit0_bundle_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case027_rom_00c6_8000_f6d4_bit0_bundle: selector 0x00C6=0x8000; F6D4.0 bundle selector candidate" + }, + { + "action": "send", + "label": "case027_rom_00c6_8000_f6d4_bit0_bundle", + "frame": "00 01 46 80 00 9D", + "listen": 0.75 + }, + { + "action": "send", + "label": "case027_rom_00c6_8000_f6d4_bit0_bundle_clear", + "frame": "00 01 46 00 00 1D", + "listen": 0.12, + "snapshot": false + }, + { + "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": "case028_rom_00f8_8000_f6d4_bit1_candidate_ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "send", + "label": "case028_rom_00f8_8000_f6d4_bit1_candidate_ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.25, + "snapshot": false + }, + { + "action": "note", + "message": "case028_rom_00f8_8000_f6d4_bit1_candidate: selector 0x00F8=0x8000; F6D4.1 handler candidate" + }, + { + "action": "send", + "label": "case028_rom_00f8_8000_f6d4_bit1_candidate", + "frame": "00 01 78 80 00 A3", + "listen": 0.75 + }, + { + "action": "send", + "label": "case028_rom_00f8_8000_f6d4_bit1_candidate_clear", + "frame": "00 01 78 00 00 23", + "listen": 0.12, + "snapshot": false + }, + { + "action": "listen", + "seconds": 0.8 + } + ] +} diff --git a/scenarios/panel-atlas-standard-master-bit-sweep-v1.json b/scenarios/panel-atlas-standard-master-bit-sweep-v1.json new file mode 100644 index 0000000..994edc8 --- /dev/null +++ b/scenarios/panel-atlas-standard-master-bit-sweep-v1.json @@ -0,0 +1,110 @@ +{ + "name": "panel-atlas-standard-master-bit-sweep-v1", + "notes": [ + "Targeted bench sweep for the far-right STANDARD and MASTER lamps.", + "Uses CONNECT OK seed frames, a known SLAVE positive control, then bit sweeps around adjacent selector words.", + "Watch far-right stack top to bottom: tally, STANDARD, MASTER, SLAVE, CAM POWER, BARS." + ], + "steps": [ + { + "action": "power_cycle", + "off_seconds": 1.5 + }, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": 10.0, + "require": true + }, + { + "action": "drain", + "seconds": 0.8 + }, + { + "action": "send", + "label": "ok_seed_1", + "frame": "00 00 00 80 00 DA", + "listen": 0.6 + }, + { + "action": "send", + "label": "ok_seed_2", + "frame": "00 00 00 80 00 DA", + "listen": 0.6 + }, + { + "action": "send", + "label": "positive_control_0013_8000_slave_on", + "frame": "00 00 13 80 00 C9", + "listen": 0.8 + }, + { + "action": "send", + "label": "clear_0013_after_slave", + "frame": "00 00 13 00 00 49", + "listen": 0.5 + }, + { + "action": "repeat", + "count": 1, + "steps": [ + {"action": "send", "label": "candidate_0013_4000", "frame": "00 00 13 40 00 09", "listen": 0.75}, + {"action": "send", "label": "clear_0013_after_4000", "frame": "00 00 13 00 00 49", "listen": 0.45}, + {"action": "send", "label": "candidate_0013_2000", "frame": "00 00 13 20 00 69", "listen": 0.75}, + {"action": "send", "label": "clear_0013_after_2000", "frame": "00 00 13 00 00 49", "listen": 0.45}, + {"action": "send", "label": "candidate_0013_1000", "frame": "00 00 13 10 00 59", "listen": 0.75}, + {"action": "send", "label": "clear_0013_after_1000", "frame": "00 00 13 00 00 49", "listen": 0.45}, + {"action": "send", "label": "candidate_0013_0800", "frame": "00 00 13 08 00 41", "listen": 0.75}, + {"action": "send", "label": "clear_0013_after_0800", "frame": "00 00 13 00 00 49", "listen": 0.45} + ] + }, + { + "action": "send", + "label": "ok_refresh_before_0012", + "frame": "00 00 00 80 00 DA", + "listen": 0.6 + }, + { + "action": "repeat", + "count": 1, + "steps": [ + {"action": "send", "label": "candidate_0012_4000", "frame": "00 00 12 40 00 08", "listen": 0.75}, + {"action": "send", "label": "clear_0012_after_4000", "frame": "00 00 12 00 00 48", "listen": 0.45}, + {"action": "send", "label": "candidate_0012_2000", "frame": "00 00 12 20 00 68", "listen": 0.75}, + {"action": "send", "label": "clear_0012_after_2000", "frame": "00 00 12 00 00 48", "listen": 0.45}, + {"action": "send", "label": "candidate_0012_1000", "frame": "00 00 12 10 00 58", "listen": 0.75}, + {"action": "send", "label": "clear_0012_after_1000", "frame": "00 00 12 00 00 48", "listen": 0.45}, + {"action": "send", "label": "candidate_0012_0800", "frame": "00 00 12 08 00 40", "listen": 0.75}, + {"action": "send", "label": "clear_0012_after_0800", "frame": "00 00 12 00 00 48", "listen": 0.45}, + {"action": "send", "label": "candidate_0012_8000", "frame": "00 00 12 80 00 C8", "listen": 0.75}, + {"action": "send", "label": "clear_0012_after_8000", "frame": "00 00 12 00 00 48", "listen": 0.45} + ] + }, + { + "action": "send", + "label": "ok_refresh_before_0014", + "frame": "00 00 00 80 00 DA", + "listen": 0.6 + }, + { + "action": "repeat", + "count": 1, + "steps": [ + {"action": "send", "label": "candidate_0014_4000", "frame": "00 00 14 40 00 0E", "listen": 0.75}, + {"action": "send", "label": "clear_0014_after_4000", "frame": "00 00 14 00 00 4E", "listen": 0.45}, + {"action": "send", "label": "candidate_0014_2000", "frame": "00 00 14 20 00 6E", "listen": 0.75}, + {"action": "send", "label": "clear_0014_after_2000", "frame": "00 00 14 00 00 4E", "listen": 0.45}, + {"action": "send", "label": "candidate_0014_1000", "frame": "00 00 14 10 00 5E", "listen": 0.75}, + {"action": "send", "label": "clear_0014_after_1000", "frame": "00 00 14 00 00 4E", "listen": 0.45}, + {"action": "send", "label": "candidate_0014_0800", "frame": "00 00 14 08 00 46", "listen": 0.75}, + {"action": "send", "label": "clear_0014_after_0800", "frame": "00 00 14 00 00 4E", "listen": 0.45}, + {"action": "send", "label": "candidate_0014_8000", "frame": "00 00 14 80 00 CE", "listen": 0.75}, + {"action": "send", "label": "clear_0014_after_8000", "frame": "00 00 14 00 00 4E", "listen": 0.45} + ] + }, + { + "action": "listen", + "seconds": 1.0 + } + ] +} diff --git a/scenarios/panel-atlas-standard-master-lower-neighbor-sweep-v3.json b/scenarios/panel-atlas-standard-master-lower-neighbor-sweep-v3.json new file mode 100644 index 0000000..b66612d --- /dev/null +++ b/scenarios/panel-atlas-standard-master-lower-neighbor-sweep-v3.json @@ -0,0 +1,70 @@ +{ + "name": "panel-atlas-standard-master-lower-neighbor-sweep-v3", + "notes": [ + "Third STANDARD/MASTER hunt over lower neighbor selectors 0x0008-0x000F.", + "This tests whether the far-right STANDARD/MASTER lamps live closer to the CAM POWER/CALL selector pocket than the SLAVE/BARS pocket.", + "Watch far-right stack top to bottom: tally, STANDARD, MASTER, SLAVE, CAM POWER, BARS." + ], + "steps": [ + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.8}, + {"action": "send", "label": "ok_seed_1", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "ok_seed_2", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "positive_control_0013_8000_slave_on", "frame": "00 00 13 80 00 C9", "listen": 0.8}, + {"action": "send", "label": "clear_0013_after_slave", "frame": "00 00 13 00 00 49", "listen": 0.6}, + + {"action": "send", "label": "candidate_0008_8000", "frame": "00 00 08 80 00 D2", "listen": 0.6}, + {"action": "send", "label": "candidate_0008_4000", "frame": "00 00 08 40 00 12", "listen": 0.6}, + {"action": "send", "label": "candidate_0008_2000", "frame": "00 00 08 20 00 72", "listen": 0.6}, + {"action": "send", "label": "candidate_0008_1000", "frame": "00 00 08 10 00 42", "listen": 0.6}, + {"action": "send", "label": "clear_0008", "frame": "00 00 08 00 00 52", "listen": 0.45}, + + {"action": "send", "label": "candidate_0009_8000", "frame": "00 00 09 80 00 D3", "listen": 0.6}, + {"action": "send", "label": "candidate_0009_4000", "frame": "00 00 09 40 00 13", "listen": 0.6}, + {"action": "send", "label": "candidate_0009_2000", "frame": "00 00 09 20 00 73", "listen": 0.6}, + {"action": "send", "label": "candidate_0009_1000", "frame": "00 00 09 10 00 43", "listen": 0.6}, + {"action": "send", "label": "clear_0009", "frame": "00 00 09 00 00 53", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_000A", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_000A_8000", "frame": "00 00 0A 80 00 D0", "listen": 0.6}, + {"action": "send", "label": "candidate_000A_4000", "frame": "00 00 0A 40 00 10", "listen": 0.6}, + {"action": "send", "label": "candidate_000A_2000", "frame": "00 00 0A 20 00 70", "listen": 0.6}, + {"action": "send", "label": "candidate_000A_1000", "frame": "00 00 0A 10 00 40", "listen": 0.6}, + {"action": "send", "label": "clear_000A", "frame": "00 00 0A 00 00 50", "listen": 0.45}, + + {"action": "send", "label": "candidate_000B_8000", "frame": "00 00 0B 80 00 D1", "listen": 0.6}, + {"action": "send", "label": "candidate_000B_4000", "frame": "00 00 0B 40 00 11", "listen": 0.6}, + {"action": "send", "label": "candidate_000B_2000", "frame": "00 00 0B 20 00 71", "listen": 0.6}, + {"action": "send", "label": "candidate_000B_1000", "frame": "00 00 0B 10 00 41", "listen": 0.6}, + {"action": "send", "label": "clear_000B", "frame": "00 00 0B 00 00 51", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_000C", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_000C_8000", "frame": "00 00 0C 80 00 D6", "listen": 0.6}, + {"action": "send", "label": "candidate_000C_4000", "frame": "00 00 0C 40 00 16", "listen": 0.6}, + {"action": "send", "label": "candidate_000C_2000", "frame": "00 00 0C 20 00 76", "listen": 0.6}, + {"action": "send", "label": "candidate_000C_1000", "frame": "00 00 0C 10 00 46", "listen": 0.6}, + {"action": "send", "label": "clear_000C", "frame": "00 00 0C 00 00 56", "listen": 0.45}, + + {"action": "send", "label": "candidate_000D_8000", "frame": "00 00 0D 80 00 D7", "listen": 0.6}, + {"action": "send", "label": "candidate_000D_4000", "frame": "00 00 0D 40 00 17", "listen": 0.6}, + {"action": "send", "label": "candidate_000D_2000", "frame": "00 00 0D 20 00 77", "listen": 0.6}, + {"action": "send", "label": "candidate_000D_1000", "frame": "00 00 0D 10 00 47", "listen": 0.6}, + {"action": "send", "label": "clear_000D", "frame": "00 00 0D 00 00 57", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_000E", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_000E_8000", "frame": "00 00 0E 80 00 D4", "listen": 0.6}, + {"action": "send", "label": "candidate_000E_4000", "frame": "00 00 0E 40 00 14", "listen": 0.6}, + {"action": "send", "label": "candidate_000E_2000", "frame": "00 00 0E 20 00 74", "listen": 0.6}, + {"action": "send", "label": "candidate_000E_1000", "frame": "00 00 0E 10 00 44", "listen": 0.6}, + {"action": "send", "label": "clear_000E", "frame": "00 00 0E 00 00 54", "listen": 0.45}, + + {"action": "send", "label": "candidate_000F_8000", "frame": "00 00 0F 80 00 D5", "listen": 0.6}, + {"action": "send", "label": "candidate_000F_4000", "frame": "00 00 0F 40 00 15", "listen": 0.6}, + {"action": "send", "label": "candidate_000F_2000", "frame": "00 00 0F 20 00 75", "listen": 0.6}, + {"action": "send", "label": "candidate_000F_1000", "frame": "00 00 0F 10 00 45", "listen": 0.6}, + {"action": "send", "label": "clear_000F", "frame": "00 00 0F 00 00 55", "listen": 0.45}, + + {"action": "listen", "seconds": 1.0} + ] +} diff --git a/scenarios/panel-atlas-standard-master-neighbor-sweep-v2.json b/scenarios/panel-atlas-standard-master-neighbor-sweep-v2.json new file mode 100644 index 0000000..043ade7 --- /dev/null +++ b/scenarios/panel-atlas-standard-master-neighbor-sweep-v2.json @@ -0,0 +1,70 @@ +{ + "name": "panel-atlas-standard-master-neighbor-sweep-v2", + "notes": [ + "Second targeted STANDARD/MASTER hunt after 0x0012/0x0013/0x0014 high-bit pass did not show them.", + "Sweeps neighboring selector words with high-nibble values; these are the values most similar to confirmed lamp controls.", + "Watch far-right stack top to bottom: tally, STANDARD, MASTER, SLAVE, CAM POWER, BARS." + ], + "steps": [ + {"action": "power_cycle", "off_seconds": 1.5}, + {"action": "wait_ready", "heartbeats": 2, "timeout": 10.0, "require": true}, + {"action": "drain", "seconds": 0.8}, + {"action": "send", "label": "ok_seed_1", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "ok_seed_2", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "positive_control_0013_8000_slave_on", "frame": "00 00 13 80 00 C9", "listen": 0.8}, + {"action": "send", "label": "clear_0013_after_slave", "frame": "00 00 13 00 00 49", "listen": 0.6}, + + {"action": "send", "label": "candidate_0010_8000", "frame": "00 00 10 80 00 CA", "listen": 0.6}, + {"action": "send", "label": "candidate_0010_4000", "frame": "00 00 10 40 00 0A", "listen": 0.6}, + {"action": "send", "label": "candidate_0010_2000", "frame": "00 00 10 20 00 6A", "listen": 0.6}, + {"action": "send", "label": "candidate_0010_1000", "frame": "00 00 10 10 00 5A", "listen": 0.6}, + {"action": "send", "label": "clear_0010", "frame": "00 00 10 00 00 4A", "listen": 0.45}, + + {"action": "send", "label": "candidate_0011_8000", "frame": "00 00 11 80 00 CB", "listen": 0.6}, + {"action": "send", "label": "candidate_0011_4000", "frame": "00 00 11 40 00 0B", "listen": 0.6}, + {"action": "send", "label": "candidate_0011_2000", "frame": "00 00 11 20 00 6B", "listen": 0.6}, + {"action": "send", "label": "candidate_0011_1000", "frame": "00 00 11 10 00 5B", "listen": 0.6}, + {"action": "send", "label": "clear_0011", "frame": "00 00 11 00 00 4B", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_0015", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_0015_4000", "frame": "00 00 15 40 00 0F", "listen": 0.6}, + {"action": "send", "label": "candidate_0015_2000", "frame": "00 00 15 20 00 6F", "listen": 0.6}, + {"action": "send", "label": "candidate_0015_1000", "frame": "00 00 15 10 00 5F", "listen": 0.6}, + {"action": "send", "label": "candidate_0015_0800", "frame": "00 00 15 08 00 47", "listen": 0.6}, + {"action": "send", "label": "clear_0015", "frame": "00 00 15 00 00 4F", "listen": 0.45}, + + {"action": "send", "label": "candidate_0016_8000", "frame": "00 00 16 80 00 CC", "listen": 0.6}, + {"action": "send", "label": "candidate_0016_4000", "frame": "00 00 16 40 00 0C", "listen": 0.6}, + {"action": "send", "label": "candidate_0016_2000", "frame": "00 00 16 20 00 6C", "listen": 0.6}, + {"action": "send", "label": "candidate_0016_1000", "frame": "00 00 16 10 00 5C", "listen": 0.6}, + {"action": "send", "label": "clear_0016", "frame": "00 00 16 00 00 4C", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_0017", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_0017_4000", "frame": "00 00 17 40 00 0D", "listen": 0.6}, + {"action": "send", "label": "candidate_0017_2000", "frame": "00 00 17 20 00 6D", "listen": 0.6}, + {"action": "send", "label": "candidate_0017_1000", "frame": "00 00 17 10 00 5D", "listen": 0.6}, + {"action": "send", "label": "candidate_0017_0800", "frame": "00 00 17 08 00 45", "listen": 0.6}, + {"action": "send", "label": "clear_0017", "frame": "00 00 17 00 00 4D", "listen": 0.45}, + + {"action": "send", "label": "candidate_0018_8000", "frame": "00 00 18 80 00 C2", "listen": 0.6}, + {"action": "send", "label": "candidate_0018_4000", "frame": "00 00 18 40 00 02", "listen": 0.6}, + {"action": "send", "label": "candidate_0018_2000", "frame": "00 00 18 20 00 62", "listen": 0.6}, + {"action": "send", "label": "candidate_0018_1000", "frame": "00 00 18 10 00 52", "listen": 0.6}, + {"action": "send", "label": "clear_0018", "frame": "00 00 18 00 00 42", "listen": 0.45}, + + {"action": "send", "label": "ok_refresh_before_0019", "frame": "00 00 00 80 00 DA", "listen": 0.6}, + {"action": "send", "label": "candidate_0019_8000", "frame": "00 00 19 80 00 C3", "listen": 0.6}, + {"action": "send", "label": "candidate_0019_4000", "frame": "00 00 19 40 00 03", "listen": 0.6}, + {"action": "send", "label": "candidate_0019_2000", "frame": "00 00 19 20 00 63", "listen": 0.6}, + {"action": "send", "label": "candidate_0019_1000", "frame": "00 00 19 10 00 53", "listen": 0.6}, + {"action": "send", "label": "clear_0019", "frame": "00 00 19 00 00 43", "listen": 0.45}, + + {"action": "send", "label": "candidate_001A_8000", "frame": "00 00 1A 80 00 C0", "listen": 0.6}, + {"action": "send", "label": "candidate_001A_4000", "frame": "00 00 1A 40 00 00", "listen": 0.6}, + {"action": "send", "label": "candidate_001A_2000", "frame": "00 00 1A 20 00 60", "listen": 0.6}, + {"action": "send", "label": "candidate_001A_1000", "frame": "00 00 1A 10 00 50", "listen": 0.6}, + {"action": "send", "label": "clear_001A", "frame": "00 00 1A 00 00 40", "listen": 0.45}, + + {"action": "listen", "seconds": 1.0} + ] +} diff --git a/scripts/build_panel_visual_sweep.py b/scripts/build_panel_visual_sweep.py new file mode 100644 index 0000000..b57800d --- /dev/null +++ b/scripts/build_panel_visual_sweep.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +"""Build a JSON serial_scenario for broad visible panel sweeps.""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path +from typing import Iterable + + +CHECKSUM_SEED = 0x5A +CONNECT_OK_FRAME = "00 00 00 80 00 DA" +SLAVE_POSITIVE_CONTROL = "00 00 13 80 00 C9" +SLAVE_CLEAR = "00 00 13 00 00 49" + + +def main() -> int: + args = build_arg_parser().parse_args() + values = parse_int_list(args.values) + skips = set(parse_int_list(args.skip)) if args.skip else set() + selectors = [ + selector + for selector in range(parse_int(args.start), parse_int(args.end) + 1) + if selector not in skips and (args.include_selector_zero or selector != 0) + ] + if not selectors: + raise SystemExit("selector range is empty after skips") + + scenario = build_scenario(args, selectors, values) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(scenario, indent=2) + "\n", encoding="utf-8") + + candidate_images = len(selectors) * len(values) + windows = window_count(len(selectors), args.power_cycle_every) + print(f"wrote {args.output}") + print(f"selectors={len(selectors)} values={len(values)} candidate_snapshots={candidate_images}") + print(f"power_cycle_windows={windows} estimated_candidate_time={candidate_images * args.listen / 60:.1f}min") + return 0 + + +def build_arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Generate a serial_scenario JSON file for a broad panel-output webcam sweep." + ) + parser.add_argument("output", type=Path, help="scenario JSON path to write") + parser.add_argument("--start", default="0x0001", help="first logical selector, inclusive") + parser.add_argument("--end", default="0x017F", help="last logical selector, inclusive") + parser.add_argument( + "--values", + default="0x8000,0x4000,0x2000,0x1000,0x0800", + help="comma-separated 16-bit values to try for each selector", + ) + parser.add_argument( + "--skip", + default="", + help="comma-separated logical selectors to skip, e.g. 0x006C,0x006D", + ) + parser.add_argument( + "--include-selector-zero", + action="store_true", + help="include selector 0 in the sweep; omitted by default because it controls CONNECT OK state", + ) + parser.add_argument("--listen", type=float, default=0.65, help="seconds to listen after each candidate send") + parser.add_argument("--clear-listen", type=float, default=0.15, help="seconds after selector clear writes") + parser.add_argument("--ok-listen", type=float, default=0.30, help="seconds after CONNECT OK refresh writes") + parser.add_argument( + "--ok-every", + type=int, + default=8, + help="refresh CONNECT OK every N selectors; use 0 to disable periodic refresh", + ) + parser.add_argument( + "--power-cycle-every", + type=int, + default=32, + help="power-cycle every N selectors to limit latch contamination; use 0 for one long session", + ) + parser.add_argument("--off-seconds", type=float, default=1.5, help="relay power-off time per window") + parser.add_argument("--ready-timeout", type=float, default=10.0, help="wait_ready timeout") + parser.add_argument("--drain", type=float, default=0.5, help="seconds to drain after ready") + parser.add_argument("--final-listen", type=float, default=1.0, help="seconds to listen at the end") + return parser + + +def build_scenario(args: argparse.Namespace, selectors: list[int], values: list[int]) -> dict[str, object]: + start = selectors[0] + end = selectors[-1] + value_text = ",".join(f"0x{value:04X}" for value in values) + scenario: dict[str, object] = { + "name": f"panel-atlas-big-visual-sweep-{start:03X}-{end:03X}", + "notes": [ + "Broad visible-output sweep generated by scripts/build_panel_visual_sweep.py.", + "Candidate selector/value sends have webcam snapshots enabled; CONNECT OK refreshes and clears do not.", + "Use image filenames candidate_XXXX_YYYY to refine any visible trigger into a smaller follow-up scenario.", + f"Values: {value_text}", + ], + "steps": [], + } + steps: list[dict[str, object]] = scenario["steps"] # type: ignore[assignment] + + for window_index, window in enumerate(selector_windows(selectors, args.power_cycle_every), start=1): + add_session_prelude(args, steps, window_index) + if window_index == 1: + steps.append(send_step("positive_control_0013_8000_slave_on", SLAVE_POSITIVE_CONTROL, args.listen)) + steps.append(send_step("clear_0013_after_slave", SLAVE_CLEAR, args.clear_listen, snapshot=False)) + + for selector_index, selector in enumerate(window, start=1): + if args.ok_every > 0 and (selector_index - 1) % args.ok_every == 0: + steps.append( + send_step( + f"ok_refresh_before_{selector:04X}", + CONNECT_OK_FRAME, + args.ok_listen, + snapshot=False, + ) + ) + for value in values: + steps.append( + send_step( + f"candidate_{selector:04X}_{value:04X}", + frame_hex(0x00, selector, value), + args.listen, + ) + ) + steps.append( + send_step( + f"clear_{selector:04X}", + frame_hex(0x00, selector, 0), + args.clear_listen, + snapshot=False, + ) + ) + + steps.append({"action": "listen", "seconds": args.final_listen}) + return scenario + + +def add_session_prelude(args: argparse.Namespace, steps: list[dict[str, object]], window_index: int) -> None: + steps.extend( + [ + {"action": "power_cycle", "off_seconds": args.off_seconds}, + { + "action": "wait_ready", + "heartbeats": 2, + "timeout": args.ready_timeout, + "require": True, + }, + {"action": "drain", "seconds": args.drain}, + send_step(f"window_{window_index:03d}_ok_seed_1", CONNECT_OK_FRAME, args.ok_listen, snapshot=False), + send_step(f"window_{window_index:03d}_ok_seed_2", CONNECT_OK_FRAME, args.ok_listen, snapshot=False), + ] + ) + + +def send_step(label: str, frame: str, listen: float, *, snapshot: bool = True) -> dict[str, object]: + step: dict[str, object] = { + "action": "send", + "label": label, + "frame": frame, + "listen": listen, + } + if not snapshot: + step["snapshot"] = False + return step + + +def selector_windows(selectors: list[int], size: int) -> Iterable[list[int]]: + if size <= 0: + yield selectors + return + for index in range(0, len(selectors), size): + yield selectors[index : index + size] + + +def window_count(selector_count: int, size: int) -> int: + if size <= 0: + return 1 + return (selector_count + size - 1) // size + + +def frame_hex(command: int, selector: int, value: int) -> str: + selector_hi, selector_lo = selector_bytes(selector) + data = bytes( + [ + command & 0xFF, + selector_hi, + selector_lo, + (value >> 8) & 0xFF, + value & 0xFF, + ] + ) + return " ".join(f"{byte:02X}" for byte in data + bytes([frame_checksum(data)])) + + +def selector_bytes(selector: int) -> tuple[int, int]: + selector &= 0x01FF + if selector <= 0x007F: + return 0x00, selector + if selector <= 0x017F: + return 0x01, selector - 0x0080 + return 0x02, selector - 0x0180 + + +def frame_checksum(data: bytes) -> int: + checksum = CHECKSUM_SEED + for value in data[:5]: + checksum ^= value + return checksum & 0xFF + + +def parse_int_list(text: str) -> list[int]: + values = [] + for part in text.split(","): + item = part.strip() + if item: + values.append(parse_int(item)) + return values + + +def parse_int(text: str) -> int: + return int(str(text).strip(), 0) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/build_rom_button_output_sweep.py b/scripts/build_rom_button_output_sweep.py new file mode 100644 index 0000000..92c0621 --- /dev/null +++ b/scripts/build_rom_button_output_sweep.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +"""Build a fresh-boot webcam sweep for ROM-derived panel-output candidates.""" + +from __future__ import annotations + +import argparse +import json +from dataclasses import dataclass +from pathlib import Path + + +CHECKSUM_SEED = 0x5A +CONNECT_OK_FRAME = "00 00 00 80 00 DA" + + +@dataclass(frozen=True) +class Candidate: + label: str + selector: int + value: int + note: str + + +CANDIDATES: tuple[Candidate, ...] = ( + Candidate("positive_0013_4000_iris_mblack_link", 0x0013, 0x4000, "known IRIS/M.BLACK LINK lamp positive control"), + Candidate("positive_0013_8000_slave", 0x0013, 0x8000, "known SLAVE lamp positive control"), + Candidate("positive_0015_8000_call", 0x0015, 0x8000, "known CALL lamp positive control"), + Candidate("positive_0017_8000_bars", 0x0017, 0x8000, "known BARS lamp positive control"), + Candidate("positive_0110_8000_knee_auto", 0x0110, 0x8000, "known KNEE AUTO positive control"), + Candidate("rom_001a_0808_multi_button_default", 0x001A, 0x0808, "F6D3 group default/fallback value"), + Candidate("rom_001a_2020_f6d3_bit3_family", 0x001A, 0x2020, "F6D3.3-style packed state candidate"), + Candidate("rom_001a_4040_f6d3_bit4_family", 0x001A, 0x4040, "F6D3.4-style packed state candidate"), + Candidate("rom_001a_8080_f6d3_bit5_family", 0x001A, 0x8080, "F6D3.5-style packed state candidate"), + Candidate("rom_006b_8000_f6d4_bit6_candidate", 0x006B, 0x8000, "F6D4.6 handler report value"), + Candidate("rom_0083_0004_f6d0_step_candidate", 0x0083, 0x0004, "F6D0.1 lower-step value candidate"), + Candidate("rom_0083_4000_high_tag_candidate", 0x0083, 0x4000, "0x0083 high-bit/tag candidate"), + Candidate("rom_0083_2000_high_tag_candidate", 0x0083, 0x2000, "0x0083 high-bit/tag candidate"), + Candidate("rom_008f_8000_f6d0_bit7_local", 0x008F, 0x8000, "F6D0.7 local SHUTTER/OTHERS report bit"), + Candidate("rom_008f_2000_f6d0_bit6_local", 0x008F, 0x2000, "F6D0.6 local SHUTTER/OTHERS report bit"), + Candidate("known_008f_0800_evs_display", 0x008F, 0x0800, "known EVS/shutter display positive control"), + Candidate("known_008f_1000_off_display", 0x008F, 0x1000, "known OFF/shutter display positive control"), + Candidate("rom_0093_1020_f6dc_bit5_context", 0x0093, 0x1020, "F6DC.5 handler context candidate"), + Candidate("rom_0093_4040_f6dc_bit4_context", 0x0093, 0x4040, "F6DC.4 handler context candidate"), + Candidate("rom_0093_8040_f6dc_bit3_context", 0x0093, 0x8040, "F6DC.3 handler context candidate"), + Candidate("rom_0093_0020_f6dc_bit1_context", 0x0093, 0x0020, "F6DC.1 handler low-field candidate"), + Candidate("rom_0093_0040_f6dc_bit0_context", 0x0093, 0x0040, "F6DC.0 handler low-field candidate"), + Candidate("rom_009a_0800_iris_auto_candidate", 0x009A, 0x0800, "F6DB.3 IRIS AUTO report candidate"), + Candidate("rom_00b7_2000_f6d4_bit0_bundle", 0x00B7, 0x2000, "F6D4.0 bundle selector candidate"), + Candidate("rom_00b9_4000_f6dc_bit7_candidate", 0x00B9, 0x4000, "F6DC.7 handler value candidate"), + Candidate("rom_00c4_8000_f6d4_bit0_bundle", 0x00C4, 0x8000, "F6D4.0 bundle selector candidate"), + Candidate("rom_00c6_8000_f6d4_bit0_bundle", 0x00C6, 0x8000, "F6D4.0 bundle selector candidate"), + Candidate("rom_00f8_8000_f6d4_bit1_candidate", 0x00F8, 0x8000, "F6D4.1 handler candidate"), +) + + +def main() -> int: + args = build_arg_parser().parse_args() + scenario = build_scenario(args) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(scenario, indent=2) + "\n", encoding="utf-8") + print(f"wrote {args.output}") + print(f"candidates={len(CANDIDATES)} snapshots={len(CANDIDATES)}") + print(f"estimated_hold_time={len(CANDIDATES) * args.listen / 60:.1f}min plus power-cycle/ready time") + return 0 + + +def build_arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "output", + nargs="?", + type=Path, + default=Path("scenarios/panel-atlas-rom-button-output-candidates-v1.json"), + ) + parser.add_argument("--listen", type=float, default=0.75, help="seconds to listen after each candidate send") + parser.add_argument("--ok-listen", type=float, default=0.25, help="seconds to listen after CONNECT OK seeds") + parser.add_argument("--drain", type=float, default=0.25, help="seconds to drain after ready") + parser.add_argument("--off-seconds", type=float, default=1.5, help="relay power-off time before each candidate") + parser.add_argument("--ready-heartbeats", type=int, default=2, help="heartbeats before each candidate") + parser.add_argument("--ready-timeout", type=float, default=10.0, help="ready wait timeout") + return parser + + +def build_scenario(args: argparse.Namespace) -> dict[str, object]: + steps: list[dict[str, object]] = [] + for index, candidate in enumerate(CANDIDATES, start=1): + steps.extend(candidate_steps(args, index, candidate)) + steps.append({"action": "listen", "seconds": 0.8}) + return { + "name": "panel-atlas-rom-button-output-candidates-v1", + "notes": [ + "Fresh-boot webcam sweep for ROM-derived button/report output candidates.", + "This deliberately skips physical RCP button presses: each candidate sends command 0 directly.", + "Each candidate gets its own power-cycle/CONNECT-OK baseline to reduce latch contamination.", + "Candidate snapshots only are enabled; setup, CONNECT OK seeds, and clears should not produce webcam images.", + "Run with --camera-index 4 --snapshot-delays 0.5 on the current bench.", + ], + "steps": steps, + } + + +def candidate_steps(args: argparse.Namespace, index: int, candidate: Candidate) -> list[dict[str, object]]: + label_base = f"case{index:03d}_{candidate.label}" + return [ + {"action": "power_cycle", "off_seconds": args.off_seconds}, + { + "action": "wait_ready", + "heartbeats": args.ready_heartbeats, + "timeout": args.ready_timeout, + "require": True, + }, + {"action": "drain", "seconds": args.drain}, + send_step(f"{label_base}_ok_seed_1", CONNECT_OK_FRAME, args.ok_listen, snapshot=False), + send_step(f"{label_base}_ok_seed_2", CONNECT_OK_FRAME, args.ok_listen, snapshot=False), + { + "action": "note", + "message": ( + f"{label_base}: selector 0x{candidate.selector:04X}=0x{candidate.value:04X}; " + f"{candidate.note}" + ), + }, + send_step(label_base, frame_hex(0x00, candidate.selector, candidate.value), args.listen, snapshot=True), + send_step( + f"{label_base}_clear", + frame_hex(0x00, candidate.selector, 0x0000), + 0.12, + snapshot=False, + ), + ] + + +def send_step(label: str, frame: str, listen: float, *, snapshot: bool) -> dict[str, object]: + step: dict[str, object] = { + "action": "send", + "label": label, + "frame": frame, + "listen": listen, + } + if not snapshot: + step["snapshot"] = False + return step + + +def frame_hex(command: int, selector: int, value: int) -> str: + selector_hi, selector_lo = selector_bytes(selector) + data = bytes([command & 0xFF, selector_hi, selector_lo, (value >> 8) & 0xFF, value & 0xFF]) + return " ".join(f"{byte:02X}" for byte in data + bytes([frame_checksum(data)])) + + +def selector_bytes(selector: int) -> tuple[int, int]: + selector &= 0x01FF + if selector <= 0x007F: + return 0x00, selector + if selector <= 0x017F: + return 0x01, selector - 0x0080 + return 0x02, selector - 0x0180 + + +def frame_checksum(data: bytes) -> int: + value = CHECKSUM_SEED + for byte in data[:5]: + value ^= byte & 0xFF + return value & 0xFF + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/make_panel_sweep_contact_sheets.py b/scripts/make_panel_sweep_contact_sheets.py new file mode 100644 index 0000000..9434ff0 --- /dev/null +++ b/scripts/make_panel_sweep_contact_sheets.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +"""Build labeled contact sheets from serial_scenario webcam snapshots.""" + +from __future__ import annotations + +import argparse +import math +from pathlib import Path + +import cv2 +import numpy as np + + +CROP_PRESETS = { + "full": (0.00, 0.00, 1.00, 1.00), + "panel": (0.03, 0.10, 0.98, 0.94), + "right-stack": (0.70, 0.23, 0.92, 0.86), + "lcd": (0.00, 0.22, 0.38, 0.78), +} + + +def main() -> int: + args = build_arg_parser().parse_args() + images = sorted(args.snapshot_dir.glob(args.glob)) + if args.only_candidates: + images = [path for path in images if "candidate_" in path.name] + if not images: + raise SystemExit(f"no images found in {args.snapshot_dir}") + + output_dir = args.output_dir or args.snapshot_dir.with_name(args.snapshot_dir.name + "-sheets") + output_dir.mkdir(parents=True, exist_ok=True) + + per_sheet = args.cols * args.rows + total_sheets = math.ceil(len(images) / per_sheet) + written: list[Path] = [] + for sheet_index in range(total_sheets): + group = images[sheet_index * per_sheet : (sheet_index + 1) * per_sheet] + sheet = build_sheet(group, args) + out = output_dir / f"sheet-{sheet_index + 1:03d}.jpg" + cv2.imwrite(str(out), sheet) + written.append(out) + + print(f"images={len(images)} sheets={len(written)} output_dir={output_dir}") + if written: + print(f"first={written[0]}") + print(f"last={written[-1]}") + return 0 + + +def build_arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description="Create labeled contact sheets from webcam snapshots.") + parser.add_argument("snapshot_dir", type=Path, help="directory containing serial_scenario snapshots") + parser.add_argument("--output-dir", type=Path, help="directory for generated contact sheets") + parser.add_argument("--glob", default="*.jpg", help="image glob within snapshot_dir") + parser.add_argument("--cols", type=int, default=4, help="thumbnail columns per sheet") + parser.add_argument("--rows", type=int, default=5, help="thumbnail rows per sheet") + parser.add_argument("--thumb-width", type=int, default=360, help="thumbnail image width") + parser.add_argument("--label-height", type=int, default=48, help="label area height per thumbnail") + parser.add_argument( + "--crop", + choices=sorted(CROP_PRESETS), + default="panel", + help="crop preset before thumbnailing", + ) + parser.add_argument( + "--only-candidates", + action="store_true", + help="include only filenames containing candidate_", + ) + return parser + + +def build_sheet(paths: list[Path], args: argparse.Namespace) -> np.ndarray: + cells = [build_cell(path, args) for path in paths] + blank = np.full_like(cells[0], 245) + while len(cells) < args.cols * args.rows: + cells.append(blank.copy()) + + rows = [] + for row_index in range(args.rows): + row_cells = cells[row_index * args.cols : (row_index + 1) * args.cols] + rows.append(np.hstack(row_cells)) + return np.vstack(rows) + + +def build_cell(path: Path, args: argparse.Namespace) -> np.ndarray: + image = cv2.imread(str(path)) + if image is None: + image = np.full((240, 320, 3), 220, dtype=np.uint8) + image = crop_image(image, CROP_PRESETS[args.crop]) + thumb_height = max(1, int(image.shape[0] * args.thumb_width / max(1, image.shape[1]))) + thumb = cv2.resize(image, (args.thumb_width, thumb_height), interpolation=cv2.INTER_AREA) + + label = snapshot_label(path) + cell = np.full((args.label_height + thumb_height, args.thumb_width, 3), 245, dtype=np.uint8) + cell[args.label_height : args.label_height + thumb_height, 0 : args.thumb_width] = thumb + draw_label(cell, label, args.label_height) + return cell + + +def crop_image(image: np.ndarray, crop: tuple[float, float, float, float]) -> np.ndarray: + h, w = image.shape[:2] + x1, y1, x2, y2 = crop + left = min(w - 1, max(0, int(w * x1))) + top = min(h - 1, max(0, int(h * y1))) + right = min(w, max(left + 1, int(w * x2))) + bottom = min(h, max(top + 1, int(h * y2))) + return image[top:bottom, left:right] + + +def draw_label(cell: np.ndarray, text: str, label_height: int) -> None: + font = cv2.FONT_HERSHEY_SIMPLEX + scale = 0.48 + thickness = 1 + max_chars = 45 + line1 = text[:max_chars] + line2 = text[max_chars : max_chars * 2] + cv2.putText(cell, line1, (6, 18), font, scale, (0, 0, 0), thickness, cv2.LINE_AA) + if line2: + cv2.putText(cell, line2, (6, min(label_height - 8, 38)), font, scale, (0, 0, 0), thickness, cv2.LINE_AA) + + +def snapshot_label(path: Path) -> str: + name = path.name + if "_tx_0500ms_" in name: + label = name.split("_tx_0500ms_", 1)[1] + elif "_tx_" in name: + label = name.split("_tx_", 1)[1] + else: + label = name + return label.rsplit("_", 1)[0] + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_bench_connect_lcd.py b/tests/test_bench_connect_lcd.py index b039221..e945d0a 100644 --- a/tests/test_bench_connect_lcd.py +++ b/tests/test_bench_connect_lcd.py @@ -86,6 +86,14 @@ class BenchConnectLcdTest(unittest.TestCase): def test_label_frame_marks_copy_in_progress_selector_006d_candidate(self): self.assertEqual(label_frame(bytes.fromhex("00006D000037")), "copy_in_progress_selector_006d_candidate") + def test_label_frame_marks_iris_mblack_link_reports(self): + self.assertEqual(label_frame(bytes.fromhex("000013400009")), "known_iris_mblack_link_active_report_candidate") + self.assertEqual(label_frame(bytes.fromhex("02001300004B")), "queued_iris_mblack_link_clear_report_candidate") + self.assertEqual( + label_frame(bytes.fromhex("010013C00088")), + "queued_selector_0013_bit15_plus_iris_mblack_link_report_candidate", + ) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_ccu_emulator.py b/tests/test_ccu_emulator.py index c1b95ac..b9c785b 100644 --- a/tests/test_ccu_emulator.py +++ b/tests/test_ccu_emulator.py @@ -1,8 +1,12 @@ import unittest +from collections import Counter +from ccu_emulator.controller import CcuConfig, CcuEmulator from ccu_emulator.frames import ACTIVE_SEED_COMMAND0, NEUTRAL_ACK_FRAME, build_frame, frame_checksum_ok +from ccu_emulator.iris_mblack_link import IrisMblackLinkModule from ccu_emulator.policy import AckPolicy from ccu_emulator.refresh import PeriodicRefresh +from ccu_emulator.serial_link import RxFrame class CcuEmulatorFrameTests(unittest.TestCase): @@ -29,5 +33,95 @@ class PeriodicRefreshTests(unittest.TestCase): self.assertEqual(refresh.due_frames(now=10.6), []) +class IrisMblackLinkModuleTests(unittest.TestCase): + def test_active_report_gets_selector_ack_and_mirror(self): + module = IrisMblackLinkModule(mirror_delay=0.012) + + decision = module.on_rx(bytes.fromhex("000013400009"), "known_iris_mblack_link_active_report_candidate") + + self.assertIsNotNone(decision) + assert decision is not None + self.assertTrue(decision.suppress_default_ack) + self.assertEqual( + [tx.frame for tx in decision.tx], + [bytes.fromhex("05001300004C"), bytes.fromhex("000013400009")], + ) + self.assertEqual(decision.tx[1].delay, 0.012) + self.assertIn("active", decision.reason) + + def test_clear_report_gets_selector_ack_and_mirror(self): + module = IrisMblackLinkModule() + + decision = module.on_rx(bytes.fromhex("02001300004B"), "queued_iris_mblack_link_clear_report_candidate") + + self.assertIsNotNone(decision) + assert decision is not None + self.assertEqual( + [tx.frame for tx in decision.tx], + [bytes.fromhex("05001300004C"), bytes.fromhex("000013000049")], + ) + self.assertIn("clear", decision.reason) + + def test_non_0013_report_is_ignored(self): + module = IrisMblackLinkModule() + + self.assertIsNone(module.on_rx(bytes.fromhex("0000158000CF"), "known_call_button_active_report")) + + +class CcuEmulatorModuleIntegrationTests(unittest.TestCase): + def test_module_response_suppresses_generic_neutral_ack(self): + link = FakeLink(RxFrame(bytes.fromhex("000013400009"), "known_iris_mblack_link_active_report_candidate")) + logger = FakeLogger() + emulator = CcuEmulator( + link, + logger, + config=CcuConfig(seed_frames=(), ready_heartbeats=0), + modules=(IrisMblackLinkModule(mirror_delay=0.0),), + ) + + emulator._service_rx() + + self.assertEqual( + [frame for frame, _label in link.sent], + [bytes.fromhex("05001300004C"), bytes.fromhex("000013400009")], + ) + self.assertEqual(emulator.stats.ack_frames, 0) + self.assertEqual(emulator.stats.module_frames, 2) + self.assertEqual(emulator.stats.tx_frames, 2) + + +class FakeDetector: + def __init__(self) -> None: + self.labels = Counter() + self.resync_events = 0 + self.dropped_bytes = 0 + + +class FakeLink: + def __init__(self, *items: RxFrame) -> None: + self.items = list(items) + self.sent: list[tuple[bytes, str]] = [] + self.detector = FakeDetector() + + def read_available(self) -> list[RxFrame]: + if not self.items: + return [] + return [self.items.pop(0)] + + def send(self, frame: bytes, label: str) -> None: + self.sent.append((frame, label)) + + +class FakeLogger: + def __init__(self) -> None: + self.lines: list[str] = [] + + def event(self, text: str) -> None: + self.lines.append(text) + + def emit(self, line: str = "") -> None: + self.lines.append(line) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_panel_selectors.py b/tests/test_panel_selectors.py new file mode 100644 index 0000000..c7613db --- /dev/null +++ b/tests/test_panel_selectors.py @@ -0,0 +1,58 @@ +import unittest + +from h8536.panel_selectors import ( + CURRENT_TABLE_BASE, + describe_selector_value, + known_panel_selector, + panel_selector_semantics_payload, + selector_word_address, +) + + +class PanelSelectorSemanticsTest(unittest.TestCase): + def test_selector_0013_maps_to_current_table_word_and_lamp_bits(self): + item = known_panel_selector(0x0013) + + self.assertIsNotNone(item) + assert item is not None + self.assertEqual(item["current_word_address_hex"], "H'E826") + self.assertEqual(selector_word_address(CURRENT_TABLE_BASE, 0x0013), 0xE826) + + text = " ".join(describe_selector_value(0x0013, 0x4000)) + self.assertIn("IRIS/M.BLACK LINK", text) + self.assertIn("F791.5", text) + self.assertIn("F716.7", text) + + def test_selector_payload_includes_local_panel_toggle_source(self): + by_selector = { + int(item["selector"]): item + for item in panel_selector_semantics_payload() + } + + selector_0013 = by_selector[0x0013] + trigger_text = " ".join( + str(trigger.get("summary", "")) + for trigger in selector_0013.get("local_triggers", []) + ) + self.assertIn("F6DB.7", trigger_text) + self.assertIn("H'E826", trigger_text) + trigger_names = " ".join( + str(trigger.get("name_candidate", "")) + for trigger in selector_0013.get("local_triggers", []) + ) + self.assertIn("provisional_iris_mblack_link_button_toggle_report", trigger_names) + + def test_selector_payload_includes_closed_loop_state_machine(self): + item = known_panel_selector(0x0013) + + self.assertIsNotNone(item) + assert item is not None + state_machine = item["state_machine"] + self.assertEqual(state_machine["name_candidate"], "iris_mblack_link_closed_loop_state_candidate") + self.assertEqual(state_machine["ack_frame"], "05 00 13 00 00 4C") + self.assertEqual(state_machine["active_mirror_frame"], "00 00 13 40 00 09") + self.assertEqual(state_machine["clear_mirror_frame"], "00 00 13 00 00 49") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_serial_pseudocode.py b/tests/test_serial_pseudocode.py index bd334d7..1794da5 100644 --- a/tests/test_serial_pseudocode.py +++ b/tests/test_serial_pseudocode.py @@ -494,6 +494,77 @@ class SerialPseudocodeTest(unittest.TestCase): self.assertIn("MEM8[0xF9C6u] = (u8)(MEM8[0xF9C6u] - 1u);", text) self.assertIn("candidate effect: table_write_candidate; target primary_value_table_candidate", text) + def test_panel_selector_semantics_are_emitted_as_comments_and_helper(self): + analysis = { + "protocol_semantics": [ + { + "confidence": "medium", + "confidence_score": 0.7, + "commands": [], + "panel_selector_semantics": [ + { + "selector": 0x0013, + "selector_hex": "0x0013", + "name": "slave_and_iris_mblack_link_lamps", + "summary": "Selector 0x0013 reads H'E826 and controls two lamp bits.", + "current_word_address_hex": "H'E826", + "dispatch_handler": "H'2E06", + "state_machine": { + "name_candidate": "iris_mblack_link_closed_loop_state_candidate", + "summary": "RCP reports local intent, CCU ACKs selector 0x0013, then mirrors accepted state back.", + "active_report_frame": "00 00 13 40 00 09", + "clear_report_frame": "00 00 13 00 00 49", + "ack_frame": "05 00 13 00 00 4C", + "active_mirror_frame": "00 00 13 40 00 09", + "clear_mirror_frame": "00 00 13 00 00 49", + }, + "effects": [ + { + "bit": 14, + "mask": 0x4000, + "mask_hex": "0x4000", + "name": "IRIS/M.BLACK LINK lamp", + "when_set": "sets F791.5 and F716.7", + "when_clear": "clears F791.5 and F716.7", + "ram_bits": ["F791.5", "F716.7"], + }, + ], + "local_triggers": [ + { + "source": "F006.7 / F6DB.7", + "handler": "H'200E", + "name_candidate": "provisional_iris_mblack_link_button_toggle_report", + "summary": "H'200E toggles H'E826 bit14 and queues selector 0x0013.", + "gate": "F731 <= 3", + "current_state_bit": "F791.5", + "active_value": 0x4000, + "clear_value": 0x0000, + }, + ], + }, + ], + } + ] + } + + with patch("h8536.serial_pseudocode.analyze_serial_semantics", return_value=analysis): + text = generate_serial_pseudocode(candidate_payload()) + + self.assertIn("panel selector semantics:", text) + self.assertIn("0x0013 slave_and_iris_mblack_link_lamps", text) + self.assertIn("0x4000 -> IRIS/M.BLACK LINK lamp", text) + self.assertIn("F791.5", text) + self.assertIn("F716.7", text) + self.assertIn("F006.7 / F6DB.7", text) + self.assertIn("iris_mblack_link_closed_loop_state_candidate", text) + self.assertIn("ACK 05 00 13 00 00 4C", text) + self.assertIn("static void sci1_candidate_panel_selector_annotation", text) + self.assertIn("case 0x0013u:", text) + self.assertIn("void provisional_iris_mblack_link_button_toggle_report(void)", text) + self.assertIn("Source F006.7 / F6DB.7; gate F731 <= 3; current state F791.5.", text) + self.assertIn("Requests selector 0x0013=0x4000", text) + self.assertIn("CCU should ACK 05 00 13 00 00 4C, then mirror 00 00 13 40 00 09.", text) + def test_timer_source_models_emit_separate_tick_isrs(self): analysis = { "protocol_semantics": [ diff --git a/tests/test_serial_scenario.py b/tests/test_serial_scenario.py index bf1592a..8c6d737 100644 --- a/tests/test_serial_scenario.py +++ b/tests/test_serial_scenario.py @@ -84,6 +84,67 @@ class SerialScenarioTest(unittest.TestCase): self.assertIn("before_send=1", output) self.assertIn("delays=0,0.25,1", output) + def test_dry_run_summarizes_listen_ack_until_quiet(self): + scenario = { + "name": "unit-quiet-ack", + "steps": [ + { + "action": "listen_ack_until_quiet", + "seconds": 12.0, + "quiet_seconds": 0.9, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "max_acks": 16, + } + ], + } + with tempfile.TemporaryDirectory() as tmpdir: + path = Path(tmpdir) / "scenario.json" + path.write_text(json.dumps(scenario), encoding="utf-8") + stdout = io.StringIO() + + exit_code = main([str(path), "--dry-run"], stdout=stdout) + + output = stdout.getvalue() + self.assertEqual(exit_code, 0) + self.assertIn("step[1]=listen_ack_until_quiet", output) + self.assertIn("seconds=12.000", output) + self.assertIn("quiet=0.900s", output) + self.assertIn("target_mode=queued_reports", output) + self.assertIn("ack_mode=cmd5_selector", output) + + def test_dry_run_summarizes_respond_on_rules(self): + scenario = { + "name": "unit-respond-on", + "steps": [ + { + "action": "listen_ack", + "seconds": 2.0, + "target_mode": "queued_reports", + "ack_mode": "cmd5_selector", + "respond_on": [ + { + "frames": ["00 00 13 40 00 09"], + "send": "00 00 13 40 00 09", + "label": "mirror_selector_0013_active_from_button", + } + ], + } + ], + } + with tempfile.TemporaryDirectory() as tmpdir: + path = Path(tmpdir) / "scenario.json" + path.write_text(json.dumps(scenario), encoding="utf-8") + stdout = io.StringIO() + + exit_code = main([str(path), "--dry-run"], stdout=stdout) + + output = stdout.getvalue() + self.assertEqual(exit_code, 0) + self.assertIn("respond_on=1", output) + self.assertIn("send=00 00 13 40 00 09", output) + self.assertIn("label=mirror_selector_0013_active_from_button", output) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_serial_scenario_unexpected.py b/tests/test_serial_scenario_unexpected.py new file mode 100644 index 0000000..1555f94 --- /dev/null +++ b/tests/test_serial_scenario_unexpected.py @@ -0,0 +1,20 @@ +import unittest + +from h8536.serial_scenario_unexpected import parse_detected_frames + + +class SerialScenarioUnexpectedTest(unittest.TestCase): + def test_parse_detected_frames_relabels_iris_mblack_link_report(self): + frames = parse_detected_frames( + [ + "12:00:00.000 DETECT checksum_ok_unlabeled 00 00 13 40 00 09", + "12:00:00.100 DETECT checksum_ok_unlabeled 02 00 13 00 00 4B", + ] + ) + + self.assertEqual(frames[0].label, "known_iris_mblack_link_active_report_candidate") + self.assertEqual(frames[1].label, "queued_iris_mblack_link_clear_report_candidate") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_serial_semantics.py b/tests/test_serial_semantics.py index 67b4d18..d3a7b35 100644 --- a/tests/test_serial_semantics.py +++ b/tests/test_serial_semantics.py @@ -405,6 +405,19 @@ class SerialSemanticsTest(unittest.TestCase): self.assertIn("faa2 == 0", gate_text) self.assertIn("not rom constants", gate_text) + def test_panel_selector_semantics_include_iris_mblack_link_trace(self): + semantics = only_semantics(self, planned_semantics_payload()) + + panel = semantics["panel_selector_semantics"] + panel_text = semantic_text(panel) + + self.assertIn("0x0013", panel_text) + self.assertIn("iris/m.black link", panel_text) + self.assertIn("h'e826", panel_text) + self.assertIn("f791.5", panel_text) + self.assertIn("f716.7", panel_text) + self.assertIn("f6db.7", panel_text) + def test_actual_dispatch_split_marks_initial_and_continuation_commands(self): semantics = only_semantics( self, diff --git a/tests/test_table_xrefs.py b/tests/test_table_xrefs.py index f7f5e0e..24aac20 100644 --- a/tests/test_table_xrefs.py +++ b/tests/test_table_xrefs.py @@ -130,9 +130,9 @@ class TableXrefsTest(unittest.TestCase): self.assertIn("Table/Index Cross-Reference Report for sample.json", text) self.assertIn("primary_value_table_candidate H'E000", text) - self.assertIn("offset H'0006 -> H'E006", text) - self.assertIn("offset H'0124 -> H'E124", text) - self.assertIn("offset H'0002 at H'F922", text) + self.assertIn("offset H'0006 selector 0x003 -> H'E006", text) + self.assertIn("offset H'0124 selector 0x092 -> H'E124", text) + self.assertIn("offset H'0002 selector 0x001 at H'F922", text) self.assertIn("index dynamic via R4", text) self.assertIn("term 'CONNECT': no LCD/text candidate hits", text) self.assertIn("term 'COMM LINK': 1 candidate", text)