44 lines
1.2 KiB
Python
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()
|