"""Beyond display bring-up over the MCU control HID (35BD:0101).

Feature-report vocabulary from reference/extended-mode-display.md (report ID 0):
  '+'/'-'  display power on/off          'p'  disable proximity sensor
  'o'      per-eye MIPI DCS display-on   'I'  duty (persistence) hi,lo
  'd'      EDID select + rate            'L'  LED r,g,b

Usage:
  python bringup.py on            # power on + prox off + dim green LED
  python bringup.py off           # display power off
  python bringup.py panel-on     # DCS display-on to both eyes
  python bringup.py duty 0x199   # set duty (0x3FF=100% ... 0x066=10%)
  python bringup.py edid 2       # set EDID native (0=both,1=90Hz,2=75Hz) - resets VXR, ~5s
"""

import sys
import time

import hid

VID, PID = 0x35BD, 0x0101


def open_dev():
    for d in hid.enumerate(VID, PID):
        dev = hid.device()
        dev.open_path(d["path"])
        return dev
    raise SystemExit("FAIL: Beyond MCU HID (35BD:0101) not found")


def feat(dev, payload):
    data = bytes([0]) + bytes(payload)
    n = dev.send_feature_report(data)
    print(f"  sent {data.hex(' ')} -> {n}")
    return n


def main():
    cmd = sys.argv[1] if len(sys.argv) > 1 else "on"
    dev = open_dev()
    if cmd == "on":
        print("display power ON")
        feat(dev, [ord("+"), 0])
        time.sleep(3)
        print("proximity OFF (panels stay on while not worn)")
        feat(dev, [ord("p")])
        print("LED dim green")
        feat(dev, [ord("L"), 0, 1, 0])
    elif cmd == "off":
        print("display power OFF")
        feat(dev, [ord("-"), 0])
    elif cmd == "panel-on":
        for eye in (0, 1):
            print(f"DCS display-on eye {eye}")
            feat(dev, [ord("o"), eye, 1, 0x29])
            time.sleep(0.2)
    elif cmd == "duty":
        v = int(sys.argv[2], 0)
        print(f"duty 0x{v:03X}")
        feat(dev, [ord("I"), (v >> 8) & 0xFF, v & 0xFF])
    elif cmd == "edid":
        rate = int(sys.argv[2])
        print(f"EDID native, rate code {rate} (VXR resets, sleeping 5s)")
        feat(dev, [ord("d"), rate])
        time.sleep(5)
    else:
        raise SystemExit(f"unknown command {cmd}")
    dev.close()
    print("ok")


if __name__ == "__main__":
    main()
