diff --git a/src/bobby_webserver.h b/src/bobby_webserver.h index 6172407..e07e473 100644 --- a/src/bobby_webserver.h +++ b/src/bobby_webserver.h @@ -1,8 +1,13 @@ #pragma once +// 3rdparty lib includes #include +// local includes #include "screens.h" +#include "textinterface.h" +#include "menudisplay.h" +#include "changevaluedisplay.h" namespace { #ifdef FEATURE_WEBSERVER @@ -64,7 +69,7 @@ void initWebserver() "Back"); } - if (auto constCurrentDisplay = static_cast(currentDisplay)) + if (auto constCurrentDisplay = static_cast(currentDisplay.get())) { if (const auto *textInterface = constCurrentDisplay->asTextInterface()) { diff --git a/src/containermenudefinition.h b/src/containermenudefinition.h new file mode 100644 index 0000000..37c6e55 --- /dev/null +++ b/src/containermenudefinition.h @@ -0,0 +1,63 @@ +#pragma once + +// system includes +#include +#include + +// local includes +#include "menudefinitioninterface.h" + +namespace { +class ContainerMenuDefinition : public virtual MenuDefinitionInterface +{ +public: + std::size_t size() const override { return m_items.size(); } + + MenuItem& getMenuItem(std::size_t index) override + { + if (index < m_items.size()) + return *m_items[index].get(); + + throw "aua"; + } + + const MenuItem& getMenuItem(std::size_t index) const override + { + if (index < m_items.size()) + return *m_items[index].get(); + + throw "aua"; + } + + void runForEveryMenuItem(std::function &&callback) override + { + for (const auto &ptr : m_items) + callback(*ptr); + } + + void runForEveryMenuItem(std::function &&callback) const override + { + for (const auto &ptr : m_items) + callback(*ptr); + } + + template + void constructItem(Args&&... args) + { + emplaceItem(std::make_unique(std::forward(args)...)); + } + + void emplaceItem(std::unique_ptr &&ptr) + { + m_items.emplace_back(std::move(ptr)); + } + + void clearItems() + { + m_items.clear(); + } + +private: + std::vector> m_items; +}; +} // namespace diff --git a/src/displays/menus/mainmenu.h b/src/displays/menus/mainmenu.h index aee6a1f..765899f 100644 --- a/src/displays/menus/mainmenu.h +++ b/src/displays/menus/mainmenu.h @@ -1,7 +1,8 @@ #pragma once +// local includes #include "menudisplay.h" -#include "staticmenudefinition.h" +#include "containermenudefinition.h" #include "menuitem.h" #include "actions/switchscreenaction.h" #include "actions/modesettingsaction.h" @@ -18,6 +19,7 @@ #include "icons/poweroff.h" #include "icons/reboot.h" +// forward declares namespace { class StatusDisplay; class SelectModeMenu; @@ -31,32 +33,36 @@ 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 ContainerMenuDefinition +{ +public: + MainMenu() + { + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>>(); + constructItem, ModeSettingsAction>>(); + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>>(); + constructItem, SwitchScreenAction>>(); + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>>(); #ifdef FEATURE_BMS - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>, + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>>(); + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>>(); #ifdef FEATURE_MOSFETS - makeComponent, SwitchScreenAction>, + constructItem, SwitchScreenAction>>(); #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>, - makeComponent, RebootAction, StaticMenuItemIcon<&icons::reboot>>, - makeComponent, SwitchScreenAction> - > -{}; + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>>(); + constructItem, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>>(); + constructItem, RebootAction, StaticMenuItemIcon<&icons::reboot>>>(); + constructItem, SwitchScreenAction>>(); + } }; +} // namespace 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/main.cpp b/src/main.cpp index 19068ca..4230d55 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" diff --git a/src/screens.h b/src/screens.h index 9dc3e2f..0d5959c 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; diff --git a/src/staticmenudefinition.h b/src/staticmenudefinition.h index 83143ef..587901b 100644 --- a/src/staticmenudefinition.h +++ b/src/staticmenudefinition.h @@ -1,5 +1,6 @@ #pragma once +// local includes #include "menudefinitioninterface.h" namespace { @@ -81,4 +82,4 @@ public: private: T item; }; -} +} // namespace