Demo of Bluetooth Notification (with Fingerprint Approval)

Dependencies:   mbed Menu DRV2605 RPG RGBLED TextLCD GT511C3

Committer:
austinterrell
Date:
Tue Dec 03 19:42:19 2019 +0000
Revision:
0:5fa2d54bedb4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
austinterrell 0:5fa2d54bedb4 1 #include "mbed.h"
austinterrell 0:5fa2d54bedb4 2 #include "GT511C3.hpp"
austinterrell 0:5fa2d54bedb4 3 #include "TextLCD.h"
austinterrell 0:5fa2d54bedb4 4 #include "DRV2605.h"
austinterrell 0:5fa2d54bedb4 5 #include "RGBLED.h"
austinterrell 0:5fa2d54bedb4 6 #include "Menu.h"
austinterrell 0:5fa2d54bedb4 7 #include "Selection.h"
austinterrell 0:5fa2d54bedb4 8 #include "Navigator.h"
austinterrell 0:5fa2d54bedb4 9 using namespace std;
austinterrell 0:5fa2d54bedb4 10
austinterrell 0:5fa2d54bedb4 11 // Devices
austinterrell 0:5fa2d54bedb4 12 GT511C3 scanner(p9,p10);
austinterrell 0:5fa2d54bedb4 13 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
austinterrell 0:5fa2d54bedb4 14 RPG rpg(p21,p22,p23);
austinterrell 0:5fa2d54bedb4 15 RGBLed rgb(p24,p25,p26);
austinterrell 0:5fa2d54bedb4 16 DRV2605 haptics(p28, p27);
austinterrell 0:5fa2d54bedb4 17 Serial blue(p13, p14);
austinterrell 0:5fa2d54bedb4 18
austinterrell 0:5fa2d54bedb4 19 // Globals
austinterrell 0:5fa2d54bedb4 20 Navigator *navPtr;
austinterrell 0:5fa2d54bedb4 21 Menu mainMenu("1");
austinterrell 0:5fa2d54bedb4 22 Menu notificationsMenu("2");
austinterrell 0:5fa2d54bedb4 23 Menu settingsMenu("2");
austinterrell 0:5fa2d54bedb4 24 Menu notification("3");
austinterrell 0:5fa2d54bedb4 25 char text[16];
austinterrell 0:5fa2d54bedb4 26 char *textPtr = text;
austinterrell 0:5fa2d54bedb4 27 int userID = 1;
austinterrell 0:5fa2d54bedb4 28 bool notificationPresent = false;
austinterrell 0:5fa2d54bedb4 29 bool led = false;
austinterrell 0:5fa2d54bedb4 30 Ticker t;
austinterrell 0:5fa2d54bedb4 31
austinterrell 0:5fa2d54bedb4 32 // Prototypes
austinterrell 0:5fa2d54bedb4 33 void receive();
austinterrell 0:5fa2d54bedb4 34 void print(char *msg);
austinterrell 0:5fa2d54bedb4 35 int progress(int status, char *msg);
austinterrell 0:5fa2d54bedb4 36 void refreshMenu();
austinterrell 0:5fa2d54bedb4 37 void gotoMainMenu();
austinterrell 0:5fa2d54bedb4 38 bool verifyUser();
austinterrell 0:5fa2d54bedb4 39 void approve();
austinterrell 0:5fa2d54bedb4 40 void decline();
austinterrell 0:5fa2d54bedb4 41 void enroll();
austinterrell 0:5fa2d54bedb4 42 void deleteUsers();
austinterrell 0:5fa2d54bedb4 43 void blinker();
austinterrell 0:5fa2d54bedb4 44
austinterrell 0:5fa2d54bedb4 45 int main()
austinterrell 0:5fa2d54bedb4 46 {
austinterrell 0:5fa2d54bedb4 47 // Locals
austinterrell 0:5fa2d54bedb4 48 unsigned char data[498]; // Fingerprint template
austinterrell 0:5fa2d54bedb4 49
austinterrell 0:5fa2d54bedb4 50 /* DEVICE SETUP */
austinterrell 0:5fa2d54bedb4 51
austinterrell 0:5fa2d54bedb4 52 // Setup haptic feedback
austinterrell 0:5fa2d54bedb4 53 haptics.init(3.3);
austinterrell 0:5fa2d54bedb4 54 haptics.load_waveform_sequence(45,65);
austinterrell 0:5fa2d54bedb4 55 haptics.play();
austinterrell 0:5fa2d54bedb4 56 while(haptics.i2cReadByte(GO));
austinterrell 0:5fa2d54bedb4 57
austinterrell 0:5fa2d54bedb4 58 // Configure Bluetooth
austinterrell 0:5fa2d54bedb4 59 blue.baud(9600);
austinterrell 0:5fa2d54bedb4 60 blue.attach(&receive);
austinterrell 0:5fa2d54bedb4 61
austinterrell 0:5fa2d54bedb4 62 // Start blinker
austinterrell 0:5fa2d54bedb4 63 t.attach(&blinker, 0.4);
austinterrell 0:5fa2d54bedb4 64
austinterrell 0:5fa2d54bedb4 65 /* MENU SETUP */
austinterrell 0:5fa2d54bedb4 66
austinterrell 0:5fa2d54bedb4 67 // Make menus
austinterrell 0:5fa2d54bedb4 68 notificationsMenu.add(Selection(NULL, &mainMenu, " None..."));
austinterrell 0:5fa2d54bedb4 69
austinterrell 0:5fa2d54bedb4 70 // Build settings menu
austinterrell 0:5fa2d54bedb4 71 settingsMenu.add(Selection(&enroll, NULL, " Enroll User"));
austinterrell 0:5fa2d54bedb4 72 settingsMenu.add(Selection(&deleteUsers, NULL, " Delete Users"));
austinterrell 0:5fa2d54bedb4 73 settingsMenu.add(Selection(NULL, &mainMenu, " Main Menu"));
austinterrell 0:5fa2d54bedb4 74
austinterrell 0:5fa2d54bedb4 75 // Build main Menu
austinterrell 0:5fa2d54bedb4 76 mainMenu.add(Selection(NULL, &notificationsMenu, " Notification"));
austinterrell 0:5fa2d54bedb4 77 mainMenu.add(Selection(NULL, &settingsMenu, " Settings"));
austinterrell 0:5fa2d54bedb4 78
austinterrell 0:5fa2d54bedb4 79 // Add notification options
austinterrell 0:5fa2d54bedb4 80 notification.add(Selection(&approve, NULL, " Approve"));
austinterrell 0:5fa2d54bedb4 81 notification.add(Selection(&decline, NULL, " Decline"));
austinterrell 0:5fa2d54bedb4 82 notification.add(Selection(NULL, &mainMenu, " Cancel"));
austinterrell 0:5fa2d54bedb4 83
austinterrell 0:5fa2d54bedb4 84 // Build navigator to browse menus
austinterrell 0:5fa2d54bedb4 85 Navigator navigator(&mainMenu, rpg, &lcd);
austinterrell 0:5fa2d54bedb4 86 navPtr = &navigator;
austinterrell 0:5fa2d54bedb4 87
austinterrell 0:5fa2d54bedb4 88 /* FINGERPRINT SCANNER SETUP */
austinterrell 0:5fa2d54bedb4 89
austinterrell 0:5fa2d54bedb4 90 // Start fingerprint scanner
austinterrell 0:5fa2d54bedb4 91 if(scanner.Open() != 0) {
austinterrell 0:5fa2d54bedb4 92 lcd.cls();
austinterrell 0:5fa2d54bedb4 93 lcd.printf("Fingerprint Scanner FAILED.\n\r");
austinterrell 0:5fa2d54bedb4 94 exit(0);
austinterrell 0:5fa2d54bedb4 95 }
austinterrell 0:5fa2d54bedb4 96
austinterrell 0:5fa2d54bedb4 97 // Deletes All Fingerprints enrolled in the database
austinterrell 0:5fa2d54bedb4 98 scanner.DeleteAllIDs();
austinterrell 0:5fa2d54bedb4 99
austinterrell 0:5fa2d54bedb4 100 // Turn on scanner
austinterrell 0:5fa2d54bedb4 101 scanner.CmosLed(1);
austinterrell 0:5fa2d54bedb4 102
austinterrell 0:5fa2d54bedb4 103 // Add inital user
austinterrell 0:5fa2d54bedb4 104 print("Scan New\nUser's Finger...");
austinterrell 0:5fa2d54bedb4 105 scanner.WaitPress(1);
austinterrell 0:5fa2d54bedb4 106 scanner.Enroll(-1, progress);
austinterrell 0:5fa2d54bedb4 107 scanner.RecvData(data, 498);
austinterrell 0:5fa2d54bedb4 108 scanner.SetTemplate(userID, data, 498);
austinterrell 0:5fa2d54bedb4 109
austinterrell 0:5fa2d54bedb4 110 // Turn off scanner
austinterrell 0:5fa2d54bedb4 111 scanner.CmosLed(0);
austinterrell 0:5fa2d54bedb4 112
austinterrell 0:5fa2d54bedb4 113 // Show menu
austinterrell 0:5fa2d54bedb4 114 refreshMenu();
austinterrell 0:5fa2d54bedb4 115
austinterrell 0:5fa2d54bedb4 116 // Poll navigator for menu
austinterrell 0:5fa2d54bedb4 117 while(1) {
austinterrell 0:5fa2d54bedb4 118 navigator.poll();
austinterrell 0:5fa2d54bedb4 119 }
austinterrell 0:5fa2d54bedb4 120 }
austinterrell 0:5fa2d54bedb4 121
austinterrell 0:5fa2d54bedb4 122 // Reads bluetooth and posts notification
austinterrell 0:5fa2d54bedb4 123 void receive()
austinterrell 0:5fa2d54bedb4 124 {
austinterrell 0:5fa2d54bedb4 125 // Locals
austinterrell 0:5fa2d54bedb4 126 int i = 1;
austinterrell 0:5fa2d54bedb4 127
austinterrell 0:5fa2d54bedb4 128 // Make first char a space
austinterrell 0:5fa2d54bedb4 129 memset(text, 0, sizeof(text));
austinterrell 0:5fa2d54bedb4 130 text[0] = ' ';
austinterrell 0:5fa2d54bedb4 131
austinterrell 0:5fa2d54bedb4 132 // Read serial from bluetooth
austinterrell 0:5fa2d54bedb4 133 while(blue.readable() && (i < 15)) {
austinterrell 0:5fa2d54bedb4 134 text[i] += blue.getc();
austinterrell 0:5fa2d54bedb4 135 i++;
austinterrell 0:5fa2d54bedb4 136 wait(0.1);
austinterrell 0:5fa2d54bedb4 137 }
austinterrell 0:5fa2d54bedb4 138 text[i] = '\0'; // Null terminate
austinterrell 0:5fa2d54bedb4 139
austinterrell 0:5fa2d54bedb4 140 // Post notification
austinterrell 0:5fa2d54bedb4 141 notificationsMenu.selections[0].childMenu = &notification;
austinterrell 0:5fa2d54bedb4 142 notificationsMenu.selections[0].selText = text;
austinterrell 0:5fa2d54bedb4 143
austinterrell 0:5fa2d54bedb4 144 // Show notificaiton for a couple seconds
austinterrell 0:5fa2d54bedb4 145 lcd.cls();
austinterrell 0:5fa2d54bedb4 146 lcd.locate(0,0);
austinterrell 0:5fa2d54bedb4 147 lcd.printf("%s\n", text);
austinterrell 0:5fa2d54bedb4 148 rgb.write(0.5, 0.0, 0.5);
austinterrell 0:5fa2d54bedb4 149 haptics.play();
austinterrell 0:5fa2d54bedb4 150 wait(2);
austinterrell 0:5fa2d54bedb4 151 refreshMenu();
austinterrell 0:5fa2d54bedb4 152 notificationPresent = true;
austinterrell 0:5fa2d54bedb4 153 }
austinterrell 0:5fa2d54bedb4 154
austinterrell 0:5fa2d54bedb4 155 // Print message to LCD
austinterrell 0:5fa2d54bedb4 156 void print(char *msg)
austinterrell 0:5fa2d54bedb4 157 {
austinterrell 0:5fa2d54bedb4 158 lcd.cls();
austinterrell 0:5fa2d54bedb4 159 lcd.printf("%s\n", msg);
austinterrell 0:5fa2d54bedb4 160 }
austinterrell 0:5fa2d54bedb4 161
austinterrell 0:5fa2d54bedb4 162 // Prints enrollment progress
austinterrell 0:5fa2d54bedb4 163 int progress(int status, char *msg)
austinterrell 0:5fa2d54bedb4 164 {
austinterrell 0:5fa2d54bedb4 165 lcd.cls();
austinterrell 0:5fa2d54bedb4 166 lcd.printf("%s\n", msg);
austinterrell 0:5fa2d54bedb4 167 return 0;
austinterrell 0:5fa2d54bedb4 168 }
austinterrell 0:5fa2d54bedb4 169
austinterrell 0:5fa2d54bedb4 170 // Re-display menu
austinterrell 0:5fa2d54bedb4 171 void refreshMenu()
austinterrell 0:5fa2d54bedb4 172 {
austinterrell 0:5fa2d54bedb4 173 navPtr->printMenu();
austinterrell 0:5fa2d54bedb4 174 navPtr->printCursor();
austinterrell 0:5fa2d54bedb4 175 }
austinterrell 0:5fa2d54bedb4 176
austinterrell 0:5fa2d54bedb4 177 // Go to main menu
austinterrell 0:5fa2d54bedb4 178 void gotoMainMenu()
austinterrell 0:5fa2d54bedb4 179 {
austinterrell 0:5fa2d54bedb4 180 navPtr->activeMenu = &notificationsMenu;
austinterrell 0:5fa2d54bedb4 181 navPtr->bottom = navPtr->activeMenu->selections.size();
austinterrell 0:5fa2d54bedb4 182 navPtr->cursorPos = 0;
austinterrell 0:5fa2d54bedb4 183 navPtr->cursorLine = 1;
austinterrell 0:5fa2d54bedb4 184 navPtr->printMenu();
austinterrell 0:5fa2d54bedb4 185 navPtr->printCursor();
austinterrell 0:5fa2d54bedb4 186 }
austinterrell 0:5fa2d54bedb4 187
austinterrell 0:5fa2d54bedb4 188 // Read finger and verify identity
austinterrell 0:5fa2d54bedb4 189 bool verifyUser()
austinterrell 0:5fa2d54bedb4 190 {
austinterrell 0:5fa2d54bedb4 191 // Locals
austinterrell 0:5fa2d54bedb4 192 int attempts = 0;
austinterrell 0:5fa2d54bedb4 193
austinterrell 0:5fa2d54bedb4 194 // Turn on scanner
austinterrell 0:5fa2d54bedb4 195 scanner.CmosLed(1);
austinterrell 0:5fa2d54bedb4 196
austinterrell 0:5fa2d54bedb4 197 // Allow 3 attempts
austinterrell 0:5fa2d54bedb4 198 while (attempts < 3) {
austinterrell 0:5fa2d54bedb4 199 print("Please Verify\nIdentity...");
austinterrell 0:5fa2d54bedb4 200 scanner.WaitPress(1);
austinterrell 0:5fa2d54bedb4 201 scanner.Capture(1);
austinterrell 0:5fa2d54bedb4 202
austinterrell 0:5fa2d54bedb4 203 // If finger in database
austinterrell 0:5fa2d54bedb4 204 if (scanner.Identify() != -1)
austinterrell 0:5fa2d54bedb4 205 {
austinterrell 0:5fa2d54bedb4 206 print("Thank You.\nRemove Finger...");
austinterrell 0:5fa2d54bedb4 207 if (scanner.IsPress()) scanner.WaitPress(0);
austinterrell 0:5fa2d54bedb4 208
austinterrell 0:5fa2d54bedb4 209 // Turn off
austinterrell 0:5fa2d54bedb4 210 scanner.CmosLed(0);
austinterrell 0:5fa2d54bedb4 211 return true;
austinterrell 0:5fa2d54bedb4 212 }
austinterrell 0:5fa2d54bedb4 213 else
austinterrell 0:5fa2d54bedb4 214 {
austinterrell 0:5fa2d54bedb4 215 print("User Unknown.\nRemove Finger...");
austinterrell 0:5fa2d54bedb4 216 if (scanner.IsPress()) scanner.WaitPress(0);
austinterrell 0:5fa2d54bedb4 217 attempts++;
austinterrell 0:5fa2d54bedb4 218 }
austinterrell 0:5fa2d54bedb4 219 }
austinterrell 0:5fa2d54bedb4 220
austinterrell 0:5fa2d54bedb4 221 // Turn off
austinterrell 0:5fa2d54bedb4 222 scanner.CmosLed(0);
austinterrell 0:5fa2d54bedb4 223 return false;
austinterrell 0:5fa2d54bedb4 224
austinterrell 0:5fa2d54bedb4 225 }
austinterrell 0:5fa2d54bedb4 226
austinterrell 0:5fa2d54bedb4 227 // Approve notification
austinterrell 0:5fa2d54bedb4 228 void approve()
austinterrell 0:5fa2d54bedb4 229 {
austinterrell 0:5fa2d54bedb4 230 // Turn off blinker
austinterrell 0:5fa2d54bedb4 231 notificationPresent = false;
austinterrell 0:5fa2d54bedb4 232
austinterrell 0:5fa2d54bedb4 233 // If identity checks-out
austinterrell 0:5fa2d54bedb4 234 if (verifyUser())
austinterrell 0:5fa2d54bedb4 235 {
austinterrell 0:5fa2d54bedb4 236 // Send approval
austinterrell 0:5fa2d54bedb4 237 blue.puts("Approved.\n");
austinterrell 0:5fa2d54bedb4 238
austinterrell 0:5fa2d54bedb4 239 // Feedback
austinterrell 0:5fa2d54bedb4 240 print("Approved.\nThank You.");
austinterrell 0:5fa2d54bedb4 241 rgb.write(0.0, 1.0, 0.0);
austinterrell 0:5fa2d54bedb4 242 wait(2);
austinterrell 0:5fa2d54bedb4 243 rgb.write(0.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 244 }
austinterrell 0:5fa2d54bedb4 245 else
austinterrell 0:5fa2d54bedb4 246 {
austinterrell 0:5fa2d54bedb4 247 // Send error
austinterrell 0:5fa2d54bedb4 248 blue.puts("User Identity Unknown.\n");
austinterrell 0:5fa2d54bedb4 249
austinterrell 0:5fa2d54bedb4 250 // Feedback
austinterrell 0:5fa2d54bedb4 251 print("Error.\nUser Unknown.");
austinterrell 0:5fa2d54bedb4 252 rgb.write(1.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 253 wait(2);
austinterrell 0:5fa2d54bedb4 254 rgb.write(0.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 255 }
austinterrell 0:5fa2d54bedb4 256
austinterrell 0:5fa2d54bedb4 257 // Clear notification
austinterrell 0:5fa2d54bedb4 258 notificationsMenu.selections[0].childMenu = &mainMenu;
austinterrell 0:5fa2d54bedb4 259 notificationsMenu.selections[0].selText = " None...";
austinterrell 0:5fa2d54bedb4 260 gotoMainMenu();
austinterrell 0:5fa2d54bedb4 261 }
austinterrell 0:5fa2d54bedb4 262
austinterrell 0:5fa2d54bedb4 263 // Decline notification
austinterrell 0:5fa2d54bedb4 264 void decline()
austinterrell 0:5fa2d54bedb4 265 {
austinterrell 0:5fa2d54bedb4 266 // Turn off blinker
austinterrell 0:5fa2d54bedb4 267 notificationPresent = false;
austinterrell 0:5fa2d54bedb4 268
austinterrell 0:5fa2d54bedb4 269 // If identity checks-out
austinterrell 0:5fa2d54bedb4 270 if (verifyUser())
austinterrell 0:5fa2d54bedb4 271 {
austinterrell 0:5fa2d54bedb4 272 // Send declination
austinterrell 0:5fa2d54bedb4 273 blue.puts("Declined.\n");
austinterrell 0:5fa2d54bedb4 274
austinterrell 0:5fa2d54bedb4 275 // Feedback
austinterrell 0:5fa2d54bedb4 276 print("Declined.\nThank You.");
austinterrell 0:5fa2d54bedb4 277 rgb.write(0.0, 1.0, 0.0);
austinterrell 0:5fa2d54bedb4 278 wait(2);
austinterrell 0:5fa2d54bedb4 279 rgb.write(0.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 280 }
austinterrell 0:5fa2d54bedb4 281 else
austinterrell 0:5fa2d54bedb4 282 {
austinterrell 0:5fa2d54bedb4 283 // Send error
austinterrell 0:5fa2d54bedb4 284 blue.puts("User Identity Unknown.\n");
austinterrell 0:5fa2d54bedb4 285
austinterrell 0:5fa2d54bedb4 286 // Feedback
austinterrell 0:5fa2d54bedb4 287 print("Error.\nUser Unknown.");
austinterrell 0:5fa2d54bedb4 288 rgb.write(1.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 289 wait(2);
austinterrell 0:5fa2d54bedb4 290 rgb.write(0.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 291 }
austinterrell 0:5fa2d54bedb4 292
austinterrell 0:5fa2d54bedb4 293 // Clear notification
austinterrell 0:5fa2d54bedb4 294 notificationsMenu.selections[0].childMenu = &mainMenu;
austinterrell 0:5fa2d54bedb4 295 notificationsMenu.selections[0].selText = " None...";
austinterrell 0:5fa2d54bedb4 296 gotoMainMenu();
austinterrell 0:5fa2d54bedb4 297 }
austinterrell 0:5fa2d54bedb4 298
austinterrell 0:5fa2d54bedb4 299 // Add a new user to the scanner
austinterrell 0:5fa2d54bedb4 300 void enroll()
austinterrell 0:5fa2d54bedb4 301 {
austinterrell 0:5fa2d54bedb4 302 unsigned char data[498]; // Fingerprint template
austinterrell 0:5fa2d54bedb4 303
austinterrell 0:5fa2d54bedb4 304 if (verifyUser()) {
austinterrell 0:5fa2d54bedb4 305
austinterrell 0:5fa2d54bedb4 306 // New user
austinterrell 0:5fa2d54bedb4 307 userID++;
austinterrell 0:5fa2d54bedb4 308
austinterrell 0:5fa2d54bedb4 309 // Turn on scanner
austinterrell 0:5fa2d54bedb4 310 scanner.CmosLed(1);
austinterrell 0:5fa2d54bedb4 311
austinterrell 0:5fa2d54bedb4 312 // Add user
austinterrell 0:5fa2d54bedb4 313 print("Scan New\nUser's Finger...");
austinterrell 0:5fa2d54bedb4 314 scanner.WaitPress(1);
austinterrell 0:5fa2d54bedb4 315 scanner.Enroll(-1, progress);
austinterrell 0:5fa2d54bedb4 316 scanner.RecvData(data, 498);
austinterrell 0:5fa2d54bedb4 317 scanner.SetTemplate(userID, data, 498);
austinterrell 0:5fa2d54bedb4 318
austinterrell 0:5fa2d54bedb4 319 // Turn off scanner
austinterrell 0:5fa2d54bedb4 320 scanner.CmosLed(0);
austinterrell 0:5fa2d54bedb4 321 }
austinterrell 0:5fa2d54bedb4 322
austinterrell 0:5fa2d54bedb4 323 refreshMenu();
austinterrell 0:5fa2d54bedb4 324 }
austinterrell 0:5fa2d54bedb4 325
austinterrell 0:5fa2d54bedb4 326 // Remove all users from scanner
austinterrell 0:5fa2d54bedb4 327 void deleteUsers()
austinterrell 0:5fa2d54bedb4 328 {
austinterrell 0:5fa2d54bedb4 329 unsigned char data[498]; // Fingerprint template
austinterrell 0:5fa2d54bedb4 330
austinterrell 0:5fa2d54bedb4 331 if (verifyUser()) {
austinterrell 0:5fa2d54bedb4 332
austinterrell 0:5fa2d54bedb4 333 // Reset user IDs
austinterrell 0:5fa2d54bedb4 334 userID = 1;
austinterrell 0:5fa2d54bedb4 335
austinterrell 0:5fa2d54bedb4 336 // Deletes All Fingerprints enrolled in the database
austinterrell 0:5fa2d54bedb4 337 scanner.DeleteAllIDs();
austinterrell 0:5fa2d54bedb4 338
austinterrell 0:5fa2d54bedb4 339 // Turn on scanner
austinterrell 0:5fa2d54bedb4 340 scanner.CmosLed(1);
austinterrell 0:5fa2d54bedb4 341
austinterrell 0:5fa2d54bedb4 342 // Add inital user
austinterrell 0:5fa2d54bedb4 343 print("Scan New\nUser's Finger...");
austinterrell 0:5fa2d54bedb4 344 scanner.WaitPress(1);
austinterrell 0:5fa2d54bedb4 345 scanner.Enroll(-1, progress);
austinterrell 0:5fa2d54bedb4 346 scanner.RecvData(data, 498);
austinterrell 0:5fa2d54bedb4 347 scanner.SetTemplate(userID, data, 498);
austinterrell 0:5fa2d54bedb4 348
austinterrell 0:5fa2d54bedb4 349 // Turn off scanner
austinterrell 0:5fa2d54bedb4 350 scanner.CmosLed(0);
austinterrell 0:5fa2d54bedb4 351 }
austinterrell 0:5fa2d54bedb4 352
austinterrell 0:5fa2d54bedb4 353 refreshMenu();
austinterrell 0:5fa2d54bedb4 354 }
austinterrell 0:5fa2d54bedb4 355
austinterrell 0:5fa2d54bedb4 356 // Persistent notification led
austinterrell 0:5fa2d54bedb4 357 void blinker()
austinterrell 0:5fa2d54bedb4 358 {
austinterrell 0:5fa2d54bedb4 359 // If there is a notification
austinterrell 0:5fa2d54bedb4 360 if (notificationPresent) {
austinterrell 0:5fa2d54bedb4 361
austinterrell 0:5fa2d54bedb4 362 // If led is not on
austinterrell 0:5fa2d54bedb4 363 if (!led) {
austinterrell 0:5fa2d54bedb4 364 rgb.write(0.5, 0.0, 0.5);
austinterrell 0:5fa2d54bedb4 365 }
austinterrell 0:5fa2d54bedb4 366 else {
austinterrell 0:5fa2d54bedb4 367 rgb.write(0.0, 0.0, 0.0);
austinterrell 0:5fa2d54bedb4 368 }
austinterrell 0:5fa2d54bedb4 369 led = !led;
austinterrell 0:5fa2d54bedb4 370 }
austinterrell 0:5fa2d54bedb4 371 }