grove_fingerprint
Diff: grove_fingerprint.cpp
- Revision:
- 0:20273e15a6ee
diff -r 000000000000 -r 20273e15a6ee grove_fingerprint.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/grove_fingerprint.cpp Tue Jun 09 10:18:30 2015 +0000 @@ -0,0 +1,258 @@ + + +#include "suli2.h" +#include "grove_fingerprint.h" + +//local functions +static void grove_fingerprint_writePacket(UART_T *uart, uint32_t addr, uint8_t packettype, + uint16_t len, uint8_t *packet); +static uint8_t grove_fingerprint_getReply(UART_T *uart, uint8_t packet[], uint16_t timeout); + +//local variables +static uint32_t thePassword; +static uint32_t theAddress; +static uint16_t fingerID, confidence, templateCount; +static unsigned char cmd[CMD_LENGTH]; + + + +void grove_fingerprint_init(UART_T *uart, int pintx, int pinrx) +{ + suli_uart_init(uart, pintx, pinrx, 57600); +} + +bool grove_fingerprint_write_setup(UART_T *uart) +{ + thePassword = 0; + theAddress = 0xFFFFFFFF; + + return true; +} + +bool grove_fingerprint_verifyPassword(UART_T *uart) { + uint8_t packet[20] = {FINGERPRINT_VERIFYPASSWORD, + (thePassword >> 24), (thePassword >> 16), + (thePassword >> 8), thePassword}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 5+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len == 1) && (packet[0] == FINGERPRINT_ACKPACKET) && (packet[1] == FINGERPRINT_OK)) + return true; + +/* + Serial.print("\nGot packet type "); Serial.print(packet[0]); + for (uint8_t i=1; i<len+1;i++) { + Serial.print(" 0x"); + Serial.print(packet[i], HEX); + } + */ + return false; +} + +bool grove_fingerprint_getImage(UART_T *uart, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_GETIMAGE}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + +bool grove_fingerprint_image2Tz(UART_T *uart, uint8_t slot, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_IMAGE2TZ, slot}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 2+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + +bool grove_fingerprint_createModel(UART_T *uart, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_REGMODEL}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + + +bool grove_fingerprint_storeModel(UART_T *uart, uint16_t id, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_STORE, 0x01, id >> 8, id & 0xFF}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 4+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + +bool grove_fingerprint_deleteModel(UART_T *uart, uint16_t id, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_DELETE, id >> 8, id & 0xFF, 0x00, 0x01}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 5+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + +bool grove_fingerprint_emptyDatabase(UART_T *uart, uint8_t *res) { + uint8_t packet[20] = {FINGERPRINT_EMPTY}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + else + { + *res = packet[1]; + return true; + } +} + +bool grove_fingerprint_fingerFastSearch(UART_T *uart, uint8_t *res) { + fingerID = 0xFFFF; + confidence = 0xFFFF; + // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 + uint8_t packet[20] = {FINGERPRINT_HISPEEDSEARCH, 0x01, 0x00, 0x00, 0x00, 0xA3}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 6+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + + fingerID = packet[2]; + fingerID <<= 8; + fingerID |= packet[3]; + + confidence = packet[4]; + confidence <<= 8; + confidence |= packet[5]; + + *res = packet[1]; + return true; +} + +bool grove_fingerprint_getTemplateCount(UART_T *uart, uint8_t *res) { + templateCount = 0xFFFF; + // get number of templates in memory + uint8_t packet[20] = {FINGERPRINT_TEMPLATECOUNT}; + grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet); + uint8_t len = grove_fingerprint_getReply(uart, packet, 500); + + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + return false; + + templateCount = packet[2]; + templateCount <<= 8; + templateCount |= packet[3]; + + *res = packet[1]; + return true; +} + +static void grove_fingerprint_writePacket(UART_T *uart, uint32_t addr, uint8_t packettype, + uint16_t len, uint8_t *packet) { + uint8_t i = 0; + + + cmd[0] = (uint8_t)(FINGERPRINT_STARTCODE >> 8); + cmd[1] = (uint8_t)FINGERPRINT_STARTCODE; + cmd[2] = (uint8_t)(addr >> 24); + cmd[3] = (uint8_t)(addr >> 16); + cmd[4] = (uint8_t)(addr >> 8); + cmd[5] = (uint8_t)(addr); + cmd[6] = (uint8_t)packettype; + cmd[7] = (uint8_t)(len >> 8); + cmd[8] = (uint8_t)(len); + + uint16_t sum = (len>>8) + (len&0xFF) + packettype; + for (i=0; i< len-2; i++) { + cmd[9+i] = packet[i]; + sum += packet[i]; + } + + cmd[9+i] = (uint8_t)(sum>>8); + cmd[9+i+1] = (uint8_t)sum; + + suli_uart_write_bytes(uart, (uint8_t*)cmd, 9+i+1+1); +} + + +static uint8_t grove_fingerprint_getReply(UART_T *uart, uint8_t packet[], uint16_t timeout) { + uint8_t reply[20], idx; + uint16_t timer=0; + + idx = 0; +#ifdef FINGERPRINT_DEBUG + Serial.print("<--- "); +#endif +while (true) { + while (!suli_uart_readable(uart)) + { + suli_delay_ms(1); + timer++; + if (timer >= timeout) return FINGERPRINT_TIMEOUT; + } + + reply[idx] = suli_uart_read(uart); + + if ((idx == 0) && (reply[0] != (FINGERPRINT_STARTCODE >> 8))) + continue; + idx++; + + // check packet! + if (idx >= 9) { + if ((reply[0] != (FINGERPRINT_STARTCODE >> 8)) || + (reply[1] != (FINGERPRINT_STARTCODE & 0xFF))) + return FINGERPRINT_BADPACKET; + uint8_t packettype = reply[6]; + + uint16_t len = reply[7]; + len <<= 8; + len |= reply[8]; + len -= 2; + + if (idx <= (len+10)) continue; + packet[0] = packettype; + for (uint8_t i=0; i<len; i++) { + packet[1+i] = reply[9+i]; + } + + return len; + } + } +} + + + + + + + + +