Test Program of GT-511C3 / GT-511C31 Fingerprint reader module.

Dependencies:   GT511C3 mbed

GT-511-C31 指紋スキャンモジュールを mbed で動かしてみる

年末に大阪日本橋にあるデジットに行くと,指紋スキャンモジュールを販売していました.

値段は少しお高め(三千円〜八千円超え)ですが,使えると色々と応用が出来そうなので,GT-511-C31を購入して mbed で動かしてみました.

/media/uploads/tosihisa/2014-01-03_23.43.55.jpg

使い方とか

このページにある GT511C3test をそのままプログラムとしてインポートして下さい.

クラスライブラリ化していますので,クラスライブラリを使う場合は,以下からインポートして下さい. ドキュメントが追いついていなくてすみません.テストプログラムを参考にして頂けたらと思います...

Import libraryGT511C3

Class library of fingerprint reader module "GT-511C3 / GT-511C31"

テストプログラムでは,mbed と p28,p27 でシリアル通信します.Vin と GND はそのまま mbed の 3.3V と GND が使えます.

finger.Enroll(11,progress); この関数の呼び出しで,ID番号11番に指紋を登録します.同じ指紋を3回あてると登録できます.

その後,finger.Identify(); の呼び出しで指紋があたっていれば認識して,同じ指紋であればID番号11番を返すはずです. それ以外の指紋があたっていると -1 を返します.

注意点として,指紋の登録あるいは認識をする場合は,必ず CmosLed を点灯させて下さい.点灯させると指紋検出面が青く光ります.これが消灯していると,指紋の検出が出来ないようです.

雑感

指紋の認識は,感覚的にですが1秒ほどで認識します.10本の指それぞれで色々な角度であててみましたが,誤認識無く,登録した指紋があたるとIDが返ります.説明書によると,「違う指紋を同じ指紋として誤る確率:0.001%未満」と言うことなので,10万回に1回の確率で間違えそうですが,実用レベルだと感じます.

うまく使うと,mbed で生体認証チックな事ができそうですね.

/media/uploads/tosihisa/2014-01-03_23.44.18.jpg

指紋認証器モドキ(自動ログインのデモ)

これは,青mbed ではなく,lpclcd と指紋スキャンモジュールを組み合わせて,指紋認証器モドキを作って Mac に自動ログインするプロトタイプです.

lpclcd は mbed と同じように USBKeyboard の様に振る舞わせることが出来ますので,登録された指紋があたると,lpclcd で USBKeyboard::printf("パスワード\n"); を実行してあたかもパスワードがUSB Keyboard で打ち込まれたかの様に動作させています.

この指紋認証器モドキのメリットは,PCから見ればUSBキーボードの様に見えるので­,特別なドライバを必要としないことです.要するに「登録された指紋があたれば事前に­プログラムされた文字列を lpclcd が代わりにタイプしてくれる」だけです.

実用を考えた時,セキュリティ強度は 強くはないでしょう.このテストプログラムは,パスワードを生文字列で抱き込んでいる­ので,バイナリレベルで解析すればすぐに生文字列が分かってしまいます.なので指紋認­証器モドキです.

Committer:
tosihisa
Date:
Fri Jan 03 14:37:48 2014 +0000
Revision:
5:d3ebe6d1ed92
Parent:
4:3dd0f98e6f09
Child:
6:016ad8f480d3
Add Enroll function.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 4:3dd0f98e6f09 1 /**
tosihisa 4:3dd0f98e6f09 2 * @section LICENSE
tosihisa 4:3dd0f98e6f09 3 *
tosihisa 4:3dd0f98e6f09 4 * Copyright (c) 2013 @tosihisa, MIT License
tosihisa 4:3dd0f98e6f09 5 *
tosihisa 4:3dd0f98e6f09 6 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tosihisa 4:3dd0f98e6f09 7 * and associated documentation files (the "Software"), to deal in the Software without restriction,
tosihisa 4:3dd0f98e6f09 8 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
tosihisa 4:3dd0f98e6f09 9 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
tosihisa 4:3dd0f98e6f09 10 * furnished to do so, subject to the following conditions:
tosihisa 4:3dd0f98e6f09 11 *
tosihisa 4:3dd0f98e6f09 12 * The above copyright notice and this permission notice shall be included in all copies or
tosihisa 4:3dd0f98e6f09 13 * substantial portions of the Software.
tosihisa 4:3dd0f98e6f09 14 *
tosihisa 4:3dd0f98e6f09 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
tosihisa 4:3dd0f98e6f09 16 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
tosihisa 4:3dd0f98e6f09 17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
tosihisa 4:3dd0f98e6f09 18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tosihisa 4:3dd0f98e6f09 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tosihisa 4:3dd0f98e6f09 20 *
tosihisa 4:3dd0f98e6f09 21 * @section DESCRIPTION
tosihisa 4:3dd0f98e6f09 22 *
tosihisa 4:3dd0f98e6f09 23 * Fingerprint reader module "GT-511C3" class.
tosihisa 4:3dd0f98e6f09 24 *
tosihisa 4:3dd0f98e6f09 25 * http://www.adh-tech.com.tw/?22,gt-511c3-gt-511c31
tosihisa 4:3dd0f98e6f09 26 * http://www.adh-tech.com.tw/files/GT-511C3_datasheet_V1%201_20131127[1].pdf
tosihisa 4:3dd0f98e6f09 27 * https://www.sparkfun.com/products/11792
tosihisa 4:3dd0f98e6f09 28 * https://github.com/sparkfun/Fingerprint_Scanner-TTL/
tosihisa 4:3dd0f98e6f09 29 */
tosihisa 0:b11b455d4997 30
tosihisa 0:b11b455d4997 31 #include "mbed.h"
tosihisa 0:b11b455d4997 32 #include "GT511C3.h"
tosihisa 0:b11b455d4997 33
tosihisa 0:b11b455d4997 34 #define SET_AND_SUMADD(idx,val) sendbuf[idx]=((unsigned char)(val));sum += sendbuf[idx]
tosihisa 0:b11b455d4997 35
tosihisa 0:b11b455d4997 36 int GT511C3::Init(void)
tosihisa 0:b11b455d4997 37 {
tosihisa 0:b11b455d4997 38 baud(9600);
tosihisa 0:b11b455d4997 39 ClearLine();
tosihisa 0:b11b455d4997 40 return 0;
tosihisa 0:b11b455d4997 41 }
tosihisa 0:b11b455d4997 42
tosihisa 0:b11b455d4997 43 int GT511C3::SendCommand(unsigned long Parameter,unsigned short Command)
tosihisa 0:b11b455d4997 44 {
tosihisa 0:b11b455d4997 45 unsigned char sendbuf[12];
tosihisa 0:b11b455d4997 46 unsigned short sum = 0;
tosihisa 0:b11b455d4997 47 int idx = 0;
tosihisa 0:b11b455d4997 48 int i;
tosihisa 0:b11b455d4997 49
tosihisa 0:b11b455d4997 50 SET_AND_SUMADD(idx,0x55); idx++;
tosihisa 0:b11b455d4997 51 SET_AND_SUMADD(idx,0xAA); idx++;
tosihisa 0:b11b455d4997 52 SET_AND_SUMADD(idx,0x01); idx++;
tosihisa 0:b11b455d4997 53 SET_AND_SUMADD(idx,0x00); idx++;
tosihisa 0:b11b455d4997 54 SET_AND_SUMADD(idx,Parameter & 0xff); idx++;
tosihisa 0:b11b455d4997 55 SET_AND_SUMADD(idx,(Parameter >> 8) & 0xff); idx++;
tosihisa 0:b11b455d4997 56 SET_AND_SUMADD(idx,(Parameter >> 16) & 0xff); idx++;
tosihisa 0:b11b455d4997 57 SET_AND_SUMADD(idx,(Parameter >> 24) & 0xff); idx++;
tosihisa 0:b11b455d4997 58 SET_AND_SUMADD(idx,Command & 0xff); idx++;
tosihisa 0:b11b455d4997 59 SET_AND_SUMADD(idx,(Command >> 8) & 0xff); idx++;
tosihisa 0:b11b455d4997 60 sendbuf[idx] = sum & 0xff; idx++;
tosihisa 0:b11b455d4997 61 sendbuf[idx] = (sum >> 8) & 0xff; idx++;
tosihisa 0:b11b455d4997 62
tosihisa 0:b11b455d4997 63 for(i = 0;i < idx;i++){
tosihisa 0:b11b455d4997 64 while(!writeable());
tosihisa 0:b11b455d4997 65 putc(sendbuf[i]);
tosihisa 0:b11b455d4997 66 }
tosihisa 2:34a647292050 67 return 0;
tosihisa 0:b11b455d4997 68 }
tosihisa 0:b11b455d4997 69
tosihisa 0:b11b455d4997 70 int GT511C3::RecvResponse(unsigned long *Parameter,unsigned short *Response)
tosihisa 0:b11b455d4997 71 {
tosihisa 4:3dd0f98e6f09 72 const unsigned char fixedbuf[4] = { 0x55,0xAA,0x01,0x00 };
tosihisa 0:b11b455d4997 73 unsigned char buf[12];
tosihisa 0:b11b455d4997 74 unsigned short sum = 0;
tosihisa 0:b11b455d4997 75 int i;
tosihisa 0:b11b455d4997 76
tosihisa 0:b11b455d4997 77 *Parameter = 0;
tosihisa 0:b11b455d4997 78 *Response = CMD_Nack;
tosihisa 0:b11b455d4997 79
tosihisa 0:b11b455d4997 80 for(i = 0;i < sizeof(buf);i++){
tosihisa 0:b11b455d4997 81 while(!readable());
tosihisa 0:b11b455d4997 82 buf[i] = getc();
tosihisa 0:b11b455d4997 83 if(i < 9){
tosihisa 0:b11b455d4997 84 sum += buf[i];
tosihisa 0:b11b455d4997 85 }
tosihisa 4:3dd0f98e6f09 86 if(i < 4){
tosihisa 4:3dd0f98e6f09 87 if(buf[i] != fixedbuf[i]){
tosihisa 4:3dd0f98e6f09 88 return -1;
tosihisa 4:3dd0f98e6f09 89 }
tosihisa 4:3dd0f98e6f09 90 }
tosihisa 0:b11b455d4997 91 }
tosihisa 0:b11b455d4997 92 if(buf[10] != (sum & 0xff))
tosihisa 0:b11b455d4997 93 return -2;
tosihisa 0:b11b455d4997 94 if(buf[11] != ((sum >> 8) & 0xff))
tosihisa 0:b11b455d4997 95 return -2;
tosihisa 0:b11b455d4997 96
tosihisa 0:b11b455d4997 97 *Parameter = buf[7];
tosihisa 0:b11b455d4997 98 *Parameter = (*Parameter << 8) | buf[6];
tosihisa 0:b11b455d4997 99 *Parameter = (*Parameter << 8) | buf[5];
tosihisa 0:b11b455d4997 100 *Parameter = (*Parameter << 8) | buf[4];
tosihisa 0:b11b455d4997 101
tosihisa 0:b11b455d4997 102 *Response = buf[9];
tosihisa 0:b11b455d4997 103 *Response = (*Response << 8) | buf[8];
tosihisa 0:b11b455d4997 104
tosihisa 0:b11b455d4997 105 return 0;
tosihisa 0:b11b455d4997 106 }
tosihisa 0:b11b455d4997 107
tosihisa 4:3dd0f98e6f09 108 int GT511C3::RecvData(unsigned char *data,unsigned long size)
tosihisa 4:3dd0f98e6f09 109 {
tosihisa 4:3dd0f98e6f09 110 const unsigned char fixedbuf[4] = { 0x5A,0xA5,0x01,0x00 };
tosihisa 4:3dd0f98e6f09 111 unsigned short sum = 0;
tosihisa 4:3dd0f98e6f09 112 int i;
tosihisa 4:3dd0f98e6f09 113
tosihisa 4:3dd0f98e6f09 114 for(i = 0;i < size;i++){
tosihisa 4:3dd0f98e6f09 115 while(!readable());
tosihisa 4:3dd0f98e6f09 116 *(data + i) = getc();
tosihisa 4:3dd0f98e6f09 117 if(i < (size-2)){
tosihisa 4:3dd0f98e6f09 118 sum += *(data + i);
tosihisa 4:3dd0f98e6f09 119 }
tosihisa 4:3dd0f98e6f09 120 if(i < 4){
tosihisa 4:3dd0f98e6f09 121 if(*(data + i) != fixedbuf[i]){
tosihisa 4:3dd0f98e6f09 122 return -1;
tosihisa 4:3dd0f98e6f09 123 }
tosihisa 4:3dd0f98e6f09 124 }
tosihisa 4:3dd0f98e6f09 125 }
tosihisa 4:3dd0f98e6f09 126 if(*(data + size - 2) != (sum & 0xff))
tosihisa 4:3dd0f98e6f09 127 return -2;
tosihisa 4:3dd0f98e6f09 128 if(*(data + size - 1) != ((sum >> 8) & 0xff))
tosihisa 4:3dd0f98e6f09 129 return -2;
tosihisa 4:3dd0f98e6f09 130 return 0;
tosihisa 4:3dd0f98e6f09 131 }
tosihisa 4:3dd0f98e6f09 132
tosihisa 2:34a647292050 133 int GT511C3::SendRecv(unsigned short Command,unsigned long *Parameter,unsigned short *Response)
tosihisa 2:34a647292050 134 {
tosihisa 2:34a647292050 135 int sts;
tosihisa 4:3dd0f98e6f09 136 if((sts = SendCommand(*Parameter,Command)) == 0){
tosihisa 4:3dd0f98e6f09 137 *Parameter = 0;
tosihisa 4:3dd0f98e6f09 138 if((sts = RecvResponse(Parameter,Response)) != 0){
tosihisa 4:3dd0f98e6f09 139 *Response = CMD_Nack;
tosihisa 4:3dd0f98e6f09 140 *Parameter = NACK_IO_ERR;
tosihisa 4:3dd0f98e6f09 141 }
tosihisa 4:3dd0f98e6f09 142 }
tosihisa 4:3dd0f98e6f09 143 if(*Response == CMD_Nack){
tosihisa 4:3dd0f98e6f09 144 LastError = *Parameter;
tosihisa 2:34a647292050 145 }
tosihisa 2:34a647292050 146 return sts;
tosihisa 2:34a647292050 147 }
tosihisa 2:34a647292050 148
tosihisa 0:b11b455d4997 149 int GT511C3::ClearLine(void)
tosihisa 0:b11b455d4997 150 {
tosihisa 0:b11b455d4997 151 while(readable()){
tosihisa 0:b11b455d4997 152 (void)getc();
tosihisa 0:b11b455d4997 153 }
tosihisa 0:b11b455d4997 154 return 0;
tosihisa 0:b11b455d4997 155 }
tosihisa 0:b11b455d4997 156
tosihisa 4:3dd0f98e6f09 157 int GT511C3::Open(void)
tosihisa 4:3dd0f98e6f09 158 {
tosihisa 4:3dd0f98e6f09 159 unsigned long Parameter = 1;
tosihisa 4:3dd0f98e6f09 160 unsigned short Response = 0;
tosihisa 4:3dd0f98e6f09 161 unsigned char buf[4+sizeof(FirmwareVersion)+sizeof(IsoAreaMaxSize)+sizeof(DeviceSerialNumber)+2];
tosihisa 4:3dd0f98e6f09 162 int sts = 0;
tosihisa 4:3dd0f98e6f09 163
tosihisa 4:3dd0f98e6f09 164 if((sts = Init()) != 0)
tosihisa 4:3dd0f98e6f09 165 return -1;
tosihisa 4:3dd0f98e6f09 166
tosihisa 4:3dd0f98e6f09 167 sts = SendRecv(CMD_Open,&Parameter,&Response);
tosihisa 4:3dd0f98e6f09 168 if((sts != 0) || (Response != CMD_Ack)){
tosihisa 4:3dd0f98e6f09 169 return -1;
tosihisa 4:3dd0f98e6f09 170 }
tosihisa 4:3dd0f98e6f09 171 if((sts = RecvData(buf,sizeof(buf))) == 0){
tosihisa 4:3dd0f98e6f09 172 memcpy(&FirmwareVersion,&buf[4+0],sizeof(FirmwareVersion));
tosihisa 4:3dd0f98e6f09 173 memcpy(&IsoAreaMaxSize,&buf[4+sizeof(FirmwareVersion)],sizeof(IsoAreaMaxSize));
tosihisa 4:3dd0f98e6f09 174 memcpy(DeviceSerialNumber,&buf[4+sizeof(FirmwareVersion)+sizeof(IsoAreaMaxSize)],sizeof(DeviceSerialNumber));
tosihisa 4:3dd0f98e6f09 175 }
tosihisa 4:3dd0f98e6f09 176 return sts;
tosihisa 4:3dd0f98e6f09 177 }
tosihisa 4:3dd0f98e6f09 178
tosihisa 3:459a4f985a45 179 int GT511C3::WaitPress(int press)
tosihisa 3:459a4f985a45 180 {
tosihisa 3:459a4f985a45 181 while(IsPress() != press);
tosihisa 3:459a4f985a45 182 return 0;
tosihisa 3:459a4f985a45 183 }
tosihisa 3:459a4f985a45 184
tosihisa 3:459a4f985a45 185 int GT511C3::CmosLed(int onoff)
tosihisa 3:459a4f985a45 186 {
tosihisa 3:459a4f985a45 187 unsigned long Parameter = onoff & 1;
tosihisa 3:459a4f985a45 188 unsigned short Response = 0;
tosihisa 3:459a4f985a45 189 int sts = 0;
tosihisa 3:459a4f985a45 190
tosihisa 3:459a4f985a45 191 sts = SendRecv(CMD_CmosLed,&Parameter,&Response);
tosihisa 4:3dd0f98e6f09 192 if((sts != 0) || (Response != CMD_Ack)){
tosihisa 3:459a4f985a45 193 return -1;
tosihisa 4:3dd0f98e6f09 194 }
tosihisa 3:459a4f985a45 195 return 0;
tosihisa 3:459a4f985a45 196 }
tosihisa 3:459a4f985a45 197
tosihisa 3:459a4f985a45 198 int GT511C3::IsPress(void)
tosihisa 3:459a4f985a45 199 {
tosihisa 3:459a4f985a45 200 unsigned long Parameter = 0;
tosihisa 3:459a4f985a45 201 unsigned short Response = 0;
tosihisa 3:459a4f985a45 202 int sts = 0;
tosihisa 3:459a4f985a45 203 sts = SendRecv(CMD_IsPressFinger,&Parameter,&Response);
tosihisa 3:459a4f985a45 204 if((sts != 0) || (Response != CMD_Ack))
tosihisa 3:459a4f985a45 205 return 0;
tosihisa 3:459a4f985a45 206 if(Parameter != 0)
tosihisa 3:459a4f985a45 207 return 0;
tosihisa 3:459a4f985a45 208 return 1;
tosihisa 3:459a4f985a45 209 }
tosihisa 3:459a4f985a45 210
tosihisa 3:459a4f985a45 211 int GT511C3::Capture(int best)
tosihisa 3:459a4f985a45 212 {
tosihisa 3:459a4f985a45 213 unsigned long Parameter = best;
tosihisa 3:459a4f985a45 214 unsigned short Response = 0;
tosihisa 3:459a4f985a45 215 int sts = 0;
tosihisa 3:459a4f985a45 216
tosihisa 3:459a4f985a45 217 sts = SendRecv(CMD_CaptureFinger,&Parameter,&Response);
tosihisa 3:459a4f985a45 218 if((sts != 0) || (Response != CMD_Ack))
tosihisa 3:459a4f985a45 219 return -1;
tosihisa 3:459a4f985a45 220 return 0;
tosihisa 3:459a4f985a45 221 }
tosihisa 3:459a4f985a45 222
tosihisa 3:459a4f985a45 223 int GT511C3::Enroll_N(int N)
tosihisa 3:459a4f985a45 224 {
tosihisa 3:459a4f985a45 225 unsigned long Parameter = 0;
tosihisa 3:459a4f985a45 226 unsigned short Response = 0;
tosihisa 3:459a4f985a45 227 int sts = 0;
tosihisa 3:459a4f985a45 228 enum Command cmd;
tosihisa 3:459a4f985a45 229
tosihisa 3:459a4f985a45 230 switch(N){
tosihisa 3:459a4f985a45 231 default:
tosihisa 3:459a4f985a45 232 case 1: cmd = CMD_Enroll1; break;
tosihisa 3:459a4f985a45 233 case 2: cmd = CMD_Enroll2; break;
tosihisa 3:459a4f985a45 234 case 3: cmd = CMD_Enroll3; break;
tosihisa 3:459a4f985a45 235 }
tosihisa 3:459a4f985a45 236 sts = SendRecv(cmd,&Parameter,&Response);
tosihisa 3:459a4f985a45 237 if((sts != 0) || (Response != CMD_Ack))
tosihisa 3:459a4f985a45 238 return -1;
tosihisa 3:459a4f985a45 239 return 0;
tosihisa 3:459a4f985a45 240 }
tosihisa 3:459a4f985a45 241
tosihisa 3:459a4f985a45 242 int GT511C3::Identify(void)
tosihisa 2:34a647292050 243 {
tosihisa 2:34a647292050 244 unsigned long Parameter = 0;
tosihisa 2:34a647292050 245 unsigned short Response = 0;
tosihisa 2:34a647292050 246 int sts = 0;
tosihisa 2:34a647292050 247
tosihisa 3:459a4f985a45 248 sts = SendRecv(CMD_Identify,&Parameter,&Response);
tosihisa 3:459a4f985a45 249 if((sts != 0) || (Response != CMD_Ack))
tosihisa 3:459a4f985a45 250 return -1;
tosihisa 3:459a4f985a45 251 return Parameter;
tosihisa 2:34a647292050 252 }
tosihisa 4:3dd0f98e6f09 253
tosihisa 5:d3ebe6d1ed92 254 int GT511C3::Enroll(int ID,int (*progress)(int status,char *msg))
tosihisa 5:d3ebe6d1ed92 255 {
tosihisa 5:d3ebe6d1ed92 256 unsigned long Parameter = 0;
tosihisa 5:d3ebe6d1ed92 257 unsigned short Response = 0;
tosihisa 5:d3ebe6d1ed92 258 int sts = 0;
tosihisa 5:d3ebe6d1ed92 259
tosihisa 5:d3ebe6d1ed92 260 CmosLed(1);
tosihisa 5:d3ebe6d1ed92 261
tosihisa 5:d3ebe6d1ed92 262 while(1){
tosihisa 5:d3ebe6d1ed92 263 if((sts = (*progress)(1,"EnrollStart\n")) != 0)
tosihisa 5:d3ebe6d1ed92 264 return -9999;
tosihisa 5:d3ebe6d1ed92 265 Parameter = ID;
tosihisa 5:d3ebe6d1ed92 266 sts = SendRecv(CMD_EnrollStart,&Parameter,&Response);
tosihisa 5:d3ebe6d1ed92 267 if(sts != 0)
tosihisa 5:d3ebe6d1ed92 268 return sts;
tosihisa 5:d3ebe6d1ed92 269 if(Response != CMD_Ack)
tosihisa 5:d3ebe6d1ed92 270 return -100;
tosihisa 5:d3ebe6d1ed92 271
tosihisa 5:d3ebe6d1ed92 272 if((sts = (*progress)(0,"Remove finger\n")) != 0)
tosihisa 5:d3ebe6d1ed92 273 return -9999;
tosihisa 5:d3ebe6d1ed92 274 WaitPress(0);
tosihisa 5:d3ebe6d1ed92 275
tosihisa 5:d3ebe6d1ed92 276 while(1){
tosihisa 5:d3ebe6d1ed92 277 if((sts = (*progress)(10,"Press finger to Enroll (1st)\n")) != 0)
tosihisa 5:d3ebe6d1ed92 278 return -9999;
tosihisa 5:d3ebe6d1ed92 279 WaitPress(1);
tosihisa 5:d3ebe6d1ed92 280 if(Capture(1) == 0)
tosihisa 5:d3ebe6d1ed92 281 break;
tosihisa 5:d3ebe6d1ed92 282 }
tosihisa 5:d3ebe6d1ed92 283
tosihisa 5:d3ebe6d1ed92 284 if((sts = (*progress)(0,"Remove finger\n")) != 0)
tosihisa 5:d3ebe6d1ed92 285 return -9999;
tosihisa 5:d3ebe6d1ed92 286 if(Enroll_N(1) != 0)
tosihisa 5:d3ebe6d1ed92 287 continue;
tosihisa 5:d3ebe6d1ed92 288 WaitPress(0);
tosihisa 5:d3ebe6d1ed92 289
tosihisa 5:d3ebe6d1ed92 290 while(1){
tosihisa 5:d3ebe6d1ed92 291 if((sts = (*progress)(20,"Press finger to Enroll (2nd)\n")) != 0)
tosihisa 5:d3ebe6d1ed92 292 return -9999;
tosihisa 5:d3ebe6d1ed92 293 WaitPress(1);
tosihisa 5:d3ebe6d1ed92 294 if(Capture(1) == 0)
tosihisa 5:d3ebe6d1ed92 295 break;
tosihisa 5:d3ebe6d1ed92 296 }
tosihisa 5:d3ebe6d1ed92 297
tosihisa 5:d3ebe6d1ed92 298 if((sts = (*progress)(0,"Remove finger\n")) != 0)
tosihisa 5:d3ebe6d1ed92 299 return -9999;
tosihisa 5:d3ebe6d1ed92 300 if(Enroll_N(2) != 0)
tosihisa 5:d3ebe6d1ed92 301 continue;
tosihisa 5:d3ebe6d1ed92 302 WaitPress(0);
tosihisa 5:d3ebe6d1ed92 303
tosihisa 5:d3ebe6d1ed92 304 while(1){
tosihisa 5:d3ebe6d1ed92 305 if((sts = (*progress)(30,"Press finger to Enroll (3rd)\n")) != 0)
tosihisa 5:d3ebe6d1ed92 306 return -9999;
tosihisa 5:d3ebe6d1ed92 307 WaitPress(1);
tosihisa 5:d3ebe6d1ed92 308 if(Capture(1) == 0)
tosihisa 5:d3ebe6d1ed92 309 break;
tosihisa 5:d3ebe6d1ed92 310 }
tosihisa 5:d3ebe6d1ed92 311
tosihisa 5:d3ebe6d1ed92 312 if((sts = (*progress)(0,"Remove finger\n")) != 0)
tosihisa 5:d3ebe6d1ed92 313 return -9999;
tosihisa 5:d3ebe6d1ed92 314 if(Enroll_N(3) != 0)
tosihisa 5:d3ebe6d1ed92 315 continue;
tosihisa 5:d3ebe6d1ed92 316 WaitPress(0);
tosihisa 5:d3ebe6d1ed92 317
tosihisa 5:d3ebe6d1ed92 318 if((sts = (*progress)(100,"Enroll OK\n")) != 0)
tosihisa 5:d3ebe6d1ed92 319 return -9999;
tosihisa 5:d3ebe6d1ed92 320
tosihisa 5:d3ebe6d1ed92 321 break;
tosihisa 5:d3ebe6d1ed92 322 }
tosihisa 5:d3ebe6d1ed92 323 return 0;
tosihisa 5:d3ebe6d1ed92 324 }