diff --git a/src/bluetoothmode.h b/src/bluetoothmode.h new file mode 100644 index 0000000..8f58989 --- /dev/null +++ b/src/bluetoothmode.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace { +enum class BluetoothMode : uint8_t +{ + Off, + Master, + Slave +}; +} diff --git a/src/changevaluedisplay.h b/src/changevaluedisplay.h index 54bd889..3de6a21 100644 --- a/src/changevaluedisplay.h +++ b/src/changevaluedisplay.h @@ -136,6 +136,7 @@ void ChangeValueDisplay::confirm() } #include "changevaluedisplay_bool.h" +#include "changevaluedisplay_bluetoothmode.h" #include "changevaluedisplay_controlmode.h" #include "changevaluedisplay_controltype.h" #include "changevaluedisplay_larsmmode_mode.h" diff --git a/src/changevaluedisplay_bluetoothmode.h b/src/changevaluedisplay_bluetoothmode.h new file mode 100644 index 0000000..4a8949d --- /dev/null +++ b/src/changevaluedisplay_bluetoothmode.h @@ -0,0 +1,61 @@ +#pragma once + +#include "changevaluedisplay.h" +#include "menudisplay.h" +#include "staticmenudefinition.h" +#include "utils.h" +#include "actions/dummyaction.h" +#include "icons/back.h" +#include "texts.h" +#include "bluetoothmode.h" + +namespace { +template<> +class ChangeValueDisplay : + public MenuDisplay, + public StaticMenuDefinition< + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction>, + makeComponent, DummyAction, StaticMenuItemIcon<&icons::back>> + >, + public virtual AccessorInterface, + public virtual ActionInterface +{ + using Base = MenuDisplay; + +public: + void start() override; + + void itemPressed(int index) override; +}; + +void ChangeValueDisplay::start() +{ + Base::start(); + + if (getValue() == BluetoothMode::Off) + setSelectedIndex(0); + else if (getValue() == BluetoothMode::Master) + setSelectedIndex(1); + else if (getValue() == BluetoothMode::Slave) + setSelectedIndex(2); + else + { + Serial.printf("Unknown BluetoothMode: %i", int(getValue())); + setSelectedIndex(4); + } +} + +void ChangeValueDisplay::itemPressed(int index) +{ + switch (index) + { + case 0: setValue(BluetoothMode::Off); break; + case 1: setValue(BluetoothMode::Master); break; + case 2: setValue(BluetoothMode::Slave); break; + } + + triggered(); +} +} diff --git a/src/displays/menus/settingsmenu.h b/src/displays/menus/settingsmenu.h index a56808a..35cb7af 100644 --- a/src/displays/menus/settingsmenu.h +++ b/src/displays/menus/settingsmenu.h @@ -5,6 +5,7 @@ #include "menudisplay.h" #include "staticmenudefinition.h" #include "utils.h" +#include "changevaluedisplay.h" #include "actions/toggleboolaction.h" #include "actions/switchscreenaction.h" #include "checkboxicon.h" @@ -31,6 +32,15 @@ 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; } }; @@ -45,6 +55,7 @@ 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 4a440b3..3095bb2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ #include "ota.h" #include "presets.h" #include "statistics.h" +#include "actions/bluetoothbeginaction.h" #include "actions/bluetoothbeginmasteraction.h" #include "actions/bluetoothconnectbmsaction.h" #include "webserver.h" @@ -73,11 +74,15 @@ void setup() WiFi.softAP(deviceName, "Passwort_123"); WiFi.begin("realraum", "r3alraum"); - BluetoothBeginMasterAction{}.triggered(); + if (settings.bluetoothMode == BluetoothMode::Master) + { + BluetoothBeginMasterAction{}.triggered(); #ifdef FEATURE_BMS - if (settings.autoConnectBms) - BluetoothConnectBmsAction{}.triggered(); + if (settings.autoConnectBms) + BluetoothConnectBmsAction{}.triggered(); #endif + } else if (settings.bluetoothMode == BluetoothMode::Slave) + BluetoothBeginAction{}.triggered(); front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1); back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2); diff --git a/src/presets.h b/src/presets.h index cd8c20b..8a1393c 100644 --- a/src/presets.h +++ b/src/presets.h @@ -112,7 +112,8 @@ constexpr Settings defaultSettings{ #ifdef FEATURE_BMS .autoConnectBms = false, #endif - .reverseBeep = true, + .bluetoothMode = BluetoothMode::Off, + .reverseBeep = false, .reverseBeepFreq0 = 3, .reverseBeepFreq1 = 0, .reverseBeepDuration0 = 500, diff --git a/src/screens.h b/src/screens.h index d2b5109..22d5033 100644 --- a/src/screens.h +++ b/src/screens.h @@ -118,6 +118,8 @@ union X { UpdateDisplay updateDisplay; #endif + BluetoothModeChangeDisplay bluetoothModeChangeDisplay; + FrontFreqChangeScreen changeFrontFreq; FrontPatternChangeScreen changeFrontPattern; BackFreqChangeScreen changeBackFreq; @@ -254,6 +256,8 @@ template<> decltype(displays.statusDisplay) & template<> decltype(displays.updateDisplay) &getRefByType() { return displays.updateDisplay; } #endif +template<> decltype(displays.bluetoothModeChangeDisplay) &getRefByType() { return displays.bluetoothModeChangeDisplay; } + template<> decltype(displays.changeFrontFreq) &getRefByType() { return displays.changeFrontFreq; } template<> decltype(displays.changeFrontPattern) &getRefByType() { return displays.changeFrontPattern; } template<> decltype(displays.changeBackFreq) &getRefByType() { return displays.changeBackFreq; } diff --git a/src/settings.h b/src/settings.h index 0a2a81f..836443d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -4,6 +4,8 @@ #include "bobbycar-protocol/protocol.h" +#include "bluetoothmode.h" + namespace { enum class LarsmModeMode : uint8_t { Mode1, Mode2, Mode3, Mode4 }; @@ -12,6 +14,9 @@ struct Settings #ifdef FEATURE_BMS bool autoConnectBms; #endif + + BluetoothMode bluetoothMode; + bool reverseBeep; uint8_t reverseBeepFreq0; uint8_t reverseBeepFreq1; @@ -79,6 +84,9 @@ void Settings::executeForEverySetting(T &&callable) #ifdef FEATURE_BMS callable("autoConnectBms", autoConnectBms); #endif + + callable("bluetoothMode", bluetoothMode); + callable("reverseBeep", reverseBeep); callable("revBeepFreq0", reverseBeepFreq0); callable("revBeepFreq1", reverseBeepFreq1); diff --git a/src/settingsaccessors.h b/src/settingsaccessors.h index 94cbb03..6305b07 100644 --- a/src/settingsaccessors.h +++ b/src/settingsaccessors.h @@ -15,6 +15,7 @@ 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; } }; diff --git a/src/settingssaver.h b/src/settingssaver.h index dec0fd0..71cf731 100644 --- a/src/settingssaver.h +++ b/src/settingssaver.h @@ -7,6 +7,7 @@ #include #include "settings.h" +#include "bluetoothmode.h" namespace { class SettingsSaver @@ -91,6 +92,14 @@ template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_ *out_value = LarsmModeMode(tempValue); return err; }}; +template<> struct nvsGetterHelper { static esp_err_t nvs_get(nvs_handle handle, const char* key, BluetoothMode* out_value) + { + uint8_t tempValue; + esp_err_t err = nvs_get_u8(handle, key, &tempValue); + if (err == ESP_OK) + *out_value = BluetoothMode(tempValue); + return err; + }}; bool SettingsSaver::load(Settings &settings) { @@ -129,6 +138,10 @@ template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_ { return nvs_set_u8(handle, key, uint8_t(value)); }}; +template<> struct nvsSetterHelper { static esp_err_t nvs_set(nvs_handle handle, const char* key, BluetoothMode 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 e67fa00..816ce5c 100644 --- a/src/texts.h +++ b/src/texts.h @@ -68,6 +68,7 @@ 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"; @@ -260,6 +261,11 @@ constexpr char TEXT_LARSM[] = "Larsm"; constexpr char TEXT_GAMETRAK[] = "Gametrak"; //constexpr char TEXT_BACK[] = "Back"; +//ChangeValueDisplay +constexpr char TEXT_OFF[] = "Off"; +constexpr char TEXT_MASTER[] = "Master"; +constexpr char TEXT_SLAVE[] = "Slave"; + //ChangeValueDisplay constexpr char TEXT_TRUE[] = "true"; constexpr char TEXT_FALSE[] = "false";