diff --git a/backtrace.sh b/backtrace.sh new file mode 100755 index 0000000..3ae5e84 --- /dev/null +++ b/backtrace.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +GDB_BINARY=~/.platformio/packages/toolchain-xtensa32/bin/xtensa-esp32-elf-gdb +ELF_FILE=.pio/build/feedc0de_usb/firmware.elf + +if [[ ! -x "$GDB_BINARY" ]] +then + echo Could not find gdb binary: "$GDB_BINARY" + exit 1 +fi + +if [[ ! -f "$ELF_FILE" ]] +then + echo Could not find elf file: "$ELF_FILE" + exit 1 +fi + +ls -lah "$ELF_FILE" + +PARAMS=() +for i in $@ +do + ADDR="$(echo "$i" | cut -d ":" -f 1)" + OUTPUT="$($GDB_BINARY --batch $ELF_FILE -ex "set listsize 1" -ex "l *$ADDR" -ex "q")" + + if [[ -z "$OUTPUT" ]] + then + echo "${ADDR} gdb empty output" + else + echo "${OUTPUT}" + fi +done diff --git a/platformio.ini b/platformio.ini index baf69d1..fc5fbd8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,6 +8,9 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[platformio] +inc_dir = src/espcpputils + [common_env_data] platform = espressif32 board = esp32dev @@ -96,7 +99,7 @@ platform = ${common_env_data.platform} board = ${common_env_data.board} framework = ${common_env_data.framework} platform_packages = ${common_env_data.platform_packages} -board_build.partitions = partitions_4M_noota.csv +board_build.partitions = partitions_4M_ota.csv lib_deps = ${common_env_data.lib_deps} ${webserver_common.lib_deps} @@ -130,7 +133,8 @@ build_flags = -DDEVICE_PREFIX=bobbyquad -DAP_PASSWORD=Passwort_123 ${webserver_common.build_flags} -; -DFEATURE_OTA + -DFEATURE_ARDUINOOTA +; -DFEATURE_WEBOTA -DFEATURE_DPAD_5WIRESW -DPINS_DPAD_5WIRESW_OUT=32 -DPINS_DPAD_5WIRESW_IN1=25 @@ -150,8 +154,8 @@ build_flags = -DDEFAULT_GASMAX=3700 -DDEFAULT_BREMSMIN=1300 -DDEFAULT_BREMSMAX=4000 - -DFEATURE_BLUETOOTH - -DFEATURE_BMS +; -DFEATURE_BLUETOOTH +; -DFEATURE_BMS ; -DFEATURE_GAMETRAK ; -DPINS_GAMETRAKX=34 ; -DPINS_GAMETRAKY=39 @@ -212,7 +216,7 @@ build_flags = -DDEVICE_PREFIX=bobbycar -DAP_PASSWORD=Passwort_123 ${webserver_common.build_flags} - -DFEATURE_OTA + -DFEATURE_ARDUINOOTA -DDEFAULT_GASMIN=400 -DDEFAULT_GASMAX=2000 -DDEFAULT_BREMSMIN=600 @@ -276,7 +280,7 @@ build_flags = -DDEVICE_PREFIX=bobbyquad -DAP_PASSWORD=Passwort_123 ${webserver_common.build_flags} - -DFEATURE_OTA + -DFEATURE_ARDUINOOTA -DFEATURE_DPAD -DPINS_DPAD_UP=32 -DPINS_DPAD_DOWN=22 @@ -310,7 +314,7 @@ build_flags = -DDEVICE_PREFIX=bobbyquad -DAP_PASSWORD=Passwort_123 ${webserver_common.build_flags} - -DFEATURE_OTA + -DFEATURE_ARDUINOOTA -DRPI_DISPLAY_TYPE -DR61581_DRIVER ; TODO: TFT_MISO (touch MISO?) @@ -359,7 +363,7 @@ build_flags = -DDEVICE_PREFIX=bobbycar -DAP_PASSWORD=Passwort_123 ${webserver_common.build_flags} - -DFEATURE_OTA + -DFEATURE_ARDUINOOTA -DDEFAULT_GASMIN=1000 -DDEFAULT_GASMAX=4000 -DDEFAULT_BREMSMIN=200 diff --git a/src/bobby_webserver.h b/src/bobby_webserver.h index 6172407..addbbac 100644 --- a/src/bobby_webserver.h +++ b/src/bobby_webserver.h @@ -1,13 +1,22 @@ #pragma once +// 3rdparty lib includes #include +// local includes #include "screens.h" +#include "textinterface.h" +#include "menudisplay.h" +#include "changevaluedisplay.h" +#include "displays/updatedisplay.h" +//#include "esputils.h" namespace { #ifdef FEATURE_WEBSERVER AsyncWebServer webServer{80}; +bool shouldReboot; + class HtmlTag { public: HtmlTag(const char *tagName, AsyncResponseStream *response) : @@ -29,6 +38,8 @@ private: void initWebserver() { + shouldReboot = false; + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ @@ -64,7 +75,7 @@ void initWebserver() "Back"); } - if (auto constCurrentDisplay = static_cast(currentDisplay)) + if (auto constCurrentDisplay = static_cast(currentDisplay.get())) { if (const auto *textInterface = constCurrentDisplay->asTextInterface()) { @@ -179,7 +190,7 @@ void initWebserver() return; } - if (index < 0 || index >= menuDisplay->size()) + if (index < 0 || index >= menuDisplay->menuItemCount()) { request->send(400, "text/plain", "index out of range"); return; @@ -230,11 +241,111 @@ void initWebserver() request->send(response); }); + +#ifdef FEATURE_WEBOTA + webServer.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(200, "text/html", + "
" + "" + "" + "
" + "
" + "" + "" + "
"); + }); + + const auto handleUpdate = [](AsyncWebServerRequest *request){ + shouldReboot = !Update.hasError(); + + AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", shouldReboot ? "OK" : "FAIL"); + response->addHeader("Connection", "close"); + request->send(response); + }; + + const auto createHandleUpdtateUpload = [](size_t size, int command){ + return [size, command](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ + //ESP_UNUSED(request) + + Serial.printf("callback %u %u\r\n", index, len); + + if (!index) + { + Serial.printf("Update Start: %s\r\n", filename.c_str()); + //Update.runAsync(true); + if (!Update.begin(size, command)) + Update.printError(Serial); + + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else if (ArduinoOTA.getCommand() == U_SPIFFS) // U_SPIFFS + type = "filesystem"; + else + type = "unknown"; + + switchScreenImpl("Updating " + type); + } + + if (!Update.hasError()) + { + if (Update.write(data, len) == len) + { + ((UpdateDisplay*)currentDisplay.get())->m_progress = index; + ((UpdateDisplay*)currentDisplay.get())->m_total = size; + ((UpdateDisplay*)currentDisplay.get())->redraw(); + } + else + { + Update.printError(Serial); + + ((UpdateDisplay*)currentDisplay.get())->m_error = {}; + ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); + } + } + else + { + ((UpdateDisplay*)currentDisplay.get())->m_error = {}; + ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); + } + + if (final) + { + if (Update.end(true)) + { + Serial.printf("Update Success: %uB\r\n", index + len); + + ((UpdateDisplay*)currentDisplay.get())->m_finished = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); + } + else + { + Update.printError(Serial); + + ((UpdateDisplay*)currentDisplay.get())->m_error = {}; + ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); + } + } + }; + }; + + webServer.on("/updateCode", HTTP_POST, handleUpdate, createHandleUpdtateUpload((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000, U_FLASH)); + webServer.on("/updateData", HTTP_POST, handleUpdate, createHandleUpdtateUpload(UPDATE_SIZE_UNKNOWN, U_SPIFFS)); +#endif + webServer.begin(); } void handleWebserver() { + if (shouldReboot) + { + shouldReboot = false; + ESP.restart(); + } } #endif } diff --git a/src/changevaluedisplay_bluetoothmode.h b/src/changevaluedisplay_bluetoothmode.h index f1941c3..ac27a31 100644 --- a/src/changevaluedisplay_bluetoothmode.h +++ b/src/changevaluedisplay_bluetoothmode.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -23,66 +22,30 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 4; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_offAction; - case 1: return m_masterAction; - case 2: return m_slaveAction; - case 3: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_offAction; - case 1: return m_masterAction; - case 2: return m_slaveAction; - case 3: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_offAction); - callback(m_masterAction); - callback(m_slaveAction); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_offAction); - callback(m_masterAction); - callback(m_slaveAction); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_offAction{BluetoothMode::Off, *this, *this}; - makeComponentArgs, StaticText> m_masterAction{BluetoothMode::Master, *this, *this}; - makeComponentArgs, StaticText> m_slaveAction{BluetoothMode::Slave, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(BluetoothMode::Off, *this, *this); + constructMenuItem, StaticText>>(BluetoothMode::Master, *this, *this); + constructMenuItem, StaticText>>(BluetoothMode::Slave, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_offAction.value()) setSelectedIndex(0); else - if (getValue() == m_masterAction.value()) setSelectedIndex(1); else - if (getValue() == m_slaveAction.value()) setSelectedIndex(2); else + switch (const auto value = getValue()) { - Serial.printf("Unknown BluetoothMode: %i", int(getValue())); + case BluetoothMode::Off: setSelectedIndex(0); break; + case BluetoothMode::Master: setSelectedIndex(1); break; + case BluetoothMode::Slave: setSelectedIndex(2); break; + default: + Serial.printf("Unknown BluetoothMode: %i\r\n", int(value)); setSelectedIndex(4); } } diff --git a/src/changevaluedisplay_bool.h b/src/changevaluedisplay_bool.h index 977fb49..d7196e7 100644 --- a/src/changevaluedisplay_bool.h +++ b/src/changevaluedisplay_bool.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "actioninterface.h" #include "utils.h" #include "actions/setvalueaction.h" @@ -20,57 +19,26 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 4; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_trueItem; - case 1: return m_falseItem; - case 2: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_trueItem; - case 1: return m_falseItem; - case 2: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_trueItem); - callback(m_falseItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_trueItem); - callback(m_falseItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_trueItem{true, *this, *this}; - makeComponentArgs, StaticText> m_falseItem{false, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(true, *this, *this); + constructMenuItem, StaticText>>(false, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_trueItem.value()) setSelectedIndex(0); else - if (getValue() == m_falseItem.value()) setSelectedIndex(1); + switch (getValue()) + { + case true: setSelectedIndex(0); break; + case false: setSelectedIndex(1); break; + } } } diff --git a/src/changevaluedisplay_controlmode.h b/src/changevaluedisplay_controlmode.h index 973a8b3..6176fdc 100644 --- a/src/changevaluedisplay_controlmode.h +++ b/src/changevaluedisplay_controlmode.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -19,72 +18,32 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 5; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_openModeItem; - case 1: return m_voltageItem; - case 2: return m_speedItem; - case 3: return m_torqueItem; - case 4: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_openModeItem; - case 1: return m_voltageItem; - case 2: return m_speedItem; - case 3: return m_torqueItem; - case 4: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_openModeItem); - callback(m_voltageItem); - callback(m_speedItem); - callback(m_torqueItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_openModeItem); - callback(m_voltageItem); - callback(m_speedItem); - callback(m_torqueItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_openModeItem{ControlMode::OpenMode, *this, *this}; - makeComponentArgs, StaticText> m_voltageItem{ControlMode::Voltage, *this, *this}; - makeComponentArgs, StaticText> m_speedItem{ControlMode::Speed, *this, *this}; - makeComponentArgs, StaticText> m_torqueItem{ControlMode::Torque, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(ControlMode::OpenMode, *this, *this); + constructMenuItem, StaticText>>(ControlMode::Voltage, *this, *this); + constructMenuItem, StaticText>>(ControlMode::Speed, *this, *this); + constructMenuItem, StaticText>>(ControlMode::Torque, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_openModeItem.value()) setSelectedIndex(0); else - if (getValue() == m_voltageItem.value()) setSelectedIndex(1); else - if (getValue() == m_speedItem.value()) setSelectedIndex(2); else - if (getValue() == m_torqueItem.value()) setSelectedIndex(3); else + switch (const auto value = getValue()) { - Serial.printf("Unknown ControlMode: %i", int(getValue())); + case ControlMode::OpenMode: setSelectedIndex(0); break; + case ControlMode::Voltage: setSelectedIndex(1); break; + case ControlMode::Speed: setSelectedIndex(2); break; + case ControlMode::Torque: setSelectedIndex(3); break; + default: + Serial.printf("Unknown ControlMode: %i\r\n", int(value)); setSelectedIndex(4); } } diff --git a/src/changevaluedisplay_controltype.h b/src/changevaluedisplay_controltype.h index f9c8613..2ff213a 100644 --- a/src/changevaluedisplay_controltype.h +++ b/src/changevaluedisplay_controltype.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -19,66 +18,30 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 4; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_commutationItem; - case 1: return m_sinusoidalItem; - case 2: return m_fieldOrientedControlItem; - case 3: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_commutationItem; - case 1: return m_sinusoidalItem; - case 2: return m_fieldOrientedControlItem; - case 3: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_commutationItem); - callback(m_sinusoidalItem); - callback(m_fieldOrientedControlItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_commutationItem); - callback(m_sinusoidalItem); - callback(m_fieldOrientedControlItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_commutationItem{ControlType::Commutation, *this, *this}; - makeComponentArgs, StaticText> m_sinusoidalItem{ControlType::Sinusoidal, *this, *this}; - makeComponentArgs, StaticText> m_fieldOrientedControlItem{ControlType::FieldOrientedControl, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(ControlType::Commutation, *this, *this); + constructMenuItem, StaticText>>(ControlType::Sinusoidal, *this, *this); + constructMenuItem, StaticText>>(ControlType::FieldOrientedControl, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_commutationItem.value()) setSelectedIndex(0); else - if (getValue() == m_sinusoidalItem.value()) setSelectedIndex(1); else - if (getValue() == m_fieldOrientedControlItem.value()) setSelectedIndex(2); else + switch (const auto value = getValue()) { - Serial.printf("Unknown ControlType: %i", int(getValue())); + case ControlType::Commutation: setSelectedIndex(0); break; + case ControlType::Sinusoidal: setSelectedIndex(1); break; + case ControlType::FieldOrientedControl: setSelectedIndex(2); break; + default: + Serial.printf("Unknown ControlType: %i\r\n", int(value)); setSelectedIndex(3); } } diff --git a/src/changevaluedisplay_larsmmode_mode.h b/src/changevaluedisplay_larsmmode_mode.h index cb8d19c..8a0dfd8 100644 --- a/src/changevaluedisplay_larsmmode_mode.h +++ b/src/changevaluedisplay_larsmmode_mode.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -20,72 +19,32 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 5; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_larsmMode1Item; - case 1: return m_larsmMode2Item; - case 2: return m_larsmMode3Item; - case 3: return m_larsmMode4Item; - case 4: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_larsmMode1Item; - case 1: return m_larsmMode2Item; - case 2: return m_larsmMode3Item; - case 3: return m_larsmMode4Item; - case 4: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_larsmMode1Item); - callback(m_larsmMode2Item); - callback(m_larsmMode3Item); - callback(m_larsmMode4Item); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_larsmMode1Item); - callback(m_larsmMode2Item); - callback(m_larsmMode3Item); - callback(m_larsmMode4Item); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_larsmMode1Item{LarsmModeMode::Mode1, *this, *this}; - makeComponentArgs, StaticText> m_larsmMode2Item{LarsmModeMode::Mode2, *this, *this}; - makeComponentArgs, StaticText> m_larsmMode3Item{LarsmModeMode::Mode3, *this, *this}; - makeComponentArgs, StaticText> m_larsmMode4Item{LarsmModeMode::Mode4, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(LarsmModeMode::Mode1, *this, *this); + constructMenuItem, StaticText>>(LarsmModeMode::Mode2, *this, *this); + constructMenuItem, StaticText>>(LarsmModeMode::Mode3, *this, *this); + constructMenuItem, StaticText>>(LarsmModeMode::Mode4, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_larsmMode1Item.value()) setSelectedIndex(0); else - if (getValue() == m_larsmMode2Item.value()) setSelectedIndex(1); else - if (getValue() == m_larsmMode3Item.value()) setSelectedIndex(2); else - if (getValue() == m_larsmMode4Item.value()) setSelectedIndex(3); else + switch (const auto value = getValue()) { - Serial.printf("Unknown LarsmModeMode: %i", int(getValue())); + case LarsmModeMode::Mode1: setSelectedIndex(0); break; + case LarsmModeMode::Mode2: setSelectedIndex(1); break; + case LarsmModeMode::Mode3: setSelectedIndex(2); break; + case LarsmModeMode::Mode4: setSelectedIndex(3); break; + default: + Serial.printf("Unknown LarsmModeMode: %i\r\n", int(value)); setSelectedIndex(4); } } diff --git a/src/changevaluedisplay_unifiedmodelmode.h b/src/changevaluedisplay_unifiedmodelmode.h index c6e8751..af82f50 100644 --- a/src/changevaluedisplay_unifiedmodelmode.h +++ b/src/changevaluedisplay_unifiedmodelmode.h @@ -2,7 +2,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -20,78 +19,34 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 6; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_commutationItem; - case 1: return m_sinusoidalItem; - case 2: return m_focVoltageItem; - case 3: return m_focSpeedItem; - case 4: return m_focTorqueItem; - case 5: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_commutationItem; - case 1: return m_sinusoidalItem; - case 2: return m_focVoltageItem; - case 3: return m_focSpeedItem; - case 4: return m_focTorqueItem; - case 5: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_commutationItem); - callback(m_sinusoidalItem); - callback(m_focVoltageItem); - callback(m_focSpeedItem); - callback(m_focTorqueItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_commutationItem); - callback(m_sinusoidalItem); - callback(m_focVoltageItem); - callback(m_focSpeedItem); - callback(m_focTorqueItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_commutationItem{UnifiedModelMode::Commutation, *this, *this}; - makeComponentArgs, StaticText> m_sinusoidalItem{UnifiedModelMode::Sinusoidal, *this, *this}; - makeComponentArgs, StaticText> m_focVoltageItem{UnifiedModelMode::FocVoltage, *this, *this}; - makeComponentArgs, StaticText> m_focSpeedItem{UnifiedModelMode::FocSpeed, *this, *this}; - makeComponentArgs, StaticText> m_focTorqueItem{UnifiedModelMode::FocTorque, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(UnifiedModelMode::Commutation, *this, *this); + constructMenuItem, StaticText>>(UnifiedModelMode::Sinusoidal, *this, *this); + constructMenuItem, StaticText>>(UnifiedModelMode::FocVoltage, *this, *this); + constructMenuItem, StaticText>>(UnifiedModelMode::FocSpeed, *this, *this); + constructMenuItem, StaticText>>(UnifiedModelMode::FocTorque, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_commutationItem.value()) setSelectedIndex(0); else - if (getValue() == m_sinusoidalItem.value()) setSelectedIndex(1); else - if (getValue() == m_focVoltageItem.value()) setSelectedIndex(2); else - if (getValue() == m_focSpeedItem.value()) setSelectedIndex(3); else - if (getValue() == m_focTorqueItem.value()) setSelectedIndex(4); else + switch (const auto value = getValue()) { - Serial.printf("Unknown UnifiedModelMode: %i", int(getValue())); + case UnifiedModelMode::Commutation: setSelectedIndex(0); break; + case UnifiedModelMode::Sinusoidal: setSelectedIndex(1); break; + case UnifiedModelMode::FocVoltage: setSelectedIndex(2); break; + case UnifiedModelMode::FocSpeed: setSelectedIndex(3); break; + case UnifiedModelMode::FocTorque: setSelectedIndex(4); break; + default: + Serial.printf("Unknown UnifiedModelMode: %i\r\n", int(value)); setSelectedIndex(5); } } diff --git a/src/changevaluedisplay_wifi_mode_t.h b/src/changevaluedisplay_wifi_mode_t.h index 74616fb..4d396d6 100644 --- a/src/changevaluedisplay_wifi_mode_t.h +++ b/src/changevaluedisplay_wifi_mode_t.h @@ -4,7 +4,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -21,72 +20,32 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 5; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_nullItem; - case 1: return m_staItem; - case 2: return m_apItem; - case 3: return m_apStaItem; - case 4: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_nullItem; - case 1: return m_staItem; - case 2: return m_apItem; - case 3: return m_apStaItem; - case 4: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_nullItem); - callback(m_staItem); - callback(m_apItem); - callback(m_apStaItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_nullItem); - callback(m_staItem); - callback(m_apItem); - callback(m_apStaItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_nullItem{WIFI_MODE_NULL, *this, *this}; - makeComponentArgs, StaticText> m_staItem{WIFI_MODE_STA, *this, *this}; - makeComponentArgs, StaticText> m_apItem{WIFI_MODE_AP, *this, *this}; - makeComponentArgs, StaticText> m_apStaItem{WIFI_MODE_APSTA, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(WIFI_MODE_NULL, *this, *this); + constructMenuItem, StaticText>>(WIFI_MODE_STA, *this, *this); + constructMenuItem, StaticText>>(WIFI_MODE_AP, *this, *this); + constructMenuItem, StaticText>>(WIFI_MODE_APSTA, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_nullItem.value()) setSelectedIndex(0); else - if (getValue() == m_staItem.value()) setSelectedIndex(1); else - if (getValue() == m_apItem.value()) setSelectedIndex(2); else - if (getValue() == m_apStaItem.value()) setSelectedIndex(3); else + switch (const auto value = getValue()) { - Serial.printf("Unknown wifi_mode_t: %i", int(getValue())); + case WIFI_MODE_NULL: setSelectedIndex(0); break; + case WIFI_MODE_STA: setSelectedIndex(1); break; + case WIFI_MODE_AP: setSelectedIndex(2); break; + case WIFI_MODE_APSTA: setSelectedIndex(3); break; + default: + Serial.printf("Unknown wifi_mode_t: %i\r\n", int(value)); setSelectedIndex(4); } } diff --git a/src/changevaluedisplay_wifi_power_t.h b/src/changevaluedisplay_wifi_power_t.h index c135675..fa11ff9 100644 --- a/src/changevaluedisplay_wifi_power_t.h +++ b/src/changevaluedisplay_wifi_power_t.h @@ -4,7 +4,6 @@ #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/setvalueaction.h" #include "actions/backproxyaction.h" @@ -21,120 +20,48 @@ class ChangeValueDisplay : using Base = MenuDisplay; public: + ChangeValueDisplay(); + void start() override; - - std::size_t size() const override { return 13; } - - MenuItem& getMenuItem(std::size_t index) override - { - switch (index) - { - case 0: return m_19_5dBmItem; - case 1: return m_19dBmItem; - case 2: return m_18_5dBmItem; - case 3: return m_17dBmItem; - case 4: return m_15dBmItem; - case 5: return m_13dBmItem; - case 6: return m_11dBmItem; - case 7: return m_8_5dBmItem; - case 8: return m_7dBmItem; - case 9: return m_5dBmItem; - case 10: return m_2dBmItem; - case 11: return m_MINUS_1dBmItem; - case 12: return m_backItem; - } - - throw "aua"; - } - const MenuItem& getMenuItem(std::size_t index) const override - { - switch (index) - { - case 0: return m_19_5dBmItem; - case 1: return m_19dBmItem; - case 2: return m_18_5dBmItem; - case 3: return m_17dBmItem; - case 4: return m_15dBmItem; - case 5: return m_13dBmItem; - case 6: return m_11dBmItem; - case 7: return m_8_5dBmItem; - case 8: return m_7dBmItem; - case 9: return m_5dBmItem; - case 10: return m_2dBmItem; - case 11: return m_MINUS_1dBmItem; - case 12: return m_backItem; - } - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(m_19_5dBmItem); - callback(m_19dBmItem); - callback(m_18_5dBmItem); - callback(m_17dBmItem); - callback(m_15dBmItem); - callback(m_13dBmItem); - callback(m_11dBmItem); - callback(m_8_5dBmItem); - callback(m_7dBmItem); - callback(m_5dBmItem); - callback(m_2dBmItem); - callback(m_MINUS_1dBmItem); - callback(m_backItem); - } - void runForEveryMenuItem(std::function &&callback) const override - { - callback(m_19_5dBmItem); - callback(m_19dBmItem); - callback(m_18_5dBmItem); - callback(m_17dBmItem); - callback(m_15dBmItem); - callback(m_13dBmItem); - callback(m_11dBmItem); - callback(m_8_5dBmItem); - callback(m_7dBmItem); - callback(m_5dBmItem); - callback(m_2dBmItem); - callback(m_MINUS_1dBmItem); - callback(m_backItem); - } - -private: - makeComponentArgs, StaticText> m_19_5dBmItem{WIFI_POWER_19_5dBm, *this, *this}; - makeComponentArgs, StaticText> m_19dBmItem{WIFI_POWER_19dBm, *this, *this}; - makeComponentArgs, StaticText> m_18_5dBmItem{WIFI_POWER_18_5dBm, *this, *this}; - makeComponentArgs, StaticText> m_17dBmItem{WIFI_POWER_17dBm, *this, *this}; - makeComponentArgs, StaticText> m_15dBmItem{WIFI_POWER_15dBm, *this, *this}; - makeComponentArgs, StaticText> m_13dBmItem{WIFI_POWER_13dBm, *this, *this}; - makeComponentArgs, StaticText> m_11dBmItem{WIFI_POWER_11dBm, *this, *this}; - makeComponentArgs, StaticText> m_8_5dBmItem{WIFI_POWER_8_5dBm, *this, *this}; - makeComponentArgs, StaticText> m_7dBmItem{WIFI_POWER_7dBm, *this, *this}; - makeComponentArgs, StaticText> m_5dBmItem{WIFI_POWER_5dBm, *this, *this}; - makeComponentArgs, StaticText> m_2dBmItem{WIFI_POWER_2dBm, *this, *this}; - makeComponentArgs, StaticText> m_MINUS_1dBmItem{WIFI_POWER_MINUS_1dBm, *this, *this}; - makeComponentArgs, StaticMenuItemIcon<&icons::back>> m_backItem{*this}; }; +ChangeValueDisplay::ChangeValueDisplay() +{ + constructMenuItem, StaticText>>(WIFI_POWER_19_5dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_19dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_18_5dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_17dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_15dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_13dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_11dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_8_5dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_7dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_5dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_2dBm, *this, *this); + constructMenuItem, StaticText>>(WIFI_POWER_MINUS_1dBm, *this, *this); + constructMenuItem, StaticMenuItemIcon<&icons::back>>>(*this); +} + void ChangeValueDisplay::start() { Base::start(); - if (getValue() == m_19_5dBmItem.value()) setSelectedIndex(0); else - if (getValue() == m_19dBmItem.value()) setSelectedIndex(1); else - if (getValue() == m_18_5dBmItem.value()) setSelectedIndex(2); else - if (getValue() == m_17dBmItem.value()) setSelectedIndex(3); else - if (getValue() == m_15dBmItem.value()) setSelectedIndex(4); else - if (getValue() == m_13dBmItem.value()) setSelectedIndex(5); else - if (getValue() == m_11dBmItem.value()) setSelectedIndex(6); else - if (getValue() == m_8_5dBmItem.value()) setSelectedIndex(7); else - if (getValue() == m_7dBmItem.value()) setSelectedIndex(8); else - if (getValue() == m_5dBmItem.value()) setSelectedIndex(9); else - if (getValue() == m_2dBmItem.value()) setSelectedIndex(10); else - if (getValue() == m_MINUS_1dBmItem.value()) setSelectedIndex(11); else + switch (const auto value = getValue()) { - Serial.printf("Unknown wifi_power_t: %i", int(getValue())); + case WIFI_POWER_19_5dBm: setSelectedIndex(0); break; + case WIFI_POWER_19dBm: setSelectedIndex(1); break; + case WIFI_POWER_18_5dBm: setSelectedIndex(2); break; + case WIFI_POWER_17dBm: setSelectedIndex(3); break; + case WIFI_POWER_15dBm: setSelectedIndex(4); break; + case WIFI_POWER_13dBm: setSelectedIndex(5); break; + case WIFI_POWER_11dBm: setSelectedIndex(6); break; + case WIFI_POWER_8_5dBm: setSelectedIndex(7); break; + case WIFI_POWER_7dBm: setSelectedIndex(8); break; + case WIFI_POWER_5dBm: setSelectedIndex(9); break; + case WIFI_POWER_2dBm: setSelectedIndex(10); break; + case WIFI_POWER_MINUS_1dBm: setSelectedIndex(11); break; + default: + Serial.printf("Unknown wifi_power_t: %i\r\n", int(value)); setSelectedIndex(12); } } diff --git a/src/displays/gameoflifedisplay.h b/src/displays/gameoflifedisplay.h index 6be42b3..ea37694 100644 --- a/src/displays/gameoflifedisplay.h +++ b/src/displays/gameoflifedisplay.h @@ -46,34 +46,37 @@ private: static const constexpr auto GEN_DELAY = 0; - template auto index(T x, T y) + int index(int x, int y) { if (x >= GRIDX) { - Serial.printf("x: %i", x); + Serial.printf("x: %i\r\n", x); return 0; } if (y >= GRIDY) { - Serial.printf("y: %i", x); + Serial.printf("y: %i\r\n", x); return 0; } - return (x * GRIDX) + y; + const auto result = (x * GRIDY) + y; + if (result >= GRIDX*GRIDY) + { + Serial.printf("x:%i y:%i x*y:%i\r\n", x, y, result); + return 0; + } + return result; } - struct Data - { - std::bitset grid, newgrid; - }; - - std::unique_ptr m_data; + std::unique_ptr> m_grid; + std::unique_ptr> m_newgrid; int gen = 0; }; void GameOfLifeDisplay::start() { - m_data = std::make_unique(); + m_grid = std::make_unique>(); + m_newgrid = std::make_unique>(); } void GameOfLifeDisplay::initScreen() @@ -93,21 +96,17 @@ void GameOfLifeDisplay::redraw() computeCA(); drawGrid(); - m_data->grid = m_data->newgrid; -// for (int16_t x = 1; x < GRIDX-1; x++) { -// for (int16_t y = 1; y < GRIDY-1; y++) { -// grid[index(x,y)] = m_data->newgrid[index(x,y)]; -// } -// } + *m_grid = *m_newgrid; - if (++gen == 200) + if (++gen == 500) gen = 0; } void GameOfLifeDisplay::stop() { tft.setRotation(0); - m_data = nullptr; + m_grid = nullptr; + m_newgrid = nullptr; } void GameOfLifeDisplay::drawGrid() @@ -115,8 +114,8 @@ void GameOfLifeDisplay::drawGrid() uint16_t color = TFT_WHITE; for (int16_t x = 1; x < GRIDX - 1; x++) { for (int16_t y = 1; y < GRIDY - 1; y++) { - if ((m_data->grid[index(x,y)]) != (m_data->newgrid[index(x,y)])) { - if (m_data->newgrid[index(x,y)] == 1) + if (((*m_grid)[index(x,y)]) != ((*m_newgrid)[index(x,y)])) { + if ((*m_newgrid)[index(x,y)] == 1) color = 0xFFFF; //random(0xFFFF); else color = 0; @@ -130,16 +129,16 @@ void GameOfLifeDisplay::initGrid() { for (int16_t x = 0; x < GRIDX; x++) { for (int16_t y = 0; y < GRIDY; y++) { - m_data->newgrid[index(x,y)] = 0; + (*m_newgrid)[index(x,y)] = 0; if (x == 0 || x == GRIDX - 1 || y == 0 || y == GRIDY - 1) - m_data->grid[index(x,y)] = 0; + (*m_grid)[index(x,y)] = 0; else { if (random(3) == 1) - m_data->grid[index(x,y)] = 1; + (*m_grid)[index(x,y)] = 1; else - m_data->grid[index(x,y)] = 0; + (*m_grid)[index(x,y)] = 0; } } @@ -160,7 +159,7 @@ int GameOfLifeDisplay::getNumberOfNeighbors(int x, int y) if (new_x >= 0 && new_y >= 0 && new_x < GRIDX && new_y < GRIDY) - n += m_data->grid[index(new_x, new_y)]; + n += (*m_grid)[index(new_x, new_y)]; } return n; @@ -171,14 +170,14 @@ void GameOfLifeDisplay::computeCA() for (int16_t x = 1; x < GRIDX; x++) { for (int16_t y = 1; y < GRIDY; y++) { int neighbors = getNumberOfNeighbors(x, y); - if (m_data->grid[index(x,y)] == true && (neighbors == 2 || neighbors == 3 )) - m_data->newgrid[index(x,y)] = true; - else if (m_data->grid[index(x,y)] == 1) - m_data->newgrid[index(x,y)] = false; - if (m_data->grid[index(x,y)] == false && (neighbors == 3)) - m_data->newgrid[index(x,y)] = true; - else if (m_data->grid[index(x,y)] == 0) - m_data->newgrid[index(x,y)] = false; + if ((*m_grid)[index(x,y)] == true && (neighbors == 2 || neighbors == 3 )) + (*m_newgrid)[index(x,y)] = true; + else if ((*m_grid)[index(x,y)] == 1) + (*m_newgrid)[index(x,y)] = false; + if ((*m_grid)[index(x,y)] == false && (neighbors == 3)) + (*m_newgrid)[index(x,y)] = true; + else if ((*m_grid)[index(x,y)] == 0) + (*m_newgrid)[index(x,y)] = false; } } } diff --git a/src/displays/menus/aboutmenu.h b/src/displays/menus/aboutmenu.h index a88a17b..b49f4b9 100644 --- a/src/displays/menus/aboutmenu.h +++ b/src/displays/menus/aboutmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/dummyaction.h" #include "actions/switchscreenaction.h" @@ -9,9 +9,10 @@ #include "esptexthelpers.h" #include "texts.h" +// forward declares namespace { class SettingsMenu; -} +} // namespace namespace { constexpr char TEXT_VERSION[] = "Version: 1.0"; @@ -20,30 +21,33 @@ constexpr char TEXT_ESPINFO[] = "ESP info:"; class AboutMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + AboutMenu() + { + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/accesspointwifisettingsmenu.h b/src/displays/menus/accesspointwifisettingsmenu.h index 26853ac..eda736e 100644 --- a/src/displays/menus/accesspointwifisettingsmenu.h +++ b/src/displays/menus/accesspointwifisettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "menuitem.h" #include "actions/dummyaction.h" #include "actions/wifisoftapaction.h" @@ -13,29 +13,33 @@ #include "wifitexthelpers.h" #include "texts.h" +// forward declares namespace { class WifiSettingsMenu; -} +} // namespace namespace { class AccessPointWifiSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, WifiSoftApAction>, - makeComponent, WifiSoftApDisconnectAction>, - makeComponent, WifiSoftApDisconnectWifioffAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, WifiSoftApEnableIpV6Action>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + AccessPointWifiSettingsMenu() + { + constructMenuItem, WifiSoftApAction>>(); + constructMenuItem, WifiSoftApDisconnectAction>>(); + constructMenuItem, WifiSoftApDisconnectWifioffAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, WifiSoftApEnableIpV6Action>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/bluetoothsettingsmenu.h b/src/displays/menus/bluetoothsettingsmenu.h index d8d80ba..f0df53d 100644 --- a/src/displays/menus/bluetoothsettingsmenu.h +++ b/src/displays/menus/bluetoothsettingsmenu.h @@ -1,8 +1,8 @@ #pragma once +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "menuitem.h" #include "actions/dummyaction.h" #ifdef FEATURE_BLUETOOTH @@ -18,9 +18,10 @@ #include "icons/back.h" #include "texts.h" +// forward declares namespace { class SettingsMenu; -} +} // namespace namespace { #ifdef FEATURE_BLUETOOTH @@ -37,21 +38,24 @@ using AutoBluetoothModeChangeDisplay = makeComponent< class BluetoothSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, - makeComponent, -// makeComponent, // crashes - makeComponent, - makeComponent, - makeComponent, BluetoothBeginAction>, - makeComponent, BluetoothBeginMasterAction>, - makeComponent, BluetoothFlushAction>, - makeComponent, BluetoothEndAction>, - makeComponent, BluetoothDisconnectAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + BluetoothSettingsMenu() + { + constructMenuItem>(); + constructMenuItem>(); +// constructMenuItem>(); // crashes + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem, BluetoothBeginAction>>(); + constructMenuItem, BluetoothBeginMasterAction>>(); + constructMenuItem, BluetoothFlushAction>>(); + constructMenuItem, BluetoothEndAction>>(); + constructMenuItem, BluetoothDisconnectAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; #endif -} +} // namespace diff --git a/src/displays/menus/bmsmenu.h b/src/displays/menus/bmsmenu.h index 1a15a02..3226308 100644 --- a/src/displays/menus/bmsmenu.h +++ b/src/displays/menus/bmsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #ifdef FEATURE_BLUETOOTH @@ -18,26 +18,30 @@ #include "icons/back.h" #include "texts.h" +//forward declares namespace { class MainMenu; -} +} // namespace namespace { #if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS) class BmsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, BluetoothConnectBmsAction>, - makeComponent, BluetoothDisconnectAction>, - makeComponent, - makeComponent, BmsTurnOnChargeAction>, - makeComponent, BmsTurnOffChargeAction>, - makeComponent, BmsTurnOnDischargeAction>, - makeComponent, BmsTurnOffDischargeAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + BmsMenu() + { + constructMenuItem, BluetoothConnectBmsAction>>(); + constructMenuItem, BluetoothDisconnectAction>>(); + constructMenuItem>(); + constructMenuItem, BmsTurnOnChargeAction>>(); + constructMenuItem, BmsTurnOffChargeAction>>(); + constructMenuItem, BmsTurnOnDischargeAction>>(); + constructMenuItem, BmsTurnOffDischargeAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; #endif -} +} // namespace diff --git a/src/displays/menus/boardcomputerhardwaresettingsmenu.h b/src/displays/menus/boardcomputerhardwaresettingsmenu.h index 26b7d41..382c4f5 100644 --- a/src/displays/menus/boardcomputerhardwaresettingsmenu.h +++ b/src/displays/menus/boardcomputerhardwaresettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "actions/dummyaction.h" @@ -12,13 +12,14 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class BoardcomputerHardwareSettingsMenu; class CalibrateDisplay; class GametrakCalibrateDisplay; class TimersMenu; class SettingsMenu; -} +} // namespace namespace { struct GasText : public virtual TextInterface { @@ -137,36 +138,39 @@ using GametrakDistMaxChangeScreen = makeComponent< class BoardcomputerHardwareSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, + public BackActionInterface> +{ +public: + BoardcomputerHardwareSettingsMenu() + { + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) - makeComponent, SwitchScreenAction>, + constructMenuItem, SwitchScreenAction>>(); #endif #ifdef FEATURE_GAMETRAK - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, + constructMenuItem, DummyAction>, + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #endif - makeComponent, DummyAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, SwapScreenBytesAccessor>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + constructMenuItem, DummyAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, SwapScreenBytesAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/buzzermenu.h b/src/displays/menus/buzzermenu.h index 898d24d..b68a918 100644 --- a/src/displays/menus/buzzermenu.h +++ b/src/displays/menus/buzzermenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "menuitem.h" @@ -13,10 +13,11 @@ #include "globals.h" #include "settingsaccessors.h" +// forward declares namespace { class BuzzerMenu; class SettingsMenu; -} +} // namespace namespace { struct FrontFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return controllers.front.command.buzzer.freq; } }; @@ -87,18 +88,21 @@ using ReverseBeepDuration1ChangeScreen = makeComponent< class BuzzerMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, ReverseBeepAccessor>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + BuzzerMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, ReverseBeepAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/commanddebugmenu.h b/src/displays/menus/commanddebugmenu.h index 6e8a6b1..cb211aa 100644 --- a/src/displays/menus/commanddebugmenu.h +++ b/src/displays/menus/commanddebugmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -10,25 +10,30 @@ #include "texts.h" #include "debugtexthelpers.h" +// forward declares namespace { class DebugMenu; -} +} // namespace namespace { template class CommandDebugMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + CommandDebugMenu() + { + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; class FrontCommandDebugMenu : public CommandDebugMenu {}; class BackCommandDebugMenu : public CommandDebugMenu {}; -} + +} // namespace diff --git a/src/displays/menus/controllerhardwaresettingsmenu.h b/src/displays/menus/controllerhardwaresettingsmenu.h index 5a09488..4199fa6 100644 --- a/src/displays/menus/controllerhardwaresettingsmenu.h +++ b/src/displays/menus/controllerhardwaresettingsmenu.h @@ -2,8 +2,8 @@ #include +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "actions/toggleboolaction.h" @@ -14,13 +14,14 @@ #include "globals.h" #include "settingsaccessors.h" +// forward declares namespace { class ControllerHardwareSettingsMenu; class BoardcomputerHardwareSettingsMenu; class EnableMenu; class InvertMenu; class SettingsMenu; -} +} // namespace namespace { using WheelDiameterMmChangeScreen = makeComponent< @@ -49,15 +50,18 @@ using NumMagnetPolesChangeScreen = makeComponent< class ControllerHardwareSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, SwapFrontBackAccessor>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + ControllerHardwareSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, SwapFrontBackAccessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/debugmenu.h b/src/displays/menus/debugmenu.h index b869294..30f9f20 100644 --- a/src/displays/menus/debugmenu.h +++ b/src/displays/menus/debugmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/loadsettingsaction.h" @@ -16,6 +16,7 @@ #include "texts.h" #include "debugcolorhelpers.h" +// forward declares namespace { class MainMenu; class FrontCommandDebugMenu; @@ -31,36 +32,39 @@ class FrontRightMotorFeedbackDebugMenu; class BackLeftMotorFeedbackDebugMenu; class BackRightMotorFeedbackDebugMenu; class DynamicDebugMenu; -} +} // namespace namespace { class DebugMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, LoadSettingsAction>, - makeComponent, SaveSettingsAction>, - makeComponent, EraseNvsAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction, FrontFeedbackColor>, - makeComponent, SwitchScreenAction, BackFeedbackColor>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction, FrontFeedbackColor>, - makeComponent, SwitchScreenAction, FrontFeedbackColor>, - makeComponent, SwitchScreenAction, BackFeedbackColor>, - makeComponent, SwitchScreenAction, BackFeedbackColor>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + DebugMenu() + { + constructMenuItem, LoadSettingsAction>>(); + constructMenuItem, SaveSettingsAction>>(); + constructMenuItem, EraseNvsAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction, FrontFeedbackColor>>(); + constructMenuItem, SwitchScreenAction, BackFeedbackColor>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction, FrontFeedbackColor>>(); + constructMenuItem, SwitchScreenAction, FrontFeedbackColor>>(); + constructMenuItem, SwitchScreenAction, BackFeedbackColor>>(); + constructMenuItem, SwitchScreenAction, BackFeedbackColor>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/defaultmodesettingsmenu.h b/src/displays/menus/defaultmodesettingsmenu.h index aba50a7..e2c215d 100644 --- a/src/displays/menus/defaultmodesettingsmenu.h +++ b/src/displays/menus/defaultmodesettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "menuitem.h" @@ -12,10 +12,11 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class DefaultModeSettingsMenu; class ModesSettingsMenu; -} +} // namespace namespace { using DefaultModeModelModeChangeDisplay = makeComponent< @@ -85,21 +86,24 @@ using DefaultModeBrems2WertChangeDisplay = makeComponent< class DefaultModeSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, DefaultModeSquareGasAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, DefaultModeSquareBremsAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingAccessor>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + DefaultModeSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeSquareGasAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeSquareBremsAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/demosmenu.h b/src/displays/menus/demosmenu.h index c2d5975..22b3fd5 100644 --- a/src/displays/menus/demosmenu.h +++ b/src/displays/menus/demosmenu.h @@ -1,32 +1,36 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" +// forward declares namespace { class StarfieldDisplay; class PingPongDisplay; class SpiroDisplay; class GameOfLifeDisplay; class MainMenu; -} +} // namespace namespace { class DemosMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + DemosMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/dynamicdebugmenu.h b/src/displays/menus/dynamicdebugmenu.h index 265bb74..4ce6480 100644 --- a/src/displays/menus/dynamicdebugmenu.h +++ b/src/displays/menus/dynamicdebugmenu.h @@ -1,10 +1,11 @@ #pragma once +// Arduino includes #include #include +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/switchscreenaction.h" @@ -16,9 +17,10 @@ #include "texts.h" #include "types.h" +// forward declares namespace { class DebugMenu; -} +} // namespace namespace { class RandomText : public virtual TextInterface @@ -122,34 +124,37 @@ constexpr char TEXT_DEBUGTOGGLE[] = "Toggle"; class DynamicDebugMenu : public MenuDisplay, public RandomText, - public BackActionInterface>, - public StaticMenuDefinition< + public BackActionInterface> +{ +public: + DynamicDebugMenu() + { // dummy items to allow for scrolling - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); // the interesting bits - makeComponent, - makeComponent, RandomColor, DummyAction>, - makeComponent, RandomFont, DummyAction>, - makeComponent, RandomIcon, DummyAction>, - makeComponent, StaticMenuItemIcon<&icons::lock>, DummyAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, ToggleAccessor>, - makeComponent, + constructMenuItem>(); + constructMenuItem, RandomColor, DummyAction>>(); + constructMenuItem, RandomFont, DummyAction>>(); + constructMenuItem, RandomIcon, DummyAction>>(); + constructMenuItem, StaticMenuItemIcon<&icons::lock>, DummyAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, ToggleAccessor>>(); + constructMenuItem>(); // more scrolling - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/enablemenu.h b/src/displays/menus/enablemenu.h index 583ee3e..9fdbfe4 100644 --- a/src/displays/menus/enablemenu.h +++ b/src/displays/menus/enablemenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/toggleboolaction.h" @@ -11,21 +11,25 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class ControllerHardwareSettingsMenu; -} +} // namespace namespace { class EnableMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, ToggleBoolAction, CheckboxIcon, FrontLeftEnabledAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, FrontRightEnabledAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, BackLeftEnabledAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, BackRightEnabledAccessor>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + EnableMenu() + { + constructMenuItem, ToggleBoolAction, CheckboxIcon, FrontLeftEnabledAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, FrontRightEnabledAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, BackLeftEnabledAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, BackRightEnabledAccessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/feedbackdebugmenu.h b/src/displays/menus/feedbackdebugmenu.h index 0e40c27..e290c43 100644 --- a/src/displays/menus/feedbackdebugmenu.h +++ b/src/displays/menus/feedbackdebugmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -11,25 +11,31 @@ #include "debugtexthelpers.h" #include "debugcolorhelpers.h" +// forward declares namespace { class DebugMenu; -} +} // namespace namespace { template class ColorInterface> class FeedbackDebugMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, ColorInterface, DummyAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + FeedbackDebugMenu() + { + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, ColorInterface, DummyAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; class FrontFeedbackDebugMenu : public FeedbackDebugMenu {}; -class BackFeedbackDebugMenu : public FeedbackDebugMenu {}; } +class BackFeedbackDebugMenu : public FeedbackDebugMenu {}; + +} // namespace diff --git a/src/displays/menus/gametrakmodesettingsmenu.h b/src/displays/menus/gametrakmodesettingsmenu.h index 698cac0..57f303a 100644 --- a/src/displays/menus/gametrakmodesettingsmenu.h +++ b/src/displays/menus/gametrakmodesettingsmenu.h @@ -1,26 +1,30 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" +// forward declares namespace { class ModesSettingsMenu; -} +} // namespace namespace { #ifdef FEATURE_GAMETRAK -class GametrakModeSettingsMenu : +class ContainerModeSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + ContainerModeSettingsMenu() + { + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; #endif -} +} // namespace diff --git a/src/displays/menus/genericwifisettingsmenu.h b/src/displays/menus/genericwifisettingsmenu.h index 9fe390f..3ee2fc6 100644 --- a/src/displays/menus/genericwifisettingsmenu.h +++ b/src/displays/menus/genericwifisettingsmenu.h @@ -1,9 +1,10 @@ #pragma once +// Arduino includes #include +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "changevaluedisplay.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -15,10 +16,11 @@ #include "wifiaccessors.h" #include "texts.h" +// forward declares namespace { class GenericWifiSettingsMenu; class WifiSettingsMenu; -} +} // namespace namespace { using WifiModeChangeScreen = makeComponent< @@ -40,14 +42,17 @@ using WifiTxPowerChangeScreen = makeComponent< class GenericWifiSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, - makeComponent, - makeComponent, SwitchScreenAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, WifiSleepAccessor>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + GenericWifiSettingsMenu() + { + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, WifiSleepAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/graphsmenu.h b/src/displays/menus/graphsmenu.h index f77c427..6bbd51d 100644 --- a/src/displays/menus/graphsmenu.h +++ b/src/displays/menus/graphsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/switchscreenaction.h" #include "icons/back.h" @@ -10,10 +10,11 @@ #include "displays/splitgraphdisplay.h" #include "statistics.h" +// forward declares namespace { class MainMenu; class GraphsMenu; -} +} // namespace namespace { using GasGraphDisplay = makeComponent< @@ -148,27 +149,30 @@ using MotorCurrentsGraphDisplay = makeComponent< class GraphsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, + public BackActionInterface> +{ +public: + GraphsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #ifdef FEATURE_BMS - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #endif - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/invertmenu.h b/src/displays/menus/invertmenu.h index 4031426..c498c23 100644 --- a/src/displays/menus/invertmenu.h +++ b/src/displays/menus/invertmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/toggleboolaction.h" @@ -11,21 +11,25 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class ControllerHardwareSettingsMenu; -} +} // namespace namespace { class InvertMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, ToggleBoolAction, CheckboxIcon, FrontLeftInvertedAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, FrontRightInvertedAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, BackLeftInvertedAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, BackRightInvertedAccessor>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + InvertMenu() + { + constructMenuItem, ToggleBoolAction, CheckboxIcon, FrontLeftInvertedAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, FrontRightInvertedAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, BackLeftInvertedAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, BackRightInvertedAccessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/larsmmodesettingsmenu.h b/src/displays/menus/larsmmodesettingsmenu.h index 1b80bd7..892dcfb 100644 --- a/src/displays/menus/larsmmodesettingsmenu.h +++ b/src/displays/menus/larsmmodesettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "menuitem.h" @@ -10,10 +10,11 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class LarsmModeSettingsMenu; class ModesSettingsMenu; -} +} // namespace namespace { using LarsmModeModelModeChangeDisplay = makeComponent< @@ -41,12 +42,15 @@ using LarsmModeIterationsChangeDisplay = makeComponent< class LarsmModeSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + LarsmModeSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/limitssettingsmenu.h b/src/displays/menus/limitssettingsmenu.h index 695b628..d8b18c3 100644 --- a/src/displays/menus/limitssettingsmenu.h +++ b/src/displays/menus/limitssettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "menuitem.h" @@ -10,10 +10,11 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class LimitsSettingsMenu; class SettingsMenu; -} +} // namespace namespace { using IMotMaxChangeScreen = makeComponent< @@ -62,15 +63,18 @@ using PhaseAdvMaxChangeScreen = makeComponent< class LimitsSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + LimitsSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/mainmenu.h b/src/displays/menus/mainmenu.h index aee6a1f..622b946 100644 --- a/src/displays/menus/mainmenu.h +++ b/src/displays/menus/mainmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "menuitem.h" #include "actions/switchscreenaction.h" #include "actions/modesettingsaction.h" @@ -18,6 +18,7 @@ #include "icons/poweroff.h" #include "icons/reboot.h" +// forward declares namespace { class StatusDisplay; class SelectModeMenu; @@ -31,32 +32,35 @@ class MosfetsMenu; class DemosMenu; class PoweroffDisplay; class DebugMenu; -} +} // namespace namespace { class MainMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>, - makeComponent, ModeSettingsAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>, + public BackActionInterface> +{ +public: + MainMenu() + { + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>>(); + constructMenuItem, ModeSettingsAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>>(); #ifdef FEATURE_BMS - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>, + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>>(); #ifdef FEATURE_MOSFETS - makeComponent, SwitchScreenAction>, + constructMenuItem, SwitchScreenAction>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>, - makeComponent, RebootAction, StaticMenuItemIcon<&icons::reboot>>, - makeComponent, SwitchScreenAction> - > -{}; + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>>(); + constructMenuItem, RebootAction, StaticMenuItemIcon<&icons::reboot>>>(); + constructMenuItem, SwitchScreenAction>>(); + } }; +} // namespace diff --git a/src/displays/menus/modessettingsmenu.h b/src/displays/menus/modessettingsmenu.h index 63b372b..5c8d639 100644 --- a/src/displays/menus/modessettingsmenu.h +++ b/src/displays/menus/modessettingsmenu.h @@ -1,33 +1,37 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "menuitem.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" +// forward declares namespace { class DefaultModeSettingsMenu; class TempomatModeSettingsMenu; class LarsmModeSettingsMenu; class GametrakModeSettingsMenu; class SettingsMenu; -} +} // namespace namespace { class ModesSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, + public BackActionInterface> +{ +public: + ModesSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); #ifdef FEATURE_GAMETRAK - makeComponent, SwitchScreenAction>, + constructMenuItem, SwitchScreenAction>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/mosfetsmenu.h b/src/displays/menus/mosfetsmenu.h index a574ecd..79b4ae0 100644 --- a/src/displays/menus/mosfetsmenu.h +++ b/src/displays/menus/mosfetsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/toggleboolaction.h" @@ -11,9 +11,10 @@ #include "texts.h" #include "types.h" +// forward declares namespace { class MainMenu; -} +} // namespace namespace { #ifdef FEATURE_MOSFETS @@ -32,13 +33,16 @@ using Mosfet2Accessor = GPIOAccessor; class MosfetsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, ToggleBoolAction, CheckboxIcon, Mosfet0Accessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, Mosfet1Accessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, Mosfet2Accessor>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + MosfetsMenu() + { + constructMenuItem, ToggleBoolAction, CheckboxIcon, Mosfet0Accessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, Mosfet1Accessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, Mosfet2Accessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; #endif -} +} // namespace diff --git a/src/displays/menus/motorfeedbackdebugmenu.h b/src/displays/menus/motorfeedbackdebugmenu.h index cf01dd2..ec07797 100644 --- a/src/displays/menus/motorfeedbackdebugmenu.h +++ b/src/displays/menus/motorfeedbackdebugmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -11,31 +11,36 @@ #include "debugtexthelpers.h" #include "debugcolorhelpers.h" +// forward declares namespace { class DebugMenu; -} +} // namespace namespace { template class ColorInterface> class MotorFeedbackDebugMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, DummyAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + MotorFeedbackDebugMenu() + { + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, DummyAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; class FrontLeftMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; class FrontRightMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; class BackLeftMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; class BackRightMotorFeedbackDebugMenu : public MotorFeedbackDebugMenu {}; -} + +} // namespace diff --git a/src/displays/menus/motorstatedebugmenu.h b/src/displays/menus/motorstatedebugmenu.h index ce29146..f8aa962 100644 --- a/src/displays/menus/motorstatedebugmenu.h +++ b/src/displays/menus/motorstatedebugmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -10,32 +10,37 @@ #include "texts.h" #include "debugtexthelpers.h" +// forward declares namespace { class DebugMenu; -} +} // namespace namespace { template class MotorStateDebugMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; + public BackActionInterface> +{ +public: + MotorStateDebugMenu() + { + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; class FrontLeftMotorStateDebugMenu : public MotorStateDebugMenu {}; class FrontRightMotorStateDebugMenu : public MotorStateDebugMenu {}; class BackLeftMotorStateDebugMenu : public MotorStateDebugMenu {}; class BackRightMotorStateDebugMenu : public MotorStateDebugMenu {}; -} + +} // namespace diff --git a/src/displays/menus/presetsmenu.h b/src/displays/menus/presetsmenu.h index aff3b55..9fde848 100644 --- a/src/displays/menus/presetsmenu.h +++ b/src/displays/menus/presetsmenu.h @@ -1,8 +1,8 @@ #pragma once +// local includes #include "actioninterface.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/multiaction.h" #include "actions/switchscreenaction.h" @@ -12,9 +12,10 @@ #include "presets.h" #include "globals.h" +// forward declares namespace { class MainMenu; -} +} // namespace namespace { class ApplyPresetAction : public virtual ActionInterface @@ -75,20 +76,23 @@ public: class PresetsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, MultiAction, SwitchScreenAction>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + PresetsMenu() + { + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, MultiAction, SwitchScreenAction>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/profilesmenu.h b/src/displays/menus/profilesmenu.h index 4727234..bb0c62a 100644 --- a/src/displays/menus/profilesmenu.h +++ b/src/displays/menus/profilesmenu.h @@ -1,27 +1,31 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "actions/switchprofileaction.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" +// forward declares namespace { class MainMenu; -} +} // namespace namespace { class ProfilesMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchProfileAction<0>>, - makeComponent, SwitchProfileAction<1>>, - makeComponent, SwitchProfileAction<2>>, - makeComponent, SwitchProfileAction<3>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + ProfilesMenu() + { + constructMenuItem, SwitchProfileAction<0>>>(); + constructMenuItem, SwitchProfileAction<1>>>(); + constructMenuItem, SwitchProfileAction<2>>>(); + constructMenuItem, SwitchProfileAction<3>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/selectmodemenu.h b/src/displays/menus/selectmodemenu.h index 13f544f..9ef6771 100644 --- a/src/displays/menus/selectmodemenu.h +++ b/src/displays/menus/selectmodemenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/multiaction.h" #include "actions/switchscreenaction.h" @@ -14,9 +14,10 @@ #include "modes/larsmmode.h" #include "modes/gametrakmode.h" +// forward declares namespace { class MainMenu; -} +} // namespace namespace { template @@ -35,20 +36,22 @@ using SetGametrakModeAction = SetterAction, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, MultiAction>>, - makeComponent, MultiAction>>, - makeComponent, MultiAction>>, -#ifdef FEATURE_GAMETRAK - makeComponent, MultiAction>>, -#endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > + public BackActionInterface> { using Base = MenuDisplay; public: + SelectModeMenu() + { + constructMenuItem, MultiAction>>>(); + constructMenuItem, MultiAction>>>(); + constructMenuItem, MultiAction>>>(); +#ifdef FEATURE_GAMETRAK + constructMenuItem, MultiAction>>>(); +#endif + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } + void start() override; }; @@ -68,4 +71,4 @@ void SelectModeMenu::start() setSelectedIndex(3); } } -} +} // namespace diff --git a/src/displays/menus/settingsmenu.h b/src/displays/menus/settingsmenu.h index abd69b3..f1623a5 100644 --- a/src/displays/menus/settingsmenu.h +++ b/src/displays/menus/settingsmenu.h @@ -1,9 +1,10 @@ #pragma once +// Arduino includes #include +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/toggleboolaction.h" #include "actions/switchscreenaction.h" @@ -18,7 +19,9 @@ #include "icons/back.h" #include "texts.h" #include "globals.h" +#include "settingsaccessors.h" +// forward declares namespace { class LimitsSettingsMenu; class WifiSettingsMenu; @@ -38,24 +41,27 @@ struct BackLedAccessor : public RefAccessor { bool &getRef() const overrid class SettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::wifi>>, + public BackActionInterface> +{ +public: + SettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::wifi>>>(); #ifdef FEATURE_BLUETOOTH - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bluetooth>>, + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::bluetooth>>>(); #endif - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>, + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>>(); #if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS) - makeComponent, ToggleBoolAction, CheckboxIcon, AutoConnectBmsAccessor>, + constructMenuItem, ToggleBoolAction, CheckboxIcon, AutoConnectBmsAccessor>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::buzzer>>, - makeComponent, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, BackLedAccessor>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::info>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::buzzer>>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, BackLedAccessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::info>>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/stationwifisettingsmenu.h b/src/displays/menus/stationwifisettingsmenu.h index 920d2ee..c060d26 100644 --- a/src/displays/menus/stationwifisettingsmenu.h +++ b/src/displays/menus/stationwifisettingsmenu.h @@ -1,9 +1,10 @@ #pragma once +// Arduino includes #include +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "menuitem.h" #include "actions/dummyaction.h" @@ -18,38 +19,42 @@ #include "wifiaccessors.h" #include "texts.h" +// forward declares namespace { class WifiSettingsMenu; -} +} // namespace namespace { class StationWifiSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, WifiReconnectAction>, - makeComponent, WifiDisconnectAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, WifiAutoConnectAccessor>, - makeComponent, ToggleBoolAction, CheckboxIcon, WifiAutoReconnectAccessor>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, WifiEnableIpV6Action>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, DisabledColor, DummyAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + StationWifiSettingsMenu() + { + constructMenuItem, WifiReconnectAction>>(); + constructMenuItem, WifiDisconnectAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, WifiAutoConnectAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, WifiAutoReconnectAccessor>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, WifiEnableIpV6Action>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, DisabledColor, DummyAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/tempomatmodesettingsmenu.h b/src/displays/menus/tempomatmodesettingsmenu.h index 7664871..af31cae 100644 --- a/src/displays/menus/tempomatmodesettingsmenu.h +++ b/src/displays/menus/tempomatmodesettingsmenu.h @@ -1,7 +1,7 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "changevaluedisplay.h" #include "menuitem.h" @@ -10,10 +10,11 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class TempomatModeSettingsMenu; class ModesSettingsMenu; -} +} // namespace namespace { using TempomatModeModelModeChangeScreen = makeComponent< @@ -27,10 +28,13 @@ using TempomatModeModelModeChangeScreen = makeComponent< class TempomatModeSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + TempomatModeSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/timersmenu.h b/src/displays/menus/timersmenu.h index dce5f75..13c360d 100644 --- a/src/displays/menus/timersmenu.h +++ b/src/displays/menus/timersmenu.h @@ -1,17 +1,18 @@ #pragma once +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/switchscreenaction.h" #include "icons/back.h" #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class BoardcomputerHardwareSettingsMenu; -} +} // namespace namespace { class TimersMenu; @@ -59,14 +60,17 @@ using DisplayRedrawRateChangeDisplay = makeComponent< class TimersMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + TimersMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/menus/wifiscanmenu.h b/src/displays/menus/wifiscanmenu.h index 7ca7666..1965030 100644 --- a/src/displays/menus/wifiscanmenu.h +++ b/src/displays/menus/wifiscanmenu.h @@ -1,10 +1,10 @@ #pragma once -#include - +// Arduino includes #include #include +// local includes #include "menudisplay.h" #include "utils.h" #include "actions/multiaction.h" @@ -14,9 +14,10 @@ #include "texts.h" #include "types.h" +// forward declares namespace { class WifiSettingsMenu; -} +} // namespace namespace { class WifiScanMenu : public MenuDisplay, public BackActionInterface> @@ -24,55 +25,28 @@ class WifiScanMenu : public MenuDisplay, public BackActionInterface &&callback) override - { - for (auto &item : vec) - callback(item); - callback(m_backItem); - } - - void runForEveryMenuItem(std::function &&callback) const override - { - for (auto &item : vec) - callback(item); - callback(m_backItem); - } - private: - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> m_backItem; - - std::vector> vec; - millis_t m_lastScanComplete; + + std::vector>> m_reusableItems; }; +WifiScanMenu::WifiScanMenu() +{ + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); +} + String WifiScanMenu::text() const { - auto text = String{vec.size()} + " found"; + auto text = String{menuItemCount()-1} + " found"; switch (WiFi.scanComplete()) { case WIFI_SCAN_RUNNING: text += " (scanning)"; break; @@ -95,26 +69,40 @@ void WifiScanMenu::update() const auto n = WiFi.scanComplete(); if (n >= 0) { - if (n != vec.size()) - { - while (n > vec.size()) - { - vec.emplace_back(); - vec.back().start(); - } - - while (n < vec.size()) - { - vec.back().stop(); - vec.pop_back(); - } - } - const auto now = millis(); if (!m_lastScanComplete) { - for (auto iter = std::begin(vec); iter != std::end(vec); iter++) - iter->setTitle(WiFi.SSID(std::distance(std::begin(vec), iter))); + auto backButton = takeLastMenuItem(); + + for (std::size_t i = 0; i < n; i++) + { + const auto ssid = WiFi.SSID(i); + if (menuItemCount() <= i) + { + if (m_reusableItems.empty()) + { + auto &item = constructMenuItem>(); + item.setTitle(ssid); + } + else + { + std::unique_ptr> ptr = std::move(m_reusableItems.back()); + m_reusableItems.pop_back(); + ptr->setTitle(ssid); + emplaceMenuItem(std::move(ptr)); + } + } + else + { + auto &item = *(makeComponent*)(&getMenuItem(i)); + item.setTitle(ssid); + } + } + + while (menuItemCount() > n) + m_reusableItems.emplace_back((makeComponent*)takeLastMenuItem().release()); + + emplaceMenuItem(std::move(backButton)); m_lastScanComplete = now; } @@ -132,4 +120,4 @@ void WifiScanMenu::stop() { WiFi.scanDelete(); } -} +} // namespace diff --git a/src/displays/menus/wifisettingsmenu.h b/src/displays/menus/wifisettingsmenu.h index 3ad3ccd..5ea15c3 100644 --- a/src/displays/menus/wifisettingsmenu.h +++ b/src/displays/menus/wifisettingsmenu.h @@ -1,8 +1,8 @@ #pragma once +// local includes #include "changevaluedisplay.h" #include "menudisplay.h" -#include "staticmenudefinition.h" #include "utils.h" #include "actions/switchscreenaction.h" #include "actions/toggleboolaction.h" @@ -12,13 +12,14 @@ #include "texts.h" #include "settingsaccessors.h" +// forward declares namespace { class GenericWifiSettingsMenu; class StationWifiSettingsMenu; class WifiScanMenu; class AccessPointWifiSettingsMenu; class SettingsMenu; -} +} // namespace namespace { class WifiSettingsMenu; @@ -34,15 +35,18 @@ using AutoWifiModeChangeDisplay = makeComponent< class WifiSettingsMenu : public MenuDisplay, public StaticText, - public BackActionInterface>, - public StaticMenuDefinition< - makeComponent, SwitchScreenAction>, - makeComponent, ToggleBoolAction, CheckboxIcon, AutoEnableApAccessor>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::scan>>, - makeComponent, SwitchScreenAction>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> - > -{}; -} + public BackActionInterface> +{ +public: + WifiSettingsMenu() + { + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, AutoEnableApAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::scan>>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +} // namespace diff --git a/src/displays/updatedisplay.h b/src/displays/updatedisplay.h index 4fd6aeb..8fbbbb1 100644 --- a/src/displays/updatedisplay.h +++ b/src/displays/updatedisplay.h @@ -18,7 +18,7 @@ class StatusDisplay; } namespace { -#ifdef FEATURE_OTA +#ifdef FEATURE_ARDUINOOTA class UpdateDisplay : public Display, public DummyBack { public: diff --git a/src/globals.h b/src/globals.h index 17a97c6..8baa4b0 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1,7 +1,10 @@ #pragma once +// system includes #include +#include +// Arduino includes #ifdef FEATURE_BLUETOOTH #include #endif @@ -9,6 +12,7 @@ #include #include +// local includes #include "controller.h" #include "display.h" #include "modeinterface.h" @@ -67,7 +71,7 @@ TFT_eSPI tft = TFT_eSPI(); ModeInterface *currentMode{}; -Display *currentDisplay{}; +std::unique_ptr currentDisplay; int rotated{}; bool requestFullRedraw{}; diff --git a/src/icons/logo.h b/src/icons/logo.h index 3450bfc..db7ade9 100644 --- a/src/icons/logo.h +++ b/src/icons/logo.h @@ -4,6 +4,7 @@ namespace { namespace icons { +/* const Icon<240, 130> logo{{ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16) pixels 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32) pixels @@ -1956,5 +1957,6 @@ const Icon<240, 130> logo{{ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79D0 (31184) pixels 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79E0 (31200) pixels }}; +*/ } } diff --git a/src/main.cpp b/src/main.cpp index 19068ca..703049c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,55 @@ #include "globals.h" #include "modes/defaultmode.h" #include "modes/tempomatmode.h" +#include "displays/menus/aboutmenu.h" +#include "displays/menus/accesspointwifisettingsmenu.h" +#ifdef FEATURE_BLUETOOTH +#include "displays/menus/bluetoothsettingsmenu.h" +#endif +#include "displays/menus/bmsmenu.h" +#include "displays/menus/buzzermenu.h" +#include "displays/menus/commanddebugmenu.h" +#include "displays/menus/debugmenu.h" +#include "displays/menus/defaultmodesettingsmenu.h" +#include "displays/menus/demosmenu.h" +#include "displays/menus/dynamicdebugmenu.h" +#include "displays/menus/enablemenu.h" +#include "displays/menus/feedbackdebugmenu.h" +#include "displays/menus/gametrakmodesettingsmenu.h" +#include "displays/menus/genericwifisettingsmenu.h" +#include "displays/menus/graphsmenu.h" +#include "displays/menus/controllerhardwaresettingsmenu.h" +#include "displays/menus/invertmenu.h" +#include "displays/menus/larsmmodesettingsmenu.h" +#include "displays/menus/limitssettingsmenu.h" +#include "displays/menus/mainmenu.h" +#include "displays/menus/tempomatmodesettingsmenu.h" +#include "displays/menus/modessettingsmenu.h" +#include "displays/menus/mosfetsmenu.h" +#include "displays/menus/motorfeedbackdebugmenu.h" +#include "displays/menus/motorstatedebugmenu.h" +#include "displays/menus/profilesmenu.h" +#include "displays/menus/presetsmenu.h" +#include "displays/menus/boardcomputerhardwaresettingsmenu.h" +#include "displays/menus/selectmodemenu.h" +#include "displays/menus/settingsmenu.h" +#include "displays/menus/stationwifisettingsmenu.h" +#include "displays/menus/timersmenu.h" +#include "displays/menus/wifiscanmenu.h" +#include "displays/menus/wifisettingsmenu.h" +#include "displays/bmsdisplay.h" +#include "displays/calibratedisplay.h" #include "displays/dpad5wiredebugdisplay.h" +#include "displays/gameoflifedisplay.h" +#include "displays/gametrakcalibratedisplay.h" +#include "displays/lockscreen.h" +#include "displays/metersdisplay.h" +#include "displays/pingpongdisplay.h" +#include "displays/poweroffdisplay.h" +#include "displays/spirodisplay.h" +#include "displays/starfielddisplay.h" +#include "displays/statusdisplay.h" +#include "displays/updatedisplay.h" #include "screens.h" #include "dpad.h" #include "dpad3wire.h" @@ -40,16 +88,28 @@ millis_t lastDisplayUpdate{}; millis_t lastDisplayRedraw{}; } +void printMemoryStats(const char *s) +{ + Serial.printf("MEMORY %s 8bit: %u 32bit: %u\r\n", + s, + heap_caps_get_free_size(MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT), + heap_caps_get_free_size(MALLOC_CAP_INTERNAL|MALLOC_CAP_32BIT)); +} + void setup() { Serial.begin(115200); Serial.setDebugOutput(true); - Serial.println("setup()"); + //Serial.println("setup()"); + + printMemoryStats("setup()"); + pinMode(3, INPUT_PULLUP); currentlyReverseBeeping = false; initScreen(); + printMemoryStats("initScreen()"); #ifdef FEATURE_DPAD bootLabel.redraw("dpad"); @@ -92,9 +152,11 @@ void setup() loadSettings(); } } + printMemoryStats("loadSettings()"); bootLabel.redraw("swap front back"); updateSwapFrontBack(); + printMemoryStats("swapFronBack()"); bootLabel.redraw("deviceName"); { @@ -102,39 +164,47 @@ void setup() WiFi.macAddress(&macAddress[0]); std::sprintf(deviceName, STRING(DEVICE_PREFIX) "_%02hhx%02hhx%02hhx", macAddress[3], macAddress[4], macAddress[5]); } + printMemoryStats("deviceName"); bootLabel.redraw("setHostname"); if (!WiFi.setHostname(deviceName)) Serial.println("Could not setHostname"); + printMemoryStats("setHostname()"); bootLabel.redraw("softAPsetHostname"); if (!WiFi.softAPsetHostname(deviceName)) Serial.println("Could not softAPsetHostname"); + printMemoryStats("softAPsetHostname()"); bootLabel.redraw("WiFi mode"); if (!WiFi.mode(settings.wifiSettings.autoWifiMode)) Serial.println("Could not set mode to WIFI_AP_STA"); + printMemoryStats("WiFi.mode()"); if (settings.wifiSettings.autoEnableAp) { bootLabel.redraw("WiFi softAp"); WifiSoftApAction{}.triggered(); } + printMemoryStats("WifiSoftApAction()"); bootLabel.redraw("WiFi begin"); if (!WiFi.begin("realraum", "r3alraum")) Serial.println("Could not begin WiFi"); + printMemoryStats("WiFi.begin()"); #ifdef FEATURE_BLUETOOTH if (settings.bluetoothSettings.autoBluetoothMode == BluetoothMode::Master) { bootLabel.redraw("bluetooth begin master"); BluetoothBeginMasterAction{}.triggered(); + printMemoryStats("BluetoothBeginMasterAction()"); #ifdef FEATURE_BMS if (settings.autoConnectBms) { bootLabel.redraw("connect BMS"); BluetoothConnectBmsAction{}.triggered(); + printMemoryStats("BluetoothConnectBmsAction()"); } #endif } @@ -142,6 +212,7 @@ void setup() { bootLabel.redraw("bluetooth begin"); BluetoothBeginAction{}.triggered(); + printMemoryStats("BluetoothBeginAction()"); } #endif @@ -161,16 +232,19 @@ void setup() currentMode = &modes::defaultMode; -#ifdef FEATURE_OTA +#ifdef FEATURE_ARDUINOOTA bootLabel.redraw("ota"); initOta(); + printMemoryStats("initOta()"); #endif bootLabel.redraw("webserver"); initWebserver(); + printMemoryStats("initWebserver()"); bootLabel.redraw("potis"); readPotis(); + printMemoryStats("readPotis()"); #if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) switchScreen(); @@ -181,10 +255,15 @@ void setup() switchScreen(true); else switchScreen(); + + printMemoryStats("switchScreen()"); } void loop() { + //Serial.println("loop()"); + //printMemoryStats("loop()"); + const auto now = millis(); #ifdef FEATURE_DPAD @@ -258,7 +337,7 @@ void loop() handleSerial(); -#ifdef FEATURE_OTA +#ifdef FEATURE_ARDUINOOTA handleOta(); #endif diff --git a/src/menudefinitioninterface.h b/src/menudefinitioninterface.h deleted file mode 100644 index cc08847..0000000 --- a/src/menudefinitioninterface.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -#include "menuitem.h" - -namespace { -class MenuDefinitionInterface -{ -public: - virtual std::size_t size() const = 0; - - virtual MenuItem& getMenuItem(std::size_t index) = 0; - virtual const MenuItem& getMenuItem(std::size_t index) const = 0; - - virtual void runForEveryMenuItem(std::function &&callback) = 0; - virtual void runForEveryMenuItem(std::function &&callback) const = 0; -}; -} diff --git a/src/menudisplay.h b/src/menudisplay.h index 84826a3..67c4979 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -8,11 +8,10 @@ #include "textinterface.h" #include "widgets/label.h" #include "globals.h" -#include "menudefinitioninterface.h" #include "menuitem.h" namespace { -class MenuDisplay : public Display, public virtual TextInterface, public virtual MenuDefinitionInterface +class MenuDisplay : public Display, public virtual TextInterface { public: void start() override; @@ -32,6 +31,66 @@ public: int selectedIndex() const { return m_selectedIndex; } + + std::size_t menuItemCount() const { return m_menuItems.size(); } + + MenuItem& getMenuItem(std::size_t index) + { + if (index < m_menuItems.size()) + return *m_menuItems[index].get(); + + throw "aua"; + } + + const MenuItem& getMenuItem(std::size_t index) const + { + if (index < m_menuItems.size()) + return *m_menuItems[index].get(); + + throw "aua"; + } + + void runForEveryMenuItem(std::function &&callback) + { + for (const auto &ptr : m_menuItems) + callback(*ptr); + } + + void runForEveryMenuItem(std::function &&callback) const + { + for (const auto &ptr : m_menuItems) + callback(*ptr); + } + + template + T &constructMenuItem(Args&&... args) + { + auto ptr = std::make_unique(std::forward(args)...); + T &ref = *ptr; + emplaceMenuItem(std::move(ptr)); + return ref; + } + + void emplaceMenuItem(std::unique_ptr &&ptr) + { + m_menuItems.emplace_back(std::move(ptr)); + } + + void clearMenuItems() + { + m_menuItems.clear(); + } + + std::unique_ptr takeLastMenuItem() + { + if (m_menuItems.empty()) + throw "aua"; + + std::unique_ptr ptr = std::move(m_menuItems.back()); + m_menuItems.pop_back(); + return ptr; + } + protected: void setSelectedIndex(int selectedIndex) { m_selectedIndex = selectedIndex; } @@ -65,6 +124,8 @@ private: int m_rotateOffset; bool m_pressed; + + std::vector> m_menuItems; }; void MenuDisplay::start() @@ -102,7 +163,7 @@ void MenuDisplay::update() const auto offset = m_rotateOffset; m_rotateOffset = 0; - const auto itemCount = size(); + const auto itemCount = menuItemCount(); if (itemCount) { diff --git a/src/ota.h b/src/ota.h index f63c2a3..a27494a 100644 --- a/src/ota.h +++ b/src/ota.h @@ -1,14 +1,15 @@ #pragma once -#ifdef FEATURE_OTA +#ifdef FEATURE_ARDUINOOTA #include #endif #include "screens.h" +#include "globals.h" #include "displays/updatedisplay.h" namespace { -#ifdef FEATURE_OTA +#ifdef FEATURE_ARDUINOOTA void initOta() { ArduinoOTA @@ -24,18 +25,18 @@ void initOta() switchScreenImpl("Updating " + type); }) .onEnd([]() { - getRefByType().m_finished = true; - getRefByType().redraw(); + ((UpdateDisplay*)currentDisplay.get())->m_finished = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); }) .onProgress([](unsigned int progress, unsigned int total) { - getRefByType().m_progress = progress; - getRefByType().m_total = total; - getRefByType().redraw(); + ((UpdateDisplay*)currentDisplay.get())->m_progress = progress; + ((UpdateDisplay*)currentDisplay.get())->m_total = total; + ((UpdateDisplay*)currentDisplay.get())->redraw(); }) .onError([](ota_error_t error) { - getRefByType().m_error = error; - getRefByType().m_errorValid = true; - getRefByType().redraw(); + ((UpdateDisplay*)currentDisplay.get())->m_error = error; + ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true; + ((UpdateDisplay*)currentDisplay.get())->redraw(); }); ArduinoOTA.begin(); diff --git a/src/screens.h b/src/screens.h index 9dc3e2f..ce33cd3 100644 --- a/src/screens.h +++ b/src/screens.h @@ -2,56 +2,6 @@ #include -#include "displays/menus/aboutmenu.h" -#include "displays/menus/accesspointwifisettingsmenu.h" -#ifdef FEATURE_BLUETOOTH -#include "displays/menus/bluetoothsettingsmenu.h" -#endif -#include "displays/menus/bmsmenu.h" -#include "displays/menus/buzzermenu.h" -#include "displays/menus/commanddebugmenu.h" -#include "displays/menus/debugmenu.h" -#include "displays/menus/defaultmodesettingsmenu.h" -#include "displays/menus/demosmenu.h" -#include "displays/menus/dynamicdebugmenu.h" -#include "displays/menus/enablemenu.h" -#include "displays/menus/feedbackdebugmenu.h" -#include "displays/menus/gametrakmodesettingsmenu.h" -#include "displays/menus/genericwifisettingsmenu.h" -#include "displays/menus/graphsmenu.h" -#include "displays/menus/controllerhardwaresettingsmenu.h" -#include "displays/menus/invertmenu.h" -#include "displays/menus/larsmmodesettingsmenu.h" -#include "displays/menus/limitssettingsmenu.h" -#include "displays/menus/mainmenu.h" -#include "displays/menus/tempomatmodesettingsmenu.h" -#include "displays/menus/modessettingsmenu.h" -#include "displays/menus/mosfetsmenu.h" -#include "displays/menus/motorfeedbackdebugmenu.h" -#include "displays/menus/motorstatedebugmenu.h" -#include "displays/menus/profilesmenu.h" -#include "displays/menus/presetsmenu.h" -#include "displays/menus/boardcomputerhardwaresettingsmenu.h" -#include "displays/menus/selectmodemenu.h" -#include "displays/menus/settingsmenu.h" -#include "displays/menus/stationwifisettingsmenu.h" -#include "displays/menus/timersmenu.h" -#include "displays/menus/wifiscanmenu.h" -#include "displays/menus/wifisettingsmenu.h" -#include "displays/bmsdisplay.h" -#include "displays/calibratedisplay.h" -#include "displays/dpad5wiredebugdisplay.h" -#include "displays/gameoflifedisplay.h" -#include "displays/gametrakcalibratedisplay.h" -#include "displays/lockscreen.h" -#include "displays/metersdisplay.h" -#include "displays/pingpongdisplay.h" -#include "displays/poweroffdisplay.h" -#include "displays/spirodisplay.h" -#include "displays/starfielddisplay.h" -#include "displays/statusdisplay.h" -#include "displays/updatedisplay.h" - #include "globals.h" #include "utils.h" #include "widgets/label.h" @@ -60,340 +10,12 @@ namespace { Label bootLabel{32, 250}; -union X { - X() {} - ~X() { ((Display&)statusDisplay).~Display(); } - - AboutMenu aboutMenu; - AccessPointWifiSettingsMenu accessPointWifiSettingsMenu; -#ifdef FEATURE_BLUETOOTH - BluetoothSettingsMenu bluetoothSettingsMenu; -#ifdef FEATURE_BMS - BmsMenu bmsMenu; -#endif -#endif - BuzzerMenu buzzerMenu; - FrontCommandDebugMenu frontCommandDebugMenu; - BackCommandDebugMenu backCommandDebugMenu; - ControllerHardwareSettingsMenu controllerHardwareSettingsMenu; - DebugMenu debugMenu; - DefaultModeSettingsMenu defaultModeSettingsMenu; - DemosMenu demosMenu; - DynamicDebugMenu dynamicDebugMenu; - EnableMenu enableMenu; - FrontFeedbackDebugMenu frontFeedbackDebugMenu; - BackFeedbackDebugMenu backFeedbackDebugMenu; -#ifdef FEATURE_GAMETRAK - GametrakModeSettingsMenu gametrakModeSettingsMenu; -#endif - GenericWifiSettingsMenu genericWifiSettingsMenu; - GraphsMenu graphsMenu; - InvertMenu invertMenu; - LarsmModeSettingsMenu larsmModeSettingsMenu; - LimitsSettingsMenu limitsSettingsMenu; - MainMenu mainMenu; - TempomatModeSettingsMenu tempomatModeSettingsMenu; - ModesSettingsMenu modesSettingsMenu; -#ifdef FEATURE_MOSFETS - MosfetsMenu mosfetsMenu; -#endif - FrontLeftMotorStateDebugMenu frontLeftMotorStateDebugMenu; - FrontRightMotorStateDebugMenu frontRightMotorStateDebugMenu; - BackLeftMotorStateDebugMenu backLeftMotorStateDebugMenu; - BackRightMotorStateDebugMenu backRightMotorStateDebugMenu; - FrontLeftMotorFeedbackDebugMenu frontLeftMotorFeedbackDebugMenu; - FrontRightMotorFeedbackDebugMenu frontRightMotorFeedbackDebugMenu; - BackLeftMotorFeedbackDebugMenu backLeftMotorFeedbackDebugMenu; - BackRightMotorFeedbackDebugMenu backRightMotorFeedbackDebugMenu; - BoardcomputerHardwareSettingsMenu boardcomputerHardwareSettingsMenu; - ProfilesMenu profilesMenu; - PresetsMenu presetsMenu; - SelectModeMenu selectModeMenu; - SettingsMenu settingsMenu; - StationWifiSettingsMenu stationWifiSettingsMenu; - TimersMenu timersMenu; - WifiScanMenu wifiScanMenu; - WifiSettingsMenu wifiSettingsMenu; - -#ifdef FEATURE_BMS - BmsDisplay bmsDisplay; -#endif - CalibrateDisplay calibrateDisplay; -#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) - DPad5WireDebugDisplay dPad5WireDebugDisplay; -#endif - GameOfLifeDisplay gameOfLifeDisplay; -#ifdef FEATURE_GAMETRAK - GametrakCalibrateDisplay gametrakCalibrateDisplay; -#endif - Lockscreen lockScreen; - MetersDisplay metersDisplay; - PingPongDisplay pingPongDisplay; - PoweroffDisplay poweroffDisplay; - SpiroDisplay spiroDisplay; - StarfieldDisplay starFieldDisplay; - StatusDisplay statusDisplay; -#ifdef FEATURE_OTA - UpdateDisplay updateDisplay; -#endif - - AutoWifiModeChangeDisplay autoWifiModeChangeDisplay; - -#ifdef FEATURE_BLUETOOTH - AutoBluetoothModeChangeDisplay autoBluetoothModeChangeDisplay; -#endif - - FrontFreqChangeScreen changeFrontFreq; - FrontPatternChangeScreen changeFrontPattern; - BackFreqChangeScreen changeBackFreq; - BackPatternChangeScreen changeBackPattern; - ReverseBeepFreq0ChangeScreen changeReverseBeepFreq0; - ReverseBeepFreq1ChangeScreen changeReverseBeepFreq1; - ReverseBeepDuration0ChangeScreen changeReverseBeepDuration0; - ReverseBeepDuration1ChangeScreen changeReverseBeepDuration1; - - IMotMaxChangeScreen changeIMotMax; - IDcMaxChangeScreen changeIDcMax; - NMotMaxKmhChangeScreen changeNMotMaxKmh; - NMotMaxRpmChangeScreen changeNMotMaxRpm; - FieldWeakMaxChangeScreen changeFieldWeakMax; - PhaseAdvMaxChangeScreen changePhaseAdvMax; - - WheelDiameterMmChangeScreen wheelDiameterMmChangeScreen; - WheelDiameterInchChangeScreen wheelDiameterInchChangeScreen; - NumMagnetPolesChangeScreen numMagnetPolesChangeScreen; - - DefaultModeModelModeChangeDisplay changeDefaultModeModelMode; - DefaultModeSmoothingChangeDisplay changeDefaultModeSmoothing; - DefaultModeFrontPercentageChangeDisplay changeDefaultModeFrontPercentage; - DefaultModeBackPercentageChangeDisplay changeDefaultModeBackPercentage; - DefaultModeAddSchwelleChangeDisplay changeDefaultModeAddSchwelle; - DefaultModeGas1WertChangeDisplay changeDefaultModeGas1Wert; - DefaultModeGas2WertChangeDisplay changeDefaultModeGas2Wert; - DefaultModeBrems1WertChangeDisplay changeDefaultModeBrems1Wert; - DefaultModeBrems2WertChangeDisplay changeDefaultModeBrems2Wert; - - TempomatModeModelModeChangeScreen changeManualModeModelMode; - - LarsmModeModelModeChangeDisplay larsmModeModelModeChangeDisplay; - LarsmModeModeChangeDisplay larsmModeModeChangeDisplay; - LarsmModeIterationsChangeDisplay larsmModeIterationsChangeDisplay; - - SampleCountChangeScreen sampleCountChangeScreen; - GasMinChangeScreen changeGasMin; - GasMaxChangeScreen changeGasMax; - BremsMinChangeScreen changeBremsMin; - BremsMaxChangeScreen changeBremsMax; -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) - DPadDebounceChangeScreen dPadDebounceChangeScreen; -#endif -#ifdef FEATURE_GAMETRAK - GametrakXMinChangeScreen changeGametrakXMin; - GametrakXMaxChangeScreen changeGametrakXMax; - GametrakYMinChangeScreen changeGametrakYMin; - GametrakYMaxChangeScreen changeGametrakYMax; - GametrakDistMinChangeScreen changeGametrakDistMin; - GametrakDistMaxChangeScreen changeGametrakDistMax; -#endif - - PotiReadRateChangeDisplay potiReadRateChangeDisplay; - ModeUpdateRateChangeDisplay modeUpdateRateChangeDisplay; - StatsUpdateRateChangeDisplay statsUpdateRateChangeDisplay; - DisplayUpdateRateChangeDisplay displayUpdateRateChangeDisplay; - DisplayRedrawRateChangeDisplay displayRedrawRateChangeDisplay; - - WifiModeChangeScreen wifiModeChangeScreen; - WifiTxPowerChangeScreen wifiTxPowerChangeScreen; - - GasGraphDisplay gasGraphDisplay; - BremsGraphDisplay bremsGraphDisplay; - PotisGraphDisplay potisGraphDisplay; - PotisSplitGraphDisplay potisSplitGraphDisplay; - AvgSpeedGraphDisplay avgSpeedGraphDisplay; - AvgSpeedKmhGraphDisplay avgSpeedKmhGraphDisplay; - SumCurrentGraphDisplay sumCurrentGraphDisplay; - FrontVoltageGraphDisplay frontVoltageGraphDisplay; - BackVoltageGraphDisplay backVoltageGraphDisplay; - VoltagesGraphDisplay voltagesGraphDisplay; - VoltagesSplitGraphDisplay voltagesSplitGraphDisplay; -#ifdef FEATURE_BMS - BmsVoltageGraphDisplay bmsVoltageGraphDisplay; - BmsCurrentGraphDisplay bmsCurrentGraphDisplay; - BmsPowerGraphDisplay bmsPowerGraphDisplay; - SumCurrentsComparisonGraphDisplay sumCurrentsComparisonGraphDisplay; -#endif - MotorCurrentsGraphDisplay motorCurrentsGraphDisplay; -} displays; - -template T &getRefByType() = delete; -template<> decltype(displays.aboutMenu) &getRefByType() { return displays.aboutMenu; } -template<> decltype(displays.accessPointWifiSettingsMenu) &getRefByType() { return displays.accessPointWifiSettingsMenu; } -#ifdef FEATURE_BLUETOOTH -template<> decltype(displays.bluetoothSettingsMenu) &getRefByType() { return displays.bluetoothSettingsMenu; } -#ifdef FEATURE_BMS -template<> decltype(displays.bmsMenu) &getRefByType() { return displays.bmsMenu; } -#endif -#endif -template<> decltype(displays.buzzerMenu) &getRefByType() { return displays.buzzerMenu; } -template<> decltype(displays.boardcomputerHardwareSettingsMenu) &getRefByType() { return displays.boardcomputerHardwareSettingsMenu; } -template<> decltype(displays.controllerHardwareSettingsMenu) &getRefByType() { return displays.controllerHardwareSettingsMenu; } -template<> decltype(displays.frontCommandDebugMenu) &getRefByType() { return displays.frontCommandDebugMenu; } -template<> decltype(displays.backCommandDebugMenu) &getRefByType() { return displays.backCommandDebugMenu; } -template<> decltype(displays.debugMenu) &getRefByType() { return displays.debugMenu; } -template<> decltype(displays.defaultModeSettingsMenu) &getRefByType() { return displays.defaultModeSettingsMenu; } -template<> decltype(displays.demosMenu) &getRefByType() { return displays.demosMenu; } -template<> decltype(displays.dynamicDebugMenu) &getRefByType() { return displays.dynamicDebugMenu; } -template<> decltype(displays.enableMenu) &getRefByType() { return displays.enableMenu; } -template<> decltype(displays.frontFeedbackDebugMenu) &getRefByType() { return displays.frontFeedbackDebugMenu; } -template<> decltype(displays.backFeedbackDebugMenu) &getRefByType() { return displays.backFeedbackDebugMenu; } -#ifdef FEATURE_GAMETRAK -template<> decltype(displays.gametrakModeSettingsMenu) &getRefByType() { return displays.gametrakModeSettingsMenu; } -#endif -template<> decltype(displays.genericWifiSettingsMenu) &getRefByType() { return displays.genericWifiSettingsMenu; } -template<> decltype(displays.graphsMenu) &getRefByType() { return displays.graphsMenu; } -template<> decltype(displays.invertMenu) &getRefByType() { return displays.invertMenu; } -template<> decltype(displays.larsmModeSettingsMenu) &getRefByType() { return displays.larsmModeSettingsMenu; } -template<> decltype(displays.limitsSettingsMenu) &getRefByType() { return displays.limitsSettingsMenu; } -template<> decltype(displays.mainMenu) &getRefByType() { return displays.mainMenu; } -template<> decltype(displays.tempomatModeSettingsMenu) &getRefByType() { return displays.tempomatModeSettingsMenu; } -template<> decltype(displays.modesSettingsMenu) &getRefByType() { return displays.modesSettingsMenu; } -#ifdef FEATURE_MOSFETS -template<> decltype(displays.mosfetsMenu) &getRefByType() { return displays.mosfetsMenu; } -#endif -template<> decltype(displays.frontLeftMotorStateDebugMenu) &getRefByType() { return displays.frontLeftMotorStateDebugMenu; } -template<> decltype(displays.frontRightMotorStateDebugMenu) &getRefByType() { return displays.frontRightMotorStateDebugMenu; } -template<> decltype(displays.backLeftMotorStateDebugMenu) &getRefByType() { return displays.backLeftMotorStateDebugMenu; } -template<> decltype(displays.backRightMotorStateDebugMenu) &getRefByType() { return displays.backRightMotorStateDebugMenu; } -template<> decltype(displays.frontLeftMotorFeedbackDebugMenu) &getRefByType() { return displays.frontLeftMotorFeedbackDebugMenu; } -template<> decltype(displays.frontRightMotorFeedbackDebugMenu) &getRefByType() { return displays.frontRightMotorFeedbackDebugMenu; } -template<> decltype(displays.backLeftMotorFeedbackDebugMenu) &getRefByType() { return displays.backLeftMotorFeedbackDebugMenu; } -template<> decltype(displays.backRightMotorFeedbackDebugMenu) &getRefByType() { return displays.backRightMotorFeedbackDebugMenu; } -template<> decltype(displays.profilesMenu) &getRefByType() { return displays.profilesMenu; } -template<> decltype(displays.presetsMenu) &getRefByType() { return displays.presetsMenu; } -template<> decltype(displays.selectModeMenu) &getRefByType() { return displays.selectModeMenu; } -template<> decltype(displays.settingsMenu) &getRefByType() { return displays.settingsMenu; } -template<> decltype(displays.stationWifiSettingsMenu) &getRefByType() { return displays.stationWifiSettingsMenu; } - -template<> decltype(displays.timersMenu) &getRefByType() { return displays.timersMenu; } -template<> decltype(displays.wifiScanMenu) &getRefByType() { return displays.wifiScanMenu; } -template<> decltype(displays.wifiSettingsMenu) &getRefByType() { return displays.wifiSettingsMenu; } - -#ifdef FEATURE_BMS -template<> decltype(displays.bmsDisplay) &getRefByType() { return displays.bmsDisplay; } -#endif -template<> decltype(displays.calibrateDisplay) &getRefByType() { return displays.calibrateDisplay; } -#if defined(FEATURE_DPAD_5WIRESW) && defined(DPAD_5WIRESW_DEBUG) -template<> decltype(displays.dPad5WireDebugDisplay) &getRefByType() { return displays.dPad5WireDebugDisplay; } -#endif -template<> decltype(displays.gameOfLifeDisplay) &getRefByType() { return displays.gameOfLifeDisplay; } -#ifdef FEATURE_GAMETRAK -template<> decltype(displays.gametrakCalibrateDisplay) &getRefByType() { return displays.gametrakCalibrateDisplay; } -#endif -template<> decltype(displays.lockScreen) &getRefByType() { return displays.lockScreen; } -template<> decltype(displays.metersDisplay) &getRefByType() { return displays.metersDisplay; } -template<> decltype(displays.pingPongDisplay) &getRefByType() { return displays.pingPongDisplay; } -template<> decltype(displays.poweroffDisplay) &getRefByType() { return displays.poweroffDisplay; } -template<> decltype(displays.spiroDisplay) &getRefByType() { return displays.spiroDisplay; } -template<> decltype(displays.starFieldDisplay) &getRefByType() { return displays.starFieldDisplay; } -template<> decltype(displays.statusDisplay) &getRefByType() { return displays.statusDisplay; } -#ifdef FEATURE_OTA -template<> decltype(displays.updateDisplay) &getRefByType() { return displays.updateDisplay; } -#endif - -template<> decltype(displays.autoWifiModeChangeDisplay) &getRefByType() { return displays.autoWifiModeChangeDisplay; } - -#ifdef FEATURE_BLUETOOTH -template<> decltype(displays.autoBluetoothModeChangeDisplay) &getRefByType() { return displays.autoBluetoothModeChangeDisplay; } -#endif - -template<> decltype(displays.changeFrontFreq) &getRefByType() { return displays.changeFrontFreq; } -template<> decltype(displays.changeFrontPattern) &getRefByType() { return displays.changeFrontPattern; } -template<> decltype(displays.changeBackFreq) &getRefByType() { return displays.changeBackFreq; } -template<> decltype(displays.changeBackPattern) &getRefByType() { return displays.changeBackPattern; } -template<> decltype(displays.changeReverseBeepFreq0) &getRefByType() { return displays.changeReverseBeepFreq0; } -template<> decltype(displays.changeReverseBeepFreq1) &getRefByType() { return displays.changeReverseBeepFreq1; } -template<> decltype(displays.changeReverseBeepDuration0) &getRefByType() { return displays.changeReverseBeepDuration0; } -template<> decltype(displays.changeReverseBeepDuration1) &getRefByType() { return displays.changeReverseBeepDuration1; } - -template<> decltype(displays.changeIMotMax) &getRefByType() { return displays.changeIMotMax; } -template<> decltype(displays.changeIDcMax) &getRefByType() { return displays.changeIDcMax; } -template<> decltype(displays.changeNMotMaxKmh) &getRefByType() { return displays.changeNMotMaxKmh; } -template<> decltype(displays.changeNMotMaxRpm) &getRefByType() { return displays.changeNMotMaxRpm; } -template<> decltype(displays.changeFieldWeakMax) &getRefByType() { return displays.changeFieldWeakMax; } -template<> decltype(displays.changePhaseAdvMax) &getRefByType() { return displays.changePhaseAdvMax; } - -template<> decltype(displays.wheelDiameterMmChangeScreen) &getRefByType() { return displays.wheelDiameterMmChangeScreen; } -template<> decltype(displays.wheelDiameterInchChangeScreen) &getRefByType() { return displays.wheelDiameterInchChangeScreen; } -template<> decltype(displays.numMagnetPolesChangeScreen) &getRefByType() { return displays.numMagnetPolesChangeScreen; } - -template<> decltype(displays.changeDefaultModeModelMode) &getRefByType() { return displays.changeDefaultModeModelMode; } -template<> decltype(displays.changeDefaultModeSmoothing) &getRefByType() { return displays.changeDefaultModeSmoothing; } -template<> decltype(displays.changeDefaultModeFrontPercentage) &getRefByType() { return displays.changeDefaultModeFrontPercentage; } -template<> decltype(displays.changeDefaultModeBackPercentage) &getRefByType() { return displays.changeDefaultModeBackPercentage; } -template<> decltype(displays.changeDefaultModeAddSchwelle) &getRefByType() { return displays.changeDefaultModeAddSchwelle; } -template<> decltype(displays.changeDefaultModeGas1Wert) &getRefByType() { return displays.changeDefaultModeGas1Wert; } -template<> decltype(displays.changeDefaultModeGas2Wert) &getRefByType() { return displays.changeDefaultModeGas2Wert; } -template<> decltype(displays.changeDefaultModeBrems1Wert) &getRefByType() { return displays.changeDefaultModeBrems1Wert; } -template<> decltype(displays.changeDefaultModeBrems2Wert) &getRefByType() { return displays.changeDefaultModeBrems2Wert; } - -template<> decltype(displays.changeManualModeModelMode) &getRefByType() { return displays.changeManualModeModelMode; } - -template<> decltype(displays.larsmModeModelModeChangeDisplay) &getRefByType() { return displays.larsmModeModelModeChangeDisplay; } -template<> decltype(displays.larsmModeModeChangeDisplay) &getRefByType() { return displays.larsmModeModeChangeDisplay; } -template<> decltype(displays.larsmModeIterationsChangeDisplay) &getRefByType() { return displays.larsmModeIterationsChangeDisplay; } - -template<> decltype(displays.sampleCountChangeScreen) &getRefByType() { return displays.sampleCountChangeScreen; } -template<> decltype(displays.changeGasMin) &getRefByType() { return displays.changeGasMin; } -template<> decltype(displays.changeGasMax) &getRefByType() { return displays.changeGasMax; } -template<> decltype(displays.changeBremsMin) &getRefByType() { return displays.changeBremsMin; } -template<> decltype(displays.changeBremsMax) &getRefByType() { return displays.changeBremsMax; } -#if defined(FEATURE_DPAD) || defined(FEATURE_DPAD_3WIRESW) || defined(FEATURE_DPAD_5WIRESW) -template<> decltype(displays.dPadDebounceChangeScreen) &getRefByType() { return displays.dPadDebounceChangeScreen; } -#endif -#ifdef FEATURE_GAMETRAK -template<> decltype(displays.changeGametrakXMin) &getRefByType() { return displays.changeGametrakXMin; } -template<> decltype(displays.changeGametrakXMax) &getRefByType() { return displays.changeGametrakXMax; } -template<> decltype(displays.changeGametrakYMin) &getRefByType() { return displays.changeGametrakYMin; } -template<> decltype(displays.changeGametrakYMax) &getRefByType() { return displays.changeGametrakYMax; } -template<> decltype(displays.changeGametrakDistMin) &getRefByType() { return displays.changeGametrakDistMin; } -template<> decltype(displays.changeGametrakDistMax) &getRefByType() { return displays.changeGametrakDistMax; } -#endif - -template<> decltype(displays.potiReadRateChangeDisplay) &getRefByType() { return displays.potiReadRateChangeDisplay; } -template<> decltype(displays.modeUpdateRateChangeDisplay) &getRefByType() { return displays.modeUpdateRateChangeDisplay; } -template<> decltype(displays.statsUpdateRateChangeDisplay) &getRefByType() { return displays.statsUpdateRateChangeDisplay; } -template<> decltype(displays.displayUpdateRateChangeDisplay) &getRefByType() { return displays.displayUpdateRateChangeDisplay; } -template<> decltype(displays.displayRedrawRateChangeDisplay) &getRefByType() { return displays.displayRedrawRateChangeDisplay; } - -template<> decltype(displays.wifiModeChangeScreen) &getRefByType() { return displays.wifiModeChangeScreen; } -template<> decltype(displays.wifiTxPowerChangeScreen) &getRefByType() { return displays.wifiTxPowerChangeScreen; } - -template<> decltype(displays.gasGraphDisplay) &getRefByType() { return displays.gasGraphDisplay; } -template<> decltype(displays.bremsGraphDisplay) &getRefByType() { return displays.bremsGraphDisplay; } -template<> decltype(displays.potisGraphDisplay) &getRefByType() { return displays.potisGraphDisplay; } -template<> decltype(displays.potisSplitGraphDisplay) &getRefByType() { return displays.potisSplitGraphDisplay; } -template<> decltype(displays.avgSpeedGraphDisplay) &getRefByType() { return displays.avgSpeedGraphDisplay; } -template<> decltype(displays.avgSpeedKmhGraphDisplay) &getRefByType() { return displays.avgSpeedKmhGraphDisplay; } -template<> decltype(displays.sumCurrentGraphDisplay) &getRefByType() { return displays.sumCurrentGraphDisplay; } -template<> decltype(displays.frontVoltageGraphDisplay) &getRefByType() { return displays.frontVoltageGraphDisplay; } -template<> decltype(displays.backVoltageGraphDisplay) &getRefByType() { return displays.backVoltageGraphDisplay; } -template<> decltype(displays.voltagesGraphDisplay) &getRefByType() { return displays.voltagesGraphDisplay; } -template<> decltype(displays.voltagesSplitGraphDisplay) &getRefByType() { return displays.voltagesSplitGraphDisplay; } -#ifdef FEATURE_BMS -template<> decltype(displays.bmsVoltageGraphDisplay) &getRefByType() { return displays.bmsVoltageGraphDisplay; } -template<> decltype(displays.bmsCurrentGraphDisplay) &getRefByType() { return displays.bmsCurrentGraphDisplay; } -template<> decltype(displays.bmsPowerGraphDisplay) &getRefByType() { return displays.bmsPowerGraphDisplay; } -template<> decltype(displays.sumCurrentsComparisonGraphDisplay) &getRefByType() { return displays.sumCurrentsComparisonGraphDisplay; } -#endif -template<> decltype(displays.motorCurrentsGraphDisplay) &getRefByType() { return displays.motorCurrentsGraphDisplay; } - - void deconstructScreen() { if (currentDisplay) { currentDisplay->stop(); - currentDisplay->~Display(); + //currentDisplay->~Display(); currentDisplay = nullptr; } } @@ -403,13 +25,12 @@ void switchScreenImpl(Args&&... args) { deconstructScreen(); - T &ref = getRefByType(); - new (&ref) T{std::forward(args)...}; - currentDisplay = &ref; - ref.start(); - ref.initScreen(); - ref.update(); - ref.redraw(); + std::unique_ptr ptr = std::make_unique(std::forward(args)...); + currentDisplay = std::move(ptr); + currentDisplay->start(); + currentDisplay->initScreen(); + currentDisplay->update(); + currentDisplay->redraw(); } std::function changeScreenCallback; @@ -429,7 +50,7 @@ void initScreen() tft.fillScreen(TFT_WHITE); tft.setTextColor(TFT_BLACK, TFT_WHITE); tft.setTextFont(4); - tft.pushImage(0, 40, icons::logo.WIDTH, icons::logo.HEIGHT, icons::logo.buffer); + //tft.pushImage(0, 40, icons::logo.WIDTH, icons::logo.HEIGHT, icons::logo.buffer); tft.drawString("Bobbycar-OS", 32, 200); tft.drawString("booting...", 32, 225); bootLabel.start(); diff --git a/src/staticmenudefinition.h b/src/staticmenudefinition.h deleted file mode 100644 index 83143ef..0000000 --- a/src/staticmenudefinition.h +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include "menudefinitioninterface.h" - -namespace { -template -class StaticMenuDefinition; - -template -class StaticMenuDefinition : public virtual MenuDefinitionInterface -{ -public: - std::size_t size() const override { return 1; } - - MenuItem& getMenuItem(std::size_t index) override - { - if (index == 0) - return item; - - throw "aua"; - } - - const MenuItem& getMenuItem(std::size_t index) const override - { - if (index == 0) - return item; - - throw "aua"; - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(item); - } - - void runForEveryMenuItem(std::function &&callback) const override - { - callback(item); - } - -private: - T item; -}; - -template -class StaticMenuDefinition : public virtual StaticMenuDefinition -{ - using Base = StaticMenuDefinition; - -public: - std::size_t size() const override { return 1 + sizeof...(Tmore); } - - MenuItem& getMenuItem(std::size_t index) override - { - if (index == 0) - return item; - - return Base::getMenuItem(index - 1); - } - - const MenuItem& getMenuItem(std::size_t index) const override - { - if (index == 0) - return item; - - return Base::getMenuItem(index - 1); - } - - void runForEveryMenuItem(std::function &&callback) override - { - callback(item); - Base::runForEveryMenuItem(std::move(callback)); - } - - void runForEveryMenuItem(std::function &&callback) const override - { - callback(item); - Base::runForEveryMenuItem(std::move(callback)); - } - -private: - T item; -}; -}