summaryrefslogtreecommitdiff
path: root/kvmd/plugins/hid/otg/device.py
diff options
context:
space:
mode:
Diffstat (limited to 'kvmd/plugins/hid/otg/device.py')
-rw-r--r--kvmd/plugins/hid/otg/device.py20
1 files changed, 9 insertions, 11 deletions
diff --git a/kvmd/plugins/hid/otg/device.py b/kvmd/plugins/hid/otg/device.py
index 625aeef5..43d324b1 100644
--- a/kvmd/plugins/hid/otg/device.py
+++ b/kvmd/plugins/hid/otg/device.py
@@ -23,7 +23,6 @@
import os
import select
import multiprocessing
-import multiprocessing.queues
import queue
import errno
import time
@@ -32,6 +31,7 @@ from typing import Dict
from ....logging import get_logger
+from .... import tools
from .... import aiomulti
from .... import aioproc
@@ -76,7 +76,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
self.__noop = noop
self.__fd = -1
- self.__events_queue: multiprocessing.queues.Queue = multiprocessing.Queue()
+ self.__events_queue: "multiprocessing.Queue[BaseEvent]" = multiprocessing.Queue()
self.__state_flags = aiomulti.AioSharedFlags({"online": True, **initial_state}, notifier)
self.__stop_event = multiprocessing.Event()
@@ -93,16 +93,18 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
if self.__ensure_device(): # Check device and process reports if needed
self.__read_all_reports()
try:
- event: BaseEvent = self.__events_queue.get(timeout=0.1)
+ event = self.__events_queue.get(timeout=0.1)
except queue.Empty:
if not self.__udc.can_operate():
+ self._clear_queue()
self.__close_device()
else:
- self._process_event(event)
+ if not self._process_event(event):
+ self._clear_queue()
except Exception:
logger.exception("Unexpected HID-%s error", self.__name)
+ self._clear_queue()
self.__close_device()
- finally:
time.sleep(1)
self.__close_device()
@@ -112,7 +114,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
# =====
- def _process_event(self, event: BaseEvent) -> None:
+ def _process_event(self, event: BaseEvent) -> bool:
raise NotImplementedError
def _process_read_report(self, report: bytes) -> None:
@@ -135,11 +137,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
self.__events_queue.put_nowait(event)
def _clear_queue(self) -> None:
- while not self.__events_queue.empty():
- try:
- self.__events_queue.get_nowait()
- except queue.Empty:
- break
+ tools.clear_queue(self.__events_queue)
def _ensure_write(self, report: bytes, reopen: bool=False, close: bool=False) -> bool:
if reopen: