From 86da64d5005b1f43d153b91fbb5fe40dbca6cdf2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sun, 7 Jun 2020 19:02:15 +0200 Subject: [PATCH] Added persistent settings for bluetooth and wifi --- src/displays/menus/bluetoothsettingsmenu.h | 13 +++++++++++++ src/displays/menus/settingsmenu.h | 12 ------------ src/main.cpp | 6 ++++-- src/presets.h | 12 +++++++++++- src/screens.h | 4 ++-- src/settings.h | 20 ++++++++++++++++---- src/settingsaccessors.h | 6 +++++- src/settingssaver.h | 12 ++++++++++++ src/texts.h | 2 +- 9 files changed, 64 insertions(+), 23 deletions(-) diff --git a/src/displays/menus/bluetoothsettingsmenu.h b/src/displays/menus/bluetoothsettingsmenu.h index af0afdb..4a8324a 100644 --- a/src/displays/menus/bluetoothsettingsmenu.h +++ b/src/displays/menus/bluetoothsettingsmenu.h @@ -1,5 +1,6 @@ #pragma once +#include "changevaluedisplay.h" #include "menudisplay.h" #include "staticmenudefinition.h" #include "menuitem.h" @@ -11,6 +12,7 @@ #include "actions/bluetoothdisconnectaction.h" #include "actions/switchscreenaction.h" #include "bluetoothtexthelpers.h" +#include "settingsaccessors.h" #include "icons/back.h" #include "texts.h" @@ -19,6 +21,16 @@ class SettingsMenu; } namespace { +class BluetoothSettingsMenu; + +using AutoBluetoothModeChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + AutoBluetoothModeAccessor, + BackActionInterface>, + SwitchScreenAction +>; + class BluetoothSettingsMenu : public MenuDisplay, public StaticText, @@ -34,6 +46,7 @@ class BluetoothSettingsMenu : makeComponent, BluetoothFlushAction>, makeComponent, BluetoothEndAction>, makeComponent, BluetoothDisconnectAction>, + makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> > {}; diff --git a/src/displays/menus/settingsmenu.h b/src/displays/menus/settingsmenu.h index 35cb7af..5717501 100644 --- a/src/displays/menus/settingsmenu.h +++ b/src/displays/menus/settingsmenu.h @@ -5,7 +5,6 @@ #include "menudisplay.h" #include "staticmenudefinition.h" #include "utils.h" -#include "changevaluedisplay.h" #include "actions/toggleboolaction.h" #include "actions/switchscreenaction.h" #include "checkboxicon.h" @@ -17,7 +16,6 @@ #include "icons/back.h" #include "texts.h" #include "globals.h" -#include "settingsaccessors.h" namespace { class LimitsSettingsMenu; @@ -32,15 +30,6 @@ class MainMenu; } namespace { -class SettingsMenu; -using BluetoothModeChangeDisplay = makeComponent< - ChangeValueDisplay, - StaticText, - BluetoothModeAccessor, - BackActionInterface>, - SwitchScreenAction ->; - struct FrontLedAccessor : public RefAccessor { bool &getRef() const override { return front.command.led; } }; struct BackLedAccessor : public RefAccessor { bool &getRef() const override { return back.command.led; } }; @@ -55,7 +44,6 @@ class SettingsMenu : makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>, makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>, - makeComponent, SwitchScreenAction>, #ifdef FEATURE_BMS makeComponent, ToggleBoolAction, CheckboxIcon, AutoConnectBmsAccessor>, #endif diff --git a/src/main.cpp b/src/main.cpp index 138c12f..b1e59c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,7 @@ #include +#include + #include #include #include @@ -96,14 +98,14 @@ void setup() if (!WiFi.begin("realraum", "r3alraum")) Serial.println("Could not begin WiFi"); - if (settings.bluetoothMode == BluetoothMode::Master) + if (settings.bluetoothSettings.autoBluetoothMode == BluetoothMode::Master) { BluetoothBeginMasterAction{}.triggered(); #ifdef FEATURE_BMS if (settings.autoConnectBms) BluetoothConnectBmsAction{}.triggered(); #endif - } else if (settings.bluetoothMode == BluetoothMode::Slave) + } else if (settings.bluetoothSettings.autoBluetoothMode == BluetoothMode::Slave) BluetoothBeginAction{}.triggered(); front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1); diff --git a/src/presets.h b/src/presets.h index fdaaebf..04bb7e5 100644 --- a/src/presets.h +++ b/src/presets.h @@ -51,6 +51,15 @@ constexpr Settings::ControllerHardware mosfetsOffControllerHardware { .swapFrontBack = false }; +constexpr Settings::WifiSettings defaultWifiSettings { + .autoWifiMode = WIFI_MODE_APSTA, + .autoEnableAp = true +}; + +constexpr Settings::BluetoothSettings defaultBluetoothSettings { + .autoBluetoothMode = BluetoothMode::Off +}; + constexpr Settings::ControllerHardware spinnerControllerHardware { .enableFrontLeft = true, .enableFrontRight = true, @@ -127,13 +136,14 @@ constexpr Settings defaultSettings{ #ifdef FEATURE_BMS .autoConnectBms = false, #endif - .bluetoothMode = BluetoothMode::Off, .reverseBeep = false, .reverseBeepFreq0 = 3, .reverseBeepFreq1 = 0, .reverseBeepDuration0 = 500, .reverseBeepDuration1 = 500, .limits = defaultLimits, + .wifiSettings = defaultWifiSettings, + .bluetoothSettings = defaultBluetoothSettings, .controllerHardware = defaultControllerHardware, .boardcomputerHardware = defaultBoardcomputerHardware, .defaultMode = defaultDefaultMode, diff --git a/src/screens.h b/src/screens.h index 6f473e0..914f642 100644 --- a/src/screens.h +++ b/src/screens.h @@ -122,7 +122,7 @@ union X { UpdateDisplay updateDisplay; #endif - BluetoothModeChangeDisplay bluetoothModeChangeDisplay; + AutoBluetoothModeChangeDisplay autoBluetoothModeChangeDisplay; FrontFreqChangeScreen changeFrontFreq; FrontPatternChangeScreen changeFrontPattern; @@ -265,7 +265,7 @@ template<> decltype(displays.statusDisplay) & template<> decltype(displays.updateDisplay) &getRefByType() { return displays.updateDisplay; } #endif -template<> decltype(displays.bluetoothModeChangeDisplay) &getRefByType() { return displays.bluetoothModeChangeDisplay; } +template<> decltype(displays.autoBluetoothModeChangeDisplay) &getRefByType() { return displays.autoBluetoothModeChangeDisplay; } template<> decltype(displays.changeFrontFreq) &getRefByType() { return displays.changeFrontFreq; } template<> decltype(displays.changeFrontPattern) &getRefByType() { return displays.changeFrontPattern; } diff --git a/src/settings.h b/src/settings.h index fd9b59f..b99653b 100644 --- a/src/settings.h +++ b/src/settings.h @@ -2,6 +2,8 @@ #include +#include + #include "bobbycar-protocol/protocol.h" #include "bluetoothmode.h" @@ -16,8 +18,6 @@ struct Settings bool autoConnectBms; #endif - BluetoothMode bluetoothMode; - bool reverseBeep; uint8_t reverseBeepFreq0; uint8_t reverseBeepFreq1; @@ -32,6 +32,15 @@ struct Settings int16_t phaseAdvMax; // [deg] Maximum Phase Advance angle (only for SIN). Higher angle results in higher maximum speed. } limits; + struct WifiSettings { + wifi_mode_t autoWifiMode; + bool autoEnableAp; + } wifiSettings; + + struct BluetoothSettings { + BluetoothMode autoBluetoothMode; + } bluetoothSettings; + struct ControllerHardware { bool enableFrontLeft, enableFrontRight, enableBackLeft, enableBackRight; bool invertFrontLeft, invertFrontRight, invertBackLeft, invertBackRight; @@ -88,8 +97,6 @@ void Settings::executeForEverySetting(T &&callable) callable("autoConnectBms", autoConnectBms); #endif - callable("bluetoothMode", bluetoothMode); - callable("reverseBeep", reverseBeep); callable("revBeepFreq0", reverseBeepFreq0); callable("revBeepFreq1", reverseBeepFreq1); @@ -102,6 +109,11 @@ void Settings::executeForEverySetting(T &&callable) callable("fieldWeakMax", limits.fieldWeakMax); callable("phaseAdvMax", limits.phaseAdvMax); + callable("autoBluetoothMo", bluetoothSettings.autoBluetoothMode); + + callable("autoWifiMode", wifiSettings.autoWifiMode); + callable("autoEnableAp", wifiSettings.autoEnableAp); + callable("enableFrontLeft", controllerHardware.enableFrontLeft); callable("enableFrontRigh", controllerHardware.enableFrontRight); callable("enableBackLeft", controllerHardware.enableBackLeft); diff --git a/src/settingsaccessors.h b/src/settingsaccessors.h index b88e631..86134b9 100644 --- a/src/settingsaccessors.h +++ b/src/settingsaccessors.h @@ -15,7 +15,6 @@ struct RefAccessorSaveSettings : public virtual RefAccessor #ifdef FEATURE_BMS struct AutoConnectBmsAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.autoConnectBms; } }; #endif -struct BluetoothModeAccessor : public RefAccessorSaveSettings { BluetoothMode &getRef() const override { return settings.bluetoothMode; } }; struct ReverseBeepAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.reverseBeep; } }; struct ReverseBeepFreq0Accessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.reverseBeepFreq0; } }; struct ReverseBeepFreq1Accessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.reverseBeepFreq1; } }; @@ -33,6 +32,11 @@ struct NMotMaxRpmAccessor : public RefAccessorSaveSettings { int16_t &g struct FieldWeakMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.fieldWeakMax; } }; struct PhaseAdvMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.limits.phaseAdvMax; } }; +struct AutoWifiModeAccessor : public RefAccessorSaveSettings { wifi_mode_t &getRef() const override { return settings.wifiSettings.autoWifiMode; } }; +struct AutoEnableApAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.wifiSettings.autoEnableAp; } }; + +struct AutoBluetoothModeAccessor : public RefAccessorSaveSettings { BluetoothMode &getRef() const override { return settings.bluetoothSettings.autoBluetoothMode; } }; + 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/src/settingssaver.h b/src/settingssaver.h index 28b669e..b169d80 100644 --- a/src/settingssaver.h +++ b/src/settingssaver.h @@ -109,6 +109,14 @@ template<> struct nvsGetterHelper { static esp_err_t nvs_get(n *out_value = UnifiedModelMode(tempValue); return err; }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, wifi_mode_t* out_value) +{ + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = wifi_mode_t(tempValue); + return err; +}}; bool SettingsSaver::load(Settings &settings) { @@ -155,6 +163,10 @@ template<> struct nvsSetterHelper { static esp_err_t nvs_set(n { return nvs_set_u8(handle, key, uint8_t(value)); }}; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, wifi_mode_t value) +{ + return nvs_set_u8(handle, key, uint8_t(value)); +}}; bool SettingsSaver::save(Settings &settings) { diff --git a/src/texts.h b/src/texts.h index 37ce2cd..f185c96 100644 --- a/src/texts.h +++ b/src/texts.h @@ -20,6 +20,7 @@ constexpr char TEXT_BLUETOOTHBEGINMASTER[] = "begin() Master"; constexpr char TEXT_BLUETOOTHFLUSH[] = "flush()"; constexpr char TEXT_BLUETOOTHEND[] = "end()"; constexpr char TEXT_BLUETOOTHDISCONNECT[] = "disconnect()"; +constexpr char TEXT_AUTOBLUETOOTHMODE[] = "Auto bluetooth mode"; //constexpr char TEXT_BACK[] = "Back"; //BmsMenu @@ -72,7 +73,6 @@ constexpr char TEXT_WIFISETTINGS[] = "WiFi settings"; constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; constexpr char TEXT_CONTROLLERHARDWARESETTINGS[] = "Controller H/W settings"; constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings"; -constexpr char TEXT_BLUETOOTHMODE[] = "Bluetooth mode"; constexpr char TEXT_AUTOCONNECTBMS[] = "Auto connect BMS"; constexpr char TEXT_BUZZER[] = "Buzzer"; constexpr char TEXT_FRONTLED[] = "Front LED";