Version 1.0

Dependencies:   4DGL-uLCD-SE GT511C3 SDFileSystem mbed

Fork of GT511C3_demo by Eugene Gonzalez

Files at this revision

API Documentation at this revision

Comitter:
yoshua0207
Date:
Tue Dec 08 04:03:40 2015 +0000
Parent:
1:4c720110a2a8
Commit message:
Version 1.0

Changed in this revision

4DGL-uLCD-SE.lib Show annotated file Show diff for this revision Revisions of this file
GT511C3.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib 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
diff -r 4c720110a2a8 -r 9a274c5defd2 4DGL-uLCD-SE.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4DGL-uLCD-SE.lib	Tue Dec 08 04:03:40 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/4180_1/code/4DGL-uLCD-SE/#e39a44de229a
diff -r 4c720110a2a8 -r 9a274c5defd2 GT511C3.lib
--- a/GT511C3.lib	Tue Dec 01 20:49:44 2015 +0000
+++ b/GT511C3.lib	Tue Dec 08 04:03:40 2015 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/beanmachine44/code/GT511C3/#8fa6daf39d91
+https://developer.mbed.org/users/yoshua0207/code/GT511C3/#a3500c97e7d5
diff -r 4c720110a2a8 -r 9a274c5defd2 SDFileSystem.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Tue Dec 08 04:03:40 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/SDFileSystem/#c8f66dc765d4
diff -r 4c720110a2a8 -r 9a274c5defd2 main.cpp
--- a/main.cpp	Tue Dec 01 20:49:44 2015 +0000
+++ b/main.cpp	Tue Dec 08 04:03:40 2015 +0000
@@ -1,60 +1,564 @@
 #include "mbed.h"
+#include "uLCD_4DGL.h"
+#include "SDFileSystem.h"
+#include <string>
 #include "GT511C3.hpp"
- 
+
+DigitalIn Up(p15);
+DigitalIn Center(p16);
+DigitalIn Left(p17);
+DigitalIn Down(p18);
+DigitalIn Right(p19);
+uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
 Serial debug(USBTX,USBRX);
- 
-DigitalOut myled(LED1);
-GT511C3 finger(p9,p10);
- 
-int progress(int status,char *msg)
-{
-    debug.printf("%s",msg);
+SDFileSystem sd(p5, p6, p7, p8, "sd");
+GT511C3 finger(p9, p10);
+
+// ************** CONST VARIABLE **************** //
+// Size
+const int screen_width = 18;
+const int screen_height = 14;
+const int packet_size = 498;
+const int id_size = 5;
+const int sid_size = 9;
+const int group_size = 200;
+// Wait Time
+const float scr_switch_wait = 1;
+const float wait_time = 0.04;
+
+// File Name
+const char * owner_id_file = "owner_id_file.txt";
+const char * sid_file = "sid_file.txt";
+
+// VARIABLE
+char group_id[id_size];
+char sid_temp[sid_size];
+int this_session[group_size];
+
+//FUNCTIONS: UI
+void left_arrow();
+void clear_line(int line);
+void display_center(int line, char * text);
+void display_menu(int line, char * text);
+void start_program();
+void SCR_start_session();
+void SCR_header();
+int is_authenticated();
+int is_enroll_more();
+int SCR_auth_to_enroll_new_fingerprint(char * msg);
+void SCR_enroll_new_fingerprint();
+void enter_int_input(char * to_put, int size, int x, int y);
+int db_exists(char * group_idDB);
+void close_session();
+void FUNC_update_right_arrow(int * selection, int size, int start);
+void read_from_fingerprint_scanner();
+void upload_to_scanner();
+string getstudentIDfromIndex(int fid);
+void send_email();
+int get_enroll_id(const char * filename, char * sid);
+void enroll_new_fingerprint(char* groupIDF, char* index);
+int progress(int status, char *msg);
+void add_new_fingerprint();
+
+int main() {
+    while (1) {
+        start_program();
+    }
+}
+
+void start_program() {
+    int is_done = 0;
+    while (!is_done) {
+        uLCD.cls();
+        SCR_header();
+        if (is_authenticated()) {
+            SCR_start_session();
+        }
+    }
+}
+
+void SCR_start_session() {
+    upload_to_scanner();
+    int is_done = 0;
+    int selection;
+    while (!is_done) {
+        uLCD.cls();
+        display_center(1, "MENU");        
+        display_menu(4, "Scan");
+        display_menu(5, "Enroll");
+        display_menu(6, "Close session");
+        FUNC_update_right_arrow(&selection, 3, 4);
+        if (selection == 0) {
+            debug.printf("Entering read_from_fingerprint_scanner()\n");
+            read_from_fingerprint_scanner();
+        } else if (selection == 1) {
+            debug.printf("Entering auth to enroll new()\n");
+            if (SCR_auth_to_enroll_new_fingerprint("Enroll New")) {
+                add_new_fingerprint();
+            }
+        } else if (selection == 2) {
+            is_done = SCR_auth_to_enroll_new_fingerprint("Close Session");
+            close_session();
+        } else {
+            uLCD.printf("YOW! NOT SUPPOSED TO GET HERE!");
+        }
+    }
+}
+
+void close_session() {
+    // remove the current id
+    // send information to the owner
+    // make sure the database is updated
+}
+
+/*
+ * Compare whether the currently scanned fingerprint is contained
+ * in the existing database. Set the this_session_id data structure
+ * to 1 if yes to notify that the person has signed in for this
+ * session.
+ *
+ * @param none
+ * @return none
+ */
+void read_from_fingerprint_scanner() {
+    uLCD.cls();
+    display_center(1, "SCAN");
+    left_arrow();
+    int FID = -1;
+    
+    //Talk to the fingerprint and get an ID back
+    display_center(5, "Place finger");
+    display_center(6, "on scanner!");
+    finger.CmosLed(1);        
+    finger.WaitPress(1);
+    int is_cancelled = 0;
+    while(finger.Capture(1) != 0 && !is_cancelled) {
+        if (!Down) {
+            is_cancelled = 1;
+            finger.WaitPress(0);
+            finger.CmosLed(0);
+        }
+    }
+    clear_line(5);
+    clear_line(6);
+    
+    if (!is_cancelled) {
+        // Identify!
+        FID = finger.Identify();
+        
+    //        debug.printf("ID = %d\n", FID);
+        display_center(5, "Remove finger");
+        display_center(6, "from scanner!");
+        finger.WaitPress(0);
+        finger.CmosLed(0);
+        if(FID!=-1)
+        {
+            display_center(8, "Student found!");
+           
+            this_session[FID] = 1;
+        } else {
+            display_center(8, "Student not found");
+        }
+         wait(2);
+        if (FID >= 0 && FID < group_size) {
+        } else {
+            debug.printf("Sorry, ID failed!");
+        }
+    }
+}
+
+void send_email() {
+    string attended;
+    //char buffer[2000];
+    
+    
+//    attended = getstudentIDfromIndex(FID);
+//    debug.printf("Attended = %s",attended);
+    //allAttended = allAttended + "\n" + attended;
+    //debug.printf("All Attended %s",allAttended);
+}
+
+void clear_line(int line) {
+    uLCD.locate(0,line);
+    uLCD.printf("                  ");
+}
+
+void upload_to_scanner() {
+    finger.DeleteAllIDs();
+   
+    int indexScanner = 0;
+     
+    string fileNameScan;
+    char indexC[3];
+    sprintf(indexC,"%d",indexScanner);
+    fileNameScan = "/sd/" + string(group_id) + "/" + indexC + ".bin";
+    const char* conv_fileScan = fileNameScan.c_str();
+    unsigned char data[packet_size];
+//    debug.printf("Attempt to find file %s\n", conv_fileScan);
+     
+    FILE *templateFile = fopen(conv_fileScan, "r");
+    if(templateFile==NULL) {
+       debug.printf("File is NULL!\n");   
+    }
+     
+    while(templateFile != NULL) {
+        fread(data, sizeof(unsigned char), sizeof(data),templateFile);
+        
+        if(finger.SetTemplate(indexScanner,data,packet_size)) {
+//            debug.printf("Attempt to find fileSetTemplate %s\n", conv_fileScan);
+            indexScanner++;  
+            fclose(templateFile); 
+        }
+//        debug.printf("Index Scanner = %d",indexScanner);
+        string fileNameScan;
+        char indexC[3];
+        sprintf(indexC,"%d",indexScanner);
+        fileNameScan = "/sd/" + string(group_id) + "/" + indexC + ".bin";
+        conv_fileScan = fileNameScan.c_str();
+     
+        debug.printf("Attempt to find file %s\n", conv_fileScan);
+     
+        FILE *templateFile = fopen(conv_fileScan, "r");
+        if(templateFile==NULL)
+        {
+            debug.printf("THERE IS NO FILE!\n");
+            break;   
+        }
+    }
+}
+
+string getstudentIDfromIndex(int fid) {
+    char* studentIDN;
+    string fNSID = "/sd/" + string(group_id) + "/" + string(sid_file);
+//    debug.printf("fnSID = %s\n",fNSID);
+    const char* conv_fNSID = fNSID.c_str();
+    FILE *templateFile = fopen(conv_fNSID, "r");
+    if(templateFile == NULL)
+    {
+        debug.printf("Template File NULL!!\n");   
+    }
+    fid = 2*fid + 1;
+    for (int i = 0; i < fid;i++)
+    {
+           fgets(studentIDN, 10, templateFile);
+    }
+    fclose(templateFile);
+    debug.printf("studentIDN = %s\n",studentIDN);
+    return string(studentIDN);
+}
+
+int SCR_auth_to_enroll_new_fingerprint(char * msg) {
+    uLCD.cls();
+    display_center(1, msg);
+    display_center(7, "Enter Group ID:");
+    char gid_temp[id_size];
+    enter_int_input(gid_temp, id_size, 0, 8);
+    if (strcmp(gid_temp, group_id) == 0) {
+        display_center(11, "Success!");
+        wait(scr_switch_wait);
+        return 1;
+    } else {
+        display_center(11, "Failed!");
+        wait(scr_switch_wait);
+      return 0;
+    }    
+}
+/**
+ UI for the right arrow to choose which one of the options
+ that is chosen.
+ @param selection
+ @param size
+ @param start
+ */
+void FUNC_update_right_arrow(int * selection, int size, int start) {
+    int x = 15;
+    int y = start;
+    uLCD.locate(x, y);
+    uLCD.printf(">>");
+    int is_entered = 0;
+    while(!is_entered) {
+        if (!Down) {
+            uLCD.locate(x, y);
+            uLCD.printf("  ");
+            y++;
+            if (y - start < 0) {
+                y = start;
+            } else if (y - start >= size) {
+                y = size + start - 1;
+            }
+            uLCD.locate(x, y);
+            uLCD.printf(">>");
+        } else if(!Up) {
+            uLCD.locate(x, y);
+            uLCD.printf("  ");
+            y--;
+            if (y - start < 0) {
+                y = start;
+            } else if (y - start >= size) {
+                y = size + start - 1;
+            }
+            uLCD.locate(x, y);
+            uLCD.printf(">>");
+        } else if(!Left) {
+        } else if(!Right) {
+            * selection = y - start;
+            is_entered = 1;
+        } else if (!Center) {
+        }
+        wait(wait_time);
+    }    
+}
+
+void SCR_header() {
+    uLCD.cls();
+    uLCD.printf("******************\n");
+    uLCD.printf("FingerprintScanner \n");
+    uLCD.printf("******************\n\n");
+}
+
+int is_authenticated() {
+    display_center(7, "Enter Group ID:");
+    char gid_temp[id_size];
+    enter_int_input(gid_temp, id_size, 0, 8);
+    if (db_exists(gid_temp)) {
+        memcpy(group_id, gid_temp, id_size);
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+/**
+ Match the parameter whether it exists in
+ owner_id_file
+ @param group_id the string to be checked
+ @return 1 if group_id is in owner_id_file, 0 otherwise
+ */
+int db_exists(char * group_idDB) {
+    
+    FILE *file = fopen("/sd/owner_id_file.txt", "r");
+//    uLCD.printf("Opening file: %s\n",filename);
+    char buffer[6];
+    debug.printf("Finding database\n");
+    if(file==NULL)
+    {
+        debug.printf("No File!\n");
+    }
+    while (fgets(buffer, 6, file))
+    {
+//        debug.printf("Buffer = %s\n",buffer);
+//        debug.printf("Group iD = %s\n",group_id);
+        if (strcmp(group_idDB,buffer)==0) {
+            debug.printf("Found!\n");
+
+            fclose(file);
+            display_center(11, "Authenticated,");
+            display_center(12, "session starts!");
+            wait(scr_switch_wait);
+            return 1;
+        }
+    }
+    fclose(file);
+    display_center(11, "Not authenticated");
+    wait(scr_switch_wait);
     return 0;
 }
- 
-int main() {
-    int sts = 0;
-    int ID = 0;
- 
-    debug.format(8,Serial::None,1);
-    debug.baud(115200);
- 
-    debug.printf("Fingerprint reader module \"GT-511C3 / GT-511C31\" test program.\n");
-    debug.printf("Build: %s %s\n",__DATE__,__TIME__);
- 
-    debug.printf("Open\n");
-    sts = finger.Open();
-    debug.printf("sts = %d\n",sts);
-    if(sts == 0){
-        int i;
-        debug.printf("FirmwareVersion = %lx\n",finger.FirmwareVersion);
-        debug.printf("IsoAreaMaxSize = %ld\n",finger.IsoAreaMaxSize);
-        debug.printf("DeviceSerialNumber = ");
-        for(i = 0; i < sizeof(finger.DeviceSerialNumber);i++){
-            debug.printf("%02X",finger.DeviceSerialNumber[i]);
+
+void enter_int_input(char * to_put, int size, int x, int y) {
+    x = (screen_width - size) / 2;
+    int current = 0;
+    int gid_int[size];
+    for (int i = 0; i < size; i++) {
+        gid_int[i] = 0;
+    }
+    int is_entered = 0;
+    while(!is_entered) {
+        for (int i = 0; i < size; i++) {
+            uLCD.locate(x + i, y);
+            uLCD.printf("%d", gid_int[i]);
+        }
+        if (!Down) {
+            if (gid_int[current] == 0) {
+                gid_int[current] += 10;
+            }
+            gid_int[current]--;
+        } else if(!Up) {
+            if (gid_int[current] == 9) {
+                gid_int[current] = 0;
+            } else {
+                gid_int[current]++;
+            }
+        } else if(!Left) {
+            current --;
+        } else if(!Right) {
+            current++;
+        } else if (!Center) {
+            for (int i = 0; i < size; i++) {
+                sprintf((to_put + i), "%d", gid_int[i]);
+            }
+            is_entered = 1;
+        }
+        wait(wait_time);
+        if (current < 0) {
+            current = 0;
+        } else if (current >= size) {
+            current = size - 1;
+        }
+    }
+}
+
+void left_arrow() {
+    uLCD.locate(1,1);
+    uLCD.printf("<<");
+}
+
+void add_new_fingerprint() {
+   
+   string fileNameSID;
+   int cancelled = 0;
+   
+   do {
+        uLCD.cls();
+        display_center(1, "ENROLL");
+        display_center(5, "Enter SID:");
+        char student_id[sid_size];
+        enter_int_input(student_id, sid_size, 0, 6);
+//        uLCD.printf("\n\nStudent Id = %s\n",student_id);
+        wait(wait_time);
+        fileNameSID = "/sd/" + string(group_id) + "/" + string(sid_file);
+    //           uLCD.printf("Group ID 1 = %s\n",group_id);
+        const char* conv_fileSID = fileNameSID.c_str();
+    //           uLCD.printf("FileNameSID File = %s\n",fileNameSID);           
+    //           uLCD.printf("Conv_fileSID = %s\n",conv_fileSID);
+       
+        int eid = get_enroll_id(conv_fileSID, student_id);
+        if (eid == -1) {
+            display_center(11, "Failed");
+            uLCD.printf("\n\nEnroll Failed!\n");
+        } else {
+            
+            char eidc[4];
+            sprintf(eidc, "%d",eid);
+           
+//            uLCD.printf("Enroll ID = %s\n",eidc);
+            enroll_new_fingerprint(group_id, eidc);
+//            uLCD.printf("\n\nSuccess\n");
+            display_center(11, "Succeeded");
         }
-        debug.printf("\n");
+        wait(1);
+        cancelled = is_enroll_more();
+        wait(2);
+    } while(!cancelled);
+}
+
+int is_enroll_more() {
+    uLCD.cls();
+    display_center(1, "MENU");
+    display_center(3, "Enroll more?");
+    display_menu(5, "Yes");
+    display_menu(6, "No");
+    int selection;
+    FUNC_update_right_arrow(&selection, 2, 5);
+    return selection;
+}
+
+void display_center(int line, char * text) {
+    int len = strlen(text) - 1;
+    int x = (screen_width - len) / 2;
+    uLCD.locate(x, line);
+    uLCD.printf(text);
+}
+
+void display_menu(int line, char * text) {
+    int x = 1;
+    uLCD.locate(x, line);
+    uLCD.printf(text);
+}
+
+int get_enroll_id(const char * filename, char * sid) {
+
+    debug.printf("GetEnrollID File %s\n",filename);
+    FILE *file = fopen(filename, "r");
+    if(file==NULL)
+    {
+        debug.printf("File NULL\n");
     }
+    int index = 0;
+    int is_found = 0;
+    char buffer[10];
+    while (fgets(buffer, 10, file))
+    {
+        debug.printf("A\n");
+        debug.printf("Buffer = %s\n",buffer);
+        debug.printf("SID = %s\n",sid);
+        if (strcmp(buffer,sid) == 0)
+        {
+            debug.printf("Found at index %d!",index);
+            uLCD.locate(1,9);
+            uLCD.printf("Student ID found!\n");
+            uLCD.printf("Scan Finger 3X !\n");
+            fclose(file);
+            is_found = 1;
+            break;   
+        }
+        index++;    
+    }    
+    fclose(file);
+    if(!is_found) {
+        return -1;
+        debug.printf("Invalid ID!");
+    } else {
+        return index/2; 
+    }  
+}
+
+/*
+ * Enroll new fingerprint into the existing class session
+ *
+ * @param 
+ * @return none
+ */
+void enroll_new_fingerprint(char* groupIDF, char* index) {
+//    uLCD.printf("Pick student ID :\n");
+//    char SID[10] = "903091468";
+//    char* index = "3";
+    int EnrollID = -1;
+    
+    unsigned char datas[498];
+    debug.printf("Trying to Enroll\n");
+    finger.Enroll(EnrollID, progress);
+    
+    finger.RecvData(datas, 498);
+    debug.printf("Index = %s, Int Index = %d",index, atoi(index));
+   // int indexINT;
+    
+    finger.SetTemplate(atoi(index),datas,packet_size);
+//    uLCD.printf("RecvData = %d\n", finger.RecvData(data, packet_size));
+    string fileName;
+    fileName = "/sd/" + string(groupIDF) + "/" + string(index) + ".bin";
+    
+    const char* conv_file = fileName.c_str();
+    debug.printf("Trying to read file %s\n",conv_file);
+    // make_bin_file(directory, groupID, index, fileName);
+//    uLCD.printf("Trying to read file %s\n",fileName);
+    
+//    char* file = fileName;
+    FILE *templateFile = fopen(conv_file, "w");
+    
+    if(templateFile == NULL) {
+             debug.printf("Could not open file for write\n");
+        }
+    
+    fwrite(datas,sizeof(unsigned char), sizeof(datas),templateFile);
+
+    fclose(templateFile); 
  
  
-    int EnrollID = -1;
-    unsigned char data[498];
-    debug.printf("Deleting IDs = %d\n", finger.DeleteAllIDs());
-    finger.Enroll(EnrollID,progress);
-    debug.printf("RecvData = %d\n", finger.RecvData(data, 498));
-    debug.printf("Data[0-3] = %X %X %X %X\n", data[0], data[1],data[2],data[3]);
-    debug.printf("SetTemplate = %d\n", finger.SetTemplate(11,data,498));
-    
- 
     finger.CmosLed(1);
-    while(1) {
-        debug.printf("Press finger for Identify\n");
-        finger.WaitPress(1);
-        if(finger.Capture(1) != 0)
-            continue;
-        ID = finger.Identify();
-        debug.printf("ID = %d\n",ID);
-        debug.printf("Remove finger\n");
-        finger.WaitPress(0);
-    }
+}
+
+int progress(int status, char *msg) {
+//    uLCD.locate(1,10);
+    debug.printf("%s",msg);
+    return 0;
 }
\ No newline at end of file