diff --git a/icons/Password.bmp b/icons/Password.bmp new file mode 100644 index 0000000..cf127d7 Binary files /dev/null and b/icons/Password.bmp differ diff --git a/src/OLED/MenuSelScreen.cpp b/src/OLED/MenuSelScreen.cpp index 913bdb5..b308888 100644 --- a/src/OLED/MenuSelScreen.cpp +++ b/src/OLED/MenuSelScreen.cpp @@ -36,6 +36,7 @@ CMenuSelScreen::onSelect() CScreenHeader::onSelect(); _rowSel = 0; _menuMode = NVstore.getUserSettings().menuMode; + _holdPW = NVstore.getUserSettings().holdPassword; _scrollChar = 0; _bReload = false; } @@ -63,15 +64,23 @@ CMenuSelScreen::show() _showConfirmMessage(); } else { - _showTitle("Menu Mode"); + _showTitle("Menu Options"); - _drawBitmap(30, 16, MenuIconInfo); + _drawBitmap(25, 16, MenuIconInfo); switch(_menuMode) { case 0: strcpy(msg, "Standard"); break; case 1: strcpy(msg, "Basic"); break; case 2: strcpy(msg, "No heater"); break; } - _printMenuText(50, 16, msg, _rowSel == 1); + _printMenuText(45, 16, msg, _rowSel == 2); + + _drawBitmap(25, 28, passwordIconInfo); + if(_holdPW) + strcpy(msg, "Retain 24hrs"); + else + strcpy(msg, "Forget"); + _printMenuText(45, 30, msg, _rowSel == 1); + } } return true; @@ -87,20 +96,28 @@ CMenuSelScreen::animate() } if(_rowSel != SaveConfirm) { const char* pMsg = NULL; - switch(_menuMode) { + switch(_rowSel) { case 0: - pMsg = " Standard, complete menu allows full access to features. "; - break; - case 1: - pMsg = " Basic simplified menu. "; + _printMenuText(_display.xCentre(), 52, " \021 \030Edit Exit \020 ", true, eCentreJustify); break; case 2: - pMsg = " No heater mode. "; + switch(_menuMode) { + case 0: pMsg = " Standard, complete menu allows full access to features. "; break; + case 1: pMsg = " Basic simplified menu. "; break; + case 2: pMsg = " No heater mode. "; break; + } + break; + case 1: + if(_holdPW) + pMsg = " Retain password for 24 hours after correct entry. "; + else + pMsg = " Forget password after each entry. "; break; } - _display.drawFastHLine(0, 52, 128, WHITE); - if(pMsg != NULL) + if(pMsg != NULL) { + _display.drawFastHLine(0, 52, 128, WHITE); _scrollMessage(56, pMsg, _scrollChar); + } return true; } } @@ -127,6 +144,7 @@ CMenuSelScreen::keyHandler(uint8_t event) _enableStoringMessage(); us = NVstore.getUserSettings(); us.menuMode = _menuMode; + us.holdPassword = _holdPW; NVstore.setUserSettings(us); NVstore.save(); switch(us.menuMode) { @@ -134,11 +152,21 @@ CMenuSelScreen::keyHandler(uint8_t event) case 1: DebugPort.println("Invoking Basic menu mode"); break; case 2: DebugPort.println("Invoking No Heater menu mode"); break; } + _holdPassword(); _bReload = true; _rowSel = 0; } else { - _getPassword(); + if(_rowSel == 0) { + _getPassword(); + if(_isPasswordOK()) { + _rowSel = 1; + } + } + else { + _rowSel++; + UPPERLIMIT(_rowSel, 2); + } } } // DOWN press @@ -182,6 +210,9 @@ CMenuSelScreen::adjust(int dir) { switch(_rowSel) { case 1: + _holdPW = _holdPW ? 0 : 1; + break; + case 2: _menuMode += dir; WRAPLIMITS(_menuMode, 0, 2); break; diff --git a/src/OLED/MenuSelScreen.h b/src/OLED/MenuSelScreen.h index 222cb80..feafe40 100644 --- a/src/OLED/MenuSelScreen.h +++ b/src/OLED/MenuSelScreen.h @@ -34,6 +34,7 @@ class CMenuSelScreen : public CPasswordScreen int _rowSel; int _scrollChar; int _menuMode; + uint8_t _holdPW; bool _bReload; void _initUI(); public: diff --git a/src/OLED/PasswordScreen.cpp b/src/OLED/PasswordScreen.cpp index 30a1053..3270592 100644 --- a/src/OLED/PasswordScreen.cpp +++ b/src/OLED/PasswordScreen.cpp @@ -31,8 +31,10 @@ #include "PasswordScreen.h" #include "KeyPad.h" #include "../Utility/macros.h" +#include "../Utility/NVStorage.h" #include "fonts/Arial.h" +long CPasswordScreen::__Expiry = 0; CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) { @@ -47,16 +49,33 @@ CPasswordScreen::onSelect() } void -CPasswordScreen::_initUI() +CPasswordScreen::__initPassword(bool get) { - _bGetPassword = false; + _bGetPassword = get; _bPasswordOK = false; + _bPasswordOK |= __Expiry != 0; _PWcol = 0; + // reset PW digits for(int i= 0; i < 4; i++) _PWdig[i] = -1; +} + +void +CPasswordScreen::_initUI() +{ + __initPassword(false); + _SaveTime = 0; } +void +CPasswordScreen::_getPassword() +{ + __initPassword(true); + + _ScreenManager.reqUpdate(); +} + bool CPasswordScreen::show() { @@ -68,17 +87,13 @@ CPasswordScreen::show() return true; } else if(_bGetPassword) { - _display.clearDisplay(); -/* { - CTransientFont AF(_display, &arial_8ptBoldFontInfo); - _printMenuText(_display.xCentre(), 32, "Enter password...", false, eCentreJustify); - }*/ - _showPassword(); - return true; - } - else { - return false; + if(!_bPasswordOK) { + _display.clearDisplay(); + _showPassword(); + return true; + } } + return false; } bool @@ -100,10 +115,25 @@ CPasswordScreen::_busy() return _SaveTime != 0; } +void +CPasswordScreen::_holdPassword() +{ + if(NVstore.getUserSettings().holdPassword) + __Expiry = millis() + 24 * 60 * 60 * 1000; // 24 hours + else + __Expiry = 0; +} + bool CPasswordScreen::keyHandler(uint8_t event) { if(_bGetPassword) { + + if(_bPasswordOK) { + _bGetPassword = false; + return true; + } + if(event & keyPressed) { // press CENTRE @@ -114,6 +144,7 @@ CPasswordScreen::keyHandler(uint8_t event) (_PWdig[2] == 8) && (_PWdig[3] == 8)) { _bPasswordOK = true; + _holdPassword(); } _bGetPassword = false; @@ -186,19 +217,6 @@ CPasswordScreen::_showPassword() return _bGetPassword; } -void -CPasswordScreen::_getPassword() -{ - _bGetPassword = true; - _bPasswordOK = false; - _PWcol = 0; - // reset PW digits - for(int i= 0; i < 4; i++) - _PWdig[i] = -1; - - _ScreenManager.reqUpdate(); -} - void CPasswordScreen::_enableStoringMessage() { @@ -207,3 +225,14 @@ CPasswordScreen::_enableStoringMessage() } +bool CPasswordScreen::_isPasswordOK() +{ + if(__Expiry) { + long tDelta = millis() - __Expiry; + if(tDelta > 0) { + __Expiry = 0; + _bPasswordOK = false; + } + } + return __Expiry != 0 || _bPasswordOK; +}; diff --git a/src/OLED/PasswordScreen.h b/src/OLED/PasswordScreen.h index 465d946..5301cb7 100644 --- a/src/OLED/PasswordScreen.h +++ b/src/OLED/PasswordScreen.h @@ -33,10 +33,13 @@ class CPasswordScreen : public CScreenHeader { bool _bPasswordOK; int _PWcol; unsigned long _SaveTime; + static long __Expiry; + void __initPassword(bool get); protected: bool _showPassword(); + void _holdPassword(); void _getPassword(); - bool _isPasswordOK() { return _bPasswordOK; }; + bool _isPasswordOK(); void _enableStoringMessage(); void _initUI(); bool _busy(); diff --git a/src/OLED/fonts/Icons.cpp b/src/OLED/fonts/Icons.cpp index d854308..db61ff3 100644 --- a/src/OLED/fonts/Icons.cpp +++ b/src/OLED/fonts/Icons.cpp @@ -1345,3 +1345,31 @@ const uint8_t PROGMEM userBitmap[] = const BITMAP_INFO UserIconInfo(8, 9, userBitmap); +// +// Image data for password +// + +const uint8_t PROGMEM passwordIcon[] = +{ + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x11, 0x00, // # # + 0x11, 0x00, // # # + 0x7F, 0xC0, // ######### + 0x71, 0xC0, // ### ### + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x7B, 0xC0, // #### #### + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0xEE, 0xE0, // ### ### ### + 0xAA, 0xA0, // # # # # # # + 0x22, 0x20, // # # # + 0x44, 0x40, // # # # + 0x00, 0x00, // + 0x44, 0x40, // # # # +}; + +const BITMAP_INFO passwordIconInfo(11, 17, passwordIcon); + + diff --git a/src/OLED/fonts/Icons.h b/src/OLED/fonts/Icons.h index c6c7025..cb36e00 100644 --- a/src/OLED/fonts/Icons.h +++ b/src/OLED/fonts/Icons.h @@ -156,3 +156,5 @@ extern const BITMAP_INFO OutputIconInfo; extern const BITMAP_INFO _1IconInfo; extern const BITMAP_INFO _2IconInfo; extern const BITMAP_INFO algIconInfo; + +extern const BITMAP_INFO passwordIconInfo; diff --git a/src/Utility/NVStorage.cpp b/src/Utility/NVStorage.cpp index 8d00794..568a569 100644 --- a/src/Utility/NVStorage.cpp +++ b/src/Utility/NVStorage.cpp @@ -388,6 +388,7 @@ sUserSettings::load() validatedLoad("JSONpad", JSON.padding, 0, u8inBounds, 0, 1); validatedLoad("menuMode", menuMode, 0, u8inBounds, 0, 2); validatedLoad("Clock12hr", clock12hr, 0, u8inBounds, 0, 1); + validatedLoad("holdPassword", holdPassword, 0, u8inBounds, 0, 1); preferences.end(); } @@ -421,6 +422,7 @@ sUserSettings::save() preferences.putUChar("JSONpad", JSON.padding); preferences.putUChar("menuMode", menuMode); preferences.putUChar("Clock12hr", clock12hr); + preferences.putUChar("holdPassword", holdPassword); preferences.end(); } diff --git a/src/Utility/NVStorage.h b/src/Utility/NVStorage.h index dea2580..b2ec950 100644 --- a/src/Utility/NVStorage.h +++ b/src/Utility/NVStorage.h @@ -266,6 +266,7 @@ struct sUserSettings : public CESP32_NVStorage { sJSONoptions JSON; uint8_t menuMode; // 0 normal, 1, basic, 2 no heater uint8_t clock12hr; + uint8_t holdPassword; bool valid() { bool retval = true; @@ -309,6 +310,7 @@ struct sUserSettings : public CESP32_NVStorage { JSON.init(); menuMode = 0; clock12hr = 0; + holdPassword = 0; }; void load(); void save(); @@ -333,6 +335,7 @@ struct sUserSettings : public CESP32_NVStorage { JSON = rhs.JSON; menuMode = rhs.menuMode; clock12hr = rhs.clock12hr; + holdPassword = rhs.holdPassword; return *this; } };