Загрузка данных
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)