Reworked serial reading
This commit is contained in:
0
rpi/hardware/generic/__init__.py
Normal file
0
rpi/hardware/generic/__init__.py
Normal file
40
rpi/hardware/generic/serial_reader.py
Normal file
40
rpi/hardware/generic/serial_reader.py
Normal 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)
|
||||||
@@ -4,40 +4,18 @@ from threading import Thread
|
|||||||
import threading
|
import threading
|
||||||
from serial import Serial
|
from serial import Serial
|
||||||
|
|
||||||
|
from hardware.generic.serial_reader import SerialReader
|
||||||
|
|
||||||
class RfidReader:
|
class RfidReader(SerialReader):
|
||||||
|
|
||||||
__serial : Serial = None
|
|
||||||
__thread : Thread | None = None
|
|
||||||
__listeners : list[Callable] = None
|
|
||||||
|
|
||||||
def __init__(self, port : str, baudrate: int):
|
def __init__(self, port : str, baudrate: int):
|
||||||
self.__serial = Serial(port, baudrate)
|
super().__init__(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)
|
|
||||||
|
|
||||||
def __read(self):
|
def __read(self):
|
||||||
while self._run_event.is_set():
|
while self._run_event.is_set():
|
||||||
data = b""
|
data = b""
|
||||||
while len(data) < 14 and self._run_event.is_set():
|
while len(data) < 14 and self._run_event.is_set():
|
||||||
character = self.__serial.read(1)
|
character = self.serial.read(1)
|
||||||
if not character: continue
|
if not character: continue
|
||||||
data += character
|
data += character
|
||||||
|
|
||||||
@@ -45,14 +23,12 @@ class RfidReader:
|
|||||||
hex_value = data[5:11].decode(errors='ignore')
|
hex_value = data[5:11].decode(errors='ignore')
|
||||||
try:
|
try:
|
||||||
res = int(hex_value, 16)
|
res = int(hex_value, 16)
|
||||||
self.__notify(res)
|
self.__notify(str(res))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
print("Invalid hex:", hex_value)
|
print("Invalid hex:", hex_value)
|
||||||
else:
|
else:
|
||||||
print("Received incomplete data:", data)
|
print("Received incomplete data:", data)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
def callback(uid):
|
def callback(uid):
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import cv2
|
import cv2
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
|
||||||
|
from hardware.generic.serial_reader import SerialReader
|
||||||
from hardware.screen.screen import Screen
|
from hardware.screen.screen import Screen
|
||||||
from hardware.rfid.reader import RfidReader
|
from hardware.rfid.reader import RfidReader
|
||||||
from services.detection_service import DetectionService
|
from services.detection_service import DetectionService
|
||||||
@@ -11,7 +12,8 @@ app = Flask(__name__)
|
|||||||
|
|
||||||
screen = Screen()
|
screen = Screen()
|
||||||
mqtt_service = MQTTService("127.0.0.1", 1883)
|
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()
|
detection_service = DetectionService()
|
||||||
|
|
||||||
@app.route("/party/start", methods=['POST'])
|
@app.route("/party/start", methods=['POST'])
|
||||||
@@ -24,8 +26,8 @@ if __name__ == "__main__":
|
|||||||
screen.enableBackground()
|
screen.enableBackground()
|
||||||
screen.displayMessage("Waiting for scan...")
|
screen.displayMessage("Waiting for scan...")
|
||||||
|
|
||||||
reader.start()
|
rfid_reader.start()
|
||||||
reader.subscribe(lambda uid: mqtt_service.publish(
|
rfid_reader.subscribe(lambda uid: mqtt_service.publish(
|
||||||
"rpi", "/board-mate/rfid/scan", str(uid), 0
|
"rpi", "/board-mate/rfid/scan", str(uid), 0
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user