Skip to content

Commit 194ea57

Browse files
add backoff and better error handling
1 parent c36463e commit 194ea57

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

src/controllers/rfid_reader_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def _run(self, reader):
2727
scanner_error = False
2828
while True:
2929
if scanner_error:
30-
time.sleep(0.1)
30+
time.sleep(1.0)
3131
if reader.reconnect():
3232
logging.info("Card reader reconnected")
3333
scanner_error = False

src/hardware/rfid_reader.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,41 @@
1111

1212

1313
class Reader(Thread):
14-
def __init__(self, usb_id="/dev/ttyUSB0"):
14+
def __init__(self, usb_id):
1515
super().__init__()
1616
self._usb_id = usb_id
1717
self._pn532 = None
1818
self._pending_tag = None
19-
if usb_id is None:
20-
logging.error("No card reader USB ID configured, exiting")
21-
sys.exit(1)
2219
if not exists(usb_id):
2320
logging.error("Card reader not found at %s, exiting", usb_id)
2421
sys.exit(1)
25-
self._init_pn532()
26-
logging.info("Card reader init finished")
22+
for attempt in range(1, 6):
23+
try:
24+
self._init_pn532()
25+
logging.info("Card reader init finished")
26+
break
27+
except Exception as e:
28+
logging.warning("Card reader init attempt %d/5 failed: %s", attempt, e)
29+
if attempt == 5:
30+
logging.error("Card reader failed to initialize after 5 attempts, exiting")
31+
sys.exit(1)
32+
time.sleep(attempt * 0.5)
2733

2834
def _init_pn532(self):
2935
uart = serial.Serial(self._usb_id, baudrate=115200, timeout=0.1)
36+
uart.reset_input_buffer()
37+
uart.reset_output_buffer()
38+
time.sleep(0.1)
3039
self._pn532 = PN532_UART(uart, debug=False)
31-
self._pn532.SAM_configuration()
3240

3341
def reconnect(self):
3442
if not exists(self._usb_id):
3543
return False
3644
try:
3745
self._init_pn532()
3846
return True
39-
except Exception:
47+
except Exception as e:
48+
logging.warning("Card reader reconnect attempt failed: %s", e)
4049
self._pn532 = None
4150
return False
4251

@@ -47,8 +56,8 @@ def get_ser_in_waiting(self):
4756
raise OSError(f"PN532 error: {e}")
4857
if uid:
4958
self._pending_tag = "".join(f"{b:02X}" for b in uid)
50-
time.sleep(0.01) # let any remaining in-flight bytes arrive
51-
self._pn532._uart.reset_input_buffer() # and flush them
59+
time.sleep(0.01)
60+
self._pn532._uart.reset_input_buffer()
5261
return expected_characters
5362
self._pending_tag = None
5463
return 0

0 commit comments

Comments
 (0)