#!/usr/bin/env python3
"""
捕获 radio_test 4 1 返回的数据，并尝试不同波特率解析
"""
import serial
import time
import os

PORT = "/dev/cu.usbmodem1302"
CMD = b"radio_test 4 1\r"
OUTPUT_DIR = "."


def capture_at_baud(baud: int, read_time: float = 2.0):
    print(f"\n{'='*60}")
    print(f"以 {baud} 波特率测试")
    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.reset_input_buffer()
            ser.reset_output_buffer()
            time.sleep(0.2)

            print(f"发送: {CMD!r}")
            ser.write(CMD)
            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)

            filename = os.path.join(OUTPUT_DIR, f"ams_response_{baud}.bin")
            with open(filename, "wb") as f:
                f.write(data)

            print(f"收到 {len(data)} bytes，已保存到 {filename}")
            print(f"HEX 前 100 bytes: {' '.join(f'{b:02X}' for b in data[:100])}")
            print(f"ASCII 前 200 chars: {data[:200]!r}")

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


def try_switch_baud():
    """发送后尝试切换波特率读取"""
    print(f"\n{'='*60}")
    print("发送命令后切换波特率读取测试")
    print(f"{'='*60}")

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

        print(f"发送: {CMD!r}")
        ser.write(CMD)
        ser.flush()

        # 先读 921600 1 秒
        data1 = b""
        deadline = time.time() + 1.0
        while time.time() < deadline:
            rx = ser.read(ser.in_waiting or 1)
            if rx:
                data1 += rx
            else:
                time.sleep(0.02)
        print(f"921600 读到 {len(data1)} bytes")

        # 切换到 460800 再读 1 秒
        ser.baudrate = 460800
        time.sleep(0.1)
        ser.reset_input_buffer()
        data2 = b""
        deadline = time.time() + 1.0
        while time.time() < deadline:
            rx = ser.read(ser.in_waiting or 1)
            if rx:
                data2 += rx
            else:
                time.sleep(0.02)
        print(f"460800 读到 {len(data2)} bytes")

        # 切回 921800 再读 0.5 秒
        ser.baudrate = 921600
        time.sleep(0.1)
        data3 = b""
        deadline = time.time() + 0.5
        while time.time() < deadline:
            rx = ser.read(ser.in_waiting or 1)
            if rx:
                data3 += rx
            else:
                time.sleep(0.02)
        print(f"切回 921600 读到 {len(data3)} bytes")

        all_data = data1 + data2 + data3
        filename = os.path.join(OUTPUT_DIR, "ams_response_switch_baud.bin")
        with open(filename, "wb") as f:
            f.write(all_data)
        print(f"合并数据 {len(all_data)} bytes，已保存到 {filename}")


def main():
    print(f"目标串口: {PORT}")
    print(f"命令: {CMD!r}")

    # 纯 921600 捕获
    capture_at_baud(921600, read_time=3.0)

    # 纯 460800 捕获
    capture_at_baud(460800, read_time=3.0)

    # 切换波特率捕获
    try_switch_baud()

    print("\n捕获完成")


if __name__ == "__main__":
    main()
