#!/usr/bin/env python3
"""
基于常见 Windows 串口助手行为，进行多种猜测性测试
"""
import serial
import time

PORT = "/dev/cu.usbmodem1302"
BAUD = 921600


def test_payload(name: str, payload: bytes, baud: int = BAUD, read_time: float = 3.0):
    print(f"\n{'='*60}")
    print(f"测试: {name}")
    print(f"HEX ({len(payload)}): {' '.join(f'{b:02X}' for b in payload)}")
    try:
        print(f"ASCII: {payload!r}")
    except Exception:
        pass

    try:
        with serial.Serial(
            port=PORT,
            baudrate=baud,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            rtscts=False,
            dsrdtr=False,
            xonxoff=False,
            timeout=0.05,
        ) as ser:
            ser.dtr = True
            ser.rts = True
            time.sleep(0.1)
            ser.reset_input_buffer()
            ser.reset_output_buffer()
            time.sleep(0.2)

            ser.write(payload)
            ser.flush()

            data = b""
            deadline = time.time() + read_time
            while time.time() < deadline:
                rx = ser.read(ser.in_waiting or 1)
                if rx:
                    data += rx
                else:
                    time.sleep(0.02)

            print(f"收到 {len(data)} bytes")
            text = data.decode("utf-8", errors="ignore")
            print(f"ASCII: {text[:300]!r}")

            lower = text.lower()
            keywords = ["ams", "freq", "radio", "ok", "error", "found", "not found", "test", "> ", "$ ", "# ", "xiexw"]
            hits = [k for k in keywords if k in lower]
            if hits:
                print(f">>> 关键词命中: {hits}")

    except Exception as e:
        print(f"错误: {e}")


def main():
    print(f"目标串口: {PORT}")
    print(f"默认波特率: {BAUD}")

    # 1. 基本命令，多种换行和编码尝试
    test_payload("radio_test 4 1 + CR", b"radio_test 4 1\r")
    test_payload("radio_test 4 1 + LF", b"radio_test 4 1\n")
    test_payload("radio_test 4 1 + CRLF", b"radio_test 4 1\r\n")
    test_payload("radio_test 4 1 + 双CRLF", b"radio_test 4 1\r\n\r\n")

    # 2. 加前导空字节或换行
    test_payload("先CRLF 再命令", b"\r\nradio_test 4 1\r\n")
    test_payload("先00 再命令", b"\x00radio_test 4 1\r\n")

    # 3. 不同空格/分隔符
    test_payload("radio_test=4,1", b"radio_test=4,1\r\n")
    test_payload("radio_test 0x04 0x01", b"radio_test 0x04 0x01\r\n")
    test_payload("radio 4 1", b"radio 4 1\r\n")
    test_payload("radio_test4 1", b"radio_test4 1\r\n")

    # 4. 常见 shell/AT 命令，先激活命令行
    test_payload("连续按 Enter", b"\r\n\r\n\r\n")
    test_payload("help + CRLF", b"help\r\n")
    test_payload("ls + CRLF", b"ls\r\n")
    test_payload("AT + CRLF", b"AT\r\n")
    test_payload("AT+AMS + CRLF", b"AT+AMS\r\n")

    # 5. 十六进制帧：基于 MCU 协议 ff aa 尝试 radio 域
    # 假设 msgType=radio domain, cmd=0x??
    test_payload("MCU Radio frame 1", bytes([0xFF, 0xAA, 0x00, 0x07, 0x04, 0x01, 0xF3]))
    test_payload("MCU Radio frame 2", bytes([0xFF, 0xAA, 0x00, 0x07, 0x04, 0x04, 0xF0]))

    # 6. 460800 发送尝试
    test_payload("460800 发命令", b"radio_test 4 1\r\n", baud=460800, read_time=2.0)

    print("\n猜测测试完成")


if __name__ == "__main__":
    main()
