Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import serial
- import time
- class FPM10A:
- def __init__(self, port):
- self._ser = serial.Serial(port, baudrate=57600)
- self._addr = b"\xFF\xFF\xFF\xFF"
- self._lengthLimit = 128
- self.DEBUG = False
- def _HexByte(x):
- chars = (0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F')
- print(chars[x >> 4], end="")
- print(chars[x & 15], end="")
- print(" ", end="")
- def sendPkg(self, pid, data, sleep=0.5):
- time.sleep(sleep)
- if type(pid) == bytes:
- pid = pid[0]
- length = len(data) + 2
- sum = pid + (length >> 8) + (length & 255)
- for d in data:
- sum = sum + d
- pkg = (b"\xEF\x01" + self._addr + bytes([pid, length >> 8, length & 255])
- + data + bytes([sum >> 8, sum & 255])
- )
- self._ser.write(pkg)
- if self.DEBUG:
- print("ME: ", end="")
- for j in pkg:
- FPM10A._HexByte(j)
- print("")
- def sendData(self, data):
- debug = self.DEBUG
- self.DEBUG = False
- time.sleep(0.01)
- while len(data):
- if len(data) > self._lengthLimit:
- self.sendPkg(2, data[0:self._lengthLimit], 0)
- data = data[self._lengthLimit:]
- else:
- self.sendPkg(8, data)
- break
- self.DEBUG = debug
- self.getData()
- def getPkg(self, sleep=1):
- if sleep:
- time.sleep(sleep)
- mode = 0
- (pid, data) = (0, b"")
- length = 0
- if self.DEBUG:
- print("FPM10A: ", end="")
- breakFree = False
- while not breakFree and self._ser.inWaiting() > 0:
- while not breakFree and self._ser.inWaiting() > 0:
- c = self._ser.read(1)[0]
- if self.DEBUG:
- FPM10A._HexByte(c)
- if length > 2:
- data = data + bytes([c])
- length = length - 1
- elif length > 0:
- length = length - 1
- elif (mode == 7) or (mode == 8):
- length = (length << 8) | c
- mode = mode + 1
- elif (mode == 6):
- pid = c
- mode = mode + 1
- elif ((mode == 0 and c == 0xEF)
- or (mode == 1 and c == 0x01)
- or (mode == 2 and c == self._addr[0])
- or (mode == 3 and c == self._addr[1])
- or (mode == 4 and c == self._addr[2])
- or (mode == 5 and c == self._addr[3])
- ):
- mode = mode + 1
- else:
- mode = 0
- if mode > 8 and length == 0:
- breakFree = True
- time.sleep(sleep)
- if self.DEBUG:
- print("")
- return (pid, data)
- def getData(self):
- debug = self.DEBUG
- self.DEBUG = False
- tmp = ""
- rdata = b""
- while True:
- (pid, data) = self.getPkg(0.01)
- if pid in(2, 8):
- rdata = rdata + data
- if pid == 8:
- self.DEBUG = debug
- return rdata
- else:
- self.DEBUG = debug
- return b""
- def ReadSysPara(self):
- self.sendPkg(1, b"\x0F")
- (pid, data) = self.getPkg()
- if pid == 7 and data[0] == 0:
- conf = data[0]
- result = {
- 'statusRegister': data[1:3],
- 'systemVerifyCode': data[3:5],
- 'fingerprintLibrarySize': (data[5] << 8) | data[6],
- 'securityLevel': (data[7] << 8) | data[8],
- 'addr': data[9:13],
- 'lengthLimit': (data[13] << 8) | data[14],
- 'baudrateControl': (data[15] << 8) | data[16]
- }
- return ("OK", result)
- else:
- return ("ERR", pid, data)
- def _confirm(self, command):
- self.sendPkg(1, command)
- (pid, data) = self.getPkg()
- if pid == 7 and data[0] == 0:
- return ("OK",)
- else:
- return ("ERR", pid, data)
- def _ChrBufferPageQty(bufferId, pageId, qty):
- if type(bufferId) == int:
- bufferId = bytes([bufferId])
- if type(pageId) == int:
- pageId = bytes([pageId >> 8, pageId & 255])
- if type(qty) == int:
- qty = bytes([qty >> 8, qty & 255])
- return (bufferId, pageId, qty)
- def GenImg(self):
- self.sendPkg(1, b"\x01", 0)
- (pid, data) = self.getPkg(1)
- if pid == 7 and data[0] in b"\x00\x02":
- return ("OK", data[0])
- else:
- return ("ERR", pid, data)
- def UpImage(self):
- confirm = self._confirm(b"\x0A")
- if confirm[0] == "OK":
- data = self.getData()
- return ("OK", data)
- else:
- return confirm
- def DownImage(self, data):
- confirm = self._confirm(b"\x0B")
- if confirm[0] == "OK":
- data = self.sendData(data)
- return ("OK",)
- else:
- return confirm
- def Img2Tz(self, bufferId):
- (bufferId, _, _) = FPM10A._ChrBufferPageQty(bufferId, False, False)
- return self._confirm(b"\x02" + bufferId)
- def RegModel(self):
- return self._confirm(b"\x05")
- def Store(self, bufferId, pageId):
- (bufferId, pageId, _) = FPM10A._ChrBufferPageQty(bufferId, pageId, False)
- return self._confirm(b"\x06" + bufferId + pageId)
- def LoadChar(self, bufferId, pageId):
- (bufferId, pageId, _) = FPM10A._ChrBufferPageQty(bufferId, pageId, False)
- return self._confirm(b"\x07" + bufferId + pageId)
- def UpChar(self, bufferId):
- (bufferId, _, _) = FPM10A._ChrBufferPageQty(bufferId, False, False)
- confirm = self._confirm(b"\x08" + bufferId)
- if confirm[0] == "OK":
- data = self.getData()
- return ("OK", data)
- else:
- return confirm
- def DownChar(self, bufferId, data):
- (bufferId, _, _) = FPM10A._ChrBufferPageQty(bufferId, False, False)
- confirm = self._confirm(b"\x09" + bufferId)
- if confirm[0] == "OK":
- data = self.sendData(data)
- return ("OK",)
- else:
- return confirm
- def DeletChar(self, pageId, qty=1):
- (_, pageId, qty) = FPM10A._ChrBufferPageQty(False, pageId, qty)
- return self._confirm(b"\x0C" + pageId + qty)
- def Empty(self):
- return self._confirm(b"\x0D")
- def Match(self):
- self.sendPkg(1, b"\x03")
- (pid, data) = self.getPkg()
- if pid == 7 and data[0] in b"\x00\x08":
- match = {0:True, 8:False}
- score = data[1] << 8 | data[2]
- return ("OK", match[data[0]], score)
- else:
- return ("ERR", pid, data)
- def Search(self, bufferId, pageId, qty):
- (bufferId, pageId, qty) = FPM10A._ChrBufferPageQty(bufferId, pageId, qty)
- self.sendPkg(1, b"\x04" + bufferId + pageId + qty)
- (pid, data) = self.getPkg()
- if pid == 7 and data[0] in b"\x00\x09":
- found = {0:True, 9:False}
- pageId = data[1] << 8 | data[2]
- score = data[3] << 8 | data[4]
- return ("OK", found[data[0]], pageId, score)
- else:
- return ("ERR", pid, data)
- def promptScan(self, message, timeout=5):
- last = 0
- timeout = time.time() + timeout
- while True:
- if time.time() > timeout:
- return ("ERR","TIMEOUT")
- elif int(timeout - time.time()) + 1 != last:
- last = int(timeout - time.time()) + 1
- print(message % (last + 1))
- results = self.GenImg()
- if results[0] == "OK" and results[1] == 0:
- return ("OK",)
- elif results[0] == "ERR":
- return results
- else:
- time.sleep(0.1)
- if __name__ == "__main__":
- def main():
- fpm10a = FPM10A("/dev/ttyUSB0")
- fpm10a.DEBUG = True
- print("> Read System Parameters")
- results = fpm10a.ReadSysPara()
- if results[0] != "OK": return results
- print(results[1])
- fingerprintLibrarySize = results[1]['fingerprintLibrarySize']
- print("> Scan your finger!")
- results = fpm10a.promptScan("Scan your finger (%d)")
- if results[0] != "OK": return results
- #print("> Uploading your finger image data..")
- #results = fpm10a.UpImage()
- #if results[0] != "OK": return results
- #data = results[1]
- #print("> Downloading your finger image data..")
- #results = fpm10a.DownImage(data=data)
- #if results[0] != "OK": return results
- print("> Getting feature data into buffer 1..")
- results = fpm10a.Img2Tz(1)
- if results[0] != "OK": return results
- print("> Scan your finger again!")
- results = fpm10a.promptScan("Scan your finger again (%d)")
- if results[0] != "OK": return results
- print("> Getting feature data into buffer 2..")
- results = fpm10a.Img2Tz(2)
- if results[0] != "OK": return results
- print("> Generating model..")
- results = fpm10a.RegModel()
- if results[0] != "OK": return results
- #print("> Uploading model data from buffer 2..")
- #results = fpm10a.UpChar(2)
- #if results[0] != "OK": return results
- #data = results[1]
- #print("> Downloading model data into buffer 2..")
- #results = fpm10a.DownChar(2, data=data)
- #if results[0] != "OK": return results
- print("> Scan your finger again!")
- results = fpm10a.promptScan("Scan your finger again (%d)")
- if results[0] != "OK": return results
- print("> Getting feature data into buffer 1..")
- results = fpm10a.Img2Tz(1)
- if results[0] != "OK": return results
- print("> Matching feature (in buffer 1) with model (in buffer 2)..")
- results = fpm10a.Match()
- if results[0] != "OK": return results
- print("M A T C H:%d Score:%d" % (results[1], results[2]))
- print("> Saving model from buffer 2 into page 0")
- results = fpm10a.Store(2, 0)
- if results[0] != "OK": return results
- print("> Load model into buffer 2 from page 0")
- results = fpm10a.LoadChar(2, 0)
- if results[0] != "OK": return results
- print("> Search feature in buffer 1 on page 0..")
- results = fpm10a.Search(1, 0, qty=1)
- if results[0] != "OK": return results
- print("F O U N D:%d Page:%d Score:%d" % (results[1], results[2], results[3]))
- print("> Scan other finger!")
- results = fpm10a.promptScan("Scan other finger (%d)")
- if results[0] != "OK": return results
- print("> Getting feature data into buffer 1..")
- results = fpm10a.Img2Tz(1)
- if results[0] != "OK": return results
- print("> Matching feature (in buffer 1) with model (in buffer 2)..")
- results = fpm10a.Match()
- if results[0] != "OK": return results
- print("M A T C H:%d Score:%d" % (results[1], results[2]))
- print("> Search feature in buffer 1 on page 0..")
- results = fpm10a.Search(1, 0, qty=1)
- if results[0] != "OK": return results
- print("F O U N D:%d Page:%d Score:%d" % (results[1], results[2], results[3]))
- return str(fingerprintLibrarySize)+" NOT ERROR"
- print("ERROR: " + str(main()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement