diff options
author | Devaev Maxim <[email protected]> | 2020-11-12 21:03:28 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2020-11-12 21:03:28 +0300 |
commit | 87cc8cf7b0e00f7f0a9badf551067aafad6da4ce (patch) | |
tree | cdd802d124236ded6969dc5d80c764deec357e02 /kvmd/plugins/hid/_mcu/gpio.py | |
parent | 79ef26e2f441f6c742a5da78b08ea2d5a4cc6e18 (diff) | |
parent | 0984f0cb36c5881669010c62e986cc8bc7fe019a (diff) |
Merge branch 'spi'
Diffstat (limited to 'kvmd/plugins/hid/_mcu/gpio.py')
-rw-r--r-- | kvmd/plugins/hid/_mcu/gpio.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/kvmd/plugins/hid/_mcu/gpio.py b/kvmd/plugins/hid/_mcu/gpio.py new file mode 100644 index 00000000..87f4b547 --- /dev/null +++ b/kvmd/plugins/hid/_mcu/gpio.py @@ -0,0 +1,78 @@ +# ========================================================================== # +# # +# KVMD - The main Pi-KVM daemon. # +# # +# Copyright (C) 2018 Maxim Devaev <[email protected]> # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see <https://www.gnu.org/licenses/>. # +# # +# ========================================================================== # + + +from typing import Optional + +import gpiod + +from ....logging import get_logger + +from .... import env +from .... import aiotools +from .... import aiogp + + +# ===== +class Gpio: + def __init__( + self, + reset_pin: int, + reset_inverted: bool, + reset_delay: float, + ) -> None: + + self.__reset_pin = reset_pin + self.__reset_inverted = reset_inverted + self.__reset_delay = reset_delay + + self.__chip: Optional[gpiod.Chip] = None + self.__reset_line: Optional[gpiod.Line] = None + self.__reset_wip = False + + def open(self) -> None: + if self.__reset_pin >= 0: + assert self.__chip is None + assert self.__reset_line is None + self.__chip = gpiod.Chip(env.GPIO_DEVICE_PATH) + self.__reset_line = self.__chip.get_line(self.__reset_pin) + self.__reset_line.request("kvmd::hid-mcu::reset", gpiod.LINE_REQ_DIR_OUT, default_vals=[int(self.__reset_inverted)]) + + def close(self) -> None: + if self.__chip: + try: + self.__chip.close() + except Exception: + pass + + @aiotools.atomic + async def reset(self) -> None: + if self.__reset_pin >= 0: + assert self.__reset_line + if not self.__reset_wip: + self.__reset_wip = True + try: + await aiogp.pulse(self.__reset_line, self.__reset_delay, 1, self.__reset_inverted) + finally: + self.__reset_wip = False + get_logger(0).info("Reset HID performed") + else: + get_logger(0).info("Another reset HID in progress") |