Skip to content

Commit 5dca35f

Browse files
Fixes for rfid reader (MiczFlor#2250)
* fix wait_for_tag for both modes * fix function names * move rc522 settings init * fix reader readCard indirection (MiczFlor#551) access readCard function of Reader class itself. readCard added for "experimental" * moved rc522 reader initialization * updated rc522 implementation in "experimental.multi" * highlight default setting
1 parent 2ceef1b commit 5dca35f

8 files changed

+45
-33
lines changed

components/rfid-reader/RC522/setup_rc522.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ printf "Please make sure that the RC522 reader is wired up correctly to the GPIO
1717
question "Continue"
1818

1919
printf "Use backward-compatible card ID (not suggested for new installations)?\n"
20-
read -p "(y/n) " choice
20+
read -p "(y/N) " choice
2121
case "$choice" in
2222
y|Y ) printf "OFF" > "${JUKEBOX_HOME_DIR}"/settings/Rfidreader_Rc522_Readmode_UID;;
2323
* ) printf "ON" > "${JUKEBOX_HOME_DIR}"/settings/Rfidreader_Rc522_Readmode_UID;;

scripts/Reader.py

-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@ def get_devices():
2929

3030

3131
class Reader:
32-
reader = None
3332

3433
def __init__(self):
35-
self.reader = self
3634
path = os.path.dirname(os.path.realpath(__file__))
3735
self.keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
3836
if not os.path.isfile(path + '/deviceName.txt'):

scripts/Reader.py.Multi

-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@ def get_devices():
2929

3030

3131
class Reader:
32-
reader = None
3332

3433
def __init__(self):
35-
self.reader = self
3634
devs = list()
3735
path = os.path.dirname(os.path.realpath(__file__))
3836
self.keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"

scripts/Reader.py.experimental

+18-12
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,18 @@ class UsbReader(object):
5050

5151

5252
class Mfrc522Reader(object):
53-
def __init__(self, readmode_uid=False):
53+
def __init__(self):
5454
import pirc522
5555
self.device = pirc522.RFID()
56-
self.readmode_uid = readmode_uid
57-
self.readCard = self.readCard_normal if self.readmode_uid else self.readCard_legacy
56+
path = os.path.dirname(os.path.realpath(__file__))
57+
readmode_uid = False
58+
if os.path.isfile(path + '/../settings/Rfidreader_Rc522_Readmode_UID'):
59+
with open(path + '/../settings/Rfidreader_Rc522_Readmode_UID', 'r') as f:
60+
readmode_uid = f.read().rstrip().split(';', 1)[0] == 'ON'
61+
self._read_function = self._readCard_normal if readmode_uid else self._readCard_legacy
5862

59-
def readCard_legacy(self):
63+
def _readCard_legacy(self):
6064
# Scan for cards
61-
self.device.wait_for_tag()
6265
(error, tag_type) = self.device.request()
6366

6467
if not error:
@@ -72,7 +75,7 @@ class Mfrc522Reader(object):
7275
logger.debug("No Device ID found.")
7376
return None
7477

75-
def readCard_normal(self):
78+
def _readCard_normal(self):
7679
# Scan for cards
7780
uid = self.device.read_id(as_number=True)
7881
if not uid:
@@ -83,6 +86,11 @@ class Mfrc522Reader(object):
8386
logger.info(card_id)
8487
return card_id
8588

89+
def readCard(self):
90+
# Scan for cards
91+
self.device.wait_for_tag()
92+
return self._read_function()
93+
8694
@staticmethod
8795
def cleanup():
8896
GPIO.cleanup()
@@ -201,14 +209,9 @@ class Reader(object):
201209
else:
202210
with open(path + '/deviceName.txt', 'r') as f:
203211
device_name = f.read().rstrip().split(';', 1)[0]
204-
if os.path.isfile(path + '/../settings/Rfidreader_Rc522_Readmode_UID'):
205-
with open(path + '/../settings/Rfidreader_Rc522_Readmode_UID', 'r') as f:
206-
readmode_uid = f.read().rstrip().split(';', 1)[0] == 'ON'
207-
else:
208-
readmode_uid = False
209212

210213
if device_name == 'MFRC522':
211-
self.reader = Mfrc522Reader(readmode_uid)
214+
self.reader = Mfrc522Reader()
212215
elif device_name == 'RDM6300':
213216
# The Rdm6300Reader supports 2 Additional Number Formats which can bee choosen by an optional parameter dictionary:
214217
# {'numberformat':'card_id_float'} or {'numberformat':'card_id_dec'}
@@ -221,3 +224,6 @@ class Reader(object):
221224
self.reader = UsbReader(device)
222225
except IndexError:
223226
sys.exit('Could not find the device %s.\n Make sure it is connected' % device_name)
227+
228+
def readCard(self):
229+
return self.reader.readCard()

scripts/Reader.py.experimental.Multi

+24-3
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,17 @@ class UsbReader(object):
7070

7171
class Mfrc522Reader(object):
7272
def __init__(self):
73+
import pirc522
7374
self.device = pirc522.RFID()
75+
path = os.path.dirname(os.path.realpath(__file__))
76+
readmode_uid = False
77+
if os.path.isfile(path + '/../settings/Rfidreader_Rc522_Readmode_UID'):
78+
with open(path + '/../settings/Rfidreader_Rc522_Readmode_UID', 'r') as f:
79+
readmode_uid = f.read().rstrip().split(';', 1)[0] == 'ON'
80+
self._read_function = self._readCard_normal if readmode_uid else self._readCard_legacy
7481

75-
def readCard(self):
82+
def _readCard_legacy(self):
7683
# Scan for cards
77-
self.device.wait_for_tag()
7884
(error, tag_type) = self.device.request()
7985

8086
if not error:
@@ -88,6 +94,22 @@ class Mfrc522Reader(object):
8894
logger.debug("No Device ID found.")
8995
return None
9096

97+
def _readCard_normal(self):
98+
# Scan for cards
99+
uid = self.device.read_id(as_number=True)
100+
if not uid:
101+
logger.debug("No Device ID found.")
102+
return None
103+
card_id = str(uid)
104+
logger.info("Card detected.")
105+
logger.info(card_id)
106+
return card_id
107+
108+
def readCard(self):
109+
# Scan for cards
110+
self.device.wait_for_tag()
111+
return self._read_function()
112+
91113
@staticmethod
92114
def cleanup():
93115
GPIO.cleanup()
@@ -158,7 +180,6 @@ class Pn532Reader:
158180

159181
class Reader(object):
160182
def __init__(self):
161-
self.reader = self
162183
self.devs = list()
163184
path = os.path.dirname(os.path.realpath(__file__))
164185
if not os.path.isfile(path + '/deviceName.txt'):

scripts/Reader.py.original

-2
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,9 @@ def get_devices():
3030

3131

3232
class Reader:
33-
reader = None
3433

3534
def __init__(self):
3635
logger.debug('Initialize Reader')
37-
self.reader = self
3836
path = os.path.dirname(os.path.realpath(__file__))
3937
self.keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
4038
deviceNameFile = os.path.join(path, 'deviceName.txt')

scripts/Reader.py.pcsc

+1-3
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@ from smartcard.util import *
1212

1313
class Reader:
1414

15-
reader = None
16-
1715
def __init__(self):
18-
self.reader = self
16+
pass
1917

2018
def readCard(self):
2119

scripts/daemon_rfid_reader.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,7 @@ def handler(signum, frame):
8585
signal.alarm(1)
8686

8787
# reading the card id
88-
# NOTE: it's been reported that KKMOON Reader might need the following line altered.
89-
# Instead of:
90-
# cardid = reader.reader.readCard()
91-
# change the line to:
92-
# cardid = reader.readCard()
93-
# See here for (German ;) details:
94-
# https://github.com/MiczFlor/RPi-Jukebox-RFID/issues/551
95-
cardid = reader.reader.readCard()
88+
cardid = reader.readCard()
9689

9790
# disable the alarm after a successful read
9891
signal.alarm(0)

0 commit comments

Comments
 (0)