from __future__ import annotations from h8536.bench_connect_lcd import format_frame, frame_checksum, frame_checksum_ok, parse_frame FRAME_LENGTH = 6 HEARTBEAT_FRAME = bytes.fromhex("0000000080DA") # Command 0, selector 0, value 0x8080. This seeds E000/E800 selector zero. ACTIVE_SEED_COMMAND0 = bytes.fromhex("00000080805A") # The older bench cadence sequence. It is still useful as an optional wake-up # strategy because the real panel proved timing-sensitive around these frames. CONNECT_CADENCE_SEQUENCE = ( bytes.fromhex("04000040001E"), bytes.fromhex("0400008000DE"), bytes.fromhex("040000C0009E"), ) # Command 5, selector 0x0040, value ignored. ROM trace shows this is the safest # neutral report-consume candidate. NEUTRAL_ACK_FRAME = bytes.fromhex("05004000001F") def build_frame(command: int, selector: int, value: int) -> bytes: """Build a six-byte host frame for simple page-0/page-1 selectors. This helper covers the selector encodings we currently use in fake-CCU probes. Keep more exotic mapping in one place when we learn it. """ if not 0 <= command <= 0xFF: raise ValueError("command byte out of range") if not 0 <= selector <= 0x01FF: raise ValueError("selector out of supported range 0x000-0x1FF") if not 0 <= value <= 0xFFFF: raise ValueError("value out of range") if selector <= 0x007F: byte1 = 0x00 byte2 = selector elif selector <= 0x017F: byte1 = 0x01 byte2 = selector - 0x0080 else: byte1 = 0x02 byte2 = selector - 0x0180 frame = bytes( [ command & 0xFF, byte1 & 0xFF, byte2 & 0xFF, (value >> 8) & 0xFF, value & 0xFF, ] ) return frame + bytes([frame_checksum(frame)])