Different approach: Only short-lived operation in executor
authorBenjamin Braatz <bb@bbraatz.eu>
Mon, 22 Aug 2022 19:14:09 +0000 (21:14 +0200)
committerBenjamin Braatz <bb@bbraatz.eu>
Mon, 22 Aug 2022 19:14:09 +0000 (21:14 +0200)
controlpi_plugins/nfc.py

index dbd601cdb146206ce70ab9c6e9d5ae55a0e808b5..98e189077b2daf1ea9b8a754caf5796e02ff1f4f 100644 (file)
@@ -53,44 +53,24 @@ class NFCReader(BasePlugin):
                                                      'card': card}))
 
     def _poll_reader(self, loop) -> None:
-        while loop.is_running():
-            card = ""
-            loop.call_soon_threadsafe(
-                    self._set_state, False, "")
-            readers = smartcard.System.readers()
-            while not readers and loop.is_running():
-                time.sleep(10)
-                readers = smartcard.System.readers()
+        readers = smartcard.System.readers()
+        if readers:
             reader = readers[0]
             connection = reader.createConnection()
-            while loop.is_running():
-                time.sleep(0.5)
-                try:
-                    connection.connect()
-                    data, sw1, sw2 = connection.transmit([0xFF, 0xCA, 0x00,
-                                                          0x00, 0x00])
-                    identifier = bytes(data).hex()
-                    if identifier != card:
-                        if card:
-                            loop.call_soon_threadsafe(
-                                    self._set_state, False, "")
-                        card = identifier
-                        if card:
-                            loop.call_soon_threadsafe(
-                                    self._set_state, True, card)
-                except smartcard.Exceptions.NoCardException:
-                    if card:
-                        card = ""
-                        loop.call_soon_threadsafe(
-                                self._set_state, False, "")
-                except smartcard.Exceptions.CardConnectionException:
-                    if card:
-                        card = ""
-                        loop.call_soon_threadsafe(
-                                self._set_state, False, "")
-                    break
+            try:
+                connection.connect()
+                data, sw1, sw2 = connection.transmit([0xFF, 0xCA, 0x00,
+                                                      0x00, 0x00])
+                card = bytes(data).hex()
+                loop.call_soon_threadsafe(self._set_state, True, card)
+            except Exception:
+                loop.call_soon_threadsafe(self._set_state, False, "")
+        else:
+            loop.call_soon_threadsafe(self._set_state, False, "")
 
     async def run(self) -> None:
         """Run no code proactively."""
-        loop = asyncio.get_running_loop()
-        loop.run_in_executor(None, self._poll_reader, loop)
+        while True:
+            loop = asyncio.get_running_loop()
+            loop.run_in_executor(None, self._poll_reader, loop)
+            await asyncio.sleep(0.5)