From 6d2d07d59541142cbc85fff1f74917c8a4db0d3e Mon Sep 17 00:00:00 2001 From: Jack O'Sullivan Date: Fri, 13 Dec 2024 17:46:59 +0000 Subject: [PATCH] firmware+controller: Initial working HID state control --- controller/hid-test.py | 17 ++++----- controller/valconomy.py | 76 +++++++++++++++++++++++++++++++++++++++-- firmware/main/ui.c | 4 +-- firmware/main/usb.c | 54 +++++++++++++++++++++++------ firmware/main/usb.h | 6 ++++ 5 files changed, 133 insertions(+), 24 deletions(-) diff --git a/controller/hid-test.py b/controller/hid-test.py index 4e95389..b2a5685 100755 --- a/controller/hid-test.py +++ b/controller/hid-test.py @@ -1,17 +1,18 @@ #!/usr/bin/env python3 -import hid - -USB_VID = 0x6969 -USB_PID = 0x0004 +import valconomy def main(): - hid_handle = hid.device() - hid_handle.open(vendor_id=USB_VID, product_id=USB_PID) + h = valconomy.HIDValconomyHandler() try: - hid_handle.write(b'\x00test') + h.menu(None, False) + h.none() + h.menu(None, True) + h.idle(None) + + h.service() finally: - hid_handle.close() + h.close() if __name__ == '__main__': main() diff --git a/controller/valconomy.py b/controller/valconomy.py index 17dc2eb..2ae168d 100644 --- a/controller/valconomy.py +++ b/controller/valconomy.py @@ -1,10 +1,13 @@ import base64 from dataclasses import dataclass from enum import Enum +import errno import json import logging from pprint import pprint import os +import queue +import struct import time from typing import Callable @@ -49,12 +52,12 @@ class RiotPlayerInfo: return f'{self.name}#{self.tag}' class ValorantLocalClient: - lockfile_path = os.path.join(os.environ['LOCALAPPDATA'], r'Riot Games\Riot Client\Config\lockfile') poll_interval = 0.5 def __init__(self, callback: Callable[[RiotPlayerInfo, bool], None]): self.callback = callback + self.lockfile_path = os.path.join(os.environ['LOCALAPPDATA'], r'Riot Games\Riot Client\Config\lockfile') self.port, self.password = None, None self.running = True self.players = {} @@ -228,7 +231,76 @@ class ValconomyHandler: log.info('Hard luck...') class HIDValconomyHandler(ValconomyHandler): - pass + vid = 0x6969 + pid = 0x0004 + + def __init__(self): + self.dev = None + self.running = True + self.queue = queue.Queue(128) + + def close(self): + if self.dev is not None: + self.dev.close() + + def _dev_ready(self): + try: + if self.dev is None: + self.dev = hid.device() + self.dev.open(vendor_id=self.vid, product_id=self.pid) + log.info(f'USB device opened') + + # 2 bytes: report ID and returned value + # We get back the same report ID and value + data = self.dev.get_input_report(0, 2) + assert len(data) == 2 + return data[1] == 1 + except OSError: + self.dev = None + return False + + def _do(self, cmd, *vals, fmt=None): + if fmt is None: + fmt = '' + + fmt = '= 1); + if (!val_lvgl_lock(-1)) { + ESP_LOGE(TAG, "Failed to grab LVGL lock"); + return; } + if (buf[0] > ST_IDLE) { + ESP_LOGW(TAG, "Unknown state %hhu", buf[0]); + goto ret; + } + if (!val_ui_state_ready()) { + goto ret; + } + + switch (buf[0]) { + case ST_NONE: + val_ui_none(); + break; + case ST_MENU: + if (bufsize < 2) { + ESP_LOGE(TAG, "Invalid ST_MENU command"); + goto ret; + } + val_ui_menu((bool)buf[1]); + break; + case ST_IDLE: + val_ui_idle(); + break; + } + +ret: + val_lvgl_unlock(); } void val_usb_init(void) { diff --git a/firmware/main/usb.h b/firmware/main/usb.h index 015bd15..204971b 100644 --- a/firmware/main/usb.h +++ b/firmware/main/usb.h @@ -5,4 +5,10 @@ #define EPNUM_HID 0x01 #define USB_EP_BUFSIZE 64 +typedef enum val_state { + ST_NONE = 0, + ST_MENU, + ST_IDLE +} val_state_t; + void val_usb_init(void);