diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 19cc59b..64d6988 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -216,6 +216,7 @@ struct BatteryApplyCalibrationAccessor : public RefAccessorSaveSettings { struct LockscreenAllowPresetSwitchAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.lockscreen.allowPresetSwitch; } }; template struct LockscreenPinDigitAccessor : public RefAccessorSaveSettings { int8_t &getRef() const override { return settings.lockscreen.pin[index]; } }; +struct LockscreenKeepLockedAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.lockscreen.keepLockedAfterReboot; } }; // Handbremse struct HandbremsEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.handbremse.enable; } }; diff --git a/main/displays/lockscreen.cpp b/main/displays/lockscreen.cpp index beb8d5f..6a1551b 100644 --- a/main/displays/lockscreen.cpp +++ b/main/displays/lockscreen.cpp @@ -23,6 +23,11 @@ void Lockscreen::start() profileButtonDisabled = !settings.lockscreen.allowPresetSwitch; isLocked = true; + if (settings.lockscreen.keepLockedAfterReboot && !settings.lockscreen.locked) + { + settings.lockscreen.locked = true; + saveSettings(); + } } void Lockscreen::initScreen() @@ -64,12 +69,12 @@ void Lockscreen::update() void Lockscreen::redraw() { - if (m_pressed) + if (m_pressed || m_back_pressed) { drawRect(m_currentIndex, 1, TFT_BLACK); drawRect(m_currentIndex, 2, TFT_BLACK); - if (++m_currentIndex>=4) + if (!m_back_pressed && ++m_currentIndex>=4) { if (m_numbers == settings.lockscreen.pin) { @@ -83,7 +88,12 @@ void Lockscreen::redraw() m_numbers = {0,0,0,0}; m_currentIndex = 0; - std::for_each(std::begin(m_labels) + 1, std::end(m_labels), [](auto &label){ label.redraw({}); }); + std::for_each(std::begin(m_labels) + 1, std::end(m_labels), [](auto &label){ label.redraw("0"); }); + } + else if (m_back_pressed && m_currentIndex < 3) + { + drawRect(m_currentIndex+1, 1, TFT_BLACK); + drawRect(m_currentIndex+1, 2, TFT_BLACK); } m_labels[m_currentIndex].redraw(std::to_string(m_numbers[m_currentIndex])); @@ -92,6 +102,7 @@ void Lockscreen::redraw() drawRect(m_currentIndex, 2, TFT_YELLOW); m_pressed = false; + m_back_pressed = false; } if (m_rotated) @@ -124,6 +135,11 @@ void Lockscreen::stop() profileButtonDisabled = false; isLocked = false; + if (settings.lockscreen.keepLockedAfterReboot && settings.lockscreen.locked) + { + settings.lockscreen.locked = false; + saveSettings(); + } } void Lockscreen::confirm() @@ -133,6 +149,9 @@ void Lockscreen::confirm() void Lockscreen::back() { + if (m_currentIndex > 0) + m_currentIndex--; + m_back_pressed = true; } void Lockscreen::rotate(int offset) diff --git a/main/displays/lockscreen.h b/main/displays/lockscreen.h index 5af1037..57fd890 100644 --- a/main/displays/lockscreen.h +++ b/main/displays/lockscreen.h @@ -46,6 +46,7 @@ private: uint8_t m_currentIndex{}; bool m_pressed; + bool m_back_pressed; int m_rotated; ModeInterface *m_oldMode; diff --git a/main/displays/menus/lockscreensettingsmenu.cpp b/main/displays/menus/lockscreensettingsmenu.cpp index 57b9a08..b3fdffa 100644 --- a/main/displays/menus/lockscreensettingsmenu.cpp +++ b/main/displays/menus/lockscreensettingsmenu.cpp @@ -52,6 +52,7 @@ using namespace espgui; LockscreenSettingsMenu::LockscreenSettingsMenu() { constructMenuItem, ToggleBoolAction, CheckboxIcon, LockscreenAllowPresetSwitchAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, LockscreenKeepLockedAccessor>>(); constructMenuItem>, SwitchScreenAction>>(); constructMenuItem>, SwitchScreenAction>>(); constructMenuItem>, SwitchScreenAction>>(); diff --git a/main/main.cpp b/main/main.cpp index 4678423..79f2b06 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -75,6 +75,7 @@ using namespace std::chrono_literals; #endif #include "modes/defaultmode.h" #include "displays/statusdisplay.h" +#include "displays/lockscreen.h" #include "displays/calibratedisplay.h" #ifdef FEATURE_DNS_NS #include "dnsannounce.h" @@ -291,7 +292,16 @@ extern "C" void app_main() if (!gas || !brems || *gas > 200.f || *brems > 200.f) espgui::switchScreen(true); else - espgui::switchScreen(); + { + if (settings.lockscreen.keepLockedAfterReboot && settings.lockscreen.locked) + { + espgui::switchScreen(); + } + else + { + espgui::switchScreen(); + } + } #endif #ifdef FEATURE_ESPNOW espnow::initESPNow(); diff --git a/main/presets.h b/main/presets.h index bec092c..7997adf 100644 --- a/main/presets.h +++ b/main/presets.h @@ -274,6 +274,8 @@ constexpr Settings::Ledstrip defaultLedstrip { constexpr Settings::LockscreenSettings defaultLockscreen { .allowPresetSwitch = true, + .keepLockedAfterReboot = false, + .locked = false, .pin = { 1, 2, 3, 4 } }; diff --git a/main/settings.h b/main/settings.h index 9840a25..93915ae 100644 --- a/main/settings.h +++ b/main/settings.h @@ -210,6 +210,8 @@ struct Settings struct LockscreenSettings { bool allowPresetSwitch; + bool keepLockedAfterReboot; + bool locked; std::array pin; } lockscreen; @@ -360,6 +362,8 @@ void Settings::executeForEveryCommonSetting(T &&callable) callable("hybridDeacL", hybrid.deactivationLimit); callable("lockAlwPresetSw", lockscreen.allowPresetSwitch); + callable("keepLocked", lockscreen.keepLockedAfterReboot); + callable("currentlyLocked", lockscreen.locked); callable("lockscreenPin", lockscreen.pin); callable("totalCentimeter", savedStatistics.totalCentimeters); diff --git a/main/texts.cpp b/main/texts.cpp index dca1e63..71da3e8 100644 --- a/main/texts.cpp +++ b/main/texts.cpp @@ -332,6 +332,7 @@ char TEXT_ANIMATION_BLINKBOTH[] = "Blink Both"; //LockscreenSettingsMenu char TEXT_LOCKSCREENSETTINGS[] = "Lockscreen Settings"; char TEXT_ALLOWPRESETSWITCH[] = "Allow preset switch"; +char TEXT_KEEPLOCKED[] = "Keep locked"; char TEXT_PINDIGIT0[] = "PIN digit0"; char TEXT_PINDIGIT1[] = "PIN digit1"; char TEXT_PINDIGIT2[] = "PIN digit2"; diff --git a/main/texts.h b/main/texts.h index 22ec3b5..42d2bd4 100644 --- a/main/texts.h +++ b/main/texts.h @@ -332,6 +332,7 @@ extern char TEXT_ANIMATION_BLINKBOTH[]; //LockscreenSettingsMenu extern char TEXT_LOCKSCREENSETTINGS[]; extern char TEXT_ALLOWPRESETSWITCH[]; +extern char TEXT_KEEPLOCKED[]; extern char TEXT_PINDIGIT0[]; extern char TEXT_PINDIGIT1[]; extern char TEXT_PINDIGIT2[];