Загрузка данных


import time
import sys
import board
import busio
import digitalio
import displayio
import supervisor

try:
    from fourwire import FourWire
except ImportError:
    from displayio import FourWire

from adafruit_st7789 import ST7789
from adafruit_display_text import label
from adafruit_mcp230xx.mcp23017 import MCP23017
import terminalio

displayio.release_displays()
spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
display_bus = FourWire(spi, command=board.GP5, chip_select=board.GP6, reset=board.GP4)
display = ST7789(display_bus, width=320, height=170, colstart=35, rowstart=0, rotation=90)

grp_obs = displayio.Group()
grp_sys = displayio.Group()
grp_vibe = displayio.Group()

# 1. OBS
lbl_o_link  = label.Label(terminalio.FONT, text="PC: NO LINK", color=0xFFAA00, scale=1, x=220, y=15)
lbl_o_st    = label.Label(terminalio.FONT, text="OBS: OFF", color=0x888888, scale=3, x=10, y=40)
lbl_o_tm    = label.Label(terminalio.FONT, text="00:00:00", color=0xFFFFFF, scale=3, x=10, y=85)
lbl_o_sc    = label.Label(terminalio.FONT, text="SCN: ---", color=0x00FFFF, scale=2, x=10, y=125)
lbl_o_stats = label.Label(terminalio.FONT, text="FPS: 0 | CPU: 0%", color=0x666666, scale=1, x=10, y=155)
grp_obs.append(lbl_o_link); grp_obs.append(lbl_o_st); grp_obs.append(lbl_o_tm)
grp_obs.append(lbl_o_sc); grp_obs.append(lbl_o_stats)

# 2. ПК & ЖЕЛЕЗО
lbl_s_link = label.Label(terminalio.FONT, text="PC: NO LINK", color=0xFFAA00, scale=1, x=220, y=15)
lbl_s_hd   = label.Label(terminalio.FONT, text="[ SYSTEM MONITOR ]", color=0x00FF88, scale=2, x=10, y=25)
lbl_s_cp   = label.Label(terminalio.FONT, text="CPU: 0%  RAM: 0G", color=0xFFFFFF, scale=2, x=10, y=70)
lbl_s_vl   = label.Label(terminalio.FONT, text="STATUS: ACTIVE", color=0x00FFFF, scale=2, x=10, y=115)
grp_sys.append(lbl_s_link); grp_sys.append(lbl_s_hd); grp_sys.append(lbl_s_cp); grp_sys.append(lbl_s_vl)

# 3. БИНДЫ (DOWN)
lbl_v_link = label.Label(terminalio.FONT, text="PC: NO LINK", color=0xFFAA00, scale=1, x=220, y=15)
lbl_v_hd   = label.Label(terminalio.FONT, text="[ GAMING BINDS ]", color=0xFFAA00, scale=2, x=10, y=25)
lbl_v_key  = label.Label(terminalio.FONT, text="KEY: READY", color=0x00FFFF, scale=3, x=10, y=80)
lbl_v_inf  = label.Label(terminalio.FONT, text="F13 - F24 ACTIVE", color=0x888888, scale=2, x=10, y=130)
grp_vibe.append(lbl_v_link); grp_vibe.append(lbl_v_hd); grp_vibe.append(lbl_v_key); grp_vibe.append(lbl_v_inf)

# ЖЕЛЕЗО
i2c = busio.I2C(scl=board.GP1, sda=board.GP0)
mcp = MCP23017(i2c, address=0x20)
pin_map = [8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5]
switches = []
for p in pin_map:
    pin = mcp.get_pin(p)
    pin.direction = digitalio.Direction.INPUT
    pin.pull = digitalio.Pull.UP
    switches.append(pin)

tog_up = mcp.get_pin(6); tog_up.direction = digitalio.Direction.INPUT; tog_up.pull = digitalio.Pull.UP
tog_dn = mcp.get_pin(14); tog_dn.direction = digitalio.Direction.INPUT; tog_dn.pull = digitalio.Pull.UP

last_m = None
b_state = [False] * 12
last_pc_time = 0

while True:
    now = time.monotonic()
    mode = "UP" if not tog_up.value else ("DOWN" if not tog_dn.value else "MID")
    if mode != last_m:
        if mode == "UP": display.root_group = grp_obs
        elif mode == "MID": display.root_group = grp_sys
        else: display.root_group = grp_vibe
        print(f"MODE:{mode}")
        last_m = mode

    # Проверка связи с ПК (таймаут 2.5 сек)
    is_online = (now - last_pc_time < 2.5)
    for lbl in [lbl_o_link, lbl_s_link, lbl_v_link]:
        lbl.text = "PC: ONLINE" if is_online else "PC: NO LINK"
        lbl.color = 0x00FF00 if is_online else 0xFFAA00

    if not is_online:
        lbl_o_st.text = "OBS: OFF"
        lbl_o_st.color = 0x888888

    # Опрос кнопок
    for i, s in enumerate(switches):
        val = not s.value
        if val and not b_state[i]:
            b_state[i] = True
            btn_id = i + 1
            print(f"PRESS:{mode}:{btn_id}")
            if mode == "DOWN":
                lbl_v_key.text = f"KEY: F{12 + btn_id}"
        elif not val and b_state[i]:
            b_state[i] = False

    # Чтение пакетов
    if supervisor.runtime.serial_bytes_available:
        try:
            line = sys.stdin.readline().strip()
            if line.startswith("O|"):
                last_pc_time = now
                _, st, tm, sc, fps, drp, cpu = line.split("|")
                lbl_o_st.text = st
                lbl_o_st.color = 0xFF0000 if st == "REC" else (0x00FF00 if st == "IDLE" else 0x888888)
                lbl_o_tm.text = tm
                lbl_o_sc.text = f"SCN: {sc[:12]}"
                lbl_o_stats.text = f"FPS:{fps} | DROP:{drp} | CPU:{cpu}%"
            elif line.startswith("S|"):
                last_pc_time = now
                _, cpu, r_usd, r_tot, vol = line.split("|")
                lbl_s_cp.text = f"CPU:{cpu}% RAM:{r_usd}/{r_tot}G"
        except Exception:
            pass

    time.sleep(0.01)