diff options
Diffstat (limited to 'kvmd/plugins/hid/_mcu/gpio.py')
-rw-r--r-- | kvmd/plugins/hid/_mcu/gpio.py | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/kvmd/plugins/hid/_mcu/gpio.py b/kvmd/plugins/hid/_mcu/gpio.py index f79820f1..07b0b598 100644 --- a/kvmd/plugins/hid/_mcu/gpio.py +++ b/kvmd/plugins/hid/_mcu/gpio.py @@ -29,30 +29,48 @@ from ....logging import get_logger # ===== -class Gpio: +class Gpio: # pylint: disable=too-many-instance-attributes def __init__( self, device_path: str, + power_detect_pin: int, + power_detect_pull_down: bool, reset_pin: int, reset_inverted: bool, reset_delay: float, ) -> None: self.__device_path = device_path + self.__power_detect_pin = power_detect_pin + self.__power_detect_pull_down = power_detect_pull_down self.__reset_pin = reset_pin self.__reset_inverted = reset_inverted self.__reset_delay = reset_delay self.__chip: (gpiod.Chip | None) = None + self.__power_detect_line: (gpiod.Line | None) = None self.__reset_line: (gpiod.Line | None) = None + self.__last_power: (bool | None) = None + def __enter__(self) -> None: - if self.__reset_pin >= 0: + if self.__power_detect_pin >= 0 or self.__reset_pin >= 0: assert self.__chip is None - assert self.__reset_line is None self.__chip = gpiod.Chip(self.__device_path) - self.__reset_line = self.__chip.get_line(self.__reset_pin) - self.__reset_line.request("kvmd::hid::reset", gpiod.LINE_REQ_DIR_OUT, default_vals=[int(self.__reset_inverted)]) + if self.__power_detect_pin >= 0: + assert self.__power_detect_line is None + self.__power_detect_line = self.__chip.get_line(self.__power_detect_pin) + self.__power_detect_line.request( + "kvmd::hid::power_detect", gpiod.LINE_REQ_DIR_IN, + flags=(gpiod.LINE_REQ_FLAG_BIAS_PULL_DOWN if self.__power_detect_pull_down else 0), + ) + if self.__reset_pin >= 0: + assert self.__reset_line is None + self.__reset_line = self.__chip.get_line(self.__reset_pin) + self.__reset_line.request( + "kvmd::hid::reset", gpiod.LINE_REQ_DIR_OUT, + default_vals=[int(self.__reset_inverted)], + ) def __exit__( self, @@ -66,9 +84,20 @@ class Gpio: self.__chip.close() except Exception: pass + self.__last_power = None + self.__power_detect_line = None self.__reset_line = None self.__chip = None + def is_powered(self) -> bool: + if self.__power_detect_line is not None: + power = bool(self.__power_detect_line.get_value()) + if power != self.__last_power: + get_logger(0).info("HID power state changed: %s -> %s", self.__last_power, power) + self.__last_power = power + return power + return True + def reset(self) -> None: if self.__reset_pin >= 0: assert self.__reset_line |