st-ten-1/src/components/rfid_pn532.py

68 lines
2.3 KiB
Python
Raw Normal View History

2023-06-23 08:20:26 +00:00
import ctypes
import sys
import platform
from PyQt5.QtCore import QMutex, Qt, QTimer, pyqtSlot, pyqtSignal
from .component import Component
import nfc
from nfc.clf import RemoteTarget
class RFID_PN532(Component):
new_id_signal = pyqtSignal()
def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True):
super().__init__(config=config, name=name, period=period, lazy=lazy, paused=paused, threaded=threaded)
self.mutex = QMutex()
self.simulate="--sim-rfid" in sys.argv
self.clf = None
self.connected=False
self.tag_present=False
self.current_data=None
self.is_win = platform.system() == "Windows"
self.dev_list = ["tty:USB0:pn532","tty:USB1:pn532"] if self.is_win else [f"{self.config['fixture_rfid']['port']}:pn532"]
def open_device(self):
clf = nfc.ContactlessFrontend()
for dev in self.dev_list:
connected = clf.open(dev)
if connected:
self.log.info(f"CONNECTED TO {dev}")
break
else:
self.log.info(f"UNABLE TO CONNECT TO {dev}")
def close_device(self):
self.clf.close()
@pyqtSlot()
def start(self):
super().start()
@pyqtSlot()
def get(self):
try:
if not self.connected:
self.open_device()
else:
target = self.clf.sense(RemoteTarget('106A'), RemoteTarget('106B'), RemoteTarget('212F'))
if target is not None:
tag = nfc.tag.activate(self.clf, target)
if tag is not None:
self.log.debug("tag present")
if tag.ndef is not None:
tag_content=tag.ndef.records[0]
if tag_content!=self.current_data:
self.log.info(f"new tag detected:{tag_content}")
self.current_data=tag_content
self.new_id_signal.emit(self.current_data)
else:
self.log.error("tag is not NDEF")
else:
self.log.debug("no target present")
except Exception as e:
self.log.exception(f"{e}")
self.connected = False