{ "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 } ] }