From afafdf805d6caa3c715cffc782d851a55666824c Mon Sep 17 00:00:00 2001 From: Patrick Bogen Date: Thu, 30 Jun 2016 13:31:53 -0700 Subject: [PATCH 1/4] Fix perms; remove whitespace at end of lines --- Adafruit_Fingerprint.cpp | 60 ++++++++++++++++++++-------------------- Adafruit_Fingerprint.h | 14 +++++----- 2 files changed, 37 insertions(+), 37 deletions(-) mode change 100755 => 100644 Adafruit_Fingerprint.cpp mode change 100755 => 100644 Adafruit_Fingerprint.h diff --git a/Adafruit_Fingerprint.cpp b/Adafruit_Fingerprint.cpp old mode 100755 new mode 100644 index 3a974d5..7475208 --- a/Adafruit_Fingerprint.cpp +++ b/Adafruit_Fingerprint.cpp @@ -1,16 +1,16 @@ -/*************************************************** +/*************************************************** This is a library for our optical Fingerprint sensor - Designed specifically to work with the Adafruit Fingerprint sensor + Designed specifically to work with the Adafruit Fingerprint sensor ----> http://www.adafruit.com/products/751 - These displays use TTL Serial to communicate, 2 pins are required to + These displays use TTL Serial to communicate, 2 pins are required to interface - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Written by Limor Fried/Ladyada for Adafruit Industries. + Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/ @@ -52,12 +52,12 @@ void Adafruit_Fingerprint::begin(uint16_t baudrate) { } boolean Adafruit_Fingerprint::verifyPassword(void) { - uint8_t packet[] = {FINGERPRINT_VERIFYPASSWORD, + uint8_t packet[] = {FINGERPRINT_VERIFYPASSWORD, (thePassword >> 24), (thePassword >> 16), (thePassword >> 8), thePassword}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, 7, packet); uint8_t len = getReply(packet); - + if ((len == 1) && (packet[0] == FINGERPRINT_ACKPACKET) && (packet[1] == FINGERPRINT_OK)) return true; @@ -75,7 +75,7 @@ uint8_t Adafruit_Fingerprint::getImage(void) { uint8_t packet[] = {FINGERPRINT_GETIMAGE}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, 3, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -85,7 +85,7 @@ uint8_t Adafruit_Fingerprint::image2Tz(uint8_t slot) { uint8_t packet[] = {FINGERPRINT_IMAGE2TZ, slot}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -96,7 +96,7 @@ uint8_t Adafruit_Fingerprint::createModel(void) { uint8_t packet[] = {FINGERPRINT_REGMODEL}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -107,18 +107,18 @@ uint8_t Adafruit_Fingerprint::storeModel(uint16_t id) { uint8_t packet[] = {FINGERPRINT_STORE, 0x01, id >> 8, id & 0xFF}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; } - + //read a fingerprint template from flash into Char Buffer 1 uint8_t Adafruit_Fingerprint::loadModel(uint16_t id) { uint8_t packet[] = {FINGERPRINT_LOAD, 0x01, id >> 8, id & 0xFF}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -129,17 +129,17 @@ uint8_t Adafruit_Fingerprint::getModel(void) { uint8_t packet[] = {FINGERPRINT_UPLOAD, 0x01}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; } - + uint8_t Adafruit_Fingerprint::deleteModel(uint16_t id) { uint8_t packet[] = {FINGERPRINT_DELETE, id >> 8, id & 0xFF, 0x00, 0x01}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -149,7 +149,7 @@ uint8_t Adafruit_Fingerprint::emptyDatabase(void) { uint8_t packet[] = {FINGERPRINT_EMPTY}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; return packet[1]; @@ -158,22 +158,22 @@ uint8_t Adafruit_Fingerprint::emptyDatabase(void) { uint8_t Adafruit_Fingerprint::fingerFastSearch(void) { fingerID = 0xFFFF; confidence = 0xFFFF; - // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 + // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 uint8_t packet[] = {FINGERPRINT_HISPEEDSEARCH, 0x01, 0x00, 0x00, 0x00, 0xA3}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; fingerID = packet[2]; fingerID <<= 8; fingerID |= packet[3]; - + confidence = packet[4]; confidence <<= 8; confidence |= packet[5]; - + return packet[1]; } @@ -183,20 +183,20 @@ uint8_t Adafruit_Fingerprint::getTemplateCount(void) { uint8_t packet[] = {FINGERPRINT_TEMPLATECOUNT}; writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); uint8_t len = getReply(packet); - + if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) return -1; templateCount = packet[2]; templateCount <<= 8; templateCount |= packet[3]; - + return packet[1]; } -void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, +void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, uint16_t len, uint8_t *packet) { #ifdef FINGERPRINT_DEBUG Serial.print("---> 0x"); @@ -218,7 +218,7 @@ void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, Serial.print(" 0x"); Serial.print((uint8_t)(len), HEX); #endif - + #if ARDUINO >= 100 mySerial->write((uint8_t)(FINGERPRINT_STARTCODE >> 8)); mySerial->write((uint8_t)FINGERPRINT_STARTCODE); @@ -240,7 +240,7 @@ void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, mySerial->print((uint8_t)(len >> 8), BYTE); mySerial->print((uint8_t)(len), BYTE); #endif - + uint16_t sum = (len>>8) + (len&0xFF) + packettype; for (uint8_t i=0; i< len-2; i++) { #if ARDUINO >= 100 @@ -271,7 +271,7 @@ void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, uint8_t Adafruit_Fingerprint::getReply(uint8_t packet[], uint16_t timeout) { uint8_t reply[20], idx; uint16_t timer=0; - + idx = 0; #ifdef FINGERPRINT_DEBUG Serial.print("<--- "); @@ -290,7 +290,7 @@ while (true) { if ((idx == 0) && (reply[0] != (FINGERPRINT_STARTCODE >> 8))) continue; idx++; - + // check packet! if (idx >= 9) { if ((reply[0] != (FINGERPRINT_STARTCODE >> 8)) || @@ -304,7 +304,7 @@ while (true) { len -= 2; //Serial.print("Packet len"); Serial.println(len); if (idx <= (len+10)) continue; - packet[0] = packettype; + packet[0] = packettype; for (uint8_t i=0; i http://www.adafruit.com/products/751 - These displays use TTL Serial to communicate, 2 pins are required to + These displays use TTL Serial to communicate, 2 pins are required to interface - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Written by Limor Fried/Ladyada for Adafruit Industries. + Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/ @@ -64,7 +64,7 @@ #define FINGERPRINT_HISPEEDSEARCH 0x1B #define FINGERPRINT_TEMPLATECOUNT 0x1D -//#define FINGERPRINT_DEBUG +//#define FINGERPRINT_DEBUG #define DEFAULTTIMEOUT 5000 // milliseconds @@ -95,7 +95,7 @@ class Adafruit_Fingerprint { uint16_t fingerID, confidence, templateCount; - private: + private: uint32_t thePassword; uint32_t theAddress; From 8aed9eb94b3c35d3a5d57e4a18743adaeddc3436 Mon Sep 17 00:00:00 2001 From: Patrick Bogen Date: Thu, 30 Jun 2016 13:32:21 -0700 Subject: [PATCH 2/4] Add .h guards --- Adafruit_Fingerprint.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Adafruit_Fingerprint.h b/Adafruit_Fingerprint.h index 7ba3f29..466f8d9 100644 --- a/Adafruit_Fingerprint.h +++ b/Adafruit_Fingerprint.h @@ -1,3 +1,6 @@ +#ifndef ADAFRUIT_FINGERPRINT_H +#define ADAFRUIT_FINGERPRINT_H + /*************************************************** This is a library for our optical Fingerprint sensor @@ -105,3 +108,5 @@ class Adafruit_Fingerprint { #endif HardwareSerial *hwSerial; }; + +#endif From c06846b8e14bb87ee212e393c009d9530d620573 Mon Sep 17 00:00:00 2001 From: Patrick Bogen Date: Thu, 30 Jun 2016 14:14:31 -0700 Subject: [PATCH 3/4] Add packet structs to avoid buffer overflows and underruns --- Adafruit_Fingerprint.cpp | 89 +++++++++++++++++++++++++++++++++++++--- Adafruit_Fingerprint.h | 16 ++++++++ 2 files changed, 100 insertions(+), 5 deletions(-) diff --git a/Adafruit_Fingerprint.cpp b/Adafruit_Fingerprint.cpp index 7475208..0391b87 100644 --- a/Adafruit_Fingerprint.cpp +++ b/Adafruit_Fingerprint.cpp @@ -72,13 +72,18 @@ boolean Adafruit_Fingerprint::verifyPassword(void) { } uint8_t Adafruit_Fingerprint::getImage(void) { - uint8_t packet[] = {FINGERPRINT_GETIMAGE}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, 3, packet); - uint8_t len = getReply(packet); + uint8_t data[] = {FINGERPRINT_GETIMAGE}; + Adafruit_Fingerprint_Packet packet(FINGERPRINT_COMMANDPACKET, sizeof(FINGERPRINT_GETIMAGE), data); + uint8_t result = writeStructuredPacket(packet); + if(result != FINGERPRINT_OK) { + return result; + } - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) + uint8_t len = getStructuredPacket(&packet); + + if ((len != 1) && (packet.type != FINGERPRINT_ACKPACKET)) return -1; - return packet[1]; + return packet.data[0]; } uint8_t Adafruit_Fingerprint::image2Tz(uint8_t slot) { @@ -195,6 +200,47 @@ uint8_t Adafruit_Fingerprint::getTemplateCount(void) { } +uint8_t Adafruit_Fingerprint::writeStructuredPacket(const Adafruit_Fingerprint_Packet & packet) { + #if ARDUINO >= 100 + mySerial->write((uint8_t)(packet.start_code >> 8)); + mySerial->write((uint8_t)(packet.start_code & 0xFF)); + mySerial->write((uint8_t)(packet.address[0])); + mySerial->write((uint8_t)(packet.address[1])); + mySerial->write((uint8_t)(packet.address[2])); + mySerial->write((uint8_t)(packet.address[3])); + mySerial->write((uint8_t)(packet.type)); + mySerial->write((uint8_t)((packet.length+2) >> 8)); + mySerial->write((uint8_t)((packet.length+2) & 0xFF)); + #else + mySerial->write((uint8_t)(packet.start_code >> 8), BYTE); + mySerial->write((uint8_t)(packet.start_code & 0xFF), BYTE); + mySerial->write((uint8_t)(packet.address[0]), BYTE); + mySerial->write((uint8_t)(packet.address[1]), BYTE); + mySerial->write((uint8_t)(packet.address[2]), BYTE); + mySerial->write((uint8_t)(packet.address[3]), BYTE); + mySerial->write((uint8_t)(packet.type), BYTE); + mySerial->write((uint8_t)((packet.length+2) >> 8), BYTE); + mySerial->write((uint8_t)((packet.length+2) & 0xFF), BYTE); + #endif + + uint16_t sum = ((packet.length+2)>>8) + ((packet.length+2)&0xFF) + packet.type; + for (uint8_t i=0; i< packet.length; i++) { + #if ARDUINO >= 100 + mySerial->write((uint8_t)(packet.data[i])); + #else + mySerial->print((uint8_t)(packet.data[i]), BYTE); + #endif + sum += packet.data[i]; + } + #if ARDUINO >= 100 + mySerial->write((uint8_t)(sum>>8)); + mySerial->write((uint8_t)sum); + #else + mySerial->print((uint8_t)(sum>>8), BYTE); + mySerial->print((uint8_t)sum, BYTE); + #endif + return FINGERPRINT_OK; +} void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, uint16_t len, uint8_t *packet) { @@ -267,6 +313,39 @@ void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, #endif } +uint8_t Adafruit_Fingerprint::getStructuredPacket(Adafruit_Fingerprint_Packet * packet, uint16_t timeout) { + uint8_t byte; + uint16_t idx=0, timer=0; + + while(true) { + while(!mySerial->available()) { + delay(1); timer++; if(timer>=timeout) return FINGERPRINT_TIMEOUT; + } + byte = mySerial->read(); + switch(idx) { + case 0: packet->start_code = byte << 8; break; + case 1: + packet->start_code |= byte & 0xFF; + if(packet->start_code != FINGERPRINT_STARTCODE) return FINGERPRINT_BADPACKET; + break; + case 2: + case 3: + case 4: + case 5: + packet->address[idx-2] = byte; + break; + case 6: packet->type = byte; break; + case 7: packet->length = byte << 8; break; + case 8: packet->length |= byte & 0xFF; break; + default: + packet->data[idx-9] = byte; + if((idx-9) == packet->length-2) + return FINGERPRINT_OK; + break; + } + idx++; + } +} uint8_t Adafruit_Fingerprint::getReply(uint8_t packet[], uint16_t timeout) { uint8_t reply[20], idx; diff --git a/Adafruit_Fingerprint.h b/Adafruit_Fingerprint.h index 466f8d9..4fc6385 100644 --- a/Adafruit_Fingerprint.h +++ b/Adafruit_Fingerprint.h @@ -71,6 +71,20 @@ #define DEFAULTTIMEOUT 5000 // milliseconds +struct Adafruit_Fingerprint_Packet { + Adafruit_Fingerprint_Packet(uint8_t type, uint16_t length, uint8_t * data) : start_code(FINGERPRINT_STARTCODE), type(type), length(length) { + memset(address, 0xFF, 4); + if(length<64) + memcpy(this->data, data, length); + else + memcpy(this->data, data, 64); + } + uint16_t start_code; + uint8_t address[4]; + uint8_t type; + uint16_t length; + uint8_t data[64]; +}; class Adafruit_Fingerprint { public: @@ -93,6 +107,8 @@ class Adafruit_Fingerprint { uint8_t deleteModel(uint16_t id); uint8_t fingerFastSearch(void); uint8_t getTemplateCount(void); + uint8_t writeStructuredPacket(const Adafruit_Fingerprint_Packet & p); + uint8_t getStructuredPacket(Adafruit_Fingerprint_Packet * p, uint16_t timeout=DEFAULTTIMEOUT); void writePacket(uint32_t addr, uint8_t packettype, uint16_t len, uint8_t *packet); uint8_t getReply(uint8_t packet[], uint16_t timeout=DEFAULTTIMEOUT); From 83c418b6d9702a950d06a06b2dea638fc4189d42 Mon Sep 17 00:00:00 2001 From: Patrick Bogen Date: Thu, 30 Jun 2016 18:47:24 -0700 Subject: [PATCH 4/4] All commands rewritten to use struct-based packets and preprocessor macros for readability --- Adafruit_Fingerprint.cpp | 319 +++++++-------------------------------- Adafruit_Fingerprint.h | 12 +- 2 files changed, 65 insertions(+), 266 deletions(-) diff --git a/Adafruit_Fingerprint.cpp b/Adafruit_Fingerprint.cpp index 0391b87..aa926c9 100644 --- a/Adafruit_Fingerprint.cpp +++ b/Adafruit_Fingerprint.cpp @@ -51,266 +51,109 @@ void Adafruit_Fingerprint::begin(uint16_t baudrate) { #endif } +#define GET_CMD_PACKET(...) \ + uint8_t data[] = {__VA_ARGS__}; \ + Adafruit_Fingerprint_Packet packet(FINGERPRINT_COMMANDPACKET, sizeof(data), data); \ + writeStructuredPacket(packet); \ + if( getStructuredPacket(&packet) != FINGERPRINT_OK || packet.type != FINGERPRINT_ACKPACKET ) { return FINGERPRINT_PACKETRECIEVEERR; } + +#define SEND_CMD_PACKET(...) GET_CMD_PACKET(__VA_ARGS__); return packet.data[0]; + boolean Adafruit_Fingerprint::verifyPassword(void) { - uint8_t packet[] = {FINGERPRINT_VERIFYPASSWORD, - (thePassword >> 24), (thePassword >> 16), - (thePassword >> 8), thePassword}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, 7, packet); - uint8_t len = getReply(packet); - - 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> 24), (uint8_t)(thePassword >> 16), + (uint8_t)(thePassword >> 8), (uint8_t)(thePassword & 0xFF)); + return packet.data[0] == FINGERPRINT_OK; } uint8_t Adafruit_Fingerprint::getImage(void) { - uint8_t data[] = {FINGERPRINT_GETIMAGE}; - Adafruit_Fingerprint_Packet packet(FINGERPRINT_COMMANDPACKET, sizeof(FINGERPRINT_GETIMAGE), data); - uint8_t result = writeStructuredPacket(packet); - if(result != FINGERPRINT_OK) { - return result; - } - - uint8_t len = getStructuredPacket(&packet); - - if ((len != 1) && (packet.type != FINGERPRINT_ACKPACKET)) - return -1; - return packet.data[0]; + SEND_CMD_PACKET(FINGERPRINT_GETIMAGE); } uint8_t Adafruit_Fingerprint::image2Tz(uint8_t slot) { - uint8_t packet[] = {FINGERPRINT_IMAGE2TZ, slot}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_IMAGE2TZ,slot); } - uint8_t Adafruit_Fingerprint::createModel(void) { - uint8_t packet[] = {FINGERPRINT_REGMODEL}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_REGMODEL); } - uint8_t Adafruit_Fingerprint::storeModel(uint16_t id) { - uint8_t packet[] = {FINGERPRINT_STORE, 0x01, id >> 8, id & 0xFF}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_STORE, 0x01, (uint8_t)(id >> 8), (uint8_t)(id & 0xFF)); } //read a fingerprint template from flash into Char Buffer 1 uint8_t Adafruit_Fingerprint::loadModel(uint16_t id) { - uint8_t packet[] = {FINGERPRINT_LOAD, 0x01, id >> 8, id & 0xFF}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_LOAD, 0x01, (uint8_t)(id >> 8), (uint8_t)(id & 0xFF)); } //transfer a fingerprint template from Char Buffer 1 to host computer uint8_t Adafruit_Fingerprint::getModel(void) { - uint8_t packet[] = {FINGERPRINT_UPLOAD, 0x01}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_UPLOAD, 0x01); } uint8_t Adafruit_Fingerprint::deleteModel(uint16_t id) { - uint8_t packet[] = {FINGERPRINT_DELETE, id >> 8, id & 0xFF, 0x00, 0x01}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_DELETE, (uint8_t)(id>>8), (uint8_t)(id & 0xFF), 0x00, 0x01); } uint8_t Adafruit_Fingerprint::emptyDatabase(void) { - uint8_t packet[] = {FINGERPRINT_EMPTY}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - return packet[1]; + SEND_CMD_PACKET(FINGERPRINT_EMPTY); } uint8_t Adafruit_Fingerprint::fingerFastSearch(void) { + // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 + GET_CMD_PACKET(FINGERPRINT_HISPEEDSEARCH, 0x01, 0x00, 0x00, 0x00, 0xA3); fingerID = 0xFFFF; confidence = 0xFFFF; - // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 - uint8_t packet[] = {FINGERPRINT_HISPEEDSEARCH, 0x01, 0x00, 0x00, 0x00, 0xA3}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; - fingerID = packet[2]; + fingerID = packet.data[1]; fingerID <<= 8; - fingerID |= packet[3]; + fingerID |= packet.data[2]; - confidence = packet[4]; + confidence = packet.data[3]; confidence <<= 8; - confidence |= packet[5]; + confidence |= packet.data[4]; - return packet[1]; + return packet.data[0]; } uint8_t Adafruit_Fingerprint::getTemplateCount(void) { - templateCount = 0xFFFF; - // get number of templates in memory - uint8_t packet[] = {FINGERPRINT_TEMPLATECOUNT}; - writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet); - uint8_t len = getReply(packet); - - if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET)) - return -1; + GET_CMD_PACKET(FINGERPRINT_TEMPLATECOUNT); - templateCount = packet[2]; + templateCount = packet.data[1]; templateCount <<= 8; - templateCount |= packet[3]; - - return packet[1]; -} - + templateCount |= packet.data[2]; -uint8_t Adafruit_Fingerprint::writeStructuredPacket(const Adafruit_Fingerprint_Packet & packet) { - #if ARDUINO >= 100 - mySerial->write((uint8_t)(packet.start_code >> 8)); - mySerial->write((uint8_t)(packet.start_code & 0xFF)); - mySerial->write((uint8_t)(packet.address[0])); - mySerial->write((uint8_t)(packet.address[1])); - mySerial->write((uint8_t)(packet.address[2])); - mySerial->write((uint8_t)(packet.address[3])); - mySerial->write((uint8_t)(packet.type)); - mySerial->write((uint8_t)((packet.length+2) >> 8)); - mySerial->write((uint8_t)((packet.length+2) & 0xFF)); - #else - mySerial->write((uint8_t)(packet.start_code >> 8), BYTE); - mySerial->write((uint8_t)(packet.start_code & 0xFF), BYTE); - mySerial->write((uint8_t)(packet.address[0]), BYTE); - mySerial->write((uint8_t)(packet.address[1]), BYTE); - mySerial->write((uint8_t)(packet.address[2]), BYTE); - mySerial->write((uint8_t)(packet.address[3]), BYTE); - mySerial->write((uint8_t)(packet.type), BYTE); - mySerial->write((uint8_t)((packet.length+2) >> 8), BYTE); - mySerial->write((uint8_t)((packet.length+2) & 0xFF), BYTE); - #endif - - uint16_t sum = ((packet.length+2)>>8) + ((packet.length+2)&0xFF) + packet.type; - for (uint8_t i=0; i< packet.length; i++) { - #if ARDUINO >= 100 - mySerial->write((uint8_t)(packet.data[i])); - #else - mySerial->print((uint8_t)(packet.data[i]), BYTE); - #endif - sum += packet.data[i]; - } - #if ARDUINO >= 100 - mySerial->write((uint8_t)(sum>>8)); - mySerial->write((uint8_t)sum); - #else - mySerial->print((uint8_t)(sum>>8), BYTE); - mySerial->print((uint8_t)sum, BYTE); - #endif - return FINGERPRINT_OK; + return packet.data[0]; } -void Adafruit_Fingerprint::writePacket(uint32_t addr, uint8_t packettype, - uint16_t len, uint8_t *packet) { -#ifdef FINGERPRINT_DEBUG - Serial.print("---> 0x"); - Serial.print((uint8_t)(FINGERPRINT_STARTCODE >> 8), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)FINGERPRINT_STARTCODE, HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(addr >> 24), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(addr >> 16), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(addr >> 8), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(addr), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)packettype, HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(len >> 8), HEX); - Serial.print(" 0x"); - Serial.print((uint8_t)(len), HEX); -#endif - #if ARDUINO >= 100 - mySerial->write((uint8_t)(FINGERPRINT_STARTCODE >> 8)); - mySerial->write((uint8_t)FINGERPRINT_STARTCODE); - mySerial->write((uint8_t)(addr >> 24)); - mySerial->write((uint8_t)(addr >> 16)); - mySerial->write((uint8_t)(addr >> 8)); - mySerial->write((uint8_t)(addr)); - mySerial->write((uint8_t)packettype); - mySerial->write((uint8_t)(len >> 8)); - mySerial->write((uint8_t)(len)); + #define SERIAL_WRITE(...) mySerial->write(__VA_ARGS__) #else - mySerial->print((uint8_t)(FINGERPRINT_STARTCODE >> 8), BYTE); - mySerial->print((uint8_t)FINGERPRINT_STARTCODE, BYTE); - mySerial->print((uint8_t)(addr >> 24), BYTE); - mySerial->print((uint8_t)(addr >> 16), BYTE); - mySerial->print((uint8_t)(addr >> 8), BYTE); - mySerial->print((uint8_t)(addr), BYTE); - mySerial->print((uint8_t)packettype, BYTE); - mySerial->print((uint8_t)(len >> 8), BYTE); - mySerial->print((uint8_t)(len), BYTE); + #define SERIAL_WRITE(...) mySerial->write(__VA_ARGS__, BYTE) #endif - uint16_t sum = (len>>8) + (len&0xFF) + packettype; - for (uint8_t i=0; i< len-2; i++) { -#if ARDUINO >= 100 - mySerial->write((uint8_t)(packet[i])); -#else - mySerial->print((uint8_t)(packet[i]), BYTE); -#endif -#ifdef FINGERPRINT_DEBUG - Serial.print(" 0x"); Serial.print(packet[i], HEX); -#endif - sum += packet[i]; +#define SERIAL_WRITE_U16(v) SERIAL_WRITE((uint8_t)(v>>8)); SERIAL_WRITE((uint8_t)(v & 0xFF)); + +void Adafruit_Fingerprint::writeStructuredPacket(const Adafruit_Fingerprint_Packet & packet) { + SERIAL_WRITE_U16(packet.start_code); + SERIAL_WRITE(packet.address[0]); + SERIAL_WRITE(packet.address[1]); + SERIAL_WRITE(packet.address[2]); + SERIAL_WRITE(packet.address[3]); + SERIAL_WRITE(packet.type); + + uint16_t wire_length = packet.length + 2; + SERIAL_WRITE_U16(wire_length); + + uint16_t sum = ((wire_length)>>8) + ((wire_length)&0xFF) + packet.type; + for (uint8_t i=0; i< packet.length; i++) { + SERIAL_WRITE(packet.data[i]); + sum += packet.data[i]; } -#ifdef FINGERPRINT_DEBUG - //Serial.print("Checksum = 0x"); Serial.println(sum); - Serial.print(" 0x"); Serial.print((uint8_t)(sum>>8), HEX); - Serial.print(" 0x"); Serial.println((uint8_t)(sum), HEX); -#endif -#if ARDUINO >= 100 - mySerial->write((uint8_t)(sum>>8)); - mySerial->write((uint8_t)sum); -#else - mySerial->print((uint8_t)(sum>>8), BYTE); - mySerial->print((uint8_t)sum, BYTE); -#endif + + SERIAL_WRITE_U16(sum); + return; } uint8_t Adafruit_Fingerprint::getStructuredPacket(Adafruit_Fingerprint_Packet * packet, uint16_t timeout) { @@ -323,7 +166,10 @@ uint8_t Adafruit_Fingerprint::getStructuredPacket(Adafruit_Fingerprint_Packet * } byte = mySerial->read(); switch(idx) { - case 0: packet->start_code = byte << 8; break; + case 0: + if(byte != FINGERPRINT_STARTCODE>>8) continue; + packet->start_code = byte << 8; + break; case 1: packet->start_code |= byte & 0xFF; if(packet->start_code != FINGERPRINT_STARTCODE) return FINGERPRINT_BADPACKET; @@ -339,59 +185,10 @@ uint8_t Adafruit_Fingerprint::getStructuredPacket(Adafruit_Fingerprint_Packet * case 8: packet->length |= byte & 0xFF; break; default: packet->data[idx-9] = byte; - if((idx-9) == packet->length-2) + if((idx-8) == packet->length) return FINGERPRINT_OK; break; } idx++; } } - -uint8_t Adafruit_Fingerprint::getReply(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 (!mySerial->available()) { - delay(1); - timer++; - if (timer >= timeout) return FINGERPRINT_TIMEOUT; - } - // something to read! - reply[idx] = mySerial->read(); -#ifdef FINGERPRINT_DEBUG - Serial.print(" 0x"); Serial.print(reply[idx], HEX); -#endif - 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]; - //Serial.print("Packet type"); Serial.println(packettype); - uint16_t len = reply[7]; - len <<= 8; - len |= reply[8]; - len -= 2; - //Serial.print("Packet len"); Serial.println(len); - if (idx <= (len+10)) continue; - packet[0] = packettype; - for (uint8_t i=0; istart_code = FINGERPRINT_STARTCODE; + this->type = type; + this->length = length; + address[0] = 0xFF; address[1] = 0xFF; + address[2] = 0xFF; address[3] = 0xFF; if(length<64) memcpy(this->data, data, length); else @@ -107,10 +111,8 @@ class Adafruit_Fingerprint { uint8_t deleteModel(uint16_t id); uint8_t fingerFastSearch(void); uint8_t getTemplateCount(void); - uint8_t writeStructuredPacket(const Adafruit_Fingerprint_Packet & p); + void writeStructuredPacket(const Adafruit_Fingerprint_Packet & p); uint8_t getStructuredPacket(Adafruit_Fingerprint_Packet * p, uint16_t timeout=DEFAULTTIMEOUT); - void writePacket(uint32_t addr, uint8_t packettype, uint16_t len, uint8_t *packet); - uint8_t getReply(uint8_t packet[], uint16_t timeout=DEFAULTTIMEOUT); uint16_t fingerID, confidence, templateCount;