#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); } int Interface::getState(){ return _display_state; } void Interface::render() { if (this->_keyboard->available()) { this->_inputTimeout = millis(); 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->_display_state==states::ENTER_PIN_ADD_NUM||this->_display_state==states::ENTER_PIN_START){ if(millis()-_inputTimeout>10000){ this->_keyboard->clear(); this->setState(states::ABORT); } } 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 = 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; } } }