Trung Nguyen
/
FINAL_PROJECT_4180
asdasdasd
Fork of FINAL_PROJECT_4180 by
FPScanner.cpp@14:ca57ad53761b, 2016-11-23 (annotated)
- Committer:
- xemnas214
- Date:
- Wed Nov 23 01:07:10 2016 +0000
- Revision:
- 14:ca57ad53761b
- Parent:
- 2:1b1c0502bb08
iotlockkkk;
Who changed what in which revision?
User | Revision | Line number | New 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 | }; |