Version 1.0

Dependencies:   4DGL-uLCD-SE GT511C3 SDFileSystem mbed

Fork of GT511C3_demo by Eugene Gonzalez

Committer:
yoshua0207
Date:
Tue Dec 08 04:03:40 2015 +0000
Revision:
2:9a274c5defd2
Parent:
1:4c720110a2a8
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beanmachine44 0:4bbfc068d864 1 #include "mbed.h"
yoshua0207 2:9a274c5defd2 2 #include "uLCD_4DGL.h"
yoshua0207 2:9a274c5defd2 3 #include "SDFileSystem.h"
yoshua0207 2:9a274c5defd2 4 #include <string>
beanmachine44 0:4bbfc068d864 5 #include "GT511C3.hpp"
yoshua0207 2:9a274c5defd2 6
yoshua0207 2:9a274c5defd2 7 DigitalIn Up(p15);
yoshua0207 2:9a274c5defd2 8 DigitalIn Center(p16);
yoshua0207 2:9a274c5defd2 9 DigitalIn Left(p17);
yoshua0207 2:9a274c5defd2 10 DigitalIn Down(p18);
yoshua0207 2:9a274c5defd2 11 DigitalIn Right(p19);
yoshua0207 2:9a274c5defd2 12 uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
beanmachine44 0:4bbfc068d864 13 Serial debug(USBTX,USBRX);
yoshua0207 2:9a274c5defd2 14 SDFileSystem sd(p5, p6, p7, p8, "sd");
yoshua0207 2:9a274c5defd2 15 GT511C3 finger(p9, p10);
yoshua0207 2:9a274c5defd2 16
yoshua0207 2:9a274c5defd2 17 // ************** CONST VARIABLE **************** //
yoshua0207 2:9a274c5defd2 18 // Size
yoshua0207 2:9a274c5defd2 19 const int screen_width = 18;
yoshua0207 2:9a274c5defd2 20 const int screen_height = 14;
yoshua0207 2:9a274c5defd2 21 const int packet_size = 498;
yoshua0207 2:9a274c5defd2 22 const int id_size = 5;
yoshua0207 2:9a274c5defd2 23 const int sid_size = 9;
yoshua0207 2:9a274c5defd2 24 const int group_size = 200;
yoshua0207 2:9a274c5defd2 25 // Wait Time
yoshua0207 2:9a274c5defd2 26 const float scr_switch_wait = 1;
yoshua0207 2:9a274c5defd2 27 const float wait_time = 0.04;
yoshua0207 2:9a274c5defd2 28
yoshua0207 2:9a274c5defd2 29 // File Name
yoshua0207 2:9a274c5defd2 30 const char * owner_id_file = "owner_id_file.txt";
yoshua0207 2:9a274c5defd2 31 const char * sid_file = "sid_file.txt";
yoshua0207 2:9a274c5defd2 32
yoshua0207 2:9a274c5defd2 33 // VARIABLE
yoshua0207 2:9a274c5defd2 34 char group_id[id_size];
yoshua0207 2:9a274c5defd2 35 char sid_temp[sid_size];
yoshua0207 2:9a274c5defd2 36 int this_session[group_size];
yoshua0207 2:9a274c5defd2 37
yoshua0207 2:9a274c5defd2 38 //FUNCTIONS: UI
yoshua0207 2:9a274c5defd2 39 void left_arrow();
yoshua0207 2:9a274c5defd2 40 void clear_line(int line);
yoshua0207 2:9a274c5defd2 41 void display_center(int line, char * text);
yoshua0207 2:9a274c5defd2 42 void display_menu(int line, char * text);
yoshua0207 2:9a274c5defd2 43 void start_program();
yoshua0207 2:9a274c5defd2 44 void SCR_start_session();
yoshua0207 2:9a274c5defd2 45 void SCR_header();
yoshua0207 2:9a274c5defd2 46 int is_authenticated();
yoshua0207 2:9a274c5defd2 47 int is_enroll_more();
yoshua0207 2:9a274c5defd2 48 int SCR_auth_to_enroll_new_fingerprint(char * msg);
yoshua0207 2:9a274c5defd2 49 void SCR_enroll_new_fingerprint();
yoshua0207 2:9a274c5defd2 50 void enter_int_input(char * to_put, int size, int x, int y);
yoshua0207 2:9a274c5defd2 51 int db_exists(char * group_idDB);
yoshua0207 2:9a274c5defd2 52 void close_session();
yoshua0207 2:9a274c5defd2 53 void FUNC_update_right_arrow(int * selection, int size, int start);
yoshua0207 2:9a274c5defd2 54 void read_from_fingerprint_scanner();
yoshua0207 2:9a274c5defd2 55 void upload_to_scanner();
yoshua0207 2:9a274c5defd2 56 string getstudentIDfromIndex(int fid);
yoshua0207 2:9a274c5defd2 57 void send_email();
yoshua0207 2:9a274c5defd2 58 int get_enroll_id(const char * filename, char * sid);
yoshua0207 2:9a274c5defd2 59 void enroll_new_fingerprint(char* groupIDF, char* index);
yoshua0207 2:9a274c5defd2 60 int progress(int status, char *msg);
yoshua0207 2:9a274c5defd2 61 void add_new_fingerprint();
yoshua0207 2:9a274c5defd2 62
yoshua0207 2:9a274c5defd2 63 int main() {
yoshua0207 2:9a274c5defd2 64 while (1) {
yoshua0207 2:9a274c5defd2 65 start_program();
yoshua0207 2:9a274c5defd2 66 }
yoshua0207 2:9a274c5defd2 67 }
yoshua0207 2:9a274c5defd2 68
yoshua0207 2:9a274c5defd2 69 void start_program() {
yoshua0207 2:9a274c5defd2 70 int is_done = 0;
yoshua0207 2:9a274c5defd2 71 while (!is_done) {
yoshua0207 2:9a274c5defd2 72 uLCD.cls();
yoshua0207 2:9a274c5defd2 73 SCR_header();
yoshua0207 2:9a274c5defd2 74 if (is_authenticated()) {
yoshua0207 2:9a274c5defd2 75 SCR_start_session();
yoshua0207 2:9a274c5defd2 76 }
yoshua0207 2:9a274c5defd2 77 }
yoshua0207 2:9a274c5defd2 78 }
yoshua0207 2:9a274c5defd2 79
yoshua0207 2:9a274c5defd2 80 void SCR_start_session() {
yoshua0207 2:9a274c5defd2 81 upload_to_scanner();
yoshua0207 2:9a274c5defd2 82 int is_done = 0;
yoshua0207 2:9a274c5defd2 83 int selection;
yoshua0207 2:9a274c5defd2 84 while (!is_done) {
yoshua0207 2:9a274c5defd2 85 uLCD.cls();
yoshua0207 2:9a274c5defd2 86 display_center(1, "MENU");
yoshua0207 2:9a274c5defd2 87 display_menu(4, "Scan");
yoshua0207 2:9a274c5defd2 88 display_menu(5, "Enroll");
yoshua0207 2:9a274c5defd2 89 display_menu(6, "Close session");
yoshua0207 2:9a274c5defd2 90 FUNC_update_right_arrow(&selection, 3, 4);
yoshua0207 2:9a274c5defd2 91 if (selection == 0) {
yoshua0207 2:9a274c5defd2 92 debug.printf("Entering read_from_fingerprint_scanner()\n");
yoshua0207 2:9a274c5defd2 93 read_from_fingerprint_scanner();
yoshua0207 2:9a274c5defd2 94 } else if (selection == 1) {
yoshua0207 2:9a274c5defd2 95 debug.printf("Entering auth to enroll new()\n");
yoshua0207 2:9a274c5defd2 96 if (SCR_auth_to_enroll_new_fingerprint("Enroll New")) {
yoshua0207 2:9a274c5defd2 97 add_new_fingerprint();
yoshua0207 2:9a274c5defd2 98 }
yoshua0207 2:9a274c5defd2 99 } else if (selection == 2) {
yoshua0207 2:9a274c5defd2 100 is_done = SCR_auth_to_enroll_new_fingerprint("Close Session");
yoshua0207 2:9a274c5defd2 101 close_session();
yoshua0207 2:9a274c5defd2 102 } else {
yoshua0207 2:9a274c5defd2 103 uLCD.printf("YOW! NOT SUPPOSED TO GET HERE!");
yoshua0207 2:9a274c5defd2 104 }
yoshua0207 2:9a274c5defd2 105 }
yoshua0207 2:9a274c5defd2 106 }
yoshua0207 2:9a274c5defd2 107
yoshua0207 2:9a274c5defd2 108 void close_session() {
yoshua0207 2:9a274c5defd2 109 // remove the current id
yoshua0207 2:9a274c5defd2 110 // send information to the owner
yoshua0207 2:9a274c5defd2 111 // make sure the database is updated
yoshua0207 2:9a274c5defd2 112 }
yoshua0207 2:9a274c5defd2 113
yoshua0207 2:9a274c5defd2 114 /*
yoshua0207 2:9a274c5defd2 115 * Compare whether the currently scanned fingerprint is contained
yoshua0207 2:9a274c5defd2 116 * in the existing database. Set the this_session_id data structure
yoshua0207 2:9a274c5defd2 117 * to 1 if yes to notify that the person has signed in for this
yoshua0207 2:9a274c5defd2 118 * session.
yoshua0207 2:9a274c5defd2 119 *
yoshua0207 2:9a274c5defd2 120 * @param none
yoshua0207 2:9a274c5defd2 121 * @return none
yoshua0207 2:9a274c5defd2 122 */
yoshua0207 2:9a274c5defd2 123 void read_from_fingerprint_scanner() {
yoshua0207 2:9a274c5defd2 124 uLCD.cls();
yoshua0207 2:9a274c5defd2 125 display_center(1, "SCAN");
yoshua0207 2:9a274c5defd2 126 left_arrow();
yoshua0207 2:9a274c5defd2 127 int FID = -1;
yoshua0207 2:9a274c5defd2 128
yoshua0207 2:9a274c5defd2 129 //Talk to the fingerprint and get an ID back
yoshua0207 2:9a274c5defd2 130 display_center(5, "Place finger");
yoshua0207 2:9a274c5defd2 131 display_center(6, "on scanner!");
yoshua0207 2:9a274c5defd2 132 finger.CmosLed(1);
yoshua0207 2:9a274c5defd2 133 finger.WaitPress(1);
yoshua0207 2:9a274c5defd2 134 int is_cancelled = 0;
yoshua0207 2:9a274c5defd2 135 while(finger.Capture(1) != 0 && !is_cancelled) {
yoshua0207 2:9a274c5defd2 136 if (!Down) {
yoshua0207 2:9a274c5defd2 137 is_cancelled = 1;
yoshua0207 2:9a274c5defd2 138 finger.WaitPress(0);
yoshua0207 2:9a274c5defd2 139 finger.CmosLed(0);
yoshua0207 2:9a274c5defd2 140 }
yoshua0207 2:9a274c5defd2 141 }
yoshua0207 2:9a274c5defd2 142 clear_line(5);
yoshua0207 2:9a274c5defd2 143 clear_line(6);
yoshua0207 2:9a274c5defd2 144
yoshua0207 2:9a274c5defd2 145 if (!is_cancelled) {
yoshua0207 2:9a274c5defd2 146 // Identify!
yoshua0207 2:9a274c5defd2 147 FID = finger.Identify();
yoshua0207 2:9a274c5defd2 148
yoshua0207 2:9a274c5defd2 149 // debug.printf("ID = %d\n", FID);
yoshua0207 2:9a274c5defd2 150 display_center(5, "Remove finger");
yoshua0207 2:9a274c5defd2 151 display_center(6, "from scanner!");
yoshua0207 2:9a274c5defd2 152 finger.WaitPress(0);
yoshua0207 2:9a274c5defd2 153 finger.CmosLed(0);
yoshua0207 2:9a274c5defd2 154 if(FID!=-1)
yoshua0207 2:9a274c5defd2 155 {
yoshua0207 2:9a274c5defd2 156 display_center(8, "Student found!");
yoshua0207 2:9a274c5defd2 157
yoshua0207 2:9a274c5defd2 158 this_session[FID] = 1;
yoshua0207 2:9a274c5defd2 159 } else {
yoshua0207 2:9a274c5defd2 160 display_center(8, "Student not found");
yoshua0207 2:9a274c5defd2 161 }
yoshua0207 2:9a274c5defd2 162 wait(2);
yoshua0207 2:9a274c5defd2 163 if (FID >= 0 && FID < group_size) {
yoshua0207 2:9a274c5defd2 164 } else {
yoshua0207 2:9a274c5defd2 165 debug.printf("Sorry, ID failed!");
yoshua0207 2:9a274c5defd2 166 }
yoshua0207 2:9a274c5defd2 167 }
yoshua0207 2:9a274c5defd2 168 }
yoshua0207 2:9a274c5defd2 169
yoshua0207 2:9a274c5defd2 170 void send_email() {
yoshua0207 2:9a274c5defd2 171 string attended;
yoshua0207 2:9a274c5defd2 172 //char buffer[2000];
yoshua0207 2:9a274c5defd2 173
yoshua0207 2:9a274c5defd2 174
yoshua0207 2:9a274c5defd2 175 // attended = getstudentIDfromIndex(FID);
yoshua0207 2:9a274c5defd2 176 // debug.printf("Attended = %s",attended);
yoshua0207 2:9a274c5defd2 177 //allAttended = allAttended + "\n" + attended;
yoshua0207 2:9a274c5defd2 178 //debug.printf("All Attended %s",allAttended);
yoshua0207 2:9a274c5defd2 179 }
yoshua0207 2:9a274c5defd2 180
yoshua0207 2:9a274c5defd2 181 void clear_line(int line) {
yoshua0207 2:9a274c5defd2 182 uLCD.locate(0,line);
yoshua0207 2:9a274c5defd2 183 uLCD.printf(" ");
yoshua0207 2:9a274c5defd2 184 }
yoshua0207 2:9a274c5defd2 185
yoshua0207 2:9a274c5defd2 186 void upload_to_scanner() {
yoshua0207 2:9a274c5defd2 187 finger.DeleteAllIDs();
yoshua0207 2:9a274c5defd2 188
yoshua0207 2:9a274c5defd2 189 int indexScanner = 0;
yoshua0207 2:9a274c5defd2 190
yoshua0207 2:9a274c5defd2 191 string fileNameScan;
yoshua0207 2:9a274c5defd2 192 char indexC[3];
yoshua0207 2:9a274c5defd2 193 sprintf(indexC,"%d",indexScanner);
yoshua0207 2:9a274c5defd2 194 fileNameScan = "/sd/" + string(group_id) + "/" + indexC + ".bin";
yoshua0207 2:9a274c5defd2 195 const char* conv_fileScan = fileNameScan.c_str();
yoshua0207 2:9a274c5defd2 196 unsigned char data[packet_size];
yoshua0207 2:9a274c5defd2 197 // debug.printf("Attempt to find file %s\n", conv_fileScan);
yoshua0207 2:9a274c5defd2 198
yoshua0207 2:9a274c5defd2 199 FILE *templateFile = fopen(conv_fileScan, "r");
yoshua0207 2:9a274c5defd2 200 if(templateFile==NULL) {
yoshua0207 2:9a274c5defd2 201 debug.printf("File is NULL!\n");
yoshua0207 2:9a274c5defd2 202 }
yoshua0207 2:9a274c5defd2 203
yoshua0207 2:9a274c5defd2 204 while(templateFile != NULL) {
yoshua0207 2:9a274c5defd2 205 fread(data, sizeof(unsigned char), sizeof(data),templateFile);
yoshua0207 2:9a274c5defd2 206
yoshua0207 2:9a274c5defd2 207 if(finger.SetTemplate(indexScanner,data,packet_size)) {
yoshua0207 2:9a274c5defd2 208 // debug.printf("Attempt to find fileSetTemplate %s\n", conv_fileScan);
yoshua0207 2:9a274c5defd2 209 indexScanner++;
yoshua0207 2:9a274c5defd2 210 fclose(templateFile);
yoshua0207 2:9a274c5defd2 211 }
yoshua0207 2:9a274c5defd2 212 // debug.printf("Index Scanner = %d",indexScanner);
yoshua0207 2:9a274c5defd2 213 string fileNameScan;
yoshua0207 2:9a274c5defd2 214 char indexC[3];
yoshua0207 2:9a274c5defd2 215 sprintf(indexC,"%d",indexScanner);
yoshua0207 2:9a274c5defd2 216 fileNameScan = "/sd/" + string(group_id) + "/" + indexC + ".bin";
yoshua0207 2:9a274c5defd2 217 conv_fileScan = fileNameScan.c_str();
yoshua0207 2:9a274c5defd2 218
yoshua0207 2:9a274c5defd2 219 debug.printf("Attempt to find file %s\n", conv_fileScan);
yoshua0207 2:9a274c5defd2 220
yoshua0207 2:9a274c5defd2 221 FILE *templateFile = fopen(conv_fileScan, "r");
yoshua0207 2:9a274c5defd2 222 if(templateFile==NULL)
yoshua0207 2:9a274c5defd2 223 {
yoshua0207 2:9a274c5defd2 224 debug.printf("THERE IS NO FILE!\n");
yoshua0207 2:9a274c5defd2 225 break;
yoshua0207 2:9a274c5defd2 226 }
yoshua0207 2:9a274c5defd2 227 }
yoshua0207 2:9a274c5defd2 228 }
yoshua0207 2:9a274c5defd2 229
yoshua0207 2:9a274c5defd2 230 string getstudentIDfromIndex(int fid) {
yoshua0207 2:9a274c5defd2 231 char* studentIDN;
yoshua0207 2:9a274c5defd2 232 string fNSID = "/sd/" + string(group_id) + "/" + string(sid_file);
yoshua0207 2:9a274c5defd2 233 // debug.printf("fnSID = %s\n",fNSID);
yoshua0207 2:9a274c5defd2 234 const char* conv_fNSID = fNSID.c_str();
yoshua0207 2:9a274c5defd2 235 FILE *templateFile = fopen(conv_fNSID, "r");
yoshua0207 2:9a274c5defd2 236 if(templateFile == NULL)
yoshua0207 2:9a274c5defd2 237 {
yoshua0207 2:9a274c5defd2 238 debug.printf("Template File NULL!!\n");
yoshua0207 2:9a274c5defd2 239 }
yoshua0207 2:9a274c5defd2 240 fid = 2*fid + 1;
yoshua0207 2:9a274c5defd2 241 for (int i = 0; i < fid;i++)
yoshua0207 2:9a274c5defd2 242 {
yoshua0207 2:9a274c5defd2 243 fgets(studentIDN, 10, templateFile);
yoshua0207 2:9a274c5defd2 244 }
yoshua0207 2:9a274c5defd2 245 fclose(templateFile);
yoshua0207 2:9a274c5defd2 246 debug.printf("studentIDN = %s\n",studentIDN);
yoshua0207 2:9a274c5defd2 247 return string(studentIDN);
yoshua0207 2:9a274c5defd2 248 }
yoshua0207 2:9a274c5defd2 249
yoshua0207 2:9a274c5defd2 250 int SCR_auth_to_enroll_new_fingerprint(char * msg) {
yoshua0207 2:9a274c5defd2 251 uLCD.cls();
yoshua0207 2:9a274c5defd2 252 display_center(1, msg);
yoshua0207 2:9a274c5defd2 253 display_center(7, "Enter Group ID:");
yoshua0207 2:9a274c5defd2 254 char gid_temp[id_size];
yoshua0207 2:9a274c5defd2 255 enter_int_input(gid_temp, id_size, 0, 8);
yoshua0207 2:9a274c5defd2 256 if (strcmp(gid_temp, group_id) == 0) {
yoshua0207 2:9a274c5defd2 257 display_center(11, "Success!");
yoshua0207 2:9a274c5defd2 258 wait(scr_switch_wait);
yoshua0207 2:9a274c5defd2 259 return 1;
yoshua0207 2:9a274c5defd2 260 } else {
yoshua0207 2:9a274c5defd2 261 display_center(11, "Failed!");
yoshua0207 2:9a274c5defd2 262 wait(scr_switch_wait);
yoshua0207 2:9a274c5defd2 263 return 0;
yoshua0207 2:9a274c5defd2 264 }
yoshua0207 2:9a274c5defd2 265 }
yoshua0207 2:9a274c5defd2 266 /**
yoshua0207 2:9a274c5defd2 267 UI for the right arrow to choose which one of the options
yoshua0207 2:9a274c5defd2 268 that is chosen.
yoshua0207 2:9a274c5defd2 269 @param selection
yoshua0207 2:9a274c5defd2 270 @param size
yoshua0207 2:9a274c5defd2 271 @param start
yoshua0207 2:9a274c5defd2 272 */
yoshua0207 2:9a274c5defd2 273 void FUNC_update_right_arrow(int * selection, int size, int start) {
yoshua0207 2:9a274c5defd2 274 int x = 15;
yoshua0207 2:9a274c5defd2 275 int y = start;
yoshua0207 2:9a274c5defd2 276 uLCD.locate(x, y);
yoshua0207 2:9a274c5defd2 277 uLCD.printf(">>");
yoshua0207 2:9a274c5defd2 278 int is_entered = 0;
yoshua0207 2:9a274c5defd2 279 while(!is_entered) {
yoshua0207 2:9a274c5defd2 280 if (!Down) {
yoshua0207 2:9a274c5defd2 281 uLCD.locate(x, y);
yoshua0207 2:9a274c5defd2 282 uLCD.printf(" ");
yoshua0207 2:9a274c5defd2 283 y++;
yoshua0207 2:9a274c5defd2 284 if (y - start < 0) {
yoshua0207 2:9a274c5defd2 285 y = start;
yoshua0207 2:9a274c5defd2 286 } else if (y - start >= size) {
yoshua0207 2:9a274c5defd2 287 y = size + start - 1;
yoshua0207 2:9a274c5defd2 288 }
yoshua0207 2:9a274c5defd2 289 uLCD.locate(x, y);
yoshua0207 2:9a274c5defd2 290 uLCD.printf(">>");
yoshua0207 2:9a274c5defd2 291 } else if(!Up) {
yoshua0207 2:9a274c5defd2 292 uLCD.locate(x, y);
yoshua0207 2:9a274c5defd2 293 uLCD.printf(" ");
yoshua0207 2:9a274c5defd2 294 y--;
yoshua0207 2:9a274c5defd2 295 if (y - start < 0) {
yoshua0207 2:9a274c5defd2 296 y = start;
yoshua0207 2:9a274c5defd2 297 } else if (y - start >= size) {
yoshua0207 2:9a274c5defd2 298 y = size + start - 1;
yoshua0207 2:9a274c5defd2 299 }
yoshua0207 2:9a274c5defd2 300 uLCD.locate(x, y);
yoshua0207 2:9a274c5defd2 301 uLCD.printf(">>");
yoshua0207 2:9a274c5defd2 302 } else if(!Left) {
yoshua0207 2:9a274c5defd2 303 } else if(!Right) {
yoshua0207 2:9a274c5defd2 304 * selection = y - start;
yoshua0207 2:9a274c5defd2 305 is_entered = 1;
yoshua0207 2:9a274c5defd2 306 } else if (!Center) {
yoshua0207 2:9a274c5defd2 307 }
yoshua0207 2:9a274c5defd2 308 wait(wait_time);
yoshua0207 2:9a274c5defd2 309 }
yoshua0207 2:9a274c5defd2 310 }
yoshua0207 2:9a274c5defd2 311
yoshua0207 2:9a274c5defd2 312 void SCR_header() {
yoshua0207 2:9a274c5defd2 313 uLCD.cls();
yoshua0207 2:9a274c5defd2 314 uLCD.printf("******************\n");
yoshua0207 2:9a274c5defd2 315 uLCD.printf("FingerprintScanner \n");
yoshua0207 2:9a274c5defd2 316 uLCD.printf("******************\n\n");
yoshua0207 2:9a274c5defd2 317 }
yoshua0207 2:9a274c5defd2 318
yoshua0207 2:9a274c5defd2 319 int is_authenticated() {
yoshua0207 2:9a274c5defd2 320 display_center(7, "Enter Group ID:");
yoshua0207 2:9a274c5defd2 321 char gid_temp[id_size];
yoshua0207 2:9a274c5defd2 322 enter_int_input(gid_temp, id_size, 0, 8);
yoshua0207 2:9a274c5defd2 323 if (db_exists(gid_temp)) {
yoshua0207 2:9a274c5defd2 324 memcpy(group_id, gid_temp, id_size);
yoshua0207 2:9a274c5defd2 325 return 1;
yoshua0207 2:9a274c5defd2 326 } else {
yoshua0207 2:9a274c5defd2 327 return 0;
yoshua0207 2:9a274c5defd2 328 }
yoshua0207 2:9a274c5defd2 329 }
yoshua0207 2:9a274c5defd2 330
yoshua0207 2:9a274c5defd2 331 /**
yoshua0207 2:9a274c5defd2 332 Match the parameter whether it exists in
yoshua0207 2:9a274c5defd2 333 owner_id_file
yoshua0207 2:9a274c5defd2 334 @param group_id the string to be checked
yoshua0207 2:9a274c5defd2 335 @return 1 if group_id is in owner_id_file, 0 otherwise
yoshua0207 2:9a274c5defd2 336 */
yoshua0207 2:9a274c5defd2 337 int db_exists(char * group_idDB) {
yoshua0207 2:9a274c5defd2 338
yoshua0207 2:9a274c5defd2 339 FILE *file = fopen("/sd/owner_id_file.txt", "r");
yoshua0207 2:9a274c5defd2 340 // uLCD.printf("Opening file: %s\n",filename);
yoshua0207 2:9a274c5defd2 341 char buffer[6];
yoshua0207 2:9a274c5defd2 342 debug.printf("Finding database\n");
yoshua0207 2:9a274c5defd2 343 if(file==NULL)
yoshua0207 2:9a274c5defd2 344 {
yoshua0207 2:9a274c5defd2 345 debug.printf("No File!\n");
yoshua0207 2:9a274c5defd2 346 }
yoshua0207 2:9a274c5defd2 347 while (fgets(buffer, 6, file))
yoshua0207 2:9a274c5defd2 348 {
yoshua0207 2:9a274c5defd2 349 // debug.printf("Buffer = %s\n",buffer);
yoshua0207 2:9a274c5defd2 350 // debug.printf("Group iD = %s\n",group_id);
yoshua0207 2:9a274c5defd2 351 if (strcmp(group_idDB,buffer)==0) {
yoshua0207 2:9a274c5defd2 352 debug.printf("Found!\n");
yoshua0207 2:9a274c5defd2 353
yoshua0207 2:9a274c5defd2 354 fclose(file);
yoshua0207 2:9a274c5defd2 355 display_center(11, "Authenticated,");
yoshua0207 2:9a274c5defd2 356 display_center(12, "session starts!");
yoshua0207 2:9a274c5defd2 357 wait(scr_switch_wait);
yoshua0207 2:9a274c5defd2 358 return 1;
yoshua0207 2:9a274c5defd2 359 }
yoshua0207 2:9a274c5defd2 360 }
yoshua0207 2:9a274c5defd2 361 fclose(file);
yoshua0207 2:9a274c5defd2 362 display_center(11, "Not authenticated");
yoshua0207 2:9a274c5defd2 363 wait(scr_switch_wait);
beanmachine44 0:4bbfc068d864 364 return 0;
beanmachine44 0:4bbfc068d864 365 }
yoshua0207 2:9a274c5defd2 366
yoshua0207 2:9a274c5defd2 367 void enter_int_input(char * to_put, int size, int x, int y) {
yoshua0207 2:9a274c5defd2 368 x = (screen_width - size) / 2;
yoshua0207 2:9a274c5defd2 369 int current = 0;
yoshua0207 2:9a274c5defd2 370 int gid_int[size];
yoshua0207 2:9a274c5defd2 371 for (int i = 0; i < size; i++) {
yoshua0207 2:9a274c5defd2 372 gid_int[i] = 0;
yoshua0207 2:9a274c5defd2 373 }
yoshua0207 2:9a274c5defd2 374 int is_entered = 0;
yoshua0207 2:9a274c5defd2 375 while(!is_entered) {
yoshua0207 2:9a274c5defd2 376 for (int i = 0; i < size; i++) {
yoshua0207 2:9a274c5defd2 377 uLCD.locate(x + i, y);
yoshua0207 2:9a274c5defd2 378 uLCD.printf("%d", gid_int[i]);
yoshua0207 2:9a274c5defd2 379 }
yoshua0207 2:9a274c5defd2 380 if (!Down) {
yoshua0207 2:9a274c5defd2 381 if (gid_int[current] == 0) {
yoshua0207 2:9a274c5defd2 382 gid_int[current] += 10;
yoshua0207 2:9a274c5defd2 383 }
yoshua0207 2:9a274c5defd2 384 gid_int[current]--;
yoshua0207 2:9a274c5defd2 385 } else if(!Up) {
yoshua0207 2:9a274c5defd2 386 if (gid_int[current] == 9) {
yoshua0207 2:9a274c5defd2 387 gid_int[current] = 0;
yoshua0207 2:9a274c5defd2 388 } else {
yoshua0207 2:9a274c5defd2 389 gid_int[current]++;
yoshua0207 2:9a274c5defd2 390 }
yoshua0207 2:9a274c5defd2 391 } else if(!Left) {
yoshua0207 2:9a274c5defd2 392 current --;
yoshua0207 2:9a274c5defd2 393 } else if(!Right) {
yoshua0207 2:9a274c5defd2 394 current++;
yoshua0207 2:9a274c5defd2 395 } else if (!Center) {
yoshua0207 2:9a274c5defd2 396 for (int i = 0; i < size; i++) {
yoshua0207 2:9a274c5defd2 397 sprintf((to_put + i), "%d", gid_int[i]);
yoshua0207 2:9a274c5defd2 398 }
yoshua0207 2:9a274c5defd2 399 is_entered = 1;
yoshua0207 2:9a274c5defd2 400 }
yoshua0207 2:9a274c5defd2 401 wait(wait_time);
yoshua0207 2:9a274c5defd2 402 if (current < 0) {
yoshua0207 2:9a274c5defd2 403 current = 0;
yoshua0207 2:9a274c5defd2 404 } else if (current >= size) {
yoshua0207 2:9a274c5defd2 405 current = size - 1;
yoshua0207 2:9a274c5defd2 406 }
yoshua0207 2:9a274c5defd2 407 }
yoshua0207 2:9a274c5defd2 408 }
yoshua0207 2:9a274c5defd2 409
yoshua0207 2:9a274c5defd2 410 void left_arrow() {
yoshua0207 2:9a274c5defd2 411 uLCD.locate(1,1);
yoshua0207 2:9a274c5defd2 412 uLCD.printf("<<");
yoshua0207 2:9a274c5defd2 413 }
yoshua0207 2:9a274c5defd2 414
yoshua0207 2:9a274c5defd2 415 void add_new_fingerprint() {
yoshua0207 2:9a274c5defd2 416
yoshua0207 2:9a274c5defd2 417 string fileNameSID;
yoshua0207 2:9a274c5defd2 418 int cancelled = 0;
yoshua0207 2:9a274c5defd2 419
yoshua0207 2:9a274c5defd2 420 do {
yoshua0207 2:9a274c5defd2 421 uLCD.cls();
yoshua0207 2:9a274c5defd2 422 display_center(1, "ENROLL");
yoshua0207 2:9a274c5defd2 423 display_center(5, "Enter SID:");
yoshua0207 2:9a274c5defd2 424 char student_id[sid_size];
yoshua0207 2:9a274c5defd2 425 enter_int_input(student_id, sid_size, 0, 6);
yoshua0207 2:9a274c5defd2 426 // uLCD.printf("\n\nStudent Id = %s\n",student_id);
yoshua0207 2:9a274c5defd2 427 wait(wait_time);
yoshua0207 2:9a274c5defd2 428 fileNameSID = "/sd/" + string(group_id) + "/" + string(sid_file);
yoshua0207 2:9a274c5defd2 429 // uLCD.printf("Group ID 1 = %s\n",group_id);
yoshua0207 2:9a274c5defd2 430 const char* conv_fileSID = fileNameSID.c_str();
yoshua0207 2:9a274c5defd2 431 // uLCD.printf("FileNameSID File = %s\n",fileNameSID);
yoshua0207 2:9a274c5defd2 432 // uLCD.printf("Conv_fileSID = %s\n",conv_fileSID);
yoshua0207 2:9a274c5defd2 433
yoshua0207 2:9a274c5defd2 434 int eid = get_enroll_id(conv_fileSID, student_id);
yoshua0207 2:9a274c5defd2 435 if (eid == -1) {
yoshua0207 2:9a274c5defd2 436 display_center(11, "Failed");
yoshua0207 2:9a274c5defd2 437 uLCD.printf("\n\nEnroll Failed!\n");
yoshua0207 2:9a274c5defd2 438 } else {
yoshua0207 2:9a274c5defd2 439
yoshua0207 2:9a274c5defd2 440 char eidc[4];
yoshua0207 2:9a274c5defd2 441 sprintf(eidc, "%d",eid);
yoshua0207 2:9a274c5defd2 442
yoshua0207 2:9a274c5defd2 443 // uLCD.printf("Enroll ID = %s\n",eidc);
yoshua0207 2:9a274c5defd2 444 enroll_new_fingerprint(group_id, eidc);
yoshua0207 2:9a274c5defd2 445 // uLCD.printf("\n\nSuccess\n");
yoshua0207 2:9a274c5defd2 446 display_center(11, "Succeeded");
beanmachine44 0:4bbfc068d864 447 }
yoshua0207 2:9a274c5defd2 448 wait(1);
yoshua0207 2:9a274c5defd2 449 cancelled = is_enroll_more();
yoshua0207 2:9a274c5defd2 450 wait(2);
yoshua0207 2:9a274c5defd2 451 } while(!cancelled);
yoshua0207 2:9a274c5defd2 452 }
yoshua0207 2:9a274c5defd2 453
yoshua0207 2:9a274c5defd2 454 int is_enroll_more() {
yoshua0207 2:9a274c5defd2 455 uLCD.cls();
yoshua0207 2:9a274c5defd2 456 display_center(1, "MENU");
yoshua0207 2:9a274c5defd2 457 display_center(3, "Enroll more?");
yoshua0207 2:9a274c5defd2 458 display_menu(5, "Yes");
yoshua0207 2:9a274c5defd2 459 display_menu(6, "No");
yoshua0207 2:9a274c5defd2 460 int selection;
yoshua0207 2:9a274c5defd2 461 FUNC_update_right_arrow(&selection, 2, 5);
yoshua0207 2:9a274c5defd2 462 return selection;
yoshua0207 2:9a274c5defd2 463 }
yoshua0207 2:9a274c5defd2 464
yoshua0207 2:9a274c5defd2 465 void display_center(int line, char * text) {
yoshua0207 2:9a274c5defd2 466 int len = strlen(text) - 1;
yoshua0207 2:9a274c5defd2 467 int x = (screen_width - len) / 2;
yoshua0207 2:9a274c5defd2 468 uLCD.locate(x, line);
yoshua0207 2:9a274c5defd2 469 uLCD.printf(text);
yoshua0207 2:9a274c5defd2 470 }
yoshua0207 2:9a274c5defd2 471
yoshua0207 2:9a274c5defd2 472 void display_menu(int line, char * text) {
yoshua0207 2:9a274c5defd2 473 int x = 1;
yoshua0207 2:9a274c5defd2 474 uLCD.locate(x, line);
yoshua0207 2:9a274c5defd2 475 uLCD.printf(text);
yoshua0207 2:9a274c5defd2 476 }
yoshua0207 2:9a274c5defd2 477
yoshua0207 2:9a274c5defd2 478 int get_enroll_id(const char * filename, char * sid) {
yoshua0207 2:9a274c5defd2 479
yoshua0207 2:9a274c5defd2 480 debug.printf("GetEnrollID File %s\n",filename);
yoshua0207 2:9a274c5defd2 481 FILE *file = fopen(filename, "r");
yoshua0207 2:9a274c5defd2 482 if(file==NULL)
yoshua0207 2:9a274c5defd2 483 {
yoshua0207 2:9a274c5defd2 484 debug.printf("File NULL\n");
beanmachine44 0:4bbfc068d864 485 }
yoshua0207 2:9a274c5defd2 486 int index = 0;
yoshua0207 2:9a274c5defd2 487 int is_found = 0;
yoshua0207 2:9a274c5defd2 488 char buffer[10];
yoshua0207 2:9a274c5defd2 489 while (fgets(buffer, 10, file))
yoshua0207 2:9a274c5defd2 490 {
yoshua0207 2:9a274c5defd2 491 debug.printf("A\n");
yoshua0207 2:9a274c5defd2 492 debug.printf("Buffer = %s\n",buffer);
yoshua0207 2:9a274c5defd2 493 debug.printf("SID = %s\n",sid);
yoshua0207 2:9a274c5defd2 494 if (strcmp(buffer,sid) == 0)
yoshua0207 2:9a274c5defd2 495 {
yoshua0207 2:9a274c5defd2 496 debug.printf("Found at index %d!",index);
yoshua0207 2:9a274c5defd2 497 uLCD.locate(1,9);
yoshua0207 2:9a274c5defd2 498 uLCD.printf("Student ID found!\n");
yoshua0207 2:9a274c5defd2 499 uLCD.printf("Scan Finger 3X !\n");
yoshua0207 2:9a274c5defd2 500 fclose(file);
yoshua0207 2:9a274c5defd2 501 is_found = 1;
yoshua0207 2:9a274c5defd2 502 break;
yoshua0207 2:9a274c5defd2 503 }
yoshua0207 2:9a274c5defd2 504 index++;
yoshua0207 2:9a274c5defd2 505 }
yoshua0207 2:9a274c5defd2 506 fclose(file);
yoshua0207 2:9a274c5defd2 507 if(!is_found) {
yoshua0207 2:9a274c5defd2 508 return -1;
yoshua0207 2:9a274c5defd2 509 debug.printf("Invalid ID!");
yoshua0207 2:9a274c5defd2 510 } else {
yoshua0207 2:9a274c5defd2 511 return index/2;
yoshua0207 2:9a274c5defd2 512 }
yoshua0207 2:9a274c5defd2 513 }
yoshua0207 2:9a274c5defd2 514
yoshua0207 2:9a274c5defd2 515 /*
yoshua0207 2:9a274c5defd2 516 * Enroll new fingerprint into the existing class session
yoshua0207 2:9a274c5defd2 517 *
yoshua0207 2:9a274c5defd2 518 * @param
yoshua0207 2:9a274c5defd2 519 * @return none
yoshua0207 2:9a274c5defd2 520 */
yoshua0207 2:9a274c5defd2 521 void enroll_new_fingerprint(char* groupIDF, char* index) {
yoshua0207 2:9a274c5defd2 522 // uLCD.printf("Pick student ID :\n");
yoshua0207 2:9a274c5defd2 523 // char SID[10] = "903091468";
yoshua0207 2:9a274c5defd2 524 // char* index = "3";
yoshua0207 2:9a274c5defd2 525 int EnrollID = -1;
yoshua0207 2:9a274c5defd2 526
yoshua0207 2:9a274c5defd2 527 unsigned char datas[498];
yoshua0207 2:9a274c5defd2 528 debug.printf("Trying to Enroll\n");
yoshua0207 2:9a274c5defd2 529 finger.Enroll(EnrollID, progress);
yoshua0207 2:9a274c5defd2 530
yoshua0207 2:9a274c5defd2 531 finger.RecvData(datas, 498);
yoshua0207 2:9a274c5defd2 532 debug.printf("Index = %s, Int Index = %d",index, atoi(index));
yoshua0207 2:9a274c5defd2 533 // int indexINT;
yoshua0207 2:9a274c5defd2 534
yoshua0207 2:9a274c5defd2 535 finger.SetTemplate(atoi(index),datas,packet_size);
yoshua0207 2:9a274c5defd2 536 // uLCD.printf("RecvData = %d\n", finger.RecvData(data, packet_size));
yoshua0207 2:9a274c5defd2 537 string fileName;
yoshua0207 2:9a274c5defd2 538 fileName = "/sd/" + string(groupIDF) + "/" + string(index) + ".bin";
yoshua0207 2:9a274c5defd2 539
yoshua0207 2:9a274c5defd2 540 const char* conv_file = fileName.c_str();
yoshua0207 2:9a274c5defd2 541 debug.printf("Trying to read file %s\n",conv_file);
yoshua0207 2:9a274c5defd2 542 // make_bin_file(directory, groupID, index, fileName);
yoshua0207 2:9a274c5defd2 543 // uLCD.printf("Trying to read file %s\n",fileName);
yoshua0207 2:9a274c5defd2 544
yoshua0207 2:9a274c5defd2 545 // char* file = fileName;
yoshua0207 2:9a274c5defd2 546 FILE *templateFile = fopen(conv_file, "w");
yoshua0207 2:9a274c5defd2 547
yoshua0207 2:9a274c5defd2 548 if(templateFile == NULL) {
yoshua0207 2:9a274c5defd2 549 debug.printf("Could not open file for write\n");
yoshua0207 2:9a274c5defd2 550 }
yoshua0207 2:9a274c5defd2 551
yoshua0207 2:9a274c5defd2 552 fwrite(datas,sizeof(unsigned char), sizeof(datas),templateFile);
yoshua0207 2:9a274c5defd2 553
yoshua0207 2:9a274c5defd2 554 fclose(templateFile);
beanmachine44 0:4bbfc068d864 555
beanmachine44 1:4c720110a2a8 556
beanmachine44 0:4bbfc068d864 557 finger.CmosLed(1);
yoshua0207 2:9a274c5defd2 558 }
yoshua0207 2:9a274c5defd2 559
yoshua0207 2:9a274c5defd2 560 int progress(int status, char *msg) {
yoshua0207 2:9a274c5defd2 561 // uLCD.locate(1,10);
yoshua0207 2:9a274c5defd2 562 debug.printf("%s",msg);
yoshua0207 2:9a274c5defd2 563 return 0;
beanmachine44 0:4bbfc068d864 564 }