Added password hold option
This commit is contained in:
parent
3a70970356
commit
c51b18dd36
Binary file not shown.
After Width: | Height: | Size: 254 B |
|
@ -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;
|
||||
|
|
|
@ -34,6 +34,7 @@ class CMenuSelScreen : public CPasswordScreen
|
|||
int _rowSel;
|
||||
int _scrollChar;
|
||||
int _menuMode;
|
||||
uint8_t _holdPW;
|
||||
bool _bReload;
|
||||
void _initUI();
|
||||
public:
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue