asdasdasd

Dependencies:   mbed

Fork of FINAL_PROJECT_4180 by Gedeon Nyengele

Committer:
xemnas214
Date:
Wed Nov 23 01:07:10 2016 +0000
Revision:
14:ca57ad53761b
Parent:
2:1b1c0502bb08
iotlockkkk;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyengele 2:1b1c0502bb08 1 /*
nyengele 2:1b1c0502bb08 2 FPScanner.h v1.0 - Library for controlling the GT-511C3 Finger Print Scanner (FPS)
nyengele 2:1b1c0502bb08 3 Created by Josh Hawley, July 23rd 2013
nyengele 2:1b1c0502bb08 4 Licensed for non-commercial use, must include this license message
nyengele 2:1b1c0502bb08 5 basically, Feel free to hack away at it, but just give me credit for my work =)
nyengele 2:1b1c0502bb08 6 TLDR; Wil Wheaton's Law
nyengele 2:1b1c0502bb08 7 */
nyengele 2:1b1c0502bb08 8
nyengele 2:1b1c0502bb08 9 #ifndef FPScanner_H
nyengele 2:1b1c0502bb08 10 #define FPScanner_H
nyengele 2:1b1c0502bb08 11
nyengele 2:1b1c0502bb08 12 #include "mbed.h"
nyengele 2:1b1c0502bb08 13
nyengele 2:1b1c0502bb08 14 typedef uint8_t byte;
nyengele 2:1b1c0502bb08 15 typedef uint16_t word;
nyengele 2:1b1c0502bb08 16
nyengele 2:1b1c0502bb08 17
nyengele 2:1b1c0502bb08 18 class Command_Packet
nyengele 2:1b1c0502bb08 19 {
nyengele 2:1b1c0502bb08 20 public:
nyengele 2:1b1c0502bb08 21 class Commands
nyengele 2:1b1c0502bb08 22 {
nyengele 2:1b1c0502bb08 23 public:
nyengele 2:1b1c0502bb08 24 enum Commands_Enum
nyengele 2:1b1c0502bb08 25 {
nyengele 2:1b1c0502bb08 26 NotSet = 0x00, // Default value for enum. Scanner will return error if sent this.
nyengele 2:1b1c0502bb08 27 Open = 0x01, // Open Initialization
nyengele 2:1b1c0502bb08 28 Close = 0x02, // Close Termination
nyengele 2:1b1c0502bb08 29 UsbInternalCheck = 0x03, // UsbInternalCheck Check if the connected USB device is valid
nyengele 2:1b1c0502bb08 30 ChangeEBaudRate = 0x04, // ChangeBaudrate Change UART baud rate
nyengele 2:1b1c0502bb08 31 SetIAPMode = 0x05, // SetIAPMode Enter IAP Mode In this mode, FW Upgrade is available
nyengele 2:1b1c0502bb08 32 CmosLed = 0x12, // CmosLed Control CMOS LED
nyengele 2:1b1c0502bb08 33 GetEnrollCount = 0x20, // Get enrolled fingerprint count
nyengele 2:1b1c0502bb08 34 CheckEnrolled = 0x21, // Check whether the specified ID is already enrolled
nyengele 2:1b1c0502bb08 35 EnrollStart = 0x22, // Start an enrollment
nyengele 2:1b1c0502bb08 36 Enroll1 = 0x23, // Make 1st template for an enrollment
nyengele 2:1b1c0502bb08 37 Enroll2 = 0x24, // Make 2nd template for an enrollment
nyengele 2:1b1c0502bb08 38 Enroll3 = 0x25, // Make 3rd template for an enrollment, merge three templates into one template, save merged template to the database
nyengele 2:1b1c0502bb08 39 IsPressFinger = 0x26, // Check if a finger is placed on the sensor
nyengele 2:1b1c0502bb08 40 DeleteID = 0x40, // Delete the fingerprint with the specified ID
nyengele 2:1b1c0502bb08 41 DeleteAll = 0x41, // Delete all fingerprints from the database
nyengele 2:1b1c0502bb08 42 Verify1_1 = 0x50, // Verification of the capture fingerprint image with the specified ID
nyengele 2:1b1c0502bb08 43 Identify1_N = 0x51, // Identification of the capture fingerprint image with the database
nyengele 2:1b1c0502bb08 44 VerifyTemplate1_1 = 0x52, // Verification of a fingerprint template with the specified ID
nyengele 2:1b1c0502bb08 45 IdentifyTemplate1_N = 0x53, // Identification of a fingerprint template with the database
nyengele 2:1b1c0502bb08 46 CaptureFinger = 0x60, // Capture a fingerprint image(256x256) from the sensor
nyengele 2:1b1c0502bb08 47 MakeTemplate = 0x61, // Make template for transmission
nyengele 2:1b1c0502bb08 48 GetImage = 0x62, // Download the captured fingerprint image(256x256)
nyengele 2:1b1c0502bb08 49 GetRawImage = 0x63, // Capture & Download raw fingerprint image(320x240)
nyengele 2:1b1c0502bb08 50 GetTemplate = 0x70, // Download the template of the specified ID
nyengele 2:1b1c0502bb08 51 SetTemplate = 0x71, // Upload the template of the specified ID
nyengele 2:1b1c0502bb08 52 GetDatabaseStart = 0x72, // Start database download, obsolete
nyengele 2:1b1c0502bb08 53 GetDatabaseEnd = 0x73, // End database download, obsolete
nyengele 2:1b1c0502bb08 54 UpgradeFirmware = 0x80, // Not supported
nyengele 2:1b1c0502bb08 55 UpgradeISOCDImage = 0x81, // Not supported
nyengele 2:1b1c0502bb08 56 Ack = 0x30, // Acknowledge.
nyengele 2:1b1c0502bb08 57 Nack = 0x31 // Non-acknowledge
nyengele 2:1b1c0502bb08 58 };
nyengele 2:1b1c0502bb08 59 };
nyengele 2:1b1c0502bb08 60
nyengele 2:1b1c0502bb08 61 Commands::Commands_Enum Command;
nyengele 2:1b1c0502bb08 62 byte Parameter[4]; // Parameter 4 bytes, changes meaning depending on command
nyengele 2:1b1c0502bb08 63 byte* GetPacketBytes(); // returns the bytes to be transmitted
nyengele 2:1b1c0502bb08 64 void ParameterFromInt(int i);
nyengele 2:1b1c0502bb08 65
nyengele 2:1b1c0502bb08 66 Command_Packet();
nyengele 2:1b1c0502bb08 67
nyengele 2:1b1c0502bb08 68 private:
nyengele 2:1b1c0502bb08 69 static const byte COMMAND_START_CODE_1 = 0x55; // Static byte to mark the beginning of a command packet - never changes
nyengele 2:1b1c0502bb08 70 static const byte COMMAND_START_CODE_2 = 0xAA; // Static byte to mark the beginning of a command packet - never changes
nyengele 2:1b1c0502bb08 71 static const byte COMMAND_DEVICE_ID_1 = 0x01; // Device ID Byte 1 (lesser byte) - theoretically never changes
nyengele 2:1b1c0502bb08 72 static const byte COMMAND_DEVICE_ID_2 = 0x00; // Device ID Byte 2 (greater byte) - theoretically never changes
nyengele 2:1b1c0502bb08 73 byte command[2]; // Command 2 bytes
nyengele 2:1b1c0502bb08 74
nyengele 2:1b1c0502bb08 75 word _CalculateChecksum(); // Checksum is calculated using byte addition
nyengele 2:1b1c0502bb08 76 byte GetHighByte(word w);
nyengele 2:1b1c0502bb08 77 byte GetLowByte(word w);
nyengele 2:1b1c0502bb08 78 };
nyengele 2:1b1c0502bb08 79
nyengele 2:1b1c0502bb08 80
nyengele 2:1b1c0502bb08 81 /*
nyengele 2:1b1c0502bb08 82 Response_Packet represents the returned data from the finger print scanner
nyengele 2:1b1c0502bb08 83 */
nyengele 2:1b1c0502bb08 84 class Response_Packet
nyengele 2:1b1c0502bb08 85 {
nyengele 2:1b1c0502bb08 86 public:
nyengele 2:1b1c0502bb08 87 class ErrorCodes
nyengele 2:1b1c0502bb08 88 {
nyengele 2:1b1c0502bb08 89 public:
nyengele 2:1b1c0502bb08 90 enum Errors_Enum
nyengele 2:1b1c0502bb08 91 {
nyengele 2:1b1c0502bb08 92 NO_ERROR = 0x0000, // Default value. no error
nyengele 2:1b1c0502bb08 93 NACK_TIMEOUT = 0x1001, // Obsolete, capture timeout
nyengele 2:1b1c0502bb08 94 NACK_INVALID_BAUDRATE = 0x1002, // Obsolete, Invalid serial baud rate
nyengele 2:1b1c0502bb08 95 NACK_INVALID_POS = 0x1003, // The specified ID is not between 0~199
nyengele 2:1b1c0502bb08 96 NACK_IS_NOT_USED = 0x1004, // The specified ID is not used
nyengele 2:1b1c0502bb08 97 NACK_IS_ALREADY_USED = 0x1005, // The specified ID is already used
nyengele 2:1b1c0502bb08 98 NACK_COMM_ERR = 0x1006, // Communication Error
nyengele 2:1b1c0502bb08 99 NACK_VERIFY_FAILED = 0x1007, // 1:1 Verification Failure
nyengele 2:1b1c0502bb08 100 NACK_IDENTIFY_FAILED = 0x1008, // 1:N Identification Failure
nyengele 2:1b1c0502bb08 101 NACK_DB_IS_FULL = 0x1009, // The database is full
nyengele 2:1b1c0502bb08 102 NACK_DB_IS_EMPTY = 0x100A, // The database is empty
nyengele 2:1b1c0502bb08 103 NACK_TURN_ERR = 0x100B, // Obsolete, Invalid order of the enrollment (The order was not as: EnrollStart -> Enroll1 -> Enroll2 -> Enroll3)
nyengele 2:1b1c0502bb08 104 NACK_BAD_FINGER = 0x100C, // Too bad fingerprint
nyengele 2:1b1c0502bb08 105 NACK_ENROLL_FAILED = 0x100D, // Enrollment Failure
nyengele 2:1b1c0502bb08 106 NACK_IS_NOT_SUPPORTED = 0x100E, // The specified command is not supported
nyengele 2:1b1c0502bb08 107 NACK_DEV_ERR = 0x100F, // Device Error, especially if Crypto-Chip is trouble
nyengele 2:1b1c0502bb08 108 NACK_CAPTURE_CANCELED = 0x1010, // Obsolete, The capturing is canceled
nyengele 2:1b1c0502bb08 109 NACK_INVALID_PARAM = 0x1011, // Invalid parameter
nyengele 2:1b1c0502bb08 110 NACK_FINGER_IS_NOT_PRESSED = 0x1012, // Finger is not pressed
nyengele 2:1b1c0502bb08 111 INVALID = 0XFFFF // Used when parsing fails
nyengele 2:1b1c0502bb08 112 };
nyengele 2:1b1c0502bb08 113
nyengele 2:1b1c0502bb08 114 static Errors_Enum ParseFromBytes(byte high, byte low);
nyengele 2:1b1c0502bb08 115 };
nyengele 2:1b1c0502bb08 116 Response_Packet(byte* buffer);
nyengele 2:1b1c0502bb08 117 ErrorCodes::Errors_Enum Error;
nyengele 2:1b1c0502bb08 118 byte RawBytes[12];
nyengele 2:1b1c0502bb08 119 byte ParameterBytes[4];
nyengele 2:1b1c0502bb08 120 byte ResponseBytes[2];
nyengele 2:1b1c0502bb08 121 bool ACK;
nyengele 2:1b1c0502bb08 122 static const byte COMMAND_START_CODE_1 = 0x55; // Static byte to mark the beginning of a command packet - never changes
nyengele 2:1b1c0502bb08 123 static const byte COMMAND_START_CODE_2 = 0xAA; // Static byte to mark the beginning of a command packet - never changes
nyengele 2:1b1c0502bb08 124 static const byte COMMAND_DEVICE_ID_1 = 0x01; // Device ID Byte 1 (lesser byte) - theoretically never changes
nyengele 2:1b1c0502bb08 125 static const byte COMMAND_DEVICE_ID_2 = 0x00; // Device ID Byte 2 (greater byte) - theoretically never changes
nyengele 2:1b1c0502bb08 126 int IntFromParameter();
nyengele 2:1b1c0502bb08 127
nyengele 2:1b1c0502bb08 128 private:
nyengele 2:1b1c0502bb08 129 bool CheckParsing(byte b, byte propervalue, byte alternatevalue);
nyengele 2:1b1c0502bb08 130 word CalculateChecksum(byte* buffer, int length);
nyengele 2:1b1c0502bb08 131 byte GetHighByte(word w);
nyengele 2:1b1c0502bb08 132 byte GetLowByte(word w);
nyengele 2:1b1c0502bb08 133 };
nyengele 2:1b1c0502bb08 134
nyengele 2:1b1c0502bb08 135
nyengele 2:1b1c0502bb08 136 /*
nyengele 2:1b1c0502bb08 137 Object for controlling the GT-511C3 Finger Print Scanner (FPS)
nyengele 2:1b1c0502bb08 138 */
nyengele 2:1b1c0502bb08 139 class FPScanner
nyengele 2:1b1c0502bb08 140 {
nyengele 2:1b1c0502bb08 141
nyengele 2:1b1c0502bb08 142 public:
nyengele 2:1b1c0502bb08 143
nyengele 2:1b1c0502bb08 144 // Creates a new object to interface with the fingerprint scanner
nyengele 2:1b1c0502bb08 145 FPScanner(PinName tx, PinName rx);
nyengele 2:1b1c0502bb08 146
nyengele 2:1b1c0502bb08 147 //Initialises the device and gets ready for commands
nyengele 2:1b1c0502bb08 148 void Open();
nyengele 2:1b1c0502bb08 149
nyengele 2:1b1c0502bb08 150 // Does not actually do anything (according to the datasheet)
nyengele 2:1b1c0502bb08 151 // I implemented open, so had to do closed too... lol
nyengele 2:1b1c0502bb08 152 void Close();
nyengele 2:1b1c0502bb08 153
nyengele 2:1b1c0502bb08 154 // Turns on or off the LED backlight
nyengele 2:1b1c0502bb08 155 // LED must be on to see fingerprints
nyengele 2:1b1c0502bb08 156 // Parameter: true turns on the backlight, false turns it off
nyengele 2:1b1c0502bb08 157 // Returns: True if successful, false if not
nyengele 2:1b1c0502bb08 158 bool SetLED(bool on);
nyengele 2:1b1c0502bb08 159
nyengele 2:1b1c0502bb08 160 // Changes the baud rate of the connection
nyengele 2:1b1c0502bb08 161 // Parameter: 9600 - 115200
nyengele 2:1b1c0502bb08 162 // Returns: True if success, false if invalid baud
nyengele 2:1b1c0502bb08 163 // NOTE: Untested (don't have a logic level changer and a voltage divider is too slow)
nyengele 2:1b1c0502bb08 164 bool ChangeBaudRate(int baud);
nyengele 2:1b1c0502bb08 165
nyengele 2:1b1c0502bb08 166 // Gets the number of enrolled fingerprints
nyengele 2:1b1c0502bb08 167 // Return: The total number of enrolled fingerprints
nyengele 2:1b1c0502bb08 168 int GetEnrollCount();
nyengele 2:1b1c0502bb08 169
nyengele 2:1b1c0502bb08 170 // checks to see if the ID number is in use or not
nyengele 2:1b1c0502bb08 171 // Parameter: 0-199
nyengele 2:1b1c0502bb08 172 // Return: True if the ID number is enrolled, false if not
nyengele 2:1b1c0502bb08 173 bool CheckEnrolled(int id);
nyengele 2:1b1c0502bb08 174
nyengele 2:1b1c0502bb08 175 // Starts the Enrollment Process
nyengele 2:1b1c0502bb08 176 // Parameter: 0-199
nyengele 2:1b1c0502bb08 177 // Return:
nyengele 2:1b1c0502bb08 178 // 0 - ACK
nyengele 2:1b1c0502bb08 179 // 1 - Database is full
nyengele 2:1b1c0502bb08 180 // 2 - Invalid Position
nyengele 2:1b1c0502bb08 181 // 3 - Position(ID) is already used
nyengele 2:1b1c0502bb08 182 int EnrollStart(int id);
nyengele 2:1b1c0502bb08 183
nyengele 2:1b1c0502bb08 184 // Gets the first scan of an enrollment
nyengele 2:1b1c0502bb08 185 // Return:
nyengele 2:1b1c0502bb08 186 // 0 - ACK
nyengele 2:1b1c0502bb08 187 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 188 // 2 - Bad finger
nyengele 2:1b1c0502bb08 189 // 3 - ID in use
nyengele 2:1b1c0502bb08 190 int Enroll1();
nyengele 2:1b1c0502bb08 191
nyengele 2:1b1c0502bb08 192 // Gets the Second scan of an enrollment
nyengele 2:1b1c0502bb08 193 // Return:
nyengele 2:1b1c0502bb08 194 // 0 - ACK
nyengele 2:1b1c0502bb08 195 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 196 // 2 - Bad finger
nyengele 2:1b1c0502bb08 197 // 3 - ID in use
nyengele 2:1b1c0502bb08 198 int Enroll2();
nyengele 2:1b1c0502bb08 199
nyengele 2:1b1c0502bb08 200 // Gets the Third scan of an enrollment
nyengele 2:1b1c0502bb08 201 // Finishes Enrollment
nyengele 2:1b1c0502bb08 202 // Return:
nyengele 2:1b1c0502bb08 203 // 0 - ACK
nyengele 2:1b1c0502bb08 204 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 205 // 2 - Bad finger
nyengele 2:1b1c0502bb08 206 // 3 - ID in use
nyengele 2:1b1c0502bb08 207 int Enroll3();
nyengele 2:1b1c0502bb08 208
nyengele 2:1b1c0502bb08 209 // Checks to see if a finger is pressed on the FPS
nyengele 2:1b1c0502bb08 210 // Return: true if finger pressed, false if not
nyengele 2:1b1c0502bb08 211 bool IsPressFinger();
nyengele 2:1b1c0502bb08 212
nyengele 2:1b1c0502bb08 213 // Deletes the specified ID (enrollment) from the database
nyengele 2:1b1c0502bb08 214 // Returns: true if successful, false if position invalid
nyengele 2:1b1c0502bb08 215 bool DeleteID(int ID);
nyengele 2:1b1c0502bb08 216
nyengele 2:1b1c0502bb08 217 // Deletes all IDs (enrollments) from the database
nyengele 2:1b1c0502bb08 218 // Returns: true if successful, false if db is empty
nyengele 2:1b1c0502bb08 219 bool DeleteAll();
nyengele 2:1b1c0502bb08 220
nyengele 2:1b1c0502bb08 221 // Checks the currently pressed finger against a specific ID
nyengele 2:1b1c0502bb08 222 // Parameter: 0-199 (id number to be checked)
nyengele 2:1b1c0502bb08 223 // Returns:
nyengele 2:1b1c0502bb08 224 // 0 - Verified OK (the correct finger)
nyengele 2:1b1c0502bb08 225 // 1 - Invalid Position
nyengele 2:1b1c0502bb08 226 // 2 - ID is not in use
nyengele 2:1b1c0502bb08 227 // 3 - Verified FALSE (not the correct finger)
nyengele 2:1b1c0502bb08 228 int Verify1_1(int id);
nyengele 2:1b1c0502bb08 229
nyengele 2:1b1c0502bb08 230 // Checks the currently pressed finger against all enrolled fingerprints
nyengele 2:1b1c0502bb08 231 // Returns:
nyengele 2:1b1c0502bb08 232 // 0-199: Verified against the specified ID (found, and here is the ID number)
nyengele 2:1b1c0502bb08 233 // 200: Failed to find the fingerprint in the database
nyengele 2:1b1c0502bb08 234 int Identify1_N();
nyengele 2:1b1c0502bb08 235
nyengele 2:1b1c0502bb08 236 // Captures the currently pressed finger into onboard ram
nyengele 2:1b1c0502bb08 237 // Parameter: true for high quality image(slower), false for low quality image (faster)
nyengele 2:1b1c0502bb08 238 // Generally, use high quality for enrollment, and low quality for verification/identification
nyengele 2:1b1c0502bb08 239 // Returns: True if ok, false if no finger pressed
nyengele 2:1b1c0502bb08 240 bool CaptureFinger(bool highquality);
nyengele 2:1b1c0502bb08 241
nyengele 2:1b1c0502bb08 242
nyengele 2:1b1c0502bb08 243 // resets the Data_Packet class, and gets ready to download
nyengele 2:1b1c0502bb08 244 // Not implemented due to memory restrictions on the arduino
nyengele 2:1b1c0502bb08 245 // may revisit this if I find a need for it
nyengele 2:1b1c0502bb08 246 //void StartDataDownload();
nyengele 2:1b1c0502bb08 247
nyengele 2:1b1c0502bb08 248 // Returns the next data packet
nyengele 2:1b1c0502bb08 249 // Not implemented due to memory restrictions on the arduino
nyengele 2:1b1c0502bb08 250 // may revisit this if I find a need for it
nyengele 2:1b1c0502bb08 251 //Data_Packet GetNextDataPacket();
nyengele 2:1b1c0502bb08 252
nyengele 2:1b1c0502bb08 253 private:
nyengele 2:1b1c0502bb08 254 void SendCommand(byte cmd[], int length);
nyengele 2:1b1c0502bb08 255 Response_Packet* GetResponse();
nyengele 2:1b1c0502bb08 256 PinName pin_RX,pin_TX;
nyengele 2:1b1c0502bb08 257 Serial _serial;
nyengele 2:1b1c0502bb08 258 };
nyengele 2:1b1c0502bb08 259
nyengele 2:1b1c0502bb08 260
nyengele 2:1b1c0502bb08 261 #endif // FPScanner_H
nyengele 2:1b1c0502bb08 262