#!/usr/bin/env python3
"""串口测试脚本 - 连接MCU调试串口并执行KeyTest命令"""

import sys
import time

try:
    import serial
except ImportError:
    print("缺少 pyserial，请先安装: pip3 install pyserial")
    sys.exit(1)

SERIAL_PORT = "/dev/cu.usbmodem21302"
BAUDRATE = 921600

def main():
    print("=" * 60)
    print(f"串口测试工具")
    print(f"端口: {SERIAL_PORT}")
    print(f"波特率: {BAUDRATE}")
    print("=" * 60)

    try:
        ser = serial.Serial(
            port=SERIAL_PORT,
            baudrate=BAUDRATE,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            timeout=0.1,
            write_timeout=1.0
        )
    except serial.SerialException as e:
        print(f"\n❌ 无法打开串口: {e}")
        sys.exit(1)

    print(f"\n✅ 串口已打开: {SERIAL_PORT}")
    ser.flushInput()
    ser.flushOutput()

    # 阶段1: 先监听几秒，看看MCU是否有主动输出
    print("\n📥 阶段1: 监听MCU是否有主动输出 (3秒)...")
    print("-" * 50)
    data1 = bytearray()
    start = time.time()
    while time.time() - start < 3.0:
        chunk = ser.read(1024)
        if chunk:
            data1.extend(chunk)
            for b in chunk:
                print(f"0x{b:02X} ", end="", flush=True)
        else:
            time.sleep(0.05)
    print("\n" + "-" * 50)
    if data1:
        print(f"✅ 收到 {len(data1)} 字节数据")
        # 尝试解码为ASCII看看
        try:
            ascii_text = data1.decode('ascii', errors='replace')
            if any(c.isprintable() for c in ascii_text):
                print(f"ASCII内容: {ascii_text.strip()}")
        except:
            pass
    else:
        print("⚠️  未收到任何数据")
        print("   可能原因: MCU未上电 / 接线错误 / 波特率不对 / 串口被占用")

    # 阶段2: 发送 KeyTest 按下命令
    print("\n📤 阶段2: 发送 KeyTest 命令 (下一曲 按下)...")
    ser.flushInput()
    cmd = b"KeyTest 1 0x0F 0x01\r\n"
    ser.write(cmd)
    print(f"发送: {cmd.strip().decode()}")
    time.sleep(0.3)

    print("-" * 50)
    data2 = bytearray()
    start = time.time()
    while time.time() - start < 2.0:
        chunk = ser.read(1024)
        if chunk:
            data2.extend(chunk)
            for b in chunk:
                print(f"0x{b:02X} ", end="", flush=True)
        else:
            time.sleep(0.05)
    print("\n" + "-" * 50)
    if data2:
        print(f"✅ 收到 {len(data2)} 字节响应")
        try:
            ascii_text = data2.decode('ascii', errors='replace')
            if any(c.isprintable() for c in ascii_text):
                print(f"ASCII内容: {ascii_text.strip()}")
        except:
            pass
    else:
        print("⚠️  未收到响应")

    # 阶段3: 发送 KeyTest 弹起命令
    print("\n📤 阶段3: 发送 KeyTest 命令 (下一曲 弹起)...")
    ser.flushInput()
    cmd = b"KeyTest 1 0x0F 0x00\r\n"
    ser.write(cmd)
    print(f"发送: {cmd.strip().decode()}")
    time.sleep(0.3)

    print("-" * 50)
    data3 = bytearray()
    start = time.time()
    while time.time() - start < 2.0:
        chunk = ser.read(1024)
        if chunk:
            data3.extend(chunk)
            for b in chunk:
                print(f"0x{b:02X} ", end="", flush=True)
        else:
            time.sleep(0.05)
    print("\n" + "-" * 50)
    if data3:
        print(f"✅ 收到 {len(data3)} 字节响应")
        try:
            ascii_text = data3.decode('ascii', errors='replace')
            if any(c.isprintable() for c in ascii_text):
                print(f"ASCII内容: {ascii_text.strip()}")
        except:
            pass
    else:
        print("⚠️  未收到响应")

    ser.close()
    print("\n" + "=" * 60)
    print("串口已关闭")
    print("=" * 60)

if __name__ == "__main__":
    main()
