@@ -66,11 +66,29 @@ class DataListener(AsyncioListener, Generic[TData]):
6666 def __init__ (self ) -> None :
6767 self .data = self ._init_data ()
6868
69+ async def reconnect_wait (self ):
70+ await asyncio .sleep (2 )
71+
6972 @abstractmethod
7073 async def _read_loop (self , dev ):
7174 """Read data from a device"""
7275 raise NotImplementedError
7376
77+ async def _read_loop_reconnect (self , dev ):
78+
79+ """Update self.data by reading evdev events"""
80+
81+ while True :
82+ try :
83+ dev = InputDevice (dev )
84+ logger .debug (f"Connected to { dev .name } " )
85+ await self ._read_loop (dev )
86+ except OSError as e :
87+ logger .warning (f"Device { dev .path } disconnected: { e } " )
88+ await self .reconnect_wait ()
89+ except Exception as e :
90+ logger .error (f"Unexpected error in event loop: { e } " , exc_info = True )
91+
7492 @abstractmethod
7593 def _init_data (self ) -> TData :
7694 raise NotImplementedError
@@ -85,7 +103,7 @@ def _create_tasks(self, loop):
85103 devices = list (self ._find_devices ())
86104 assert len (devices ), "You may need to add your user to the 'input' group"
87105 for dev in devices :
88- loop .create_task (self ._read_loop (dev ))
106+ loop .create_task (self ._read_loop_reconnect (dev ))
89107
90108 def run (self ):
91109 loop = asyncio .new_event_loop ()
@@ -135,10 +153,6 @@ def _find_devices(self) -> Iterable[str]:
135153
136154 async def _read_loop (self , dev ):
137155
138- """Update self.data by reading evdev events"""
139-
140- dev = InputDevice (dev )
141-
142156 async for event in dev .async_read_loop ():
143157 # logger.debug(f"Evdev event ({dev.name}): {evdev.categorize(event)}")
144158 if event .type == ecodes .EV_KEY and event .value == 1 :
@@ -186,8 +200,6 @@ async def _read_loop(self, dev):
186200
187201 """Update self.data by reading evdev events"""
188202
189- dev = InputDevice (dev )
190-
191203 old_x = None
192204 old_y = None
193205
0 commit comments