From 06a1750719d14ebe2c3d072a364d097ad0389694 Mon Sep 17 00:00:00 2001 From: Jean Jacques Avril Date: Thu, 30 Sep 2021 12:25:06 +0200 Subject: [PATCH] adding userdb --- src/Interface.cpp | 200 ++++++++++++++++++++++++++++++++++++++++++++++ src/Interface.h | 44 ++++++++++ src/Rfid.cpp | 36 ++++----- src/Rfid.h | 12 +-- src/main.cpp | 162 +++++++++---------------------------- 5 files changed, 307 insertions(+), 147 deletions(-) create mode 100644 src/Interface.cpp create mode 100644 src/Interface.h diff --git a/src/Interface.cpp b/src/Interface.cpp new file mode 100644 index 0000000..60ae1e4 --- /dev/null +++ b/src/Interface.cpp @@ -0,0 +1,200 @@ +#include "Interface.h" + +Interface::Interface(/* args */) : _lcd(0x27, 16, 2) +{ +} + +Interface::~Interface() +{ +} +void Interface::begin(Keyboard *Keyboard) +{ + this->_keyboard = Keyboard; + this->_lcd.init(); + this->_lcd.backlight(); +} +void Interface::setState(states state) +{ + this->_display_state = state; + this->_displayUpdate = true; +} +void Interface::greetUser(String username) +{ + this->_username = username; + this->setState(states::GREET); +} +String Interface::getPin() +{ + String a = _pin_number; + this->_pin_number = ""; + this->_pin_available = false; + return a; +} +bool Interface::pinAvailable() +{ + return _pin_available && _pin_number.length() > 0; +} +void Interface::showMessage(String msg1, String msg2, unsigned long display_time) +{ + this->_msg1 = msg1; + this->_msg2 = msg2; + this->_msg_display_time = display_time; + this->setState(states::MSG); +} +void Interface::render() +{ + if (this->_keyboard->available()) + { + if (this->_keyboard->getLastChr() == 'X') + { + this->_keyboard->clear(); + this->setState(states::ABORT); + } + else if (('0' <= this->_keyboard->getLastChr()) && (this->_keyboard->getLastChr() <= '9')) + { + Serial.print(this->_keyboard->getLastChr()); + if (this->_display_state == states::ENTER_PIN_START) + this->setState(states::ENTER_PIN_ADD_NUM); + else if (this->_display_state != states::ENTER_PIN_ADD_NUM) + this->setState(states::ENTER_PIN_START); + else if (this->_display_state == states::ENTER_PIN_ADD_NUM) + this->_displayUpdate = true; + } + else if (this->_keyboard->getLastChr() == 'O') + { + if (this->_display_state == 2 || this->_display_state == 1) + { + this->_keyboard->clear(); + this->_pin_available = true; + } + else + { + this->showMessage("Error", "Please enter pin!", 5000); + this->_keyboard->clear(); + } + //this->setState(states::VALIDATE_PIN); + } + } + + if (this->_displayUpdate) + { + switch (this->_display_state) + { + case states::MAIN: + this->_lcd.setCursor(0, 0); + this->_lcd.print("Welcome!"); + this->_lcd.setCursor(0, 1); + this->_lcd.print("Enter Pin / Card"); + this->_displayUpdate = false; + break; + case states::ENTER_PIN_START: // Starting Pin + _pin_number.clear(); + this->_lcd.clear(); + this->_lcd.print("Please enter Pin"); + this->_lcd.setCursor(0, 1); + this->_pin_number.concat(this->_keyboard->getString()); + this->_lcd.print("Pin: " + _pin_number); + this->_display_state = 2; + this->_displayUpdate = false; + break; + case states::ENTER_PIN_ADD_NUM: + { + String input = this->_keyboard->getString(); + this->_pin_number.concat(input); + this->_lcd.print(input); + this->_displayUpdate = false; + break; + } + case states::VALIDATE_PIN: + this->_lcd.clear(); + this->_lcd.setCursor(0, 0); + this->_lcd.print("Validating PIN"); + this->_lcd.setCursor(0, 1); + if (_pin_number == "2626") + this->_lcd.print("Accepted!"); + else + this->_lcd.print("Acess denied!"); + this->_pin_number.clear(); + this->_displayTimer1 = millis() + 3000; + this->_display_state = states::DELAY; + break; + case states::ABORT: + this->_lcd.clear(); + this->_lcd.print("Input aborted!"); + this->_displayTimer1 = millis() + 3000; + this->_display_state = states::DELAY; + break; + case states::DELAY: // Delay + if ((this->_displayTimer1 != 0) && _displayTimer1 < millis()) + { + this->_lcd.clear(); + this->_display_state = states::MAIN; + } + break; + case states::READ_RFID: + { + this->_lcd.clear(); + this->_lcd.print("Card detected."); + this->_lcd.setCursor(0, 1); + + this->_lcd.print("rfid"); + this->_displayTimer1 = millis() + 3000; + this->_display_state = states::DELAY; + break; + } + case states::GREET: + { + if (this->_scroll_index==0) + { + this->_displayTimer1 = millis(); + this->_lcd.clear(); + this->_lcd.setCursor(0, 0); + this->_lcd.print("Welcome back"); + } + if (_username.length() > 16) + { + if (this->_scroll_index + 16 <= _username.length() && this->_displayTimer2 + 800 < millis()) + { + this->_displayTimer2 = millis(); + this->_lcd.setCursor(0, 1); + this->_lcd.print(_username.substring(0 + this->_scroll_index, 16 + _scroll_index)); + this->_scroll_index++; + } + else if (this->_scroll_index + 16 > _username.length()) + { + this->_displayTimer1 = millis() + 3000; + this->_display_state = states::DELAY; + this->_scroll_index = 0; + } + } + else + { + this->_lcd.setCursor(0, 1); + this->_lcd.print(_username); + this->_displayTimer1 = millis() + 3000; + this->_display_state = states::DELAY; + } + break; + } + case states::MSG: + this->_lcd.clear(); + this->_lcd.setCursor(0, 0); + this->_lcd.print(this->_msg1); + this->_msg1 = ""; + this->_lcd.setCursor(0, 1); + this->_lcd.print(this->_msg2); + this->_msg2 = ""; + if (this->_msg_display_time == 0) + this->_displayUpdate = false; + else + { + this->_displayTimer1 = millis() + this->_msg_display_time; + this->_display_state = states::DELAY; + } + break; + + default: + break; + } + } +} \ No newline at end of file diff --git a/src/Interface.h b/src/Interface.h new file mode 100644 index 0000000..1c98440 --- /dev/null +++ b/src/Interface.h @@ -0,0 +1,44 @@ +#pragma once +#include +#include "Keyboard.h" +class Interface +{ +private: + LiquidCrystal_I2C _lcd; + Keyboard* _keyboard; + String _pin_number; + bool _pin_available; + int _display_state = 0; + unsigned long _lastDisplayUpdate = 0; + unsigned long _displayTimer1 = 0; + unsigned long _displayTimer2 = 0; + bool _displayUpdate = true; + String _username = ""; + unsigned int _scroll_index = 0; + String _msg1 = ""; + String _msg2 = ""; + unsigned long _msg_display_time = 0; + ; +public: + enum states { + MAIN, + ENTER_PIN_START, + ENTER_PIN_ADD_NUM, + VALIDATE_PIN, + ABORT, + DELAY, + READ_RFID, + GREET, + MSG + + };; + Interface(/* args */); + ~Interface(); + void begin(Keyboard* Keyboard); + void render(); + void setState(states state); + void greetUser(String username); + String getPin(); + bool pinAvailable(); + void showMessage(String msg1, String msg2, unsigned long display_time); +}; diff --git a/src/Rfid.cpp b/src/Rfid.cpp index 7a0d229..12782d8 100644 --- a/src/Rfid.cpp +++ b/src/Rfid.cpp @@ -2,7 +2,7 @@ #define SS_PIN D8 #define RST_PIN D1 #define RFID_TIMEOUT 3000 -Rfid::Rfid(/* args */) : mfrc522(SS_PIN) +Rfid::Rfid(/* args */) : _mfrc522(SS_PIN) { } @@ -13,37 +13,37 @@ void Rfid::begin() { SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV8); - this->mfrc522.PCD_Init(); - this->mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); + this->_mfrc522.PCD_Init(); + this->_mfrc522.PCD_SetAntennaGain(_mfrc522.RxGain_max); } void Rfid::scan() { - if (this->mfrc522.PICC_IsNewCardPresent() && this->mfrc522.PICC_ReadCardSerial()) + if (this->_mfrc522.PICC_IsNewCardPresent() && this->_mfrc522.PICC_ReadCardSerial()) { - this->rfid = ""; - for (byte i = 0; i < this->mfrc522.uid.size; i++) + this->_rfid = ""; + for (byte i = 0; i < this->_mfrc522.uid.size; i++) { - this->rfid += this->mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "; - this->rfid += String(this->mfrc522.uid.uidByte[i], HEX); + this->_rfid += this->_mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "; + this->_rfid += String(this->_mfrc522.uid.uidByte[i], HEX); } - this->rfid.trim(); - this->rfid.toUpperCase(); - if (this->rfid != this->lastRfid || millis() > this->lastRfidScan + RFID_TIMEOUT) + this->_rfid.trim(); + this->_rfid.toUpperCase(); + if (this->_rfid != this->_lastRfid || millis() > this->_lastRfidScan + RFID_TIMEOUT) { - status = 1; - Serial.print(this->rfid); - this->lastRfid = this->rfid; - this->lastRfidScan = millis(); + _status = 1; + Serial.print(this->_rfid); + this->_lastRfid = this->_rfid; + this->_lastRfidScan = millis(); } } } bool Rfid::available() { - if (this->status==1) + if (this->_status==1) { - this->status = 0; + this->_status = 0; return true; } else @@ -51,5 +51,5 @@ bool Rfid::available() } String Rfid::getID() { - return this->rfid; + return this->_rfid; } \ No newline at end of file diff --git a/src/Rfid.h b/src/Rfid.h index ba4efb2..94ce0d1 100644 --- a/src/Rfid.h +++ b/src/Rfid.h @@ -4,12 +4,12 @@ class Rfid { private: - MFRC522 mfrc522; // Create MFRC522 instance - MFRC522::MIFARE_Key key; - int status = 0; - String rfid = ""; - String lastRfid = ""; - unsigned long lastRfidScan = 0; + MFRC522 _mfrc522; // Create MFRC522 instance + MFRC522::MIFARE_Key _key; + int _status = 0; + String _rfid = ""; + String _lastRfid = ""; + unsigned long _lastRfidScan = 0; public: Rfid(/* args */); ~Rfid(); diff --git a/src/main.cpp b/src/main.cpp index 4bb5713..f32bf1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,151 +3,67 @@ #include #include "Keyboard.h" #include "Rfid.h" +#include "Interface.h" +#include // Rfid Rfid rfid; // i2C Bus #define PIN_WIRE_SDA D3 #define PIN_WIRE_SCL D4 -#include + Keyboard keyboard(200); -LiquidCrystal_I2C lcd(0x27, 20, 4); -int display_state = 0; -String pin; -unsigned long lastDisplayUpdate = 0; -unsigned long displayTimer1 = 0; -bool displayUpdate = true; +Interface iface; + +// User DB + +typedef struct +{ + String uid; + String first_name; + String last_name; + String rfid_uid; + String user_pin; +} user_account; +std::vector userdb; void setup() { Serial.begin(9600); Serial.print("Starting"); delay(500); keyboard.begin(&Wire); - - // LCD - lcd.init(); - lcd.backlight(); rfid.begin(); - - + iface.begin(&keyboard); + userdb.push_back(user_account{.uid = "010202", .first_name = "Max", .last_name = "Mustermann and Sons", .rfid_uid = "D3 4E 03 0B", .user_pin = "1212"}); + userdb.push_back(user_account{.uid = "012345", .first_name = "John", .last_name = "Doe", .rfid_uid = "8C 75 6C 17", .user_pin = "2424"}); } -namespace states -{ - enum screenstates - { - MAIN, - ENTER_PIN_START, - ENTER_PIN_ADD_NUM, - VALIDATE_PIN, - ABORT, - DELAY, - READ_RFID - - }; -} void loop() { keyboard.scanAsync(); rfid.scan(); - if(rfid.available()){ - display_state = states::READ_RFID; - displayUpdate = true; - } - if (keyboard.available()) + if (iface.pinAvailable()) { - if (keyboard.getLastChr() == 'X') - { - keyboard.clear(); - display_state = states::ABORT; - displayUpdate = true; - } - else if (('0' <= keyboard.getLastChr()) && (keyboard.getLastChr() <= '9')) - { - Serial.print(keyboard.getLastChr()); - if (display_state == states::ENTER_PIN_START) - display_state = states::ENTER_PIN_ADD_NUM; - else if (display_state != states::ENTER_PIN_ADD_NUM) - display_state = states::ENTER_PIN_START; - displayUpdate = true; - } - else if (keyboard.getLastChr() == 'O' && (display_state == 2 || display_state == 1)) - { - keyboard.clear(); - display_state = states::VALIDATE_PIN; - displayUpdate = true; - } + String entered_pin = iface.getPin(); + std::for_each(userdb.begin(), userdb.end(), [=](user_account user) + { + if (entered_pin == user.user_pin) + { + iface.greetUser(user.first_name + " " + user.last_name); + } + }); } - if (displayUpdate) + std::cop + else if (rfid.available()) { - switch (display_state) - { - case states::MAIN: - lcd.setCursor(0, 0); - lcd.print("Welcome!"); - lcd.setCursor(0, 1); - lcd.print("Enter Pin / Card"); - displayUpdate = false; - break; - case states::ENTER_PIN_START: // Starting Pin - pin.clear(); - lcd.clear(); - lcd.print("Please enter Pin"); - lcd.setCursor(0, 1); - pin.concat(keyboard.getString()); - lcd.print("Pin: " + pin); - display_state = 2; - displayUpdate = false; - break; - case states::ENTER_PIN_ADD_NUM: - { - String input = keyboard.getString(); - pin.concat(input); - lcd.print(input); - displayUpdate = false; - break; - } - case states::VALIDATE_PIN: - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print("Validating PIN"); - lcd.setCursor(0, 1); - if (pin == "2626") - lcd.print("Accepted!"); - else - lcd.print("Acess denied!"); - pin.clear(); - displayTimer1 = millis() + 3000; - display_state = states::DELAY; - break; - case states::ABORT: - lcd.clear(); - lcd.print("Input aborted!"); - displayTimer1 = millis() + 3000; - display_state = states::DELAY; - break; - case states::DELAY: // Delay - if (displayTimer1 != 0 && displayTimer1 < millis()) - { - lcd.clear(); - display_state = states::MAIN; - } - break; - case states::READ_RFID: - { - lcd.clear(); - lcd.print("Card detected."); - lcd.setCursor(0, 1); - - lcd.print(rfid.getID()); - displayTimer1 = millis() + 3000; - display_state = states::DELAY; - break; - } - default: - break; - } + String rfid_card_uid = rfid.getID(); + std::for_each(userdb.begin(), userdb.end(), [=](user_account user) + { + if (rfid_card_uid == user.rfid_uid) + { + iface.greetUser(user.first_name + " " + user.last_name); + } + }); } - //String input = keyboard.getString(); - //Serial.println("Key " + input + "was pressed"); + iface.render(); } \ No newline at end of file