#!/usr/bin/env python3
"""
921600 固定波特率下，测试不同发送时序
"""
import serial
import time

PORT = "/dev/cu.usbmodem1302"
BAUD = 921600
CMD_STR = "radio_test 4 1"


def read_all(ser, timeout: float = 3.0):
    data = b""
    deadline = time.time() + timeout
    while time.time() < deadline:
        rx = ser.read(ser.in_waiting or 1)
        if rx:
            data += rx
        else:
            time.sleep(0.02)
    return data


def test_case(name: str, send_func, open_wait: float = 0.0):
    print(f"\n{'='*60}")
    print(f"测试: {name}")
    print(f"{'='*60}")
    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(open_wait)
            ser.reset_input_buffer()
            ser.reset_output_buffer()
            time.sleep(0.1)

            send_func(ser)

            data = read_all(ser, timeout=3.0)
            print(f"收到 {len(data)} bytes")
            text = data.decode("utf-8", errors="replace")
            print(f"内容: {text[:400]!r}")

            lower = text.lower()
            if "ams" in lower or "freq" in lower or "radio_test" in lower:
                print(">>> 可能命中 AMS 相关返回！")
            if "command" in lower:
                print(">>> 包含 command 字样")
    except Exception as e:
        print(f"错误: {e}")


def main():
    print(f"串口: {PORT}, 波特率: {BAUD} (固定)")

    # 1. 立即发送
    test_case("打开后立即发送 CRLF", lambda s: s.write(b"radio_test 4 1\r\n"))

    # 2. 打开后等 1 秒再发
    test_case("打开后等待 1 秒再发送", lambda s: s.write(b"radio_test 4 1\r\n"), open_wait=1.0)

    # 3. 打开后等 3 秒再发
    test_case("打开后等待 3 秒再发送", lambda s: s.write(b"radio_test 4 1\r\n"), open_wait=3.0)

    # 4. 先按几次回车，再发命令
    def wake_then_send(ser):
        ser.write(b"\r\n\r\n")
        time.sleep(0.2)
        ser.write(b"radio_test 4 1\r\n")
    test_case("先按两次回车再发命令", wake_then_send)

    # 5. 逐个字符慢速发送
    def slow_send(ser):
        for ch in "radio_test 4 1\r\n":
            ser.write(ch.encode())
            ser.flush()
            time.sleep(0.05)
    test_case("逐个字符发送(50ms间隔)", slow_send)

    # 6. 连续发送两次命令
    def double_send(ser):
        ser.write(b"radio_test 4 1\r\n")
        time.sleep(0.5)
        ser.write(b"radio_test 4 1\r\n")
    test_case("连续发送两次命令", double_send)

    # 7. 只发 CR 尝试激活命令行
    def cr_then_send(ser):
        ser.write(b"\r")
        time.sleep(0.5)
        ser.write(b"radio_test 4 1\r")
    test_case("先发 CR 再发命令", cr_then_send)

    print("\n时序测试完成")


if __name__ == "__main__":
    main()
