Version 1.0

Dependencies:   4DGL-uLCD-SE GT511C3 SDFileSystem mbed

Fork of GT511C3_demo by Eugene Gonzalez

Revision:
2:9a274c5defd2
Parent:
1:4c720110a2a8
--- 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