Files
forge-invar/src/forge_invar/input.py
T
2026-11-06 00:44:38 +01:00

44 lines
1.2 KiB
Python

import typing
import gpiozero
from evdev import ecodes, uinput
from .constants import GPIO_BOUNCE, GPIO_BUTTONS
class Button:
def __init__(self, ui: uinput.UInput, gpio_pin: int, keycodes: list[int]) -> None:
self.__ui = ui
self.__btn = gpiozero.Button(gpio_pin, pull_up=True, bounce_time=GPIO_BOUNCE)
self.__keycodes = keycodes
self.__btn.when_activated = self.press
self.__btn.when_deactivated = self.release
def press(self) -> None:
for keycode in self.__keycodes:
self.__ui.write(ecodes.EV_KEY, keycode, 1)
self.__ui.syn()
def release(self) -> None:
for keycode in self.__keycodes:
self.__ui.write(ecodes.EV_KEY, keycode, 0)
self.__ui.syn()
class Inputs:
def __init__(self):
self.__buttons: list[Button] = []
self.__ui: uinput.UInput | None = None
def __enter__(self) -> typing.Self:
self.__ui = uinput.UInput()
for gpio_pin, keycodes in GPIO_BUTTONS:
self.__buttons += [Button(self.__ui, gpio_pin, keycodes)]
return self
def __exit__(self, *_) -> None:
assert self.__ui
self.__ui.close()