From e34f3d01c1f4f6c33f536309e31bd4b370bf8271 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 02:46:15 +0200 Subject: [PATCH 1/6] Refactored calibrate screen layout --- src/demodisplay.h | 17 --- src/displays/bmsdisplay.h | 4 +- src/displays/calibratedisplay.h | 182 ++++++++++++++++++++---- src/displays/dualgraphdisplay.h | 6 +- src/displays/gameoflifedisplay.h | 6 +- src/displays/gametrakcalibratedisplay.h | 6 +- src/displays/graphdisplay.h | 11 +- src/displays/metersdisplay.h | 6 +- src/displays/pingpongdisplay.h | 6 +- src/displays/spirodisplay.h | 6 +- src/displays/starfielddisplay.h | 6 +- src/displays/statusdisplay.h | 6 +- src/main.cpp | 13 +- 13 files changed, 193 insertions(+), 82 deletions(-) delete mode 100644 src/demodisplay.h diff --git a/src/demodisplay.h b/src/demodisplay.h deleted file mode 100644 index 750f5cd..0000000 --- a/src/demodisplay.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "actioninterface.h" -#include "display.h" - -namespace { -class DemoDisplay : public Display, public virtual ActionInterface -{ -public: - void confirm() override; -}; - -void DemoDisplay::confirm() -{ - triggered(); -} -} diff --git a/src/displays/bmsdisplay.h b/src/displays/bmsdisplay.h index 1c47c8b..a3cc21e 100644 --- a/src/displays/bmsdisplay.h +++ b/src/displays/bmsdisplay.h @@ -2,7 +2,7 @@ #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "globals.h" #include "bmsutils.h" @@ -15,7 +15,7 @@ class StatusDisplay; } namespace { #ifdef FEATURE_BMS -class BmsDisplay : public DemoDisplay, public SwitchScreenAction +class BmsDisplay : public Display, public ConfirmActionInterface> { public: void initScreen() override; diff --git a/src/displays/calibratedisplay.h b/src/displays/calibratedisplay.h index 61f1c20..e3fa022 100644 --- a/src/displays/calibratedisplay.h +++ b/src/displays/calibratedisplay.h @@ -4,9 +4,10 @@ #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "globals.h" +#include "utils.h" #include "texts.h" #include "widgets/label.h" #include "widgets/progressbar.h" @@ -18,39 +19,68 @@ class BoardcomputerHardwareSettingsMenu; } namespace { -class CalibrateDisplay : public DemoDisplay +class CalibrateDisplay : public Display { - using Base = DemoDisplay; - public: CalibrateDisplay() = default; CalibrateDisplay(bool bootup); void start() override; void initScreen() override; + void update() override; void redraw() override; void stop() override; + void rotate(int offset) override; + void back() override; - void triggered() override; + void confirm() override; private: + void copyFromSettings(); + void copyToSettings(); + const bool m_bootup{false}; ModeInterface *m_oldMode; IgnoreInputMode m_mode{0, ControlType::FieldOrientedControl, ControlMode::Torque}; - std::array m_labels {{ - Label{25, 50}, // 100, 23 - Label{25, 75}, // 100, 23 - Label{25, 100}, // 100, 23 - Label{25, 125} // 100, 23 + std::array m_labels {{ + Label{25, 72}, // 100, 23 + Label{145, 72}, // 100, 23 + Label{25, 97}, // 100, 23 + Label{145, 97}, // 100, 23 + + Label{25, 172}, // 100, 23 + Label{145, 172}, // 100, 23 + Label{25, 197}, // 100, 23 + Label{145, 197}, // 100, 23 + + Label{25, 247}, // 190, 23 + + Label{25, 275}, // 100, 23 + Label{145, 275}, // 100, 23 }}; std::array m_progressBars {{ - ProgressBar{20, 200, 200, 10, 0, 1000}, - ProgressBar{20, 230, 200, 10, 0, 1000} + ProgressBar{20, 129, 200, 10, 0, 1000}, + ProgressBar{20, 229, 200, 10, 0, 1000} }}; + + enum Status { + Begin, + GasMin, + GasMax, + BremsMin, + BremsMax, + Confirm + }; + + int8_t m_selectedButton, m_renderedButton; + + Status m_status; + int16_t m_gasMin, m_gasMax, m_bremsMin, m_bremsMax; + float m_gas, m_brems; }; CalibrateDisplay::CalibrateDisplay(bool bootup) : @@ -62,6 +92,11 @@ void CalibrateDisplay::start() { m_oldMode = currentMode; currentMode = &m_mode; + m_selectedButton = 0; + m_status = Status::Begin; + copyFromSettings(); + m_gas = 0.f; + m_brems = 0.f; } void CalibrateDisplay::initScreen() @@ -76,23 +111,78 @@ void CalibrateDisplay::initScreen() tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString("gas:", 25, 47); + tft.drawString("brems:", 25, 147); + for (auto &label : m_labels) label.start(); for (auto &progressBar : m_progressBars) progressBar.start(); + + m_renderedButton = -1; +} + +void CalibrateDisplay::update() +{ + m_gas = scaleBetween(raw_gas, m_gasMin, m_gasMax, 0., 1000.); + m_brems = scaleBetween(raw_brems, m_bremsMin, m_bremsMax, 0., 1000.); } void CalibrateDisplay::redraw() { - m_labels[0].redraw(String{gas}); - m_labels[1].redraw(String{raw_gas}); + m_labels[0].redraw(toString(m_gas)); + m_labels[1].redraw(toString(raw_gas)); + m_labels[2].redraw(toString(m_gasMin)); + m_labels[3].redraw(toString(m_gasMax)); - m_labels[2].redraw(String{brems}); - m_labels[3].redraw(String{raw_brems}); + m_progressBars[0].redraw(m_gas); - m_progressBars[0].redraw(gas); - m_progressBars[1].redraw(brems); + m_labels[4].redraw(toString(m_brems)); + m_labels[5].redraw(toString(raw_brems)); + m_labels[6].redraw(toString(m_bremsMin)); + m_labels[7].redraw(toString(m_bremsMax)); + + m_progressBars[1].redraw(m_brems); + + m_labels[8].redraw([&](){ + switch (m_status) + { + case Status::Begin: return "Start calibrating?"; + case Status::GasMin: return "Release gas"; + case Status::GasMax: return "Press gas"; + case Status::BremsMin: return "Release brems"; + case Status::BremsMax: return "Press brems"; + case Status::Confirm: return "Verify"; + } + __builtin_unreachable(); + }()); + + m_labels[9].redraw([&](){ + switch (m_status) + { + case Status::Begin: return "Yes"; + case Status::GasMin: + case Status::GasMax: + case Status::BremsMin: + case Status::BremsMax: return "Next"; + case Status::Confirm: return "Save"; + } + __builtin_unreachable(); + }()); + + m_labels[10].redraw([&](){ + switch (m_status) + { + case Status::Begin: return "No"; + case Status::GasMin: + case Status::GasMax: + case Status::BremsMin: + case Status::BremsMax: + case Status::Confirm: return "Restart"; + } + __builtin_unreachable(); + }()); } void CalibrateDisplay::stop() @@ -101,17 +191,59 @@ void CalibrateDisplay::stop() currentMode = m_oldMode; } -void CalibrateDisplay::back() +void CalibrateDisplay::rotate(int offset) { - if (!m_bootup) - switchScreen(); + m_selectedButton += offset; + + if (m_selectedButton < 0) + m_selectedButton = 1; + if (m_selectedButton > 1) + m_selectedButton = 0; } -void CalibrateDisplay::triggered() +void CalibrateDisplay::back() { - if (m_bootup) - switchScreen(); + if (m_status == Status::Begin) + { + if (!m_bootup) + switchScreen(); + } else - switchScreen(); + { + m_status = Status::Begin; + copyFromSettings(); + } +} + +void CalibrateDisplay::confirm() +{ + if (m_status == Status::Begin) + { + if (m_bootup) + switchScreen(); + else + switchScreen(); + } + else + { + m_status = Status::Begin; + copyFromSettings(); + } +} + +void CalibrateDisplay::copyFromSettings() +{ + m_gasMin = settings.boardcomputerHardware.gasMin; + m_gasMax = settings.boardcomputerHardware.gasMax; + m_bremsMin = settings.boardcomputerHardware.bremsMin; + m_bremsMax = settings.boardcomputerHardware.bremsMax; +} + +void CalibrateDisplay::copyToSettings() +{ + settings.boardcomputerHardware.gasMin = m_gasMin; + settings.boardcomputerHardware.gasMax = m_gasMax; + settings.boardcomputerHardware.bremsMin = m_bremsMin; + settings.boardcomputerHardware.bremsMax = m_bremsMax; } } diff --git a/src/displays/dualgraphdisplay.h b/src/displays/dualgraphdisplay.h index 1bddc63..1976fb4 100644 --- a/src/displays/dualgraphdisplay.h +++ b/src/displays/dualgraphdisplay.h @@ -1,6 +1,6 @@ #pragma once -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "textinterface.h" #include "widgets/label.h" @@ -13,10 +13,8 @@ class GraphsMenu; } namespace { -class DualGraphDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class DualGraphDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/displays/gameoflifedisplay.h b/src/displays/gameoflifedisplay.h index 4c72b00..6be42b3 100644 --- a/src/displays/gameoflifedisplay.h +++ b/src/displays/gameoflifedisplay.h @@ -6,7 +6,7 @@ #include #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" namespace { @@ -14,10 +14,8 @@ class DemosMenu; } namespace { -class GameOfLifeDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class GameOfLifeDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: void start() override; void initScreen() override; diff --git a/src/displays/gametrakcalibratedisplay.h b/src/displays/gametrakcalibratedisplay.h index 6eee5c1..5b9b090 100644 --- a/src/displays/gametrakcalibratedisplay.h +++ b/src/displays/gametrakcalibratedisplay.h @@ -4,7 +4,7 @@ #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "globals.h" #include "texts.h" @@ -19,10 +19,8 @@ class BoardcomputerHardwareSettingsMenu; namespace { #ifdef FEATURE_GAMETRAK -class GametrakCalibrateDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class GametrakCalibrateDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/displays/graphdisplay.h b/src/displays/graphdisplay.h index 40bb1b7..dc99b1a 100644 --- a/src/displays/graphdisplay.h +++ b/src/displays/graphdisplay.h @@ -1,6 +1,6 @@ #pragma once -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "textinterface.h" #include "widgets/label.h" @@ -30,10 +30,13 @@ public: }; template -class GraphDisplay : public DemoDisplay, public SwitchScreenAction, public virtual TextInterface, public BackActionInterface>, public virtual MultiStatisticsInterface +class GraphDisplay : + public Display, + public virtual TextInterface, + public ConfirmActionInterface>, + public BackActionInterface>, + public virtual MultiStatisticsInterface { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/displays/metersdisplay.h b/src/displays/metersdisplay.h index 598083e..08ed1fd 100644 --- a/src/displays/metersdisplay.h +++ b/src/displays/metersdisplay.h @@ -4,7 +4,7 @@ #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "globals.h" #include "utils.h" @@ -16,10 +16,8 @@ class BmsDisplay; } namespace { -class MetersDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class MetersDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/displays/pingpongdisplay.h b/src/displays/pingpongdisplay.h index 1c76c02..da377f2 100644 --- a/src/displays/pingpongdisplay.h +++ b/src/displays/pingpongdisplay.h @@ -5,7 +5,7 @@ #include #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" namespace { @@ -13,10 +13,8 @@ class DemosMenu; } namespace { -class PingPongDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class PingPongDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: PingPongDisplay(); diff --git a/src/displays/spirodisplay.h b/src/displays/spirodisplay.h index 6c33556..226516f 100644 --- a/src/displays/spirodisplay.h +++ b/src/displays/spirodisplay.h @@ -5,7 +5,7 @@ #include #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" namespace { @@ -13,10 +13,8 @@ class DemosMenu; } namespace { -class SpiroDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class SpiroDisplay : public Display, public SwitchScreenAction, public BackActionInterface> { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/displays/starfielddisplay.h b/src/displays/starfielddisplay.h index a37c678..2d56f2a 100644 --- a/src/displays/starfielddisplay.h +++ b/src/displays/starfielddisplay.h @@ -4,7 +4,7 @@ #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "globals.h" @@ -13,10 +13,8 @@ class DemosMenu; } namespace { -class StarfieldDisplay : public DemoDisplay, public SwitchScreenAction, public BackActionInterface> +class StarfieldDisplay : public Display, public ConfirmActionInterface>, public BackActionInterface> { - using Base = DemoDisplay; - public: StarfieldDisplay(); diff --git a/src/displays/statusdisplay.h b/src/displays/statusdisplay.h index 799b2f4..698c538 100644 --- a/src/displays/statusdisplay.h +++ b/src/displays/statusdisplay.h @@ -3,7 +3,7 @@ #include #include -#include "demodisplay.h" +#include "display.h" #include "actions/switchscreenaction.h" #include "modeinterface.h" @@ -20,10 +20,8 @@ class MetersDisplay; } namespace { -class StatusDisplay : public DemoDisplay, public SwitchScreenAction +class StatusDisplay : public Display, public ConfirmActionInterface> { - using Base = DemoDisplay; - public: void initScreen() override; void redraw() override; diff --git a/src/main.cpp b/src/main.cpp index 0645d38..2810c7e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,10 +29,12 @@ namespace { ModeInterface *lastMode{}; +millis_t lastPotiRead{}; millis_t lastModeUpdate{}; millis_t lastStatsUpdate{}; millis_t lastDisplayRedraw{}; +constexpr auto potiReadRate = 50; constexpr auto modeUpdateRate = 50; constexpr auto statsUpdateRate = 50; constexpr auto displayRedrawRate = 50; @@ -148,12 +150,19 @@ void loop() dpad3wire::update(); #endif + if (!lastPotiRead) + lastPotiRead = now; + else if (now - lastPotiRead >= 1000/potiReadRate) + { + readPotis(); + + lastPotiRead = now; + } + if (!lastModeUpdate) lastModeUpdate = now; else if (now - lastModeUpdate >= 1000/modeUpdateRate) { - readPotis(); - if (lastMode != currentMode) { if (lastMode) From 0af50b64b24030e8dd887014119e15195b5e840b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 03:25:36 +0200 Subject: [PATCH 2/6] Implemented basic wizard --- src/displays/calibratedisplay.h | 91 +++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 15 deletions(-) diff --git a/src/displays/calibratedisplay.h b/src/displays/calibratedisplay.h index e3fa022..066ecac 100644 --- a/src/displays/calibratedisplay.h +++ b/src/displays/calibratedisplay.h @@ -58,8 +58,8 @@ private: Label{25, 247}, // 190, 23 - Label{25, 275}, // 100, 23 - Label{145, 275}, // 100, 23 + Label{25, 277}, // 100, 23 + Label{145, 277}, // 100, 23 }}; std::array m_progressBars {{ @@ -133,15 +133,31 @@ void CalibrateDisplay::redraw() { m_labels[0].redraw(toString(m_gas)); m_labels[1].redraw(toString(raw_gas)); + if (m_status == Status::GasMin) + tft.setTextColor(TFT_RED, TFT_BLACK); m_labels[2].redraw(toString(m_gasMin)); + if (m_status == Status::GasMin) + tft.setTextColor(TFT_WHITE, TFT_BLACK); + if (m_status == Status::GasMax) + tft.setTextColor(TFT_RED, TFT_BLACK); m_labels[3].redraw(toString(m_gasMax)); + if (m_status == Status::GasMax) + tft.setTextColor(TFT_WHITE, TFT_BLACK); m_progressBars[0].redraw(m_gas); m_labels[4].redraw(toString(m_brems)); m_labels[5].redraw(toString(raw_brems)); + if (m_status == Status::BremsMin) + tft.setTextColor(TFT_RED, TFT_BLACK); m_labels[6].redraw(toString(m_bremsMin)); + if (m_status == Status::BremsMin) + tft.setTextColor(TFT_WHITE, TFT_BLACK); + if (m_status == Status::BremsMax) + tft.setTextColor(TFT_RED, TFT_BLACK); m_labels[7].redraw(toString(m_bremsMax)); + if (m_status == Status::BremsMax) + tft.setTextColor(TFT_WHITE, TFT_BLACK); m_progressBars[1].redraw(m_brems); @@ -171,6 +187,9 @@ void CalibrateDisplay::redraw() __builtin_unreachable(); }()); + if (m_selectedButton != m_renderedButton && (m_selectedButton == 0 || m_renderedButton == 0)) + tft.drawRect(23, 275, 100, 27, m_selectedButton == 0 ? TFT_WHITE : TFT_BLACK); + m_labels[10].redraw([&](){ switch (m_status) { @@ -183,6 +202,11 @@ void CalibrateDisplay::redraw() } __builtin_unreachable(); }()); + + if (m_selectedButton != m_renderedButton && (m_selectedButton == 1 || m_renderedButton == 1)) + tft.drawRect(143, 275, 100, 27, m_selectedButton == 1 ? TFT_WHITE : TFT_BLACK); + + m_renderedButton = m_selectedButton; } void CalibrateDisplay::stop() @@ -203,13 +227,18 @@ void CalibrateDisplay::rotate(int offset) void CalibrateDisplay::back() { - if (m_status == Status::Begin) + switch (m_status) { + case Status::Begin: if (!m_bootup) switchScreen(); - } - else - { + break; + case Status::GasMin: + case Status::GasMax: + case Status::BremsMin: + case Status::BremsMax: + case Status::Confirm: + m_selectedButton = 0; m_status = Status::Begin; copyFromSettings(); } @@ -217,17 +246,49 @@ void CalibrateDisplay::back() void CalibrateDisplay::confirm() { - if (m_status == Status::Begin) + switch (m_selectedButton) { - if (m_bootup) - switchScreen(); + case 0: // left button pressed + switch (m_status) + { + case Status::Begin: + m_status = Status::GasMin; + break; + case Status::GasMin: + m_gasMin = raw_gas; + m_status = Status::GasMax; + break; + case Status::GasMax: + m_gasMax = raw_gas; + m_status = Status::BremsMin; + break; + case Status::BremsMin: + m_bremsMin = raw_brems; + m_status = Status::BremsMax; + break; + case Status::BremsMax: + m_bremsMax = raw_brems; + m_status = Status::Confirm; + break; + case Status::Confirm: + copyToSettings(); + saveSettings(); + if (m_bootup) + switchScreen(); + else + switchScreen(); + } + break; + case 1: // right button pressed + if (m_status == Status::Begin) + { + if (m_bootup) + switchScreen(); + else + switchScreen(); + } else - switchScreen(); - } - else - { - m_status = Status::Begin; - copyFromSettings(); + back(); } } From db4b746743f39622a909363f59e865eb32b33e44 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 14:47:13 +0200 Subject: [PATCH 3/6] Introduced settings for time intervals --- src/main.cpp | 27 +++++++++++---------------- src/presets.h | 11 ++++++++++- src/settings.h | 13 +++++++++++++ src/settingsaccessors.h | 5 +++++ 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2810c7e..a8c5f32 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,12 +32,8 @@ ModeInterface *lastMode{}; millis_t lastPotiRead{}; millis_t lastModeUpdate{}; millis_t lastStatsUpdate{}; +millis_t lastDisplayUpdate{}; millis_t lastDisplayRedraw{}; - -constexpr auto potiReadRate = 50; -constexpr auto modeUpdateRate = 50; -constexpr auto statsUpdateRate = 50; -constexpr auto displayRedrawRate = 50; } void setup() @@ -150,18 +146,14 @@ void loop() dpad3wire::update(); #endif - if (!lastPotiRead) - lastPotiRead = now; - else if (now - lastPotiRead >= 1000/potiReadRate) + if (!lastPotiRead || now - lastPotiRead >= 1000/settings.boardcomputerHardware.timersSettings.potiReadRate) { readPotis(); lastPotiRead = now; } - if (!lastModeUpdate) - lastModeUpdate = now; - else if (now - lastModeUpdate >= 1000/modeUpdateRate) + if (!lastModeUpdate || now - lastModeUpdate >= 1000/settings.boardcomputerHardware.timersSettings.modeUpdateRate) { if (lastMode != currentMode) { @@ -180,18 +172,21 @@ void loop() performance.current++; } - if (!lastStatsUpdate) - lastStatsUpdate = now; - else if (now - lastStatsUpdate >= 1000/statsUpdateRate) + if (!lastStatsUpdate || now - lastStatsUpdate >= 1000/settings.boardcomputerHardware.timersSettings.statsUpdateRate) { updateAccumulators(); pushStats(); lastStatsUpdate = now; } - updateDisplay(); + if (!lastDisplayUpdate || now - lastDisplayUpdate >= 1000/settings.boardcomputerHardware.timersSettings.displayUpdateRate) + { + updateDisplay(); - if (!lastDisplayRedraw || now - lastDisplayRedraw >= 1000/displayRedrawRate) + lastDisplayUpdate = now; + } + + if (!lastDisplayRedraw || now - lastDisplayRedraw >= 1000/settings.boardcomputerHardware.timersSettings.displayRedrawRate) { redrawDisplay(); diff --git a/src/presets.h b/src/presets.h index 04bb7e5..a37da5f 100644 --- a/src/presets.h +++ b/src/presets.h @@ -76,6 +76,14 @@ constexpr Settings::ControllerHardware spinnerControllerHardware { .swapFrontBack = false }; +constexpr Settings::BoardcomputerHardware::TimersSettings defaultTimersSettings { + .potiReadRate = 50, + .modeUpdateRate = 50, + .statsUpdateRate = 50, + .displayUpdateRate = 50, + .displayRedrawRate = 50 +}; + constexpr Settings::BoardcomputerHardware defaultBoardcomputerHardware { .sampleCount = 100, .gasMin = DEFAULT_GASMIN, @@ -93,7 +101,8 @@ constexpr Settings::BoardcomputerHardware defaultBoardcomputerHardware { .gametrakDistMin = DEFAULT_GAMETRAKDISTMIN, .gametrakDistMax = DEFAULT_GAMETRAKDISTMAX, #endif - .swapScreenBytes = DEFAULT_SWAPSCREENBYTES + .swapScreenBytes = DEFAULT_SWAPSCREENBYTES, + .timersSettings = defaultTimersSettings }; constexpr Settings::DefaultMode defaultDefaultMode { diff --git a/src/settings.h b/src/settings.h index b99653b..b26902b 100644 --- a/src/settings.h +++ b/src/settings.h @@ -60,6 +60,14 @@ struct Settings int16_t gametrakXMin, gametrakXMax, gametrakYMin, gametrakYMax, gametrakDistMin, gametrakDistMax; #endif bool swapScreenBytes; + + struct TimersSettings { + int16_t potiReadRate; + int16_t modeUpdateRate; + int16_t statsUpdateRate; + int16_t displayUpdateRate; + int16_t displayRedrawRate; + } timersSettings; } boardcomputerHardware; struct DefaultMode { @@ -143,6 +151,11 @@ void Settings::executeForEverySetting(T &&callable) callable("gametrakDistMax", boardcomputerHardware.gametrakDistMax); #endif callable("swapScreenBytes", boardcomputerHardware.swapScreenBytes); + callable("potiReadRate", boardcomputerHardware.timersSettings.potiReadRate); + callable("modeUpdateRate", boardcomputerHardware.timersSettings.modeUpdateRate); + callable("statsUpdateRate", boardcomputerHardware.timersSettings.statsUpdateRate); + callable("displayUpdateRa", boardcomputerHardware.timersSettings.displayUpdateRate); + callable("displayRedrawRa", boardcomputerHardware.timersSettings.displayRedrawRate); callable("default.modelMo", defaultMode.modelMode); callable("default.enableS", defaultMode.enableSmoothing); diff --git a/src/settingsaccessors.h b/src/settingsaccessors.h index 86134b9..a619c6f 100644 --- a/src/settingsaccessors.h +++ b/src/settingsaccessors.h @@ -76,6 +76,11 @@ struct GametrakDistMinAccessor : public RefAccessorSaveSettings { int16 struct GametrakDistMaxAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.gametrakDistMax; } }; #endif struct SwapScreenBytesAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.boardcomputerHardware.swapScreenBytes; } }; +struct PotiReadRateAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.timersSettings.potiReadRate; } }; +struct ModeUpdateRateAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.timersSettings.modeUpdateRate; } }; +struct StatsUpdateRateAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.timersSettings.statsUpdateRate; } }; +struct DisplayUpdateRateAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.timersSettings.displayUpdateRate; } }; +struct DisplayRedrawRateAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.boardcomputerHardware.timersSettings.displayRedrawRate; } }; struct DefaultModeModelModeAccessor : public RefAccessorSaveSettings { UnifiedModelMode &getRef() const override { return settings.defaultMode.modelMode; } }; struct DefaultModeEnableSmoothingAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableSmoothing; } }; From ad06ef506f56546368fc23d78a349c3a6ec9312f Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 14:57:10 +0200 Subject: [PATCH 4/6] Added timers menu --- .../menus/boardcomputerhardwaresettingsmenu.h | 2 ++ src/displays/menus/timersmenu.h | 23 +++++++++++++++++++ src/screens.h | 4 ++++ src/texts.h | 5 ++++ 4 files changed, 34 insertions(+) create mode 100644 src/displays/menus/timersmenu.h diff --git a/src/displays/menus/boardcomputerhardwaresettingsmenu.h b/src/displays/menus/boardcomputerhardwaresettingsmenu.h index 92981d0..f52394e 100644 --- a/src/displays/menus/boardcomputerhardwaresettingsmenu.h +++ b/src/displays/menus/boardcomputerhardwaresettingsmenu.h @@ -16,6 +16,7 @@ namespace { class BoardcomputerHardwareSettingsMenu; class CalibrateDisplay; class GametrakCalibrateDisplay; +class TimersMenu; class SettingsMenu; } @@ -164,6 +165,7 @@ class BoardcomputerHardwareSettingsMenu : #endif makeComponent, DummyAction>, makeComponent, ToggleBoolAction, CheckboxIcon, SwapScreenBytesAccessor>, + makeComponent, SwitchScreenAction>, makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> > {}; diff --git a/src/displays/menus/timersmenu.h b/src/displays/menus/timersmenu.h new file mode 100644 index 0000000..435f043 --- /dev/null +++ b/src/displays/menus/timersmenu.h @@ -0,0 +1,23 @@ +#pragma once + +#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" + +namespace { +class BoardcomputerHardwareSettingsMenu; +class TimersMenu : + public MenuDisplay, + public StaticText, + public BackActionInterface>, + public StaticMenuDefinition< + // TODO + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + > +{}; +} diff --git a/src/screens.h b/src/screens.h index 2f01cea..052a023 100644 --- a/src/screens.h +++ b/src/screens.h @@ -30,6 +30,7 @@ #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" @@ -99,6 +100,7 @@ union X { SelectModeMenu selectModeMenu; SettingsMenu settingsMenu; StationWifiSettingsMenu stationWifiSettingsMenu; + TimersMenu timersMenu; WifiScanMenu wifiScanMenu; WifiSettingsMenu wifiSettingsMenu; @@ -244,6 +246,8 @@ template<> decltype(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; } diff --git a/src/texts.h b/src/texts.h index 5858ce7..6c47062 100644 --- a/src/texts.h +++ b/src/texts.h @@ -248,6 +248,7 @@ constexpr char TEXT_SETGAMETRAKYMAX[] = "Set gametrakYMax"; constexpr char TEXT_SETGAMETRAKDISTMIN[] = "Set gametrakDistMin"; constexpr char TEXT_SETGAMETRAKDISTMAX[] = "Set gametrakDistMax"; constexpr char TEXT_SWAPSCREENBYTES[] = "Swap screen bytes"; +constexpr char TEXT_TIMERS[] = "Timers"; //constexpr char TEXT_BACK[] = "Back"; //PresetsMenu @@ -277,6 +278,10 @@ constexpr char TEXT_LARSM[] = "Larsm"; constexpr char TEXT_GAMETRAK[] = "Gametrak"; //constexpr char TEXT_BACK[] = "Back"; +//TimersMenu +//constexpr char TEXT_TIMERS[] = "Timers"; +//constexpr char TEXT_BACK[] = "Back"; + //ChangeValueDisplay constexpr char TEXT_OFF[] = "Off"; constexpr char TEXT_MASTER[] = "Master"; From 1fc970d4d50ece171c8066ced02eda328f62f7d9 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 15:09:33 +0200 Subject: [PATCH 5/6] Added change screens for timers settings --- src/displays/menus/timersmenu.h | 53 +++++++++++++++++++++++++++++++-- src/screens.h | 12 ++++++++ src/texts.h | 5 ++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/displays/menus/timersmenu.h b/src/displays/menus/timersmenu.h index 435f043..dce5f75 100644 --- a/src/displays/menus/timersmenu.h +++ b/src/displays/menus/timersmenu.h @@ -11,13 +11,62 @@ namespace { class BoardcomputerHardwareSettingsMenu; +} + +namespace { +class TimersMenu; + +using PotiReadRateChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + PotiReadRateAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +using ModeUpdateRateChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + ModeUpdateRateAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +using StatsUpdateRateChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + StatsUpdateRateAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +using DisplayUpdateRateChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + DisplayUpdateRateAccessor, + BackActionInterface>, + SwitchScreenAction +>; + +using DisplayRedrawRateChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + DisplayRedrawRateAccessor, + BackActionInterface>, + SwitchScreenAction +>; + class TimersMenu : public MenuDisplay, public StaticText, public BackActionInterface>, public StaticMenuDefinition< - // TODO - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>> > {}; } diff --git a/src/screens.h b/src/screens.h index 052a023..09aad72 100644 --- a/src/screens.h +++ b/src/screens.h @@ -181,6 +181,12 @@ union X { GametrakDistMaxChangeScreen changeGametrakDistMax; #endif + PotiReadRateChangeDisplay potiReadRateChangeDisplay; + ModeUpdateRateChangeDisplay modeUpdateRateChangeDisplay; + StatsUpdateRateChangeDisplay statsUpdateRateChangeDisplay; + DisplayUpdateRateChangeDisplay displayUpdateRateChangeDisplay; + DisplayRedrawRateChangeDisplay displayRedrawRateChangeDisplay; + WifiModeChangeScreen wifiModeChangeScreen; WifiTxPowerChangeScreen wifiTxPowerChangeScreen; @@ -328,6 +334,12 @@ template<> decltype(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; } diff --git a/src/texts.h b/src/texts.h index 6c47062..4e68beb 100644 --- a/src/texts.h +++ b/src/texts.h @@ -280,6 +280,11 @@ constexpr char TEXT_GAMETRAK[] = "Gametrak"; //TimersMenu //constexpr char TEXT_TIMERS[] = "Timers"; +constexpr char TEXT_POTIREADRATE[] = "Poti read rate"; +constexpr char TEXT_MODEUPDATERATE[] = "Mode update rate"; +constexpr char TEXT_STATSUPDATERATE[] = "Stats update rate"; +constexpr char TEXT_DISPLAYUPDATERATE[] = "Display update rate"; +constexpr char TEXT_DISPLAYREDRAWRATE[] = "Display redraw rate"; //constexpr char TEXT_BACK[] = "Back"; //ChangeValueDisplay From d5ff963143c3518c4459e721978cd58dbd7bf090 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 11 Jun 2020 15:51:44 +0200 Subject: [PATCH 6/6] Implemented security measures --- src/displays/calibratedisplay.h | 59 +++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/src/displays/calibratedisplay.h b/src/displays/calibratedisplay.h index 066ecac..b4b6b79 100644 --- a/src/displays/calibratedisplay.h +++ b/src/displays/calibratedisplay.h @@ -174,21 +174,26 @@ void CalibrateDisplay::redraw() __builtin_unreachable(); }()); - m_labels[9].redraw([&](){ - switch (m_status) - { - case Status::Begin: return "Yes"; - case Status::GasMin: - case Status::GasMax: - case Status::BremsMin: - case Status::BremsMax: return "Next"; - case Status::Confirm: return "Save"; - } - __builtin_unreachable(); - }()); + { + const auto color = m_status == Status::Confirm && (m_gas > 100 || m_brems > 100) ? TFT_DARKGREY : TFT_WHITE; + tft.setTextColor(color, TFT_BLACK); + m_labels[9].redraw([&](){ + switch (m_status) + { + case Status::Begin: return "Yes"; + case Status::GasMin: + case Status::GasMax: + case Status::BremsMin: + case Status::BremsMax: return "Next"; + case Status::Confirm: return "Save"; + } + __builtin_unreachable(); + }()); + tft.setTextColor(TFT_WHITE, TFT_BLACK); - if (m_selectedButton != m_renderedButton && (m_selectedButton == 0 || m_renderedButton == 0)) - tft.drawRect(23, 275, 100, 27, m_selectedButton == 0 ? TFT_WHITE : TFT_BLACK); + if (m_selectedButton != m_renderedButton && (m_selectedButton == 0 || m_renderedButton == 0)) + tft.drawRect(23, 275, 100, 27, m_selectedButton == 0 ? color : TFT_BLACK); + } m_labels[10].redraw([&](){ switch (m_status) @@ -230,7 +235,9 @@ void CalibrateDisplay::back() switch (m_status) { case Status::Begin: - if (!m_bootup) + if (m_bootup) + switchScreen(); + else switchScreen(); break; case Status::GasMin: @@ -261,6 +268,11 @@ void CalibrateDisplay::confirm() case Status::GasMax: m_gasMax = raw_gas; m_status = Status::BremsMin; + { + const auto dead = (m_gasMax - m_gasMin)/20; + m_gasMin += dead; + m_gasMax -= dead; + } break; case Status::BremsMin: m_bremsMin = raw_brems; @@ -269,8 +281,15 @@ void CalibrateDisplay::confirm() case Status::BremsMax: m_bremsMax = raw_brems; m_status = Status::Confirm; + { + const auto dead = (m_bremsMax - m_bremsMin)/20; + m_bremsMin += dead; + m_bremsMax -= dead; + } break; case Status::Confirm: + if (m_gas > 100 || m_brems > 100) + return; copyToSettings(); saveSettings(); if (m_bootup) @@ -280,15 +299,7 @@ void CalibrateDisplay::confirm() } break; case 1: // right button pressed - if (m_status == Status::Begin) - { - if (m_bootup) - switchScreen(); - else - switchScreen(); - } - else - back(); + back(); } }