Demo of Bluetooth Notification (with Fingerprint Approval)
Dependencies: mbed Menu DRV2605 RPG RGBLED TextLCD GT511C3
main.cpp@0:5fa2d54bedb4, 2019-12-03 (annotated)
- Committer:
- austinterrell
- Date:
- Tue Dec 03 19:42:19 2019 +0000
- Revision:
- 0:5fa2d54bedb4
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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, ¬ificationsMenu, " 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 = ¬ification; |
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 = ¬ificationsMenu; |
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 | } |