hid fixes

This commit is contained in:
Devaev Maxim 2019-09-29 05:39:25 +03:00
parent 1968aca5c4
commit 8f43d23089
3 changed files with 28 additions and 44 deletions

View File

@ -58,10 +58,10 @@ class Plugin(BaseHid):
def get_plugin_options(cls) -> Dict: def get_plugin_options(cls) -> Dict:
return { return {
"keyboard": { "keyboard": {
"device": Option("", type=valid_abs_path, unpack_as="device_path"), "device": Option("", type=valid_abs_path, unpack_as="device_path"),
"timeout": Option(1.0, type=valid_float_f01), "select_timeout": Option(1.0, type=valid_float_f01),
"retries": Option(5, type=valid_int_f1), "write_retries": Option(5, type=valid_int_f1),
"retries_delay": Option(1.0, type=valid_float_f01), "write_retries_delay": Option(0.1, type=valid_float_f01),
}, },
"noop": Option(False, type=valid_bool), "noop": Option(False, type=valid_bool),

View File

@ -44,9 +44,9 @@ class DeviceProcess(multiprocessing.Process): # pylint: disable=too-many-instan
self, self,
name: str, name: str,
device_path: str, device_path: str,
timeout: float, select_timeout: float,
retries: int, write_retries: int,
retries_delay: float, write_retries_delay: float,
noop: bool, noop: bool,
) -> None: ) -> None:
@ -55,9 +55,9 @@ class DeviceProcess(multiprocessing.Process): # pylint: disable=too-many-instan
self.__name = name self.__name = name
self.__device_path = device_path self.__device_path = device_path
self.__timeout = timeout self.__select_timeout = select_timeout
self.__retries = retries self.__write_retries = write_retries
self.__retries_delay = retries_delay self.__write_retries_delay = write_retries_delay
self.__noop = noop self.__noop = noop
self.__fd = -1 self.__fd = -1
@ -118,7 +118,7 @@ class DeviceProcess(multiprocessing.Process): # pylint: disable=too-many-instan
assert self.__fd >= 0 assert self.__fd >= 0
logger = get_logger() logger = get_logger()
retries = self.__retries retries = self.__write_retries
while retries: while retries:
try: try:
written = os.write(self.__fd, report) written = os.write(self.__fd, report)
@ -128,23 +128,19 @@ class DeviceProcess(multiprocessing.Process): # pylint: disable=too-many-instan
else: else:
logger.error("HID-%s write error: written (%s) != report length (%d)", logger.error("HID-%s write error: written (%s) != report length (%d)",
self.__name, written, len(report)) self.__name, written, len(report))
self._close_device()
except Exception as err: except Exception as err:
if isinstance(err, OSError) and errno == errno.EAGAIN: if isinstance(err, OSError) and err.errno == errno.EAGAIN: # pylint: disable=no-member
msg = "Can't write report to HID-%s {}: %s: %s" logger.error("HID-%s is busy/unplugged: %s: %s", self.__name, type(err).__name__, err) # TODO debug
msg.format(" (maybe unplugged)" if retries == 1 else "")
logger.error(msg, self.__name, type(err).__name__, err) # TODO: debug
else: else:
logger.exception("Can't write report to HID-%s", self.__name) logger.exception("Can't write report to HID-%s", self.__name)
self._close_device()
retries -= 1 retries -= 1
self.__online_shared.value = 0
if retries: if retries:
logger.error("Retries left (HID-%s, write_report): %d", self.__name, retries) logger.error("HID-%s write retries left: %d", self.__name, retries) # TODO debug
time.sleep(self.__retries_delay) time.sleep(self.__write_retries_delay)
self._close_device()
return False return False
def _ensure_device(self) -> bool: def _ensure_device(self) -> bool:
@ -158,33 +154,22 @@ class DeviceProcess(multiprocessing.Process): # pylint: disable=too-many-instan
self.__fd = os.open(self.__device_path, os.O_WRONLY|os.O_NONBLOCK) self.__fd = os.open(self.__device_path, os.O_WRONLY|os.O_NONBLOCK)
except FileNotFoundError: except FileNotFoundError:
logger.error("Missing HID-%s device: %s", self.__name, self.__device_path) logger.error("Missing HID-%s device: %s", self.__name, self.__device_path)
except Exception: except Exception as err:
logger.exception("Can't open HID-%s device: %s", self.__name, self.__device_path) logger.error("Can't open HID-%s device: %s: %s: %s",
self.__name, self.__device_path, type(err).__name__, err)
if self.__fd >= 0: if self.__fd >= 0:
retries = self.__retries try:
while retries: if select.select([], [self.__fd], [], self.__select_timeout)[1]:
try: self.__online_shared.value = 1
if select.select([], [self.__fd], [], self.__timeout)[1]: return True
self.__online_shared.value = 1 else:
return True logger.error("HID-%s is busy/unplugged", self.__name) # TODO debug
else: except Exception as err:
msg = "HID-%s is unavailable for writing" logger.error("Can't select() HID-%s: %s: %s", self.__name, type(err).__name__, err)
if retries == 1:
msg += " (maybe unplugged)"
logger.error(msg, self.__name) # TODO: debug
except Exception as err:
logger.error("Can't select() HID-%s: %s: %s", self.__name, type(err).__name__, err)
retries -= 1
self.__online_shared.value = 0
if retries:
logger.error("Retries left (HID-%s, ensure_device): %d", self.__name, retries)
time.sleep(self.__retries_delay)
self._close_device() self._close_device()
self.__online_shared.value = 0
return False return False
def _close_device(self) -> None: def _close_device(self) -> None:

View File

@ -136,7 +136,6 @@ class KeyboardProcess(DeviceProcess):
for key in self.__pressed_keys for key in self.__pressed_keys
] ]
print(self.__pressed_modifiers, self.__pressed_keys)
ok = self._write_report(bytes([modifiers, 0] + keys)) ok = self._write_report(bytes([modifiers, 0] + keys))
if not ok: if not ok: