From 3182ecba084fd2e16a1c0a181ccb9735a3109ca9 Mon Sep 17 00:00:00 2001 From: JianWu Date: Thu, 7 Jan 2021 13:55:22 +0100 Subject: [PATCH 1/5] Indentation changed to 4 spaces to conform with pep --- mfrc522/SimpleMFRC522.py | 166 ++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 81 deletions(-) diff --git a/mfrc522/SimpleMFRC522.py b/mfrc522/SimpleMFRC522.py index 91eca06..c145024 100644 --- a/mfrc522/SimpleMFRC522.py +++ b/mfrc522/SimpleMFRC522.py @@ -2,89 +2,93 @@ from . import MFRC522 import RPi.GPIO as GPIO - + + class SimpleMFRC522: - READER = None - - KEY = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] - BLOCK_ADDRS = [8, 9, 10] - - def __init__(self): - self.READER = MFRC522() - - def read(self): - id, text = self.read_no_block() - while not id: - id, text = self.read_no_block() - return id, text + READER = None + + KEY = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] + BLOCK_ADDRS = [8, 9, 10] + + def __init__(self): + self.READER = MFRC522() + + def read(self): + id, text = self.read_no_block() + while not id: + id, text = self.read_no_block() + return id, text + + def read_id(self): + id = self.read_id_no_block() + while not id: + id = self.read_id_no_block() + return id + + def read_id_no_block(self): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None + return self.uid_to_num(uid) + + def read_no_block(self): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None, None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None, None + id = self.uid_to_num(uid) + self.READER.MFRC522_SelectTag(uid) + status = self.READER.MFRC522_Auth( + self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) + data = [] + text_read = '' + if status == self.READER.MI_OK: + for block_num in self.BLOCK_ADDRS: + block = self.READER.MFRC522_Read(block_num) + if block: + data += block + if data: + text_read = ''.join(chr(i) for i in data) + self.READER.MFRC522_StopCrypto1() + return id, text_read - def read_id(self): - id = self.read_id_no_block() - while not id: - id = self.read_id_no_block() - return id + def write(self, text): + id, text_in = self.write_no_block(text) + while not id: + id, text_in = self.write_no_block(text) + return id, text_in - def read_id_no_block(self): - (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) - if status != self.READER.MI_OK: - return None - (status, uid) = self.READER.MFRC522_Anticoll() - if status != self.READER.MI_OK: - return None - return self.uid_to_num(uid) - - def read_no_block(self): - (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) - if status != self.READER.MI_OK: - return None, None - (status, uid) = self.READER.MFRC522_Anticoll() - if status != self.READER.MI_OK: - return None, None - id = self.uid_to_num(uid) - self.READER.MFRC522_SelectTag(uid) - status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) - data = [] - text_read = '' - if status == self.READER.MI_OK: - for block_num in self.BLOCK_ADDRS: - block = self.READER.MFRC522_Read(block_num) - if block: - data += block - if data: - text_read = ''.join(chr(i) for i in data) - self.READER.MFRC522_StopCrypto1() - return id, text_read - - def write(self, text): - id, text_in = self.write_no_block(text) - while not id: - id, text_in = self.write_no_block(text) - return id, text_in + def write_no_block(self, text): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None, None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None, None + id = self.uid_to_num(uid) + self.READER.MFRC522_SelectTag(uid) + status = self.READER.MFRC522_Auth( + self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) + self.READER.MFRC522_Read(11) + if status == self.READER.MI_OK: + data = bytearray() + data.extend(bytearray(text.ljust( + len(self.BLOCK_ADDRS) * 16).encode('ascii'))) + i = 0 + for block_num in self.BLOCK_ADDRS: + self.READER.MFRC522_Write(block_num, data[(i*16):(i+1)*16]) + i += 1 + self.READER.MFRC522_StopCrypto1() + return id, text[0:(len(self.BLOCK_ADDRS) * 16)] - def write_no_block(self, text): - (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) - if status != self.READER.MI_OK: - return None, None - (status, uid) = self.READER.MFRC522_Anticoll() - if status != self.READER.MI_OK: - return None, None - id = self.uid_to_num(uid) - self.READER.MFRC522_SelectTag(uid) - status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) - self.READER.MFRC522_Read(11) - if status == self.READER.MI_OK: - data = bytearray() - data.extend(bytearray(text.ljust(len(self.BLOCK_ADDRS) * 16).encode('ascii'))) - i = 0 - for block_num in self.BLOCK_ADDRS: - self.READER.MFRC522_Write(block_num, data[(i*16):(i+1)*16]) - i += 1 - self.READER.MFRC522_StopCrypto1() - return id, text[0:(len(self.BLOCK_ADDRS) * 16)] - - def uid_to_num(self, uid): - n = 0 - for i in range(0, 5): - n = n * 256 + uid[i] - return n + def uid_to_num(self, uid): + n = 0 + for i in range(0, 5): + n = n * 256 + uid[i] + return n From 4776695abca2b9fe7a4b7332a85ab6e2021bee80 Mon Sep 17 00:00:00 2001 From: JianWu Date: Thu, 7 Jan 2021 14:12:49 +0100 Subject: [PATCH 2/5] added timeout to read and changed the id variable name due to name collapse with id variable in Python --- mfrc522/SimpleMFRC522.py | 47 +++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/mfrc522/SimpleMFRC522.py b/mfrc522/SimpleMFRC522.py index c145024..5b256d3 100644 --- a/mfrc522/SimpleMFRC522.py +++ b/mfrc522/SimpleMFRC522.py @@ -2,7 +2,7 @@ from . import MFRC522 import RPi.GPIO as GPIO - +import datetime class SimpleMFRC522: @@ -14,17 +14,28 @@ class SimpleMFRC522: def __init__(self): self.READER = MFRC522() - def read(self): - id, text = self.read_no_block() - while not id: - id, text = self.read_no_block() - return id, text + def read(self, **kwargs): + ''' + read method accepting a timeout expressed as integer in seconds. For example + read(timeout = 5) will enter the read mode for 5 sec. + ''' + idnum, text = self.read_no_block() + + #Log the current date and time and add timeout to the current time stamp in case entering the while loop + timeout = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) + + while not idnum: + if datetime.datetime.now() <= timeout: + idnum, text = self.read_no_block() + else: + break + return idnum, text def read_id(self): - id = self.read_id_no_block() - while not id: - id = self.read_id_no_block() - return id + idnum = self.read_id_no_block() + while not idnum: + idnum = self.read_id_no_block() + return idnum def read_id_no_block(self): (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) @@ -42,7 +53,7 @@ def read_no_block(self): (status, uid) = self.READER.MFRC522_Anticoll() if status != self.READER.MI_OK: return None, None - id = self.uid_to_num(uid) + idnum = self.uid_to_num(uid) self.READER.MFRC522_SelectTag(uid) status = self.READER.MFRC522_Auth( self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) @@ -56,13 +67,13 @@ def read_no_block(self): if data: text_read = ''.join(chr(i) for i in data) self.READER.MFRC522_StopCrypto1() - return id, text_read + return idnum, text_read def write(self, text): - id, text_in = self.write_no_block(text) - while not id: - id, text_in = self.write_no_block(text) - return id, text_in + idnum, text_in = self.write_no_block(text) + while not idnum: + idnum, text_in = self.write_no_block(text) + return idnum, text_in def write_no_block(self, text): (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) @@ -71,7 +82,7 @@ def write_no_block(self, text): (status, uid) = self.READER.MFRC522_Anticoll() if status != self.READER.MI_OK: return None, None - id = self.uid_to_num(uid) + idnum = self.uid_to_num(uid) self.READER.MFRC522_SelectTag(uid) status = self.READER.MFRC522_Auth( self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) @@ -85,7 +96,7 @@ def write_no_block(self, text): self.READER.MFRC522_Write(block_num, data[(i*16):(i+1)*16]) i += 1 self.READER.MFRC522_StopCrypto1() - return id, text[0:(len(self.BLOCK_ADDRS) * 16)] + return idnum, text[0:(len(self.BLOCK_ADDRS) * 16)] def uid_to_num(self, uid): n = 0 From 289329433b36c019c9cd45cbc3197e5533706672 Mon Sep 17 00:00:00 2001 From: JianWu Date: Thu, 7 Jan 2021 14:20:25 +0100 Subject: [PATCH 3/5] bug fix --- mfrc522/SimpleMFRC522.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mfrc522/SimpleMFRC522.py b/mfrc522/SimpleMFRC522.py index 5b256d3..4daa29f 100644 --- a/mfrc522/SimpleMFRC522.py +++ b/mfrc522/SimpleMFRC522.py @@ -22,13 +22,15 @@ def read(self, **kwargs): idnum, text = self.read_no_block() #Log the current date and time and add timeout to the current time stamp in case entering the while loop - timeout = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) - - while not idnum: - if datetime.datetime.now() <= timeout: + if not kwargs: #If timeout keyword hasn't been provided read for infinity + while not idnum: idnum, text = self.read_no_block() - else: - break + else: + timeoutTime = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) + + while not idnum: + if datetime.datetime.now() <= timeoutTime: + idnum, text = self.read_no_block() return idnum, text def read_id(self): From 4b9b014da29c1a99e5a195853dddda39d8cf6a4e Mon Sep 17 00:00:00 2001 From: JianWu Date: Thu, 7 Jan 2021 14:21:07 +0100 Subject: [PATCH 4/5] bug fix --- mfrc522/SimpleMFRC522.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfrc522/SimpleMFRC522.py b/mfrc522/SimpleMFRC522.py index 4daa29f..e9bf66b 100644 --- a/mfrc522/SimpleMFRC522.py +++ b/mfrc522/SimpleMFRC522.py @@ -26,10 +26,10 @@ def read(self, **kwargs): while not idnum: idnum, text = self.read_no_block() else: - timeoutTime = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) + timeout = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) while not idnum: - if datetime.datetime.now() <= timeoutTime: + if datetime.datetime.now() <= timeout: idnum, text = self.read_no_block() return idnum, text From b8e09c00e480e8a3f3484935570038bcd7862c34 Mon Sep 17 00:00:00 2001 From: JianWu Date: Thu, 7 Jan 2021 15:20:51 +0100 Subject: [PATCH 5/5] Updated write and read allowing timeout as keyword --- mfrc522/SimpleMFRC522.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/mfrc522/SimpleMFRC522.py b/mfrc522/SimpleMFRC522.py index e9bf66b..b8480ec 100644 --- a/mfrc522/SimpleMFRC522.py +++ b/mfrc522/SimpleMFRC522.py @@ -23,14 +23,14 @@ def read(self, **kwargs): #Log the current date and time and add timeout to the current time stamp in case entering the while loop if not kwargs: #If timeout keyword hasn't been provided read for infinity - while not idnum: + while idnum is None: idnum, text = self.read_no_block() else: - timeout = datetime.datetime.now() + datetime.timedelta(kwargs['timeout']) - - while not idnum: - if datetime.datetime.now() <= timeout: - idnum, text = self.read_no_block() + timeout = datetime.datetime.now() + datetime.timedelta(seconds = kwargs['timeout']) + while idnum is None: + idnum, text = self.read_no_block() + if (datetime.datetime.now() > timeout): + break return idnum, text def read_id(self): @@ -71,11 +71,23 @@ def read_no_block(self): self.READER.MFRC522_StopCrypto1() return idnum, text_read - def write(self, text): + def write(self, text, **kwargs): + ''' + kwargs can accept timeout as integer expressed in number of + seconds. If the card is not introduced to the reader within the timeout, the write will be terminated. + ''' idnum, text_in = self.write_no_block(text) - while not idnum: - idnum, text_in = self.write_no_block(text) - return idnum, text_in + if not kwargs: #If no kwargs is introduced, the write goes into an infinite + while not idnum: + idnum, text_in = self.write_no_block(text) + return idnum, text_in + else: + timeout = datetime.datetime.now() + datetime.timedelta(seconds = kwargs['timeout']) + if idnum is None: + while (datetime.datetime.now() < timeout): + idnum, text_in = self.write_no_block(text) + if idnum: + break def write_no_block(self, text): (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL)