#!/usr/bin/env python3
"""
MCU UART 测试脚本
发送 radio_test 4 1 并读取返回，不经过 minicom
"""
import serial
import time
import sys

PORT = "/dev/cu.usbmodem1302"
BAUD_RATES = [921600, 460800, 115200]
EOLS = [
    ("CR", b"\r"),
    ("LF", b"\n"),
    ("CRLF", b"\r\n"),
]
CMD = b"radio_test 4 1"
TIMEOUT = 3


def bytes_to_hex(data: bytes) -> str:
    return " ".join(f"{b:02X}" for b in data)


def test_port(port: str, baud: int, eol_name: str, eol: bytes):
    print(f"\n{'='*60}")
    print(f"测试: baud={baud}, EOL={eol_name} ({bytes_to_hex(eol)})")
    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=TIMEOUT,
        ) as ser:
            # 清空缓冲
            ser.reset_input_buffer()
            ser.reset_output_buffer()
            time.sleep(0.2)

            payload = CMD + eol
            print(f"发送 ({len(payload)} bytes): {bytes_to_hex(payload)}")
            print(f"发送 (ASCII): {payload!r}")
            ser.write(payload)
            ser.flush()

            # 等待并读取返回
            time.sleep(0.5)
            rx = ser.read(ser.in_waiting or 1)
            if rx:
                print(f"收到 ({len(rx)} bytes): {bytes_to_hex(rx)}")
                try:
                    print(f"收到 (ASCII): {rx.decode('utf-8', errors='replace')!r}")
                except Exception as e:
                    print(f"解码失败: {e}")
            else:
                print("未收到数据")

            # 再读 1 秒，可能有后续输出
            time.sleep(1.0)
            rx2 = ser.read(ser.in_waiting or 1)
            if rx2:
                print(f"后续 ({len(rx2)} bytes): {bytes_to_hex(rx2)}")
                try:
                    print(f"后续 (ASCII): {rx2.decode('utf-8', errors='replace')!r}")
                except Exception as e:
                    print(f"解码失败: {e}")
    except serial.SerialException as e:
        print(f"串口错误: {e}")
    except Exception as e:
        print(f"异常: {e}")


def main():
    print(f"目标串口: {PORT}")
    print(f"目标命令: {CMD!r}")
    print(f"测试波特率: {BAUD_RATES}")
    print(f"测试换行: {[n for n, _ in EOLS]}")

    for baud in BAUD_RATES:
        for eol_name, eol in EOLS:
            test_port(PORT, baud, eol_name, eol)
            time.sleep(0.5)

    print("\n测试完成")


if __name__ == "__main__":
    main()
