Reworked serial reading

This commit is contained in:
2025-12-27 13:20:53 +01:00
parent c21ec9478b
commit 1f8316d077
4 changed files with 50 additions and 32 deletions

View File

View File

@@ -0,0 +1,40 @@
import threading
from threading import Thread
from typing import Callable
from serial import Serial
class SerialReader:
serial : Serial = None
__thread : Thread | None = None
__listeners : list[Callable] = None
def __init__(self, port, baudrate):
self.serial = Serial(port, baudrate)
self._run_event = threading.Event()
self.__listeners = []
def start(self) -> None:
self._run_event.set()
if self.__thread is None or not self.__thread.is_alive():
self.__thread = Thread(target=self.__read, daemon=True)
self.__thread.start()
def stop(self) -> None:
if self._run_event.is_set():
self._run_event.clear()
def subscribe(self, listener : Callable) -> None:
self.__listeners.append(listener)
def __notify(self, data : str):
for listener in self.__listeners:
listener(data)
def __read(self):
while self._run_event.is_set():
line = self.serial.readline()
if line:
data = line.decode('utf-8', errors='ignore')
self.__notify(data)

View File

@@ -4,40 +4,18 @@ from threading import Thread
import threading
from serial import Serial
from hardware.generic.serial_reader import SerialReader
class RfidReader:
__serial : Serial = None
__thread : Thread | None = None
__listeners : list[Callable] = None
class RfidReader(SerialReader):
def __init__(self, port : str, baudrate: int):
self.__serial = Serial(port, baudrate)
self._run_event = threading.Event()
self.__listeners = []
def start(self) -> None:
self._run_event.set()
if self.__thread is None or not self.__thread.is_alive():
self.__thread = Thread(target=self.__read, daemon=True)
self.__thread.start()
def stop(self) -> None:
if self._run_event.is_set():
self._run_event.clear()
def subscribe(self, listener : Callable) -> None:
self.__listeners.append(listener)
def __notify(self, uid : int):
for listener in self.__listeners:
listener(uid)
super().__init__(port, baudrate)
def __read(self):
while self._run_event.is_set():
data = b""
while len(data) < 14 and self._run_event.is_set():
character = self.__serial.read(1)
character = self.serial.read(1)
if not character: continue
data += character
@@ -45,14 +23,12 @@ class RfidReader:
hex_value = data[5:11].decode(errors='ignore')
try:
res = int(hex_value, 16)
self.__notify(res)
self.__notify(str(res))
except ValueError:
print("Invalid hex:", hex_value)
else:
print("Received incomplete data:", data)
if __name__ == "__main__":
def callback(uid):

View File

@@ -2,6 +2,7 @@
import cv2
from flask import Flask
from hardware.generic.serial_reader import SerialReader
from hardware.screen.screen import Screen
from hardware.rfid.reader import RfidReader
from services.detection_service import DetectionService
@@ -11,7 +12,8 @@ app = Flask(__name__)
screen = Screen()
mqtt_service = MQTTService("127.0.0.1", 1883)
reader = RfidReader("/dev/serial0", 9600)
rfid_reader = RfidReader("/dev/serial0", 9600)
light_sensor_reader = SerialReader("/dev/ttyUSB1", 57600)
detection_service = DetectionService()
@app.route("/party/start", methods=['POST'])
@@ -24,8 +26,8 @@ if __name__ == "__main__":
screen.enableBackground()
screen.displayMessage("Waiting for scan...")
reader.start()
reader.subscribe(lambda uid: mqtt_service.publish(
rfid_reader.start()
rfid_reader.subscribe(lambda uid: mqtt_service.publish(
"rpi", "/board-mate/rfid/scan", str(uid), 0
))