Program for R306 fingerprint module

Dependencies:   FPC_R306_fingerprintmodule SDFileSystem WIZnetInterface mbed-src

Fork of GT511C3_TimeStamp_WIZwiki-W7500 by WIZnet

Files at this revision

API Documentation at this revision

Comitter:
tosihisa
Date:
Fri Jan 03 12:56:03 2014 +0000
Parent:
2:34a647292050
Child:
4:3dd0f98e6f09
Commit message:
Add Enroll and Identify!;

Changed in this revision

GT511C3.cpp Show annotated file Show diff for this revision Revisions of this file
GT511C3.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/GT511C3.cpp	Fri Jan 03 07:24:39 2014 +0000
+++ b/GT511C3.cpp	Fri Jan 03 12:56:03 2014 +0000
@@ -92,18 +92,76 @@
     return 0;
 }
 
-int GT511C3::WaitPress(void)
+int GT511C3::WaitPress(int press)
+{
+    while(IsPress() != press);
+    return 0;
+}
+
+int GT511C3::CmosLed(int onoff)
+{
+    unsigned long Parameter = onoff & 1;
+    unsigned short Response = 0;
+    int sts = 0;
+
+    sts = SendRecv(CMD_CmosLed,&Parameter,&Response);
+    if((sts != 0) || (Response != CMD_Ack))
+        return -1;
+    return 0;
+}
+
+int GT511C3::IsPress(void)
+{
+    unsigned long Parameter = 0;
+    unsigned short Response = 0;
+    int sts = 0;
+    sts = SendRecv(CMD_IsPressFinger,&Parameter,&Response);
+    if((sts != 0) || (Response != CMD_Ack))
+        return 0;
+    if(Parameter != 0)
+        return 0;
+    return 1;
+}
+
+int GT511C3::Capture(int best)
+{
+    unsigned long Parameter = best;
+    unsigned short Response = 0;
+    int sts = 0;
+
+    sts = SendRecv(CMD_CaptureFinger,&Parameter,&Response);
+    if((sts != 0) || (Response != CMD_Ack))
+        return -1;
+    return 0;
+}
+
+int GT511C3::Enroll_N(int N)
+{
+    unsigned long Parameter = 0;
+    unsigned short Response = 0;
+    int sts = 0;
+    enum Command cmd;
+
+    switch(N){
+        default:
+        case 1: cmd = CMD_Enroll1; break;
+        case 2: cmd = CMD_Enroll2; break;
+        case 3: cmd = CMD_Enroll3; break;
+    }
+    sts = SendRecv(cmd,&Parameter,&Response);
+    if((sts != 0) || (Response != CMD_Ack))
+        return -1;
+    return 0;
+}
+
+int GT511C3::Identify(void)
 {
     unsigned long Parameter = 0;
     unsigned short Response = 0;
     int sts = 0;
 
-    while(1){
-        sts = SendRecv(CMD_IsPressFinger,&Parameter,&Response);
-        if(sts != 0)
-            break;
-        if((Response == CMD_Ack) && (Parameter == 0))
-            break;
-    }
-    return sts;
+    sts = SendRecv(CMD_Identify,&Parameter,&Response);
+    if((sts != 0) || (Response != CMD_Ack))
+        return -1;
+    return Parameter;
 }
--- a/GT511C3.h	Fri Jan 03 07:24:39 2014 +0000
+++ b/GT511C3.h	Fri Jan 03 12:56:03 2014 +0000
@@ -62,5 +62,10 @@
     int RecvResponse(unsigned long *Parameter,unsigned short *Response);
     int SendRecv(unsigned short Command,unsigned long *Parameter,unsigned short *Response);
     int ClearLine(void);
-    int WaitPress(void);
+    int WaitPress(int press);
+    int CmosLed(int onoff);
+    int IsPress(void);
+    int Capture(int best);
+    int Enroll_N(int N);
+    int Identify(void);
 };
--- a/main.cpp	Fri Jan 03 07:24:39 2014 +0000
+++ b/main.cpp	Fri Jan 03 12:56:03 2014 +0000
@@ -13,16 +13,62 @@
     unsigned short Response = 0;
     int sts = 0;
 
-    debug.printf("CMD_EnrollStart\n");
-    Parameter = EnrollID;
-    sts = finger.SendRecv(GT511C3::CMD_EnrollStart,&Parameter,&Response);
-    debug.printf("sts = %d,Response=0x%04x Parameter=0x%08lx\n",sts,Response,Parameter);
-    if(sts != 0)
-        return sts;
-    if(Response != GT511C3::CMD_Ack)
-        return -100;
-    //
-    return sts;
+    debug.printf("EnrollStart\n");
+    finger.CmosLed(1);
+
+    while(1){
+        debug.printf("CMD_EnrollStart\n");
+        Parameter = EnrollID;
+        sts = finger.SendRecv(GT511C3::CMD_EnrollStart,&Parameter,&Response);
+        debug.printf("sts = %d,Response=0x%04x Parameter=0x%08lx\n",sts,Response,Parameter);
+        if(sts != 0)
+            return sts;
+        if(Response != GT511C3::CMD_Ack)
+            return -100;
+
+        debug.printf("Remove finger\n");
+        finger.WaitPress(0);
+
+        while(1){
+            debug.printf("Press finger to Enroll (1st)\n");
+            finger.WaitPress(1);
+            if(finger.Capture(1) == 0)
+                break;
+        }
+
+        debug.printf("Remove finger\n");
+        if(finger.Enroll_N(1) != 0)
+            continue;
+        finger.WaitPress(0);
+
+        while(1){
+            debug.printf("Press finger to Enroll (2nd)\n");
+            finger.WaitPress(1);
+            if(finger.Capture(1) == 0)
+                break;
+        }
+
+        debug.printf("Remove finger\n");
+        if(finger.Enroll_N(2) != 0)
+            continue;
+        finger.WaitPress(0);
+
+        while(1){
+            debug.printf("Press finger to Enroll (3rd)\n");
+            finger.WaitPress(1);
+            if(finger.Capture(1) == 0)
+                break;
+        }
+
+        debug.printf("Remove finger\n");
+        if(finger.Enroll_N(3) != 0)
+            continue;
+        finger.WaitPress(0);
+
+        debug.printf("Enroll OK!\n");
+        break;
+    }
+    return 0;
 }
 
 int main() {
@@ -31,6 +77,7 @@
     int sts = 0;
     int count = 0;
     int ispress;
+    int ID;
 
     debug.format(8,Serial::None,1);
     debug.baud(115200);
@@ -42,18 +89,19 @@
     sts = finger.SendRecv(GT511C3::CMD_Open,&Parameter,&Response);
     debug.printf("sts = %d,Response=0x%04x\n",sts,Response);
 
-        Parameter = 1;
-        sts = finger.SendRecv(GT511C3::CMD_CmosLed,&Parameter,&Response);
-        debug.printf("sts = %d,Response=0x%04x\n",sts,Response);
+    if(1){
+        Enroll();
+    }
+
+    finger.CmosLed(1);
     while(1) {
-        ispress = 0;
-        Parameter = 0;
-        sts = finger.SendRecv(GT511C3::CMD_IsPressFinger,&Parameter,&Response);
-        debug.printf("sts = %d,Response=0x%04x Parameter=0x%08lx\n",sts,Response,Parameter);
-        if(sts == 0){
-            if((Response == GT511C3::CMD_Ack) && (Parameter == 0)){
-                ispress = 1;
-            }
+        ispress = finger.IsPress();
+        debug.printf("IsPressFinger=%d\n",ispress);
+        if(ispress){
+            if(finger.Capture(1) != 0)
+                continue;
+            ID = finger.Identify();
+            debug.printf("ID = %d\n",ID); 
         }
 #if 0
         myled = 1;