import serial
import time
import colorsys

import sys

channels = [
    192,  # pan
    0,  # tilt
    134,  # dimmer
    255,  # R
    0x88,  # G
    0,  # B
    0,  # W
    1,  # movement speed
    0,  # RST
]

start_addr = 10

with serial.Serial("/dev/ttyUSB0", 500000) as ser:

    payload = bytearray(512)

    FPS = 30
    if len(sys.argv) > 1:
        FPS = int(sys.argv[1])
    
    FRAME_TIME = 1 / FPS
    t = 0
    
    def sync():
        # wait for sync
        while True:
            b = ser.readline()
            if b.strip() == b"Sync.":
                return
            
    sync()

    print("initial sync.")

    while True:
        
        loop_start = time.time()

        r, g, b = colorsys.hls_to_rgb(t, 0.5, 1)

        channels[3] = int(255 * r)
        channels[4] = int(255 * g)
        channels[5] = int(255 * b)

        payload[(start_addr - 1) : (start_addr - 1 + len(channels))] = channels
        
        ser.write(payload)
        ser.flush()
        
        response = ser.readline()
        if response.strip() != b"Ack.":
            print(f"received bad response: {response!r}")
            sync()
            continue

        t += FRAME_TIME
        t %= 1
        
        loop_time = time.time() - loop_start
        if loop_time < FRAME_TIME:
            time.sleep(FRAME_TIME - loop_time)
        else:
            print("loop took too long!")
            
        print(f"loop time: {1000 * loop_time:0.2f}ms busy, {1000 * (time.time() - loop_start):0.2f}ms total")

    # print(ser.read_all())
