import serial
import time

# --- CONFIGURAÇÃO MANUAL ---
PORTA_COM = 'COM9'  # <--- TESTE COM9, SE NÃO DER, TENTE COM14
BAUDRATE = 115200

def calcular_check(lista_bytes):
    # Soma de todos os bytes exceto Header e End
    soma = sum(lista_bytes)
    return [(soma >> 8) & 0xFF, soma & 0xFF]

def enviar(ser, cmd, data):
    header = [0xA5, 0x5A]
    end = [0x0D, 0x0A]
    
    # O Length conta: os 2 bytes de len + cmd + data + 2 bytes de check
    valor_len = 2 + 1 + len(data) + 2
    len_bytes = [(valor_len >> 8) & 0xFF, valor_len & 0xFF]
    
    corpo = len_bytes + [cmd] + data
    check = calcular_check(corpo)
    
    packet = bytes(header + corpo + check + end)
    
    print(f"TX ({cmd:02X}): {packet.hex().upper()}")
    ser.write(packet)
    time.sleep(0.1)
    res = ser.read(64)
    if res:
        print(f"RX: {res.hex().upper()}")
    else:
        print("RX: SEM RESPOSTA (Verifique a Porta COM)")
    return res

try:
    s = serial.Serial(PORTA_COM, BAUDRATE, timeout=0.5)
    print(f"Conectado em {PORTA_COM}. Iniciando varredura 0-5 dBm...")

    # 1. Ativa a portadora (CW)
    # Frame esperado: A5 5A 00 06 24 01 00 2B 0D 0A (aprox)
    enviar(s, 0x24, [0x01]) 
    
    # 2. Varredura de Potência
    for p_dbm in range(0, 6): # 0, 1, 2, 3, 4, 5
        print(f"\n--- Testando {p_dbm} dBm ---")
        
        # Converte para unidade do manual (dBm * 100)
        val = int(p_dbm * 100)
        msb, lsb = (val >> 8) & 0xFF, val & 0xFF
        
        # Data: Status(0), Ant(1), Read_MSB, Read_LSB, Write_MSB, Write_LSB
        payload = [0x00, 0x01, msb, lsb, msb, lsb]
        enviar(s, 0x10, payload)
        
        time.sleep(5) # Tempo para você conferir no medidor

except Exception as e:
    print(f"Erro: {e}")
finally:
    if 's' in locals() and s.is_open:
        enviar(s, 0x24, [0x00]) # Desliga CW
        s.close()
        print("\nTeste finalizado.")