diff --git a/haas_lib_bundles/python/docs/examples/FingerPrintLock/as608.py b/haas_lib_bundles/python/docs/examples/FingerPrintLock/as608.py new file mode 100644 index 0000000000000000000000000000000000000000..43dc06bb7cdccf1c9a002fa562f6b7d33fc9c262 --- /dev/null +++ b/haas_lib_bundles/python/docs/examples/FingerPrintLock/as608.py @@ -0,0 +1,487 @@ +import utime +import ustruct +from micropython import const +from driver import UART + +# check passwoard: 4 byte 0000 +cmdVerifyPasswoard = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x07\x13\x00\x00\x00\x00\x00\x1B' + +# 采集图片 +cmdGetImage = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x01\x00\x05' + +# 生成指纹图片对应的特征值 +cmdImage2Char = b'\xEF\x01\xFF\xFF\xFF\xFF' +cmdSaveimage2Char = b'\x01\x00\x04\x02' + +# 创建指纹模板 +cmdCreateModel = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x05\x00\x09' + +# 保存指纹模板 +cmdStoreModel = b'\xEF\x01\xFF\xFF\xFF\xFF' +cmdSaveStoreModel = b'\x01\x00\x06\x06\x01' + +#指纹匹配指令 +cmdMatch = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x03\x00\x07' + +#指纹搜索指令 +cmdSearch = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x08\x04\x01\x00\x00\x00\x7F\x00\x8D' + +# 读取索引表 +cmdReadIndexTable = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x1F\x00\x00\x24' + +#删除指纹记录 +cmdDeleteModel = b'\xEF\x01\xFF\xFF\xFF\xFF' +cmdSaveDeleteModel = b'\x01\x00\x07\x0c\x00' + +# 清除数据库中的指纹信息 +cmdEmptyDatabase = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x0D\x00\x11' + +# 获取指纹图片信息 +cmdGetFPImage = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x0a\x00\x0e' + +# 获取指纹特征值信息 +cmdGetFPChar = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x08\x00\x00\x00' + + +SUCCESS = const(0) +FAIL = const(-1) +NO_FINGER = const(2) + +DATABASE_CAPABILITY = const(300) + +CMD_RSP_TIMEOUT_MS = const(500) # 单条指令超时时间 +CMD_RSP_WAIT_TIME_MS = const(10) # 目前指令的response最多44个byte,44*(1+8+2+1)/57600 ~= 9.9ms + +class AS608: + def __init__(self, *args, **kargs): + self._uartDev = None + + if not isinstance(args[0], UART): + raise ValueError("parameter is not an UART object") + + #实例化和AS608通信所用串口 + self._uartDev=args[0] + + #接收指令执行结果 + def getCmdResult(self): + cnt = 0 + len = 12 + rx = bytearray(len * b'5') + + # 检查UART接收缓冲区中是否有足够的数据 + l = self._uartDev.any() + while(l < len): + # print('uart.any:', l) + cnt += 1 + if cnt > CMD_RSP_TIMEOUT_MS/CMD_RSP_WAIT_TIME_MS: # 等待超时时间后退出 + break + utime.sleep_ms(CMD_RSP_WAIT_TIME_MS) + l = self._uartDev.any() + + self._uartDev.read(rx) + return rx + + def matchCmdResult(self): + cnt = 0 + len = 14 + rx = bytearray(len * b'5') + + # 检查UART接收缓冲区中是否有足够的数据 + l = self._uartDev.any() + while(l < len): + # print('uart.any:', l) + cnt += 1 + if cnt > CMD_RSP_TIMEOUT_MS/CMD_RSP_WAIT_TIME_MS: # 等待超时时间后退出 + break + utime.sleep_ms(CMD_RSP_WAIT_TIME_MS) + l = self._uartDev.any() + + self._uartDev.read(rx) + return rx + + #接收指纹图像数据 + def getLongResult(self): + cnt = 0 + rx = bytearray(0) + + # 检查UART接收缓冲区中是否有足够的数据 + while(cnt < 5): + utime.sleep_ms(30) + buf = bytearray(512) + l = self._uartDev.any() + # 检查UART中是否有数据 + if l > 0: + # 从UART读取数据 + l = self._uartDev.read(buf) + #print(l) + + if l > 0: + # 合并UART返回结果 + rx += buf[0:l] + cnt = 0 + else: + cnt += 1 + + return rx + + # 接收搜索指令结果 + def searchCmdResult(self): + cnt = 0 + len = 16 + rx = bytearray(len * b'5') + + l = self._uartDev.any() + while(l < len): + # print('uart.any:', l) + cnt += 1 + if cnt > CMD_RSP_TIMEOUT_MS/CMD_RSP_WAIT_TIME_MS: # 等待超时时间后退出 + break + utime.sleep_ms(CMD_RSP_WAIT_TIME_MS) + l = self._uartDev.any() + self._uartDev.read(rx) + return rx + + # 接收索引表结果 + def readIndexCmdResult(self): + cnt = 0 + len = 44 + rx = bytearray(len * b'5') + + l = self._uartDev.any() + while(l < len): + # print('uart.any:', l) + cnt += 1 + if cnt > CMD_RSP_TIMEOUT_MS/CMD_RSP_WAIT_TIME_MS: # 等待超时时间后退出 + break + utime.sleep_ms(CMD_RSP_WAIT_TIME_MS) + l = self._uartDev.any() + self._uartDev.read(rx) + return rx + + # 验证密码 + def verifyPassword(self): + self._uartDev.write(cmdVerifyPasswoard) + + rsp = self.getCmdResult() + + # 检查命令是否执行成功 + if rsp[-3] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm code=00H shows OK; + Confirm Code=01H shows receiving packet error; + Confirm Code=13H shows password incorrect; + Confirm Code=21H shows Must verify password first; + ''' + + # 录入指纹图像 + def getImage(self): + self._uartDev.write(cmdGetImage) + rsp = self.getCmdResult() + # print(rsp) + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + elif rsp[9] == 2: + return NO_FINGER + else: + return FAIL + ''' + Confirm Code=00H - 录入成功 + Confirm Code=01H - 收包错误 + Confirm Code=02H - 传感器上无手指 + Confirm Code=03H - 指纹录入失败 + ''' + + # 生成指纹对应的特征值, slot代表Buffer缓冲区ID + def image2Character(self, slot = 1): + sumImage2Char = cmdSaveimage2Char + bytearray([slot, 0, slot + 0x7]) + self._uartDev.write(cmdImage2Char) + self._uartDev.write(sumImage2Char) + + rsp = self.getCmdResult() + + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 生成特征值成功 + Confirm Code=01H - 收包错误 + Confirm Code=06H - 指纹图像太乱,生成特征值失败 + Confirm Code=07H - 特征点太少,生成特征值失败 + feature; + Confirm Code=15H - 图像缓冲区内没有有效原始图,生成特征值失败 + ''' + + # 合并特征并生成模板 + def createModel(self): + self._uartDev.write(cmdCreateModel) + + rsp = self.getCmdResult() + + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 合并成功 + Confirm Code=01H - 收包错误 + Confirm Code=0aH - 合并失败(两枚指纹不属于同一手指) + ''' + + # 将模板文件存储到PageID中,默认存储缓冲区1中的模板 + def storeModel(self, id): + #sumStoreModel = cmdSaveStoreModel + bytearray([id, 0, id + 0x0E]) + payload = cmdSaveStoreModel + bytearray([(id >> 8) & 0xff, id & 0xff]) + s = sum(payload) + sumStoreModel = cmdStoreModel + payload + bytearray([(s >> 8) & 0xff, s & 0xff]) + + self._uartDev.write(sumStoreModel) + + rsp = self.getCmdResult() + + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 储存成功 + Confirm Code=01H - 收包错误 + Confirm Code=0bH - pageID超出范围 + Confirm Code=18H - 写Flash操作出错 + ''' + # 精确比对两枚指纹特征 + def match(self): + self._uartDev.write(cmdMatch) + + rsp = self.matchCmdResult() + + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 指纹匹配 + Confirm Code=01H - 收包错误 + Confirm Code=08H - 指纹不匹配 + ''' + # 以缓冲区1或缓冲区2中的特征文件搜索整个或部分指纹库,若搜索到,返回页码 + def search(self): + result = FAIL + fingerId = -1 + confidence = 0 + self._uartDev.write(cmdSearch) + + rsp = self.searchCmdResult() + # print(rsp) + # 检查命令是否执行成功 + if rsp[9] == 0: + result = SUCCESS + fingerId, confidence = ustruct.unpack(">HH", bytes(rsp[10:14])) + else: + fingerId, confidence = -1, 0 + # print (result, fingerId, confidence) + + return result, fingerId, confidence + ''' + Confirm Code=00H - 搜索成功 + Confirm Code=01H - 收包错误 + Confirm Code=09H - 没有搜索到,此时fingerId和confidence均为0 + ''' + # 删除Flash指纹库中的一个特征文件 + def deleteModel(self, id): + if id >= DATABASE_CAPABILITY or id < 0: + return FAIL + + deleteModel = cmdSaveDeleteModel + bytearray([id, 0, 1, 0, id + 0x15]) + self._uartDev.write(cmdDeleteModel) + self._uartDev.write(deleteModel) + + rsp = self.getCmdResult() + + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 删除模板成功 + Confirm Code=01H - 收包错误 + Confirm Code=10H - 删除模板失败 + ''' + + # 删除flash数据库中的所有指纹模板 + def emptyDatabase(self): + self._uartDev.write(cmdEmptyDatabase) + + rsp = self.getCmdResult() + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS + else: + return FAIL + ''' + Confirm Code=00H - 清空指纹模板成功 + Confirm Code=01H - 收包错误 + Confirm Code=11H - 清空指纹模板失败 + ''' + + # 获取指纹特征值 + def getFPCharacter(self, slot = 1): + # 获取指纹特征值信息 + cmd = bytearray(cmdGetFPChar) + cmd[10] = slot + + s = sum(cmd[6:11]) + cmd[11] = (s >> 8) & 0xff + cmd[12] = s & 0xff + + self._uartDev.write(cmd) + + rsp = self.getLongResult() + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS, rsp[12:len(rsp)] + else: + return FAIL, [] + ''' + Confirm Code=00H - 清空指纹模板成功 + Confirm Code=01H - 收包错误 + Confirm Code=0dH - 指纹执行失败 + ''' + + # 获取指纹图像 + def getFPImage(self): + self._uartDev.write(cmdGetFPImage) + + rsp = self.getLongResult() + # 检查命令是否执行成功 + if rsp[9] == 0: + return SUCCESS, rsp[12:len(rsp)] + else: + return FAIL, [] + + ''' + Confirm Code=00H - 清空指纹模板成功 + Confirm Code=01H - 收包错误 + Confirm Code=0fH - bu不能发送后续数据包 + ''' + + def getEmptyPosition(self): + for i in range(4): + cmdReadIndexTable = b'\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x1F\x00\x00\x24' + + s = sum(cmdReadIndexTable[6:10]) + i + cmd = cmdReadIndexTable[0:10] + bytearray([i]) + bytearray([(s >> 8) & 0xff, s & 0xff]) + self._uartDev.write(cmd) + rsp = self.readIndexCmdResult() + # print(rsp) + # 检查命令是否执行成功 + if rsp[9] == 0: + index = rsp[10:41] + for j in range(len(index)): + for m in range(8): + if not (index[j] & (1 << m)): + return i * 32 + j * 8 + m + + return FAIL + + # 指纹录入 + def fingerEnroll(self, id): + p = FAIL + + if id >= DATABASE_CAPABILITY or id < 0: + return FAIL + + print('wait for finger print on the pannel') + + while p != NO_FINGER: + p = self.getImage() + + # 开始采集指纹 + while p != SUCCESS: + p = self.getImage() + + print('finger detected') + # 指纹图片转化为特征值 + p = self.image2Character(1) + if p != SUCCESS: + print('image to text failed, exit') + return 0 + + # 再录制一次 + print('take off your finger, please') + + #Take off your finger + p = 0 + + while p != NO_FINGER: + p = self.getImage() + + # put on again + # Get image again + print('put on your finger again, please') + + while p != SUCCESS: + p = self.getImage() + + # 指纹图片转化为特征值 + p = self.image2Character(2) + if p != SUCCESS: + return 0 + + print('creating finger model') + # 创建指纹模板 + p = self.createModel() + if p != SUCCESS: + print('creating model failed') + return 0 + + print('store finger model') + # 存储指纹模板 + p = self.storeModel(id) + if p != SUCCESS: + # fingerrecordfail + print('store finger model failed') + return FAIL + print('store finger model success') + return SUCCESS + + # 指纹识别 + def fingerSearch(self): + p = FAIL + print('search finger') + print('wait for finger print on the pannel') + while p != NO_FINGER: + p = self.getImage() + + while p != SUCCESS: + p = self.getImage() + + print('finger detected') + + p = self.image2Character(1) + if p != SUCCESS: + # 指纹图片转换为特征值失败 + print('image to text failed, exit') + return -1 + + # 在指纹库中搜索指纹 + p, id, confidence = self.search() + if p == SUCCESS: + # 搜索成功 + print('finger id:', id, ' confidence:', confidence) + return SUCCESS, id + else: + # 搜索失败 + print('no match finger found') + return FAIL, -1 + + diff --git a/haas_lib_bundles/python/docs/examples/FingerPrintLock/board.json b/haas_lib_bundles/python/docs/examples/FingerPrintLock/board.json new file mode 100644 index 0000000000000000000000000000000000000000..c6fd93520ab936127754795f59d512564164ca9c --- /dev/null +++ b/haas_lib_bundles/python/docs/examples/FingerPrintLock/board.json @@ -0,0 +1,63 @@ +{ + "name": "esp32", + "version": "1.0.0", + "io": { + "as608": { + "type": "UART", + "port": 2, + "dataWidth": 8, + "baudRate": 57600, + "stopBits": 2, + "flowControl": "disable", + "parity": "none" + }, + "oled_spi": { + "type": "SPI", + "port": 1, + "mode": "master", + "freq": 26000000 + }, + "oled_dc": { + "type": "GPIO", + "port": 28, + "dir": "output", + "pull": "pullup" + }, + "oled_res": { + "type": "GPIO", + "port": 30, + "dir": "output", + "pull": "pullup" + }, + "KEY_1": { + "type": "GPIO", + "port": 23, + "dir": "irq", + "pull": "pullup", + "intMode": "rising" + }, + "KEY_2": { + "type": "GPIO", + "port": 20, + "dir": "irq", + "pull": "pullup", + "intMode": "rising" + }, + "KEY_3": { + "type": "GPIO", + "port": 21, + "dir": "irq", + "pull": "pullup", + "intMode": "rising" + }, + "KEY_4": { + "type": "GPIO", + "port": 26, + "dir": "irq", + "pull": "pullup", + "intMode": "rising" + } + }, + "debugLevel": "ERROR", + "repl": "disable" +} \ No newline at end of file diff --git a/haas_lib_bundles/python/docs/examples/FingerPrintLock/main.py b/haas_lib_bundles/python/docs/examples/FingerPrintLock/main.py new file mode 100644 index 0000000000000000000000000000000000000000..4f2566492cfca20c864ee7c3e70b32430b889282 --- /dev/null +++ b/haas_lib_bundles/python/docs/examples/FingerPrintLock/main.py @@ -0,0 +1,387 @@ +import utime +from micropython import const +from driver import UART +import sh1106 # SH1106 OLED +from driver import SPI # SPI߿ +from driver import GPIO # GPIO +import framebuf # framebuf࣬ +import _thread # ߳̿ +import as608 # AS608ָʶģ + +fig = None +p= -1 +SaveResult = -1 + +from audio import Player, Snd + +resDir = "/data/pyamp/resource/" +PUT_ON_FINGER = "putonfinger.wav" # 뽫ָѹָʶ +PUT_OFF_FINGER = "putofffinger.wav" # ƿָ +FINGER_RECORD_SUCCESS = "fingerrecordsuccess.wav" # ָ¼Ƴɹ +FINGER_SEARCH_FAIL = "searchfail.wav" # ָʶʧ һ +FINGER_SEARCH_SUCCESS = "searchfingersuccess.wav" # ӭؼ +FINGER_NOT_MATCH = "fingernotmatch.wav" # ָƲָƿ +PUT_ON_FINGER_AGAIN = "putonagain.wav" # ٴνָָʶ +FINGER_RECORD_FAIL = "fingerrecordfail" # ָ¼ʧ ¼ +AUDIO_HEADER = 'fs:' + +player = None +oled = None + +K1 = None +K2 = None +K3 = None +K4 = None +keyEvents = {'K1':False, 'K2':False, 'K3':False, 'K4':False} + +SYS_INIT = const(1) +SYS_ENROLLING = const(2) +SYS_DETECTING = const(3) + +promptName = None + +# OLEDʼ +def oledInit(): + global oled + + # ֿļĿĿ¼ font, עõӢֿҪ + framebuf.set_font_path(framebuf.FONT_HZK12, '/data/font/HZK12') + framebuf.set_font_path(framebuf.FONT_HZK16, '/data/font/HZK16') + framebuf.set_font_path(framebuf.FONT_HZK24, '/data/font/HZK24') + framebuf.set_font_path(framebuf.FONT_HZK32, '/data/font/HZK32') + framebuf.set_font_path(framebuf.FONT_ASC12_8, '/data/font/ASC12_8') + framebuf.set_font_path(framebuf.FONT_ASC16_8, '/data/font/ASC16_8') + framebuf.set_font_path(framebuf.FONT_ASC24_12, '/data/font/ASC24_12') + framebuf.set_font_path(framebuf.FONT_ASC32_16, '/data/font/ASC32_16') + + oled_spi = SPI() + oled_spi.open("oled_spi") + + oled_res = GPIO() + oled_res.open("oled_res") + + oled_dc = GPIO() + oled_dc.open("oled_dc") + + #oled132*64 + oled = sh1106.SH1106_SPI(132, 64, oled_spi, oled_dc, oled_res) + +# K1~K4ijʼ +def keyInit(): + global K1, K2, K3, K4 + K1 = GPIO() + K1.open("KEY_1") + K1.on(k1Handler) + + K2 = GPIO() + K2.open("KEY_2") + K2.on(k2Handler) + + K3 = GPIO() + K3.open("KEY_3") + K3.on(k3Handler) + + K4 = GPIO() + K4.open("KEY_4") + K4.on(k4Handler) + +def k1Handler(obj): + print('K1 pressed') + keyEvents['K1'] = True + + +def k2Handler(obj): + print('K2 pressed') + keyEvents['K2'] = True + +def k3Handler(obj): + print('K3 pressed') + keyEvents['K3'] = True + +def k4Handler(obj): + print('K4 pressed') + keyEvents['K4'] = True + +# Ƿа¼pending״̬ +def keyEventsPending(): + if all(value == False for value in keyEvents.values()): + return False + return True + +# ¼ +def clearKeyEvents(): + keyEvents['K1'] = False + keyEvents['K2'] = False + keyEvents['K3'] = False + keyEvents['K4'] = False + pass + +# OLEDʾ +# text:ʾı +# x:ˮƽ y:ֱ +# color:ɫ +# clear: True-ʾ False-ʾ +# sz:С +def oledShowText(text, x, y, color, clear, sz): + global oled + if clear: + oled.fill(0) # + oled.text(text, x, y, color, size = sz) + oled.show() + +# Ļ +def oledClear(): + oled.fill(0) # + oled.show() + +# ʼ +def playerInit(): + global player + Snd.init() + player = Player() + player.open() + player.setVolume(8) + +# ʾ +def playVoicePrompt(prompt): + + global promptName + promptName = prompt + ''' + global player + + if player.getState(): + player.stop() + + # Ƶļ·ʽfs:/data/pyamp/resource/xxx.wav + player.play(AUDIO_HEADER + resDir + prompt) + ''' + +def playVoicePromptSync(prompt): + ''' + global promptName + promptName = prompt + ''' + + global player + + if player.getState(): + player.stop() + + # Ƶļ·ʽfs:/data/pyamp/resource/xxx.wav + player.play(AUDIO_HEADER + resDir + prompt) + player.waitComplete() + + +# ָ¼ +def fingerEnroll(id): + p = as608.FAIL + global SaveResult + + # ʶָƹбسʼҳϣ˳ѭ + if keyEvents['K4'] or keyEvents['K2']: + return + playVoicePrompt(PUT_ON_FINGER) + oledShowText('밴ѹذ', 32, 28, 1, True, 12) + print('wait for finger print on the pannel...') + + while p != as608.NO_FINGER: + p = fig.getImage() + + print('invalid, please put your finger on the pannel again...') + # ʼɼָ + while p != as608.SUCCESS: + p = fig.getImage() + # ʶָƹбسʼҳϣ˳ѭ + if keyEvents['K4'] or keyEvents['K2']: + return + + print('finger detected') + # ָͼƬתΪֵ + p = fig.image2Character(1) + if p != as608.SUCCESS: + SaveResult = 0 + print('image to text failed, exit...') + playVoicePrompt(FINGER_RECORD_FAIL) + return 0 + + # putofffinger + print('take off your finger please') + oledShowText('ƿָ', 32, 28, 1, True, 12) + playVoicePrompt(PUT_OFF_FINGER) + + #Take off your finger + p = 0 + + while p != as608.NO_FINGER: + p = fig.getImage() + + # put on again + #Get image again + print('put on your finger again, please...') + oledShowText('ٴΰѹذ', 17, 28, 1, True, 12) + playVoicePrompt(PUT_ON_FINGER_AGAIN) + + while p != as608.SUCCESS: + p = fig.getImage() + + # ָͼƬתΪֵ + p = fig.image2Character(2) + if p != as608.SUCCESS: + SaveResult = 0 + print('image to text failed, exit...') + playVoicePrompt(FINGER_RECORD_FAIL) + return 0 + + print('creating finger model...') + # ָģ + p = fig.createModel() + if p != as608.SUCCESS: + SaveResult = 0 + print('creating model failed') + return 0 + + print('store finger model...') + # 洢ָģ + p = fig.storeModel(id) + if p != as608.SUCCESS: + SaveResult = 0 + # fingerrecordfail + oledShowText('ָ¼ʧ', 25, 28, 1, True, 12) + playVoicePromptSync(FINGER_RECORD_FAIL) + return 0 + SaveResult = 1 + # fingerrecordsuccess + oledShowText('ָ¼ɹ', 25, 28, 1, True, 12) + playVoicePromptSync(FINGER_RECORD_SUCCESS) + + return 1 + +# ָʶ +def fingerSearch(): + p = as608.FAIL + print('search finger...') + print('wait for finger print on the pannel...') + while p != as608.NO_FINGER: + p = fig.getImage() + + while p != as608.SUCCESS: + p = fig.getImage() + # ʶָƹбسʼҳϣ˳ѭ + if keyEvents['K4'] or keyEvents['K2']: + return + + print('finger detected') + + p = fig.image2Character(1) + if p != as608.SUCCESS: + # ָͼƬתΪֵʧ + print('image to text failed, exit...') + playVoicePrompt(FINGER_SEARCH_FAIL) + + return -1 + + # ָƿָ + p, id, confidence = fig.search() + if p == as608.SUCCESS: + print('finger id:', id, ' confidence:', confidence) + # searchfingersuccess + oledShowText('ָʶɹ', 32, 28, 1, True, 12) + playVoicePrompt(FINGER_SEARCH_SUCCESS) + return id + else: + print('no match finger found') + # fingernotmatch + oledShowText('ָδע', 32, 28, 1, True, 12) + playVoicePrompt(FINGER_NOT_MATCH) + return -1 + +def promptThread(arg): + global player, promptName + + while True: + if promptName: + prompt = promptName + promptName = None + # ڲ״ֹ̬ͣŵǰʾ + if player.getState(): + player.stop() + + # Ƶļ·ʽfs:/data/pyamp/resource/xxx.wav + player.play(AUDIO_HEADER + resDir + prompt) + player.waitComplete() + else: + utime.sleep(0.1) + #print('promptThread') + pass + +# +if __name__ == '__main__': + # ϵͳ״̬ʼ + systemState = SYS_INIT + # OLEDĻʼ + oledInit() + + # ʼ + playerInit() + + # 豸ʼ + uartDev = UART() + uartDev.open('as608') + # AS608ָʶװóʼ + fig = as608.AS608(uartDev) + # ʼ + keyInit() + + try: + # ߳ + _thread.stack_size(10 * 1024) + _thread.start_new_thread(promptThread, ['promptThread']) + except: + print("Error: unable to start thread") + + + # ״̬ + clearKeyEvents() + while True: + + # ԰ʱд + if keyEvents['K1']: + if systemState == SYS_INIT: + systemState = SYS_ENROLLING + + if keyEvents['K3']: + if systemState == SYS_INIT: + systemState = SYS_DETECTING + + if keyEvents['K4'] or keyEvents['K2']: + # ذ + systemState = SYS_INIT + + # ж¼ + clearKeyEvents() + + # ϵͳ״̬л + if systemState == SYS_INIT: + oledShowText('< >', 2, 28, 1, True, 16) + oledShowText('ָע ָʶ', 10, 30, 1, False, 12) + # ȴû + while not keyEventsPending(): + utime.sleep(0.1) + pass + + elif systemState == SYS_ENROLLING: + oledShowText('ָע', 32, 28, 1, True, 12) + # ҿпid + id = fig.getEmptyPosition() + + # ָע + fingerEnroll(id) + systemState = SYS_INIT + elif systemState == SYS_DETECTING: + # ʼָʶ + oledShowText('ָʶ', 38, 28, 1, True, 12) + fingerSearch() + + uartDev.close() + del fig \ No newline at end of file