diff --git a/icons/time.png b/icons/time.png new file mode 100644 index 0000000..3703066 Binary files /dev/null and b/icons/time.png differ diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 190277f..22319d6 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -35,6 +35,7 @@ set(headers bmsutils.h changevaluedisplay_bluetoothmode.h changevaluedisplay_bool.h + changevaluedisplay_daylightsavingmode.h changevaluedisplay_larsmmode_mode.h changevaluedisplay_unifiedmodelmode.h changevaluedisplay_wifi_mode_t.h @@ -72,6 +73,7 @@ set(headers displays/menus/stationwifisettingsmenu.h displays/menus/tempomatmodesettingsmenu.h displays/menus/timersmenu.h + displays/menus/timesettingsmenu.h displays/menus/wifisettingsmenu.h displays/menus/controllerhardwaresettingsmenu.h displays/menus/boardcomputerhardwaresettingsmenu.h @@ -119,6 +121,7 @@ set(headers icons/reboot.h icons/scan.h icons/settings.h + icons/time.h icons/unchecked.h icons/update.h icons/wifi.h @@ -167,6 +170,7 @@ set(headers statistics.h textinterface.h texts.h + time_bobbycar.h unifiedmodelmode.h utils.h webserver.h diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index c5525d4..bdfebab 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -47,6 +47,9 @@ struct CloudEnabledAccessor : public RefAccessorSaveSettings { bool &getRe struct CloudTransmitTimeoutAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.cloudSettings.cloudTransmitTimeout; } }; #endif +struct TimezoneOffsetAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.timeSettings.timezoneOffset; } }; +struct DaylightSavingModeAccessor : public RefAccessorSaveSettings { espchrono::DayLightSavingMode &getRef() const override { return settings.timeSettings.daylightSavingMode; } }; + struct FrontLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableFrontLeft; } }; struct FrontRightEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableFrontRight; } }; struct BackLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableBackLeft; } }; diff --git a/main/changevaluedisplay.h b/main/changevaluedisplay.h index f2d8416..b36f6f4 100644 --- a/main/changevaluedisplay.h +++ b/main/changevaluedisplay.h @@ -1,7 +1,9 @@ #pragma once +// 3rdparty lib includes #include +// local includes #include "display.h" #include "textinterface.h" #include "actioninterface.h" @@ -155,6 +157,7 @@ void ChangeValueDisplay::confirm() #endif #include "changevaluedisplay_controlmode.h" #include "changevaluedisplay_controltype.h" +#include "changevaluedisplay_daylightsavingmode.h" #include "changevaluedisplay_larsmmode_mode.h" #include "changevaluedisplay_unifiedmodelmode.h" #include "changevaluedisplay_wifi_mode_t.h" diff --git a/main/changevaluedisplay_bluetoothmode.h b/main/changevaluedisplay_bluetoothmode.h index 250bdcb..1d61c31 100644 --- a/main/changevaluedisplay_bluetoothmode.h +++ b/main/changevaluedisplay_bluetoothmode.h @@ -1,5 +1,6 @@ #pragma once +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" #include "utils.h" diff --git a/main/changevaluedisplay_bool.h b/main/changevaluedisplay_bool.h index d7196e7..483e3f5 100644 --- a/main/changevaluedisplay_bool.h +++ b/main/changevaluedisplay_bool.h @@ -1,5 +1,6 @@ #pragma once +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" #include "actioninterface.h" diff --git a/main/changevaluedisplay_controlmode.h b/main/changevaluedisplay_controlmode.h index 01f1ddf..c0398ba 100644 --- a/main/changevaluedisplay_controlmode.h +++ b/main/changevaluedisplay_controlmode.h @@ -1,7 +1,9 @@ #pragma once +// esp-idf includes #include +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" #include "utils.h" diff --git a/main/changevaluedisplay_controltype.h b/main/changevaluedisplay_controltype.h index a9dd249..094b4d6 100644 --- a/main/changevaluedisplay_controltype.h +++ b/main/changevaluedisplay_controltype.h @@ -1,7 +1,9 @@ #pragma once +// esp-idf includes #include +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" #include "utils.h" diff --git a/main/changevaluedisplay_daylightsavingmode.h b/main/changevaluedisplay_daylightsavingmode.h new file mode 100644 index 0000000..1783be6 --- /dev/null +++ b/main/changevaluedisplay_daylightsavingmode.h @@ -0,0 +1,55 @@ +#pragma once + +// esp-idf includes +#include + +// 3rdparty lib includes +#include + +// local includes +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "utils.h" +#include "actions/setvalueaction.h" +#include "actions/backproxyaction.h" +#include "icons/back.h" +#include "texts.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + ChangeValueDisplay(); + + void start() override; +}; + +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(espchrono::DayLightSavingMode::None, *this, *this); + constructMenuItem, StaticText>>(espchrono::DayLightSavingMode::EuropeanSummerTime, *this, *this); + constructMenuItem, StaticText>>(espchrono::DayLightSavingMode::UsDaylightTime, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + +void ChangeValueDisplay::start() +{ + Base::start(); + + switch (const auto value = getValue()) + { + case espchrono::DayLightSavingMode::None: setSelectedIndex(0); break; + case espchrono::DayLightSavingMode::EuropeanSummerTime: setSelectedIndex(1); break; + case espchrono::DayLightSavingMode::UsDaylightTime: setSelectedIndex(2); break; + default: + ESP_LOGW("BOBBY", "Unknown DayLightSavingMode: %i", int(value)); + setSelectedIndex(3); + } +} +} diff --git a/main/displays/menus/settingsmenu.h b/main/displays/menus/settingsmenu.h index e96fe0b..c9e138e 100644 --- a/main/displays/menus/settingsmenu.h +++ b/main/displays/menus/settingsmenu.h @@ -10,6 +10,7 @@ #if defined(FEATURE_BLUETOOTH) || defined(FEATURE_BLE) #include "icons/bluetooth.h" #endif +#include "icons/time.h" #include "icons/hardware.h" #include "icons/buzzer.h" #include "icons/info.h" @@ -25,6 +26,7 @@ class WifiSettingsMenu; class BluetoothSettingsMenu; class BleSettingsMenu; class CloudSettingsMenu; +class TimeSettingsMenu; class ModesSettingsMenu; class ControllerHardwareSettingsMenu; class BoardcomputerHardwareSettingsMenu; @@ -66,6 +68,7 @@ public: #ifdef FEATURE_CLOUD constructMenuItem, SwitchScreenAction>>(); #endif + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::time>>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>>(); diff --git a/main/displays/menus/timesettingsmenu.h b/main/displays/menus/timesettingsmenu.h new file mode 100644 index 0000000..fd81cb4 --- /dev/null +++ b/main/displays/menus/timesettingsmenu.h @@ -0,0 +1,65 @@ +#pragma once + +// 3rdparty lib includes +#include +#include + +// local includes +#include "menudisplay.h" +#include "utils.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" +#include "texts.h" +#include "accessors/settingsaccessors.h" + +// forward declares +namespace { +class SettingsMenu; +class TimeSettingsMenu; +} // namespace + +namespace { +class CurrentUtcDateTime : public virtual TextInterface +{ +public: + std::string text() const override { return fmt::format("utc: {}", espchrono::toString(espchrono::toDateTime(espchrono::utc_clock::now()))); } +}; + +class CurrentLocalDateTime : public virtual TextInterface +{ +public: + std::string text() const override { return fmt::format("local: {}", espchrono::toString(espchrono::toDateTime(espchrono::local_clock::now()))); } +}; + +using TimezoneOffsetChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + TimezoneOffsetAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +using DaylightSavingModeChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + DaylightSavingModeAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +class TimeSettingsMenu : + public MenuDisplay, + public StaticText, + public BackActionInterface> +{ +public: + TimeSettingsMenu() + { + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/main/icons/time.h b/main/icons/time.h new file mode 100644 index 0000000..20da2bb --- /dev/null +++ b/main/icons/time.h @@ -0,0 +1,46 @@ +#pragma once + +#include "icon.h" + +namespace { +namespace icons { +const Icon<24, 24> time{{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5AAE, 0x6B2F, 0x7391, 0x7391, 0x7391, 0x7391, 0x7370, 0x7350, 0x62EF, // 0x0010 (16) pixels + 0x5AAE, 0x528E, 0xFFC0, 0xFF80, 0xFF80, 0xFF80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62AE, 0x62EF, 0x8C53, // 0x0020 (32) pixels + 0x9CD6, 0x9CF6, 0x9D17, 0x9CF6, 0x9CF6, 0x94B5, 0x8C74, 0x8C34, 0x7BB1, 0x83CC, 0xDE85, 0xFFA1, 0xFFA1, 0xFFA1, 0xFFA0, 0x0000, // 0x0030 (48) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x62CE, 0x7370, 0xAD57, 0xAD58, 0x9CD6, 0x9CF5, 0xA515, 0xA514, 0xA535, 0xA535, 0x94B4, 0x8433, // 0x0040 (64) pixels + 0x9CD2, 0xBDAC, 0xD646, 0xF764, 0xFFA3, 0xFFA2, 0xFFA1, 0xFFA0, 0x0000, 0x0000, 0x0000, 0x62EF, 0x7BD2, 0xAD98, 0xA517, 0xA516, // 0x0050 (80) pixels + 0xB595, 0xCE57, 0xDE94, 0xDE51, 0xE71A, 0xEF5D, 0xDEDA, 0xC617, 0xBDCF, 0xD668, 0xF749, 0xF76D, 0xFFAB, 0xFFA5, 0xFFA2, 0xFF81, // 0x0060 (96) pixels + 0x0000, 0x0000, 0x62CE, 0x7BB1, 0xAD57, 0x9D16, 0xAD56, 0xD656, 0xD60F, 0xD5EB, 0xDE2E, 0xC614, 0xCE79, 0xF79D, 0xEF7D, 0xEF5B, // 0x0070 (112) pixels + 0xEF30, 0xF748, 0xF78F, 0xFFB8, 0xFFB4, 0xFFA9, 0xFFA2, 0xFF81, 0x0000, 0x0000, 0x62EF, 0xA517, 0x9CF6, 0xAD56, 0xDEB8, 0xD5CB, // 0x0080 (128) pixels + 0xDE70, 0xE6B2, 0xE692, 0xDE92, 0xEF7D, 0xF79E, 0xEF7D, 0xEF7C, 0xF771, 0xFF88, 0xFFAF, 0xFFB7, 0xFFB4, 0xF76A, 0xFF82, 0xFFA1, // 0x0090 (144) pixels + 0x0000, 0x5A8D, 0x8C33, 0xA537, 0x9CF5, 0xE71B, 0x8BE8, 0x9C8C, 0xDE72, 0xE690, 0xDE6F, 0xDE6F, 0xF7BE, 0xF79E, 0xF79D, 0xEF7C, // 0x00A0 (160) pixels + 0xF774, 0xF78C, 0xFF8A, 0xFF8D, 0xF76B, 0xEF06, 0xE6E4, 0xFFA0, 0x0000, 0x62EF, 0xA537, 0x8C74, 0xCE59, 0xF79D, 0xE6F8, 0x8C71, // 0x00B0 (176) pixels + 0x942A, 0xD60E, 0xDE2D, 0xDE2C, 0xF7BE, 0xF7BE, 0xF79D, 0xEF7D, 0xEF5A, 0xF772, 0xF76C, 0xF769, 0xDE87, 0xC5EA, 0x9CCA, 0x0000, // 0x00C0 (192) pixels + 0x0000, 0x7BD2, 0x9CD6, 0x9CD4, 0xDEFB, 0xF79E, 0xF7BE, 0xF79D, 0x94B1, 0x7B67, 0xCD89, 0xD5CA, 0xF7BE, 0xF79E, 0xF79D, 0xEF7D, // 0x00D0 (208) pixels + 0xEF5C, 0xEF5A, 0xEF56, 0xEF53, 0xBDD0, 0x8C50, 0x7370, 0x0000, 0x0000, 0x8C33, 0x9475, 0xAD76, 0xEF5D, 0xF79D, 0xF79E, 0xF7BE, // 0x00E0 (224) pixels + 0xF7BE, 0xA533, 0x7B47, 0xB4E7, 0xE71B, 0xEF7D, 0xEF7D, 0xEF7D, 0xEF5D, 0xE73C, 0xE73C, 0xE71B, 0xD69A, 0x7391, 0x7391, 0x0000, // 0x00F0 (240) pixels + 0x0000, 0x8C53, 0x8C54, 0xB5B7, 0xE73C, 0xDEFB, 0xF79D, 0xF79E, 0xF7BE, 0xF79E, 0x9CD3, 0x8C71, 0x94B2, 0xC618, 0xEF7D, 0xEF5D, // 0x0100 (256) pixels + 0xEF5C, 0xE73C, 0xD6BA, 0xDEDA, 0xE71C, 0x7370, 0x7BB2, 0x0000, 0x0000, 0x8433, 0x8433, 0xBDD7, 0xDEDA, 0xC638, 0xEF7D, 0xF79D, // 0x0110 (272) pixels + 0xF79E, 0xF79D, 0xA534, 0xC618, 0xC618, 0xAD75, 0xEF7D, 0xEF5D, 0xE73C, 0xE73C, 0xC617, 0xD699, 0xE73C, 0x7370, 0x7BD2, 0x0000, // 0x0120 (288) pixels + 0x0000, 0x83F3, 0x8413, 0xBDD7, 0xEF5C, 0xEF5D, 0xEF7D, 0xEF7D, 0xEF7D, 0xBDD6, 0x0020, 0x630C, 0x8430, 0xD6BA, 0xEF5D, 0xEF5C, // 0x0130 (304) pixels + 0xE73C, 0xE71C, 0xE71B, 0xDEFB, 0xE71C, 0x7370, 0x73B1, 0x0000, 0x0000, 0x7BB2, 0x8433, 0xAD56, 0xE71B, 0xEF5C, 0xEF5D, 0xEF7D, // 0x0140 (320) pixels + 0xB596, 0x0000, 0x738E, 0xDEDB, 0xEF7D, 0xEF5D, 0xEF5C, 0xE73C, 0xE73C, 0xE71B, 0xDEFB, 0xE71C, 0xC619, 0x7391, 0x7371, 0x0000, // 0x0150 (336) pixels + 0x0000, 0x6B0F, 0x8C54, 0x8C53, 0xD6BA, 0xE73C, 0xEF5C, 0xEF5D, 0x7BEF, 0x6B4D, 0xD6BA, 0xEF5C, 0xEF5C, 0xE73C, 0xE73C, 0xE71C, // 0x0160 (352) pixels + 0xE71B, 0xDEFB, 0xDEFB, 0xE71C, 0x9493, 0x83F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BF3, 0x8412, 0xBDD7, 0xE71B, 0xE73C, 0xE73C, // 0x0170 (368) pixels + 0xE73C, 0xE73C, 0xE73C, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71B, 0xDEFB, 0xDEFB, 0xDEFB, 0xCE7A, 0x7BD2, 0x7BB2, 0x0000, 0x0000, // 0x0180 (384) pixels + 0x0000, 0x0000, 0x630F, 0x8413, 0x9473, 0xD69A, 0xE71C, 0xE71C, 0xE71C, 0xE73C, 0xE73C, 0xE73C, 0xE71C, 0xE71C, 0xE71B, 0xDEFB, // 0x0190 (400) pixels + 0xDEFB, 0xDEDB, 0xDEFB, 0x9CD4, 0x7BD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7371, 0x83F3, 0x9CD4, 0xD6BA, 0xE71B, // 0x01A0 (416) pixels + 0xE71B, 0xE71B, 0xE71B, 0xCE79, 0xCE79, 0xDEFB, 0xDEFB, 0xDEFB, 0xDEFB, 0xE73C, 0xAD36, 0x7BB2, 0x6B50, 0x4A2B, 0x0000, 0x0000, // 0x01B0 (432) pixels + 0x0000, 0x0000, 0x18A3, 0x528D, 0x7BB2, 0x7BD2, 0x94B4, 0xD69A, 0xDEFB, 0xDEFB, 0xDEFB, 0xCE58, 0xCE58, 0xDEFB, 0xDEFB, 0xDEFB, // 0x01C0 (448) pixels + 0xDEFC, 0x9CD5, 0x73B1, 0x73B1, 0x524C, 0x1062, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2926, 0x526C, 0x7391, 0x7BF3, 0x8C53, // 0x01D0 (464) pixels + 0xAD56, 0xC639, 0xDEFB, 0xE73C, 0xE73C, 0xE71C, 0xCE59, 0xB597, 0x8C53, 0x7BB2, 0x7391, 0x524C, 0x20E5, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x18C4, 0x41EA, 0x630F, 0x7BB2, 0x8434, 0x8413, 0x8C53, 0x8C53, 0x8C53, 0x8C53, 0x8413, 0x8413, // 0x01F0 (496) pixels + 0x7391, 0x630F, 0x41EA, 0x18A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2926, 0x524C, // 0x0200 (512) pixels + 0x5AAE, 0x6B50, 0x7BB2, 0x83F3, 0x83F3, 0x7BB2, 0x6B30, 0x5AAD, 0x524C, 0x2105, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18A3, 0x41C9, 0x4A2B, 0x524C, 0x524C, 0x4A2B, 0x39A9, 0x10A3, // 0x0220 (544) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) pixels + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) pixels +}}; +} +} diff --git a/main/main.cpp b/main/main.cpp index 8b27520..2b960dc 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -68,6 +68,7 @@ using namespace std::chrono_literals; #include "displays/menus/settingsmenu.h" #include "displays/menus/stationwifisettingsmenu.h" #include "displays/menus/timersmenu.h" +#include "displays/menus/timesettingsmenu.h" #include "displays/menus/wifiscanmenu.h" #include "displays/menus/wifisettingsmenu.h" #ifdef FEATURE_BMS @@ -132,6 +133,7 @@ using namespace std::chrono_literals; #include "cloud.h" #endif #include "wifi_bobbycar.h" +#include "time_bobbycar.h" namespace { std::optional lastWifiUpdate; diff --git a/main/presets.h b/main/presets.h index 7e7817b..93712d3 100644 --- a/main/presets.h +++ b/main/presets.h @@ -1,5 +1,8 @@ #pragma once +// 3rdparty lib includes +#include + // local includes #include "settings.h" #include "stringsettings.h" @@ -21,6 +24,11 @@ constexpr Settings::Limits kidsLimits { .phaseAdvMax = 20 }; +constexpr Settings::TimeSettings defaultTimeSettings { + .timezoneOffset = 60, + .daylightSavingMode = espchrono::DayLightSavingMode::EuropeanSummerTime +}; + constexpr Settings::ControllerHardware defaultControllerHardware { .enableFrontLeft = true, .enableFrontRight = true, @@ -202,6 +210,7 @@ constexpr Settings defaultSettings { #ifdef FEATURE_BLE .bleSettings = defaultBleSettings, #endif + .timeSettings = defaultTimeSettings, .controllerHardware = defaultControllerHardware, .boardcomputerHardware = defaultBoardcomputerHardware, #ifdef FEATURE_CLOUD diff --git a/main/settings.h b/main/settings.h index 6d696a4..0219943 100644 --- a/main/settings.h +++ b/main/settings.h @@ -53,6 +53,11 @@ struct Settings } bleSettings; #endif + struct TimeSettings { + int16_t timezoneOffset; + espchrono::DayLightSavingMode daylightSavingMode; + } timeSettings; + struct ControllerHardware { bool enableFrontLeft, enableFrontRight, enableBackLeft, enableBackRight; bool invertFrontLeft, invertFrontRight, invertBackLeft, invertBackRight; @@ -153,6 +158,9 @@ void Settings::executeForEveryCommonSetting(T &&callable) callable("bleEnabled", bleSettings.bleEnabled); #endif + callable("timezoneOffset", timeSettings.timezoneOffset); + callable("daylightSaving", timeSettings.daylightSavingMode); + callable("wheelDiameter", controllerHardware.wheelDiameter); callable("numMagnetPoles", controllerHardware.numMagnetPoles); callable("swapFrontBack", controllerHardware.swapFrontBack); diff --git a/main/settingspersister.h b/main/settingspersister.h index ffb8649..6e84400 100644 --- a/main/settingspersister.h +++ b/main/settingspersister.h @@ -1,15 +1,20 @@ #pragma once +// system includes #include #include +// esp-idf includes #include #include #include +// 3rdparty lib includes #include #include +#include +// local includes #include "settings.h" #ifdef FEATURE_BLUETOOTH #include "bluetoothmode.h" @@ -217,6 +222,14 @@ template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_ha *out_value = wifi_mode_t(tempValue); return err; }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, espchrono::DayLightSavingMode* out_value) +{ + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = espchrono::DayLightSavingMode(tempValue); + return err; +}}; template bool SettingsPersister::load(T &settings) @@ -300,6 +313,10 @@ template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_ha { return nvs_set_u8(handle, key, uint8_t(value)); }}; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, espchrono::DayLightSavingMode value) +{ + return nvs_set_u8(handle, key, uint8_t(value)); +}}; template bool SettingsPersister::save(T &settings) diff --git a/main/texts.h b/main/texts.h index 3cdf88d..efe1766 100644 --- a/main/texts.h +++ b/main/texts.h @@ -93,6 +93,7 @@ constexpr char TEXT_WIFISETTINGS[] = "WiFi settings"; //constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings"; //constexpr char TEXT_BLESETTINGS[] = "BLE settings"; //constexpr char TEXT_CLOUDSETTINGS[] = "Cloud settings"; +constexpr char TEXT_TIME[] = "Time"; constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; constexpr char TEXT_CONTROLLERHARDWARESETTINGS[] = "Controller H/W settings"; constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings"; @@ -328,6 +329,12 @@ constexpr char TEXT_CLOUDSENDRATE[] = "Cloud send rate"; #endif //constexpr char TEXT_BACK[] = "Back"; +//TimeSettingsMenu +//constexpr char TEXT_TIME[] = "Time"; +constexpr char TEXT_OFFSET[] = "Offset"; +constexpr char TEXT_DAYLIGHTSAVINGMODE[] = "Daylight Saving Mode"; +//constexpr char TEXT_BACK[] = "Back"; + //ChangeValueDisplay constexpr char TEXT_OFF[] = "Off"; constexpr char TEXT_MASTER[] = "Master"; @@ -351,6 +358,12 @@ constexpr char TEXT_SINUSOIDAL[] = "Sinusoidal"; constexpr char TEXT_FIELDORIENTEDCONTROL[] = "Field oriented control"; //constexpr char TEXT_BACK[] = "Back"; +//ChangeValueDisplay +constexpr char TEXT_NONE[] = "None"; +constexpr char TEXT_EUROPEANSUMMERTIME[] = "EuropeanSummerTime"; +constexpr char TEXT_USDAYLIGHTTIME[] = "UsDaylightTime"; +//constexpr char TEXT_BACK[] = "Back"; + //ChangeValueDisplay constexpr char TEXT_LARSMMODE1[] = "Mode1"; constexpr char TEXT_LARSMMODE2[] = "Mode2"; diff --git a/main/time_bobbycar.h b/main/time_bobbycar.h new file mode 100644 index 0000000..c5e1215 --- /dev/null +++ b/main/time_bobbycar.h @@ -0,0 +1,12 @@ +#pragma once + +// 3rdparty lib includes +#include + +// local includes +#include "globals.h" + +auto espchrono::local_clock::timezone() noexcept -> time_zone +{ + return time_zone{minutes32{settings.timeSettings.timezoneOffset}, settings.timeSettings.daylightSavingMode}; +}