asdasdasd

Dependencies:   mbed

Fork of FINAL_PROJECT_4180 by Gedeon Nyengele

Committer:
nyengele
Date:
Mon Apr 25 00:36:32 2016 +0000
Revision:
2:1b1c0502bb08
fingerprint scanner done!

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 #include "FPScanner.h"
nyengele 2:1b1c0502bb08 10
nyengele 2:1b1c0502bb08 11
nyengele 2:1b1c0502bb08 12 // returns the 12 bytes of the generated command packet
nyengele 2:1b1c0502bb08 13 // remember to call delete on the returned array
nyengele 2:1b1c0502bb08 14 byte* Command_Packet::GetPacketBytes()
nyengele 2:1b1c0502bb08 15 {
nyengele 2:1b1c0502bb08 16 byte* packetbytes= new byte[12];
nyengele 2:1b1c0502bb08 17
nyengele 2:1b1c0502bb08 18 // update command before calculating checksum (important!)
nyengele 2:1b1c0502bb08 19 word cmd = Command;
nyengele 2:1b1c0502bb08 20 command[0] = GetLowByte(cmd);
nyengele 2:1b1c0502bb08 21 command[1] = GetHighByte(cmd);
nyengele 2:1b1c0502bb08 22
nyengele 2:1b1c0502bb08 23 word checksum = _CalculateChecksum();
nyengele 2:1b1c0502bb08 24
nyengele 2:1b1c0502bb08 25 packetbytes[0] = COMMAND_START_CODE_1;
nyengele 2:1b1c0502bb08 26 packetbytes[1] = COMMAND_START_CODE_2;
nyengele 2:1b1c0502bb08 27 packetbytes[2] = COMMAND_DEVICE_ID_1;
nyengele 2:1b1c0502bb08 28 packetbytes[3] = COMMAND_DEVICE_ID_2;
nyengele 2:1b1c0502bb08 29 packetbytes[4] = Parameter[0];
nyengele 2:1b1c0502bb08 30 packetbytes[5] = Parameter[1];
nyengele 2:1b1c0502bb08 31 packetbytes[6] = Parameter[2];
nyengele 2:1b1c0502bb08 32 packetbytes[7] = Parameter[3];
nyengele 2:1b1c0502bb08 33 packetbytes[8] = command[0];
nyengele 2:1b1c0502bb08 34 packetbytes[9] = command[1];
nyengele 2:1b1c0502bb08 35 packetbytes[10] = GetLowByte(checksum);
nyengele 2:1b1c0502bb08 36 packetbytes[11] = GetHighByte(checksum);
nyengele 2:1b1c0502bb08 37
nyengele 2:1b1c0502bb08 38 return packetbytes;
nyengele 2:1b1c0502bb08 39 }
nyengele 2:1b1c0502bb08 40
nyengele 2:1b1c0502bb08 41 // Converts the int to bytes and puts them into the paramter array
nyengele 2:1b1c0502bb08 42 void Command_Packet::ParameterFromInt(int i)
nyengele 2:1b1c0502bb08 43 {
nyengele 2:1b1c0502bb08 44 Parameter[0] = (i & 0x000000ff);
nyengele 2:1b1c0502bb08 45 Parameter[1] = (i & 0x0000ff00) >> 8;
nyengele 2:1b1c0502bb08 46 Parameter[2] = (i & 0x00ff0000) >> 16;
nyengele 2:1b1c0502bb08 47 Parameter[3] = (i & 0xff000000) >> 24;
nyengele 2:1b1c0502bb08 48 }
nyengele 2:1b1c0502bb08 49
nyengele 2:1b1c0502bb08 50 // Returns the high byte from a word
nyengele 2:1b1c0502bb08 51 byte Command_Packet::GetHighByte(word w)
nyengele 2:1b1c0502bb08 52 {
nyengele 2:1b1c0502bb08 53 return (byte)(w>>8)&0x00FF;
nyengele 2:1b1c0502bb08 54 }
nyengele 2:1b1c0502bb08 55
nyengele 2:1b1c0502bb08 56 // Returns the low byte from a word
nyengele 2:1b1c0502bb08 57 byte Command_Packet::GetLowByte(word w)
nyengele 2:1b1c0502bb08 58 {
nyengele 2:1b1c0502bb08 59 return (byte)w&0x00FF;
nyengele 2:1b1c0502bb08 60 }
nyengele 2:1b1c0502bb08 61
nyengele 2:1b1c0502bb08 62 word Command_Packet::_CalculateChecksum()
nyengele 2:1b1c0502bb08 63 {
nyengele 2:1b1c0502bb08 64 word w = 0;
nyengele 2:1b1c0502bb08 65 w += COMMAND_START_CODE_1;
nyengele 2:1b1c0502bb08 66 w += COMMAND_START_CODE_2;
nyengele 2:1b1c0502bb08 67 w += COMMAND_DEVICE_ID_1;
nyengele 2:1b1c0502bb08 68 w += COMMAND_DEVICE_ID_2;
nyengele 2:1b1c0502bb08 69 w += Parameter[0];
nyengele 2:1b1c0502bb08 70 w += Parameter[1];
nyengele 2:1b1c0502bb08 71 w += Parameter[2];
nyengele 2:1b1c0502bb08 72 w += Parameter[3];
nyengele 2:1b1c0502bb08 73 w += command[0];
nyengele 2:1b1c0502bb08 74 w += command[1];
nyengele 2:1b1c0502bb08 75
nyengele 2:1b1c0502bb08 76 return w;
nyengele 2:1b1c0502bb08 77 }
nyengele 2:1b1c0502bb08 78
nyengele 2:1b1c0502bb08 79 Command_Packet::Command_Packet()
nyengele 2:1b1c0502bb08 80 {
nyengele 2:1b1c0502bb08 81 };
nyengele 2:1b1c0502bb08 82
nyengele 2:1b1c0502bb08 83 // creates and parses a response packet from the finger print scanner
nyengele 2:1b1c0502bb08 84 Response_Packet::Response_Packet(byte* buffer)
nyengele 2:1b1c0502bb08 85 {
nyengele 2:1b1c0502bb08 86 // CheckParsing(buffer[0], COMMAND_START_CODE_1, COMMAND_START_CODE_1);
nyengele 2:1b1c0502bb08 87 // CheckParsing(buffer[1], COMMAND_START_CODE_2, COMMAND_START_CODE_2);
nyengele 2:1b1c0502bb08 88 // CheckParsing(buffer[2], COMMAND_DEVICE_ID_1, COMMAND_DEVICE_ID_1);
nyengele 2:1b1c0502bb08 89 // CheckParsing(buffer[3], COMMAND_DEVICE_ID_2, COMMAND_DEVICE_ID_2);
nyengele 2:1b1c0502bb08 90 // CheckParsing(buffer[8], 0x30, 0x31);
nyengele 2:1b1c0502bb08 91 if (buffer[8] == 0x30) ACK = true; else ACK = false;
nyengele 2:1b1c0502bb08 92 // CheckParsing(buffer[9], 0x00, 0x00);
nyengele 2:1b1c0502bb08 93
nyengele 2:1b1c0502bb08 94 word checksum = CalculateChecksum(buffer, 10);
nyengele 2:1b1c0502bb08 95 byte checksum_low = GetLowByte(checksum);
nyengele 2:1b1c0502bb08 96 byte checksum_high = GetHighByte(checksum);
nyengele 2:1b1c0502bb08 97 // CheckParsing(buffer[10], checksum_low, checksum_low);
nyengele 2:1b1c0502bb08 98 // CheckParsing(buffer[11], checksum_high, checksum_high);
nyengele 2:1b1c0502bb08 99
nyengele 2:1b1c0502bb08 100 Error = ErrorCodes::ParseFromBytes(buffer[5], buffer[4]);
nyengele 2:1b1c0502bb08 101
nyengele 2:1b1c0502bb08 102 ParameterBytes[0] = buffer[4];
nyengele 2:1b1c0502bb08 103 ParameterBytes[1] = buffer[5];
nyengele 2:1b1c0502bb08 104 ParameterBytes[2] = buffer[6];
nyengele 2:1b1c0502bb08 105 ParameterBytes[3] = buffer[7];
nyengele 2:1b1c0502bb08 106 ResponseBytes[0]=buffer[8];
nyengele 2:1b1c0502bb08 107 ResponseBytes[1]=buffer[9];
nyengele 2:1b1c0502bb08 108 for (int i=0; i < 12; i++)
nyengele 2:1b1c0502bb08 109 {
nyengele 2:1b1c0502bb08 110 RawBytes[i]=buffer[i];
nyengele 2:1b1c0502bb08 111 }
nyengele 2:1b1c0502bb08 112 }
nyengele 2:1b1c0502bb08 113
nyengele 2:1b1c0502bb08 114 // parses bytes into one of the possible errors from the finger print scanner
nyengele 2:1b1c0502bb08 115 Response_Packet::ErrorCodes::Errors_Enum Response_Packet::ErrorCodes::ParseFromBytes(byte high, byte low)
nyengele 2:1b1c0502bb08 116 {
nyengele 2:1b1c0502bb08 117 Errors_Enum e = INVALID;
nyengele 2:1b1c0502bb08 118 if (high == 0x00)
nyengele 2:1b1c0502bb08 119 {
nyengele 2:1b1c0502bb08 120 }
nyengele 2:1b1c0502bb08 121 if (high == 0x01)
nyengele 2:1b1c0502bb08 122 {
nyengele 2:1b1c0502bb08 123 switch(low)
nyengele 2:1b1c0502bb08 124 {
nyengele 2:1b1c0502bb08 125 case 0x00: e = NO_ERROR; break;
nyengele 2:1b1c0502bb08 126 case 0x01: e = NACK_TIMEOUT; break;
nyengele 2:1b1c0502bb08 127 case 0x02: e = NACK_INVALID_BAUDRATE; break;
nyengele 2:1b1c0502bb08 128 case 0x03: e = NACK_INVALID_POS; break;
nyengele 2:1b1c0502bb08 129 case 0x04: e = NACK_IS_NOT_USED; break;
nyengele 2:1b1c0502bb08 130 case 0x05: e = NACK_IS_ALREADY_USED; break;
nyengele 2:1b1c0502bb08 131 case 0x06: e = NACK_COMM_ERR; break;
nyengele 2:1b1c0502bb08 132 case 0x07: e = NACK_VERIFY_FAILED; break;
nyengele 2:1b1c0502bb08 133 case 0x08: e = NACK_IDENTIFY_FAILED; break;
nyengele 2:1b1c0502bb08 134 case 0x09: e = NACK_DB_IS_FULL; break;
nyengele 2:1b1c0502bb08 135 case 0x0A: e = NACK_DB_IS_EMPTY; break;
nyengele 2:1b1c0502bb08 136 case 0x0B: e = NACK_TURN_ERR; break;
nyengele 2:1b1c0502bb08 137 case 0x0C: e = NACK_BAD_FINGER; break;
nyengele 2:1b1c0502bb08 138 case 0x0D: e = NACK_ENROLL_FAILED; break;
nyengele 2:1b1c0502bb08 139 case 0x0E: e = NACK_IS_NOT_SUPPORTED; break;
nyengele 2:1b1c0502bb08 140 case 0x0F: e = NACK_DEV_ERR; break;
nyengele 2:1b1c0502bb08 141 case 0x10: e = NACK_CAPTURE_CANCELED; break;
nyengele 2:1b1c0502bb08 142 case 0x11: e = NACK_INVALID_PARAM; break;
nyengele 2:1b1c0502bb08 143 case 0x12: e = NACK_FINGER_IS_NOT_PRESSED; break;
nyengele 2:1b1c0502bb08 144 }
nyengele 2:1b1c0502bb08 145 }
nyengele 2:1b1c0502bb08 146 return e;
nyengele 2:1b1c0502bb08 147 }
nyengele 2:1b1c0502bb08 148
nyengele 2:1b1c0502bb08 149 // Gets an int from the parameter bytes
nyengele 2:1b1c0502bb08 150 int Response_Packet::IntFromParameter()
nyengele 2:1b1c0502bb08 151 {
nyengele 2:1b1c0502bb08 152 int retval = 0;
nyengele 2:1b1c0502bb08 153 retval = (retval << 8) + ParameterBytes[3];
nyengele 2:1b1c0502bb08 154 retval = (retval << 8) + ParameterBytes[2];
nyengele 2:1b1c0502bb08 155 retval = (retval << 8) + ParameterBytes[1];
nyengele 2:1b1c0502bb08 156 retval = (retval << 8) + ParameterBytes[0];
nyengele 2:1b1c0502bb08 157 return retval;
nyengele 2:1b1c0502bb08 158 }
nyengele 2:1b1c0502bb08 159
nyengele 2:1b1c0502bb08 160 // calculates the checksum from the bytes in the packet
nyengele 2:1b1c0502bb08 161 word Response_Packet::CalculateChecksum(byte* buffer, int length)
nyengele 2:1b1c0502bb08 162 {
nyengele 2:1b1c0502bb08 163 word checksum = 0;
nyengele 2:1b1c0502bb08 164 for (int i=0; i<length; i++)
nyengele 2:1b1c0502bb08 165 {
nyengele 2:1b1c0502bb08 166 checksum +=buffer[i];
nyengele 2:1b1c0502bb08 167 }
nyengele 2:1b1c0502bb08 168 return checksum;
nyengele 2:1b1c0502bb08 169 }
nyengele 2:1b1c0502bb08 170
nyengele 2:1b1c0502bb08 171 // Returns the high byte from a word
nyengele 2:1b1c0502bb08 172 byte Response_Packet::GetHighByte(word w)
nyengele 2:1b1c0502bb08 173 {
nyengele 2:1b1c0502bb08 174 return (byte)(w>>8)&0x00FF;
nyengele 2:1b1c0502bb08 175 }
nyengele 2:1b1c0502bb08 176
nyengele 2:1b1c0502bb08 177 // Returns the low byte from a word
nyengele 2:1b1c0502bb08 178 byte Response_Packet::GetLowByte(word w)
nyengele 2:1b1c0502bb08 179 {
nyengele 2:1b1c0502bb08 180 return (byte)w&0x00FF;
nyengele 2:1b1c0502bb08 181 }
nyengele 2:1b1c0502bb08 182
nyengele 2:1b1c0502bb08 183 // checks to see if the byte is the proper value, and logs it to the serial channel if not
nyengele 2:1b1c0502bb08 184 bool Response_Packet::CheckParsing(byte b, byte propervalue, byte alternatevalue)
nyengele 2:1b1c0502bb08 185 {
nyengele 2:1b1c0502bb08 186 bool retval = (b == propervalue) || (b == alternatevalue);
nyengele 2:1b1c0502bb08 187 return retval;
nyengele 2:1b1c0502bb08 188
nyengele 2:1b1c0502bb08 189 }
nyengele 2:1b1c0502bb08 190
nyengele 2:1b1c0502bb08 191
nyengele 2:1b1c0502bb08 192 // Creates a new object to interface with the fingerprint scanner
nyengele 2:1b1c0502bb08 193 FPScanner::FPScanner(PinName tx, PinName rx)
nyengele 2:1b1c0502bb08 194 : _serial(tx,rx)
nyengele 2:1b1c0502bb08 195 {
nyengele 2:1b1c0502bb08 196 pin_TX = tx;
nyengele 2:1b1c0502bb08 197 pin_RX = rx;
nyengele 2:1b1c0502bb08 198 _serial.baud(9600);
nyengele 2:1b1c0502bb08 199 };
nyengele 2:1b1c0502bb08 200
nyengele 2:1b1c0502bb08 201
nyengele 2:1b1c0502bb08 202 //Initialises the device and gets ready for commands
nyengele 2:1b1c0502bb08 203 void FPScanner::Open()
nyengele 2:1b1c0502bb08 204 {
nyengele 2:1b1c0502bb08 205 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 206 cp->Command = Command_Packet::Commands::Open;
nyengele 2:1b1c0502bb08 207 cp->Parameter[0] = 0x00;
nyengele 2:1b1c0502bb08 208 cp->Parameter[1] = 0x00;
nyengele 2:1b1c0502bb08 209 cp->Parameter[2] = 0x00;
nyengele 2:1b1c0502bb08 210 cp->Parameter[3] = 0x00;
nyengele 2:1b1c0502bb08 211 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 212 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 213 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 214 delete cp;
nyengele 2:1b1c0502bb08 215 delete rp;
nyengele 2:1b1c0502bb08 216 delete [] packetbytes;
nyengele 2:1b1c0502bb08 217 }
nyengele 2:1b1c0502bb08 218
nyengele 2:1b1c0502bb08 219 // According to the DataSheet, this does nothing...
nyengele 2:1b1c0502bb08 220 // Implemented it for completeness.
nyengele 2:1b1c0502bb08 221 void FPScanner::Close()
nyengele 2:1b1c0502bb08 222 {
nyengele 2:1b1c0502bb08 223 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 224 cp->Command = Command_Packet::Commands::Close;
nyengele 2:1b1c0502bb08 225 cp->Parameter[0] = 0x00;
nyengele 2:1b1c0502bb08 226 cp->Parameter[1] = 0x00;
nyengele 2:1b1c0502bb08 227 cp->Parameter[2] = 0x00;
nyengele 2:1b1c0502bb08 228 cp->Parameter[3] = 0x00;
nyengele 2:1b1c0502bb08 229 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 230 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 231 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 232 delete cp;
nyengele 2:1b1c0502bb08 233 delete rp;
nyengele 2:1b1c0502bb08 234 delete [] packetbytes;
nyengele 2:1b1c0502bb08 235 };
nyengele 2:1b1c0502bb08 236
nyengele 2:1b1c0502bb08 237 // Turns on or off the LED backlight
nyengele 2:1b1c0502bb08 238 // Parameter: true turns on the backlight, false turns it off
nyengele 2:1b1c0502bb08 239 // Returns: True if successful, false if not
nyengele 2:1b1c0502bb08 240 bool FPScanner::SetLED(bool on)
nyengele 2:1b1c0502bb08 241 {
nyengele 2:1b1c0502bb08 242 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 243 cp->Command = Command_Packet::Commands::CmosLed;
nyengele 2:1b1c0502bb08 244 if (on)
nyengele 2:1b1c0502bb08 245 {
nyengele 2:1b1c0502bb08 246 cp->Parameter[0] = 0x01;
nyengele 2:1b1c0502bb08 247 }
nyengele 2:1b1c0502bb08 248 else
nyengele 2:1b1c0502bb08 249 {
nyengele 2:1b1c0502bb08 250 cp->Parameter[0] = 0x00;
nyengele 2:1b1c0502bb08 251 }
nyengele 2:1b1c0502bb08 252 cp->Parameter[1] = 0x00;
nyengele 2:1b1c0502bb08 253 cp->Parameter[2] = 0x00;
nyengele 2:1b1c0502bb08 254 cp->Parameter[3] = 0x00;
nyengele 2:1b1c0502bb08 255 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 256 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 257 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 258 bool retval = true;
nyengele 2:1b1c0502bb08 259 if (rp->ACK == false) retval = false;
nyengele 2:1b1c0502bb08 260 delete rp;
nyengele 2:1b1c0502bb08 261 delete [] packetbytes;
nyengele 2:1b1c0502bb08 262 delete cp;
nyengele 2:1b1c0502bb08 263 return retval;
nyengele 2:1b1c0502bb08 264 };
nyengele 2:1b1c0502bb08 265
nyengele 2:1b1c0502bb08 266 // Changes the baud rate of the connection
nyengele 2:1b1c0502bb08 267 // Parameter: 9600, 19200, 38400, 57600, 115200
nyengele 2:1b1c0502bb08 268 // Returns: True if success, false if invalid baud
nyengele 2:1b1c0502bb08 269 // NOTE: Untested (don't have a logic level changer and a voltage divider is too slow)
nyengele 2:1b1c0502bb08 270 bool FPScanner::ChangeBaudRate(int baud)
nyengele 2:1b1c0502bb08 271 {
nyengele 2:1b1c0502bb08 272 if ((baud == 9600) || (baud == 19200) || (baud == 38400) || (baud == 57600) || (baud == 115200))
nyengele 2:1b1c0502bb08 273 {
nyengele 2:1b1c0502bb08 274
nyengele 2:1b1c0502bb08 275 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 276 cp->Command = Command_Packet::Commands::Open;
nyengele 2:1b1c0502bb08 277 cp->ParameterFromInt(baud);
nyengele 2:1b1c0502bb08 278 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 279 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 280 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 281 bool retval = rp->ACK;
nyengele 2:1b1c0502bb08 282 if (retval)
nyengele 2:1b1c0502bb08 283 {
nyengele 2:1b1c0502bb08 284 _serial.baud(baud);
nyengele 2:1b1c0502bb08 285 }
nyengele 2:1b1c0502bb08 286 delete cp;
nyengele 2:1b1c0502bb08 287 delete rp;
nyengele 2:1b1c0502bb08 288 delete [] packetbytes;
nyengele 2:1b1c0502bb08 289 return retval;
nyengele 2:1b1c0502bb08 290 }
nyengele 2:1b1c0502bb08 291 return false;
nyengele 2:1b1c0502bb08 292 }
nyengele 2:1b1c0502bb08 293
nyengele 2:1b1c0502bb08 294 // Gets the number of enrolled fingerprints
nyengele 2:1b1c0502bb08 295 // Return: The total number of enrolled fingerprints
nyengele 2:1b1c0502bb08 296 int FPScanner::GetEnrollCount()
nyengele 2:1b1c0502bb08 297 {
nyengele 2:1b1c0502bb08 298 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 299 cp->Command = Command_Packet::Commands::GetEnrollCount;
nyengele 2:1b1c0502bb08 300 cp->Parameter[0] = 0x00;
nyengele 2:1b1c0502bb08 301 cp->Parameter[1] = 0x00;
nyengele 2:1b1c0502bb08 302 cp->Parameter[2] = 0x00;
nyengele 2:1b1c0502bb08 303 cp->Parameter[3] = 0x00;
nyengele 2:1b1c0502bb08 304 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 305 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 306 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 307
nyengele 2:1b1c0502bb08 308 int retval = rp->IntFromParameter();
nyengele 2:1b1c0502bb08 309 delete cp;
nyengele 2:1b1c0502bb08 310 delete rp;
nyengele 2:1b1c0502bb08 311 delete [] packetbytes;
nyengele 2:1b1c0502bb08 312 return retval;
nyengele 2:1b1c0502bb08 313 }
nyengele 2:1b1c0502bb08 314
nyengele 2:1b1c0502bb08 315 // checks to see if the ID number is in use or not
nyengele 2:1b1c0502bb08 316 // Parameter: 0-199
nyengele 2:1b1c0502bb08 317 // Return: True if the ID number is enrolled, false if not
nyengele 2:1b1c0502bb08 318 bool FPScanner::CheckEnrolled(int id)
nyengele 2:1b1c0502bb08 319 {
nyengele 2:1b1c0502bb08 320 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 321 cp->Command = Command_Packet::Commands::CheckEnrolled;
nyengele 2:1b1c0502bb08 322 cp->ParameterFromInt(id);
nyengele 2:1b1c0502bb08 323 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 324 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 325 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 326 bool retval = false;
nyengele 2:1b1c0502bb08 327 retval = rp->ACK;
nyengele 2:1b1c0502bb08 328 delete cp;
nyengele 2:1b1c0502bb08 329 delete rp;
nyengele 2:1b1c0502bb08 330 delete [] packetbytes;
nyengele 2:1b1c0502bb08 331 return retval;
nyengele 2:1b1c0502bb08 332 }
nyengele 2:1b1c0502bb08 333
nyengele 2:1b1c0502bb08 334 // Starts the Enrollment Process
nyengele 2:1b1c0502bb08 335 // Parameter: 0-199
nyengele 2:1b1c0502bb08 336 // Return:
nyengele 2:1b1c0502bb08 337 // 0 - ACK
nyengele 2:1b1c0502bb08 338 // 1 - Database is full
nyengele 2:1b1c0502bb08 339 // 2 - Invalid Position
nyengele 2:1b1c0502bb08 340 // 3 - Position(ID) is already used
nyengele 2:1b1c0502bb08 341 int FPScanner::EnrollStart(int id)
nyengele 2:1b1c0502bb08 342 {
nyengele 2:1b1c0502bb08 343 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 344 cp->Command = Command_Packet::Commands::EnrollStart;
nyengele 2:1b1c0502bb08 345 cp->ParameterFromInt(id);
nyengele 2:1b1c0502bb08 346 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 347 delete cp;
nyengele 2:1b1c0502bb08 348 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 349 delete [] packetbytes;
nyengele 2:1b1c0502bb08 350 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 351 int retval = 0;
nyengele 2:1b1c0502bb08 352 if (rp->ACK == false)
nyengele 2:1b1c0502bb08 353 {
nyengele 2:1b1c0502bb08 354 if (rp->Error == Response_Packet::ErrorCodes::NACK_DB_IS_FULL) retval = 1;
nyengele 2:1b1c0502bb08 355 if (rp->Error == Response_Packet::ErrorCodes::NACK_INVALID_POS) retval = 2;
nyengele 2:1b1c0502bb08 356 if (rp->Error == Response_Packet::ErrorCodes::NACK_IS_ALREADY_USED) retval = 3;
nyengele 2:1b1c0502bb08 357 }
nyengele 2:1b1c0502bb08 358 delete rp;
nyengele 2:1b1c0502bb08 359 return retval;
nyengele 2:1b1c0502bb08 360 }
nyengele 2:1b1c0502bb08 361
nyengele 2:1b1c0502bb08 362 // Gets the first scan of an enrollment
nyengele 2:1b1c0502bb08 363 // Return:
nyengele 2:1b1c0502bb08 364 // 0 - ACK
nyengele 2:1b1c0502bb08 365 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 366 // 2 - Bad finger
nyengele 2:1b1c0502bb08 367 // 3 - ID in use
nyengele 2:1b1c0502bb08 368 int FPScanner::Enroll1()
nyengele 2:1b1c0502bb08 369 {
nyengele 2:1b1c0502bb08 370 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 371 cp->Command = Command_Packet::Commands::Enroll1;
nyengele 2:1b1c0502bb08 372 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 373 delete cp;
nyengele 2:1b1c0502bb08 374 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 375 delete [] packetbytes;
nyengele 2:1b1c0502bb08 376 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 377 int retval = rp->IntFromParameter();
nyengele 2:1b1c0502bb08 378 if (retval < 200) retval = 3; else retval = 0;
nyengele 2:1b1c0502bb08 379 if (rp->ACK == false)
nyengele 2:1b1c0502bb08 380 {
nyengele 2:1b1c0502bb08 381 if (rp->Error == Response_Packet::ErrorCodes::NACK_ENROLL_FAILED) retval = 1;
nyengele 2:1b1c0502bb08 382 if (rp->Error == Response_Packet::ErrorCodes::NACK_BAD_FINGER) retval = 2;
nyengele 2:1b1c0502bb08 383 }
nyengele 2:1b1c0502bb08 384 delete rp;
nyengele 2:1b1c0502bb08 385 if (rp->ACK) return 0; else return retval;
nyengele 2:1b1c0502bb08 386 }
nyengele 2:1b1c0502bb08 387
nyengele 2:1b1c0502bb08 388 // Gets the Second scan of an enrollment
nyengele 2:1b1c0502bb08 389 // Return:
nyengele 2:1b1c0502bb08 390 // 0 - ACK
nyengele 2:1b1c0502bb08 391 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 392 // 2 - Bad finger
nyengele 2:1b1c0502bb08 393 // 3 - ID in use
nyengele 2:1b1c0502bb08 394 int FPScanner::Enroll2()
nyengele 2:1b1c0502bb08 395 {
nyengele 2:1b1c0502bb08 396 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 397 cp->Command = Command_Packet::Commands::Enroll2;
nyengele 2:1b1c0502bb08 398 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 399 delete cp;
nyengele 2:1b1c0502bb08 400 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 401 delete [] packetbytes;
nyengele 2:1b1c0502bb08 402 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 403 int retval = rp->IntFromParameter();
nyengele 2:1b1c0502bb08 404 if (retval < 200) retval = 3; else retval = 0;
nyengele 2:1b1c0502bb08 405 if (rp->ACK == false)
nyengele 2:1b1c0502bb08 406 {
nyengele 2:1b1c0502bb08 407 if (rp->Error == Response_Packet::ErrorCodes::NACK_ENROLL_FAILED) retval = 1;
nyengele 2:1b1c0502bb08 408 if (rp->Error == Response_Packet::ErrorCodes::NACK_BAD_FINGER) retval = 2;
nyengele 2:1b1c0502bb08 409 }
nyengele 2:1b1c0502bb08 410 delete rp;
nyengele 2:1b1c0502bb08 411 if (rp->ACK) return 0; else return retval;
nyengele 2:1b1c0502bb08 412 }
nyengele 2:1b1c0502bb08 413
nyengele 2:1b1c0502bb08 414 // Gets the Third scan of an enrollment
nyengele 2:1b1c0502bb08 415 // Finishes Enrollment
nyengele 2:1b1c0502bb08 416 // Return:
nyengele 2:1b1c0502bb08 417 // 0 - ACK
nyengele 2:1b1c0502bb08 418 // 1 - Enroll Failed
nyengele 2:1b1c0502bb08 419 // 2 - Bad finger
nyengele 2:1b1c0502bb08 420 // 3 - ID in use
nyengele 2:1b1c0502bb08 421 int FPScanner::Enroll3()
nyengele 2:1b1c0502bb08 422 {
nyengele 2:1b1c0502bb08 423 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 424 cp->Command = Command_Packet::Commands::Enroll3;
nyengele 2:1b1c0502bb08 425 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 426 delete cp;
nyengele 2:1b1c0502bb08 427 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 428 delete [] packetbytes;
nyengele 2:1b1c0502bb08 429 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 430 int retval = rp->IntFromParameter();
nyengele 2:1b1c0502bb08 431 if (retval < 200) retval = 3; else retval = 0;
nyengele 2:1b1c0502bb08 432 if (rp->ACK == false)
nyengele 2:1b1c0502bb08 433 {
nyengele 2:1b1c0502bb08 434 if (rp->Error == Response_Packet::ErrorCodes::NACK_ENROLL_FAILED) retval = 1;
nyengele 2:1b1c0502bb08 435 if (rp->Error == Response_Packet::ErrorCodes::NACK_BAD_FINGER) retval = 2;
nyengele 2:1b1c0502bb08 436 }
nyengele 2:1b1c0502bb08 437 delete rp;
nyengele 2:1b1c0502bb08 438 if (rp->ACK) return 0; else return retval;
nyengele 2:1b1c0502bb08 439 }
nyengele 2:1b1c0502bb08 440
nyengele 2:1b1c0502bb08 441 // Checks to see if a finger is pressed on the FPS
nyengele 2:1b1c0502bb08 442 // Return: true if finger pressed, false if not
nyengele 2:1b1c0502bb08 443 bool FPScanner::IsPressFinger()
nyengele 2:1b1c0502bb08 444 {
nyengele 2:1b1c0502bb08 445 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 446 cp->Command = Command_Packet::Commands::IsPressFinger;
nyengele 2:1b1c0502bb08 447 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 448 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 449 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 450 bool retval = false;
nyengele 2:1b1c0502bb08 451 int pval = rp->ParameterBytes[0];
nyengele 2:1b1c0502bb08 452 pval += rp->ParameterBytes[1];
nyengele 2:1b1c0502bb08 453 pval += rp->ParameterBytes[2];
nyengele 2:1b1c0502bb08 454 pval += rp->ParameterBytes[3];
nyengele 2:1b1c0502bb08 455 if (pval == 0) retval = true;
nyengele 2:1b1c0502bb08 456 delete rp;
nyengele 2:1b1c0502bb08 457 delete [] packetbytes;
nyengele 2:1b1c0502bb08 458 delete cp;
nyengele 2:1b1c0502bb08 459 return retval;
nyengele 2:1b1c0502bb08 460 }
nyengele 2:1b1c0502bb08 461
nyengele 2:1b1c0502bb08 462 // Deletes the specified ID (enrollment) from the database
nyengele 2:1b1c0502bb08 463 // Parameter: 0-199 (id number to be deleted)
nyengele 2:1b1c0502bb08 464 // Returns: true if successful, false if position invalid
nyengele 2:1b1c0502bb08 465 bool FPScanner::DeleteID(int id)
nyengele 2:1b1c0502bb08 466 {
nyengele 2:1b1c0502bb08 467 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 468 cp->Command = Command_Packet::Commands::DeleteID;
nyengele 2:1b1c0502bb08 469 cp->ParameterFromInt(id);
nyengele 2:1b1c0502bb08 470 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 471 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 472 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 473 bool retval = rp->ACK;
nyengele 2:1b1c0502bb08 474 delete rp;
nyengele 2:1b1c0502bb08 475 delete [] packetbytes;
nyengele 2:1b1c0502bb08 476 delete cp;
nyengele 2:1b1c0502bb08 477 return retval;
nyengele 2:1b1c0502bb08 478 }
nyengele 2:1b1c0502bb08 479
nyengele 2:1b1c0502bb08 480 // Deletes all IDs (enrollments) from the database
nyengele 2:1b1c0502bb08 481 // Returns: true if successful, false if db is empty
nyengele 2:1b1c0502bb08 482 bool FPScanner::DeleteAll()
nyengele 2:1b1c0502bb08 483 {
nyengele 2:1b1c0502bb08 484 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 485 cp->Command = Command_Packet::Commands::DeleteAll;
nyengele 2:1b1c0502bb08 486 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 487 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 488 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 489 bool retval = rp->ACK;
nyengele 2:1b1c0502bb08 490 delete rp;
nyengele 2:1b1c0502bb08 491 delete [] packetbytes;
nyengele 2:1b1c0502bb08 492 delete cp;
nyengele 2:1b1c0502bb08 493 return retval;
nyengele 2:1b1c0502bb08 494 }
nyengele 2:1b1c0502bb08 495
nyengele 2:1b1c0502bb08 496 // Checks the currently pressed finger against a specific ID
nyengele 2:1b1c0502bb08 497 // Parameter: 0-199 (id number to be checked)
nyengele 2:1b1c0502bb08 498 // Returns:
nyengele 2:1b1c0502bb08 499 // 0 - Verified OK (the correct finger)
nyengele 2:1b1c0502bb08 500 // 1 - Invalid Position
nyengele 2:1b1c0502bb08 501 // 2 - ID is not in use
nyengele 2:1b1c0502bb08 502 // 3 - Verified FALSE (not the correct finger)
nyengele 2:1b1c0502bb08 503 int FPScanner::Verify1_1(int id)
nyengele 2:1b1c0502bb08 504 {
nyengele 2:1b1c0502bb08 505 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 506 cp->Command = Command_Packet::Commands::Verify1_1;
nyengele 2:1b1c0502bb08 507 cp->ParameterFromInt(id);
nyengele 2:1b1c0502bb08 508 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 509 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 510 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 511 int retval = 0;
nyengele 2:1b1c0502bb08 512 if (rp->ACK == false)
nyengele 2:1b1c0502bb08 513 {
nyengele 2:1b1c0502bb08 514 if (rp->Error == Response_Packet::ErrorCodes::NACK_INVALID_POS) retval = 1;
nyengele 2:1b1c0502bb08 515 if (rp->Error == Response_Packet::ErrorCodes::NACK_IS_NOT_USED) retval = 2;
nyengele 2:1b1c0502bb08 516 if (rp->Error == Response_Packet::ErrorCodes::NACK_VERIFY_FAILED) retval = 3;
nyengele 2:1b1c0502bb08 517 }
nyengele 2:1b1c0502bb08 518 delete rp;
nyengele 2:1b1c0502bb08 519 delete [] packetbytes;
nyengele 2:1b1c0502bb08 520 delete cp;
nyengele 2:1b1c0502bb08 521 return retval;
nyengele 2:1b1c0502bb08 522 }
nyengele 2:1b1c0502bb08 523
nyengele 2:1b1c0502bb08 524 // Checks the currently pressed finger against all enrolled fingerprints
nyengele 2:1b1c0502bb08 525 // Returns:
nyengele 2:1b1c0502bb08 526 // 0-199: Verified against the specified ID (found, and here is the ID number)
nyengele 2:1b1c0502bb08 527 // 200: Failed to find the fingerprint in the database
nyengele 2:1b1c0502bb08 528 int FPScanner::Identify1_N()
nyengele 2:1b1c0502bb08 529 {
nyengele 2:1b1c0502bb08 530 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 531 cp->Command = Command_Packet::Commands::Identify1_N;
nyengele 2:1b1c0502bb08 532 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 533 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 534 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 535 int retval = rp->IntFromParameter();
nyengele 2:1b1c0502bb08 536 if (retval > 200) retval = 200;
nyengele 2:1b1c0502bb08 537 delete rp;
nyengele 2:1b1c0502bb08 538 delete [] packetbytes;
nyengele 2:1b1c0502bb08 539 delete cp;
nyengele 2:1b1c0502bb08 540 return retval;
nyengele 2:1b1c0502bb08 541 }
nyengele 2:1b1c0502bb08 542
nyengele 2:1b1c0502bb08 543 // Captures the currently pressed finger into onboard ram use this prior to other commands
nyengele 2:1b1c0502bb08 544 // Parameter: true for high quality image(slower), false for low quality image (faster)
nyengele 2:1b1c0502bb08 545 // Generally, use high quality for enrollment, and low quality for verification/identification
nyengele 2:1b1c0502bb08 546 // Returns: True if ok, false if no finger pressed
nyengele 2:1b1c0502bb08 547 bool FPScanner::CaptureFinger(bool highquality)
nyengele 2:1b1c0502bb08 548 {
nyengele 2:1b1c0502bb08 549 Command_Packet* cp = new Command_Packet();
nyengele 2:1b1c0502bb08 550 cp->Command = Command_Packet::Commands::CaptureFinger;
nyengele 2:1b1c0502bb08 551 if (highquality)
nyengele 2:1b1c0502bb08 552 {
nyengele 2:1b1c0502bb08 553 cp->ParameterFromInt(1);
nyengele 2:1b1c0502bb08 554 }
nyengele 2:1b1c0502bb08 555 else
nyengele 2:1b1c0502bb08 556 {
nyengele 2:1b1c0502bb08 557 cp->ParameterFromInt(0);
nyengele 2:1b1c0502bb08 558 }
nyengele 2:1b1c0502bb08 559 byte* packetbytes = cp->GetPacketBytes();
nyengele 2:1b1c0502bb08 560 SendCommand(packetbytes, 12);
nyengele 2:1b1c0502bb08 561 Response_Packet* rp = GetResponse();
nyengele 2:1b1c0502bb08 562 bool retval = rp->ACK;
nyengele 2:1b1c0502bb08 563 delete rp;
nyengele 2:1b1c0502bb08 564 delete [] packetbytes;
nyengele 2:1b1c0502bb08 565 delete cp;
nyengele 2:1b1c0502bb08 566 return retval;
nyengele 2:1b1c0502bb08 567
nyengele 2:1b1c0502bb08 568 }
nyengele 2:1b1c0502bb08 569
nyengele 2:1b1c0502bb08 570
nyengele 2:1b1c0502bb08 571 // Sends the command to the software serial channel
nyengele 2:1b1c0502bb08 572 void FPScanner::SendCommand(byte cmd[], int length)
nyengele 2:1b1c0502bb08 573 {
nyengele 2:1b1c0502bb08 574 for (int i = 0; i < length; i++) {
nyengele 2:1b1c0502bb08 575 _serial.putc(cmd[i]);
nyengele 2:1b1c0502bb08 576 }
nyengele 2:1b1c0502bb08 577 };
nyengele 2:1b1c0502bb08 578
nyengele 2:1b1c0502bb08 579 // Gets the response to the command from the software serial channel (and waits for it)
nyengele 2:1b1c0502bb08 580 Response_Packet* FPScanner::GetResponse()
nyengele 2:1b1c0502bb08 581 {
nyengele 2:1b1c0502bb08 582 byte firstbyte = 0;
nyengele 2:1b1c0502bb08 583 bool done = false;
nyengele 2:1b1c0502bb08 584 while (done == false)
nyengele 2:1b1c0502bb08 585 {
nyengele 2:1b1c0502bb08 586 firstbyte = (byte)_serial.getc();
nyengele 2:1b1c0502bb08 587 if (firstbyte == Response_Packet::COMMAND_START_CODE_1)
nyengele 2:1b1c0502bb08 588 {
nyengele 2:1b1c0502bb08 589 done = true;
nyengele 2:1b1c0502bb08 590 }
nyengele 2:1b1c0502bb08 591 }
nyengele 2:1b1c0502bb08 592 byte* resp = new byte[12];
nyengele 2:1b1c0502bb08 593 resp[0] = firstbyte;
nyengele 2:1b1c0502bb08 594 for (int i=1; i < 12; i++)
nyengele 2:1b1c0502bb08 595 {
nyengele 2:1b1c0502bb08 596 resp[i]= (byte) _serial.getc();
nyengele 2:1b1c0502bb08 597 }
nyengele 2:1b1c0502bb08 598 Response_Packet* rp = new Response_Packet(resp);
nyengele 2:1b1c0502bb08 599 delete [] resp;
nyengele 2:1b1c0502bb08 600 return rp;
nyengele 2:1b1c0502bb08 601 };