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)