diff --git a/configs/kvmd/v1.yaml b/configs/kvmd/v1.yaml index 26a2dbba..a01435e2 100644 --- a/configs/kvmd/v1.yaml +++ b/configs/kvmd/v1.yaml @@ -5,8 +5,12 @@ kvmd: heartbeat: 3.0 hid: + pinout: + reset: 4 + device: /dev/ttyAMA0 speed: 115200 + reset_delay: 0.1 atx: pinout: diff --git a/configs/kvmd/v2.yaml b/configs/kvmd/v2.yaml index 99683b11..b7eb4f29 100644 --- a/configs/kvmd/v2.yaml +++ b/configs/kvmd/v2.yaml @@ -5,8 +5,12 @@ kvmd: heartbeat: 3.0 hid: + pinout: + reset: 4 + device: /dev/ttyAMA0 speed: 115200 + reset_delay: 0.1 atx: pinout: diff --git a/kvmd/__init__.py b/kvmd/__init__.py index da430634..77c49ad0 100644 --- a/kvmd/__init__.py +++ b/kvmd/__init__.py @@ -23,8 +23,10 @@ def main() -> None: loop = asyncio.get_event_loop() hid = Hid( + reset=int(config["hid"]["pinout"]["reset"]), device_path=str(config["hid"]["device"]), speed=int(config["hid"]["speed"]), + reset_delay=float(config["hid"]["reset_delay"]), ) atx = Atx( diff --git a/kvmd/extras/cleanup/__init__.py b/kvmd/extras/cleanup/__init__.py index 75b35562..60446c2b 100644 --- a/kvmd/extras/cleanup/__init__.py +++ b/kvmd/extras/cleanup/__init__.py @@ -16,6 +16,7 @@ def main() -> None: logger.info("Cleaning up ...") with gpio.bcm(): for (name, pin) in [ + ("hid_reset", config["hid"]["pinout"]["reset"]), ("msd_target", config["msd"]["pinout"]["target"]), ("msd_reset", config["msd"]["pinout"]["reset"]), ("atx_power_switch", config["atx"]["pinout"]["power_switch"]), diff --git a/kvmd/hid.py b/kvmd/hid.py index e5d4de78..776e6f0e 100644 --- a/kvmd/hid.py +++ b/kvmd/hid.py @@ -14,6 +14,8 @@ import yaml import serial import setproctitle +from . import gpio + from .logging import get_logger @@ -44,17 +46,21 @@ class _MouseWheelEvent(NamedTuple): delta_y: int -class Hid(multiprocessing.Process): +class Hid(multiprocessing.Process): # pylint: disable=too-many-instance-attributes def __init__( self, + reset: int, device_path: str, speed: int, + reset_delay: float, ) -> None: super().__init__(daemon=True) + self.__reset = gpio.set_output(reset) self.__device_path = device_path self.__speed = speed + self.__reset_delay = reset_delay self.__pressed_keys: Set[str] = set() self.__pressed_mouse_buttons: Set[str] = set() @@ -67,7 +73,11 @@ class Hid(multiprocessing.Process): get_logger().info("Starting HID daemon ...") super().start() - # TODO: add reset or power switching + async def reset(self) -> None: + async with self.__lock: + gpio.write(self.__reset, True) + await asyncio.sleep(self.__reset_delay) + gpio.write(self.__reset, False) async def send_key_event(self, key: str, state: bool) -> None: if not self.__stop_event.is_set(): @@ -114,6 +124,7 @@ class Hid(multiprocessing.Process): else: get_logger().warning("Emergency cleaning up HID events ...") self.__emergency_clear_events() + gpio.write(self.__reset, False) def __unsafe_clear_events(self) -> None: for button in self.__pressed_mouse_buttons: diff --git a/kvmd/server.py b/kvmd/server.py index efdb48c0..47dddf78 100644 --- a/kvmd/server.py +++ b/kvmd/server.py @@ -141,6 +141,8 @@ class Server: # pylint: disable=too-many-instance-attributes app.router.add_get("/ws", self.__ws_handler) + app.router.add_post("/hid/reset", self.__hid_reset_handler) + app.router.add_get("/atx", self.__atx_state_handler) app.router.add_post("/atx/click", self.__atx_click_handler) @@ -228,6 +230,12 @@ class Server: # pylint: disable=too-many-instance-attributes return await self.__hid.send_mouse_wheel_event(delta_y) + # ===== HID + + async def __hid_reset_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response: + await self.__hid.reset() + return _json() + # ===== ATX async def __atx_state_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response: diff --git a/testenv/kvmd.yaml b/testenv/kvmd.yaml index 4428cde5..37306593 100644 --- a/testenv/kvmd.yaml +++ b/testenv/kvmd.yaml @@ -5,8 +5,12 @@ kvmd: heartbeat: 3.0 hid: + pinout: + reset: 4 + device: /dev/ttyS10 speed: 115200 + reset_delay: 0.1 atx: pinout: diff --git a/web/index.html b/web/index.html index 52e08f45..35fae241 100644 --- a/web/index.html +++ b/web/index.html @@ -89,6 +89,7 @@