Refactored calibrate screen layout

This commit is contained in:
2020-06-11 02:46:15 +02:00
parent 24b514e3f3
commit e34f3d01c1
13 changed files with 193 additions and 82 deletions

View File

@@ -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();
}
}

View File

@@ -2,7 +2,7 @@
#include <Arduino.h> #include <Arduino.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "globals.h" #include "globals.h"
#include "bmsutils.h" #include "bmsutils.h"
@@ -15,7 +15,7 @@ class StatusDisplay;
} }
namespace { namespace {
#ifdef FEATURE_BMS #ifdef FEATURE_BMS
class BmsDisplay : public DemoDisplay, public SwitchScreenAction<MainMenu> class BmsDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<MainMenu>>
{ {
public: public:
void initScreen() override; void initScreen() override;

View File

@@ -4,9 +4,10 @@
#include <WString.h> #include <WString.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "globals.h" #include "globals.h"
#include "utils.h"
#include "texts.h" #include "texts.h"
#include "widgets/label.h" #include "widgets/label.h"
#include "widgets/progressbar.h" #include "widgets/progressbar.h"
@@ -18,39 +19,68 @@ class BoardcomputerHardwareSettingsMenu;
} }
namespace { namespace {
class CalibrateDisplay : public DemoDisplay class CalibrateDisplay : public Display
{ {
using Base = DemoDisplay;
public: public:
CalibrateDisplay() = default; CalibrateDisplay() = default;
CalibrateDisplay(bool bootup); CalibrateDisplay(bool bootup);
void start() override; void start() override;
void initScreen() override; void initScreen() override;
void update() override;
void redraw() override; void redraw() override;
void stop() override; void stop() override;
void rotate(int offset) override;
void back() override; void back() override;
void triggered() override; void confirm() override;
private: private:
void copyFromSettings();
void copyToSettings();
const bool m_bootup{false}; const bool m_bootup{false};
ModeInterface *m_oldMode; ModeInterface *m_oldMode;
IgnoreInputMode m_mode{0, ControlType::FieldOrientedControl, ControlMode::Torque}; IgnoreInputMode m_mode{0, ControlType::FieldOrientedControl, ControlMode::Torque};
std::array<Label, 4> m_labels {{ std::array<Label, 11> m_labels {{
Label{25, 50}, // 100, 23 Label{25, 72}, // 100, 23
Label{25, 75}, // 100, 23 Label{145, 72}, // 100, 23
Label{25, 100}, // 100, 23 Label{25, 97}, // 100, 23
Label{25, 125} // 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<ProgressBar, 2> m_progressBars {{ std::array<ProgressBar, 2> m_progressBars {{
ProgressBar{20, 200, 200, 10, 0, 1000}, ProgressBar{20, 129, 200, 10, 0, 1000},
ProgressBar{20, 230, 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) : CalibrateDisplay::CalibrateDisplay(bool bootup) :
@@ -62,6 +92,11 @@ void CalibrateDisplay::start()
{ {
m_oldMode = currentMode; m_oldMode = currentMode;
currentMode = &m_mode; currentMode = &m_mode;
m_selectedButton = 0;
m_status = Status::Begin;
copyFromSettings();
m_gas = 0.f;
m_brems = 0.f;
} }
void CalibrateDisplay::initScreen() void CalibrateDisplay::initScreen()
@@ -76,23 +111,78 @@ void CalibrateDisplay::initScreen()
tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.drawString("gas:", 25, 47);
tft.drawString("brems:", 25, 147);
for (auto &label : m_labels) for (auto &label : m_labels)
label.start(); label.start();
for (auto &progressBar : m_progressBars) for (auto &progressBar : m_progressBars)
progressBar.start(); progressBar.start();
m_renderedButton = -1;
}
void CalibrateDisplay::update()
{
m_gas = scaleBetween<float>(raw_gas, m_gasMin, m_gasMax, 0., 1000.);
m_brems = scaleBetween<float>(raw_brems, m_bremsMin, m_bremsMax, 0., 1000.);
} }
void CalibrateDisplay::redraw() void CalibrateDisplay::redraw()
{ {
m_labels[0].redraw(String{gas}); m_labels[0].redraw(toString(m_gas));
m_labels[1].redraw(String{raw_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_progressBars[0].redraw(m_gas);
m_labels[3].redraw(String{raw_brems});
m_progressBars[0].redraw(gas); m_labels[4].redraw(toString(m_brems));
m_progressBars[1].redraw(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() void CalibrateDisplay::stop()
@@ -101,17 +191,59 @@ void CalibrateDisplay::stop()
currentMode = m_oldMode; currentMode = m_oldMode;
} }
void CalibrateDisplay::back() void CalibrateDisplay::rotate(int offset)
{ {
if (!m_bootup) m_selectedButton += offset;
switchScreen<BoardcomputerHardwareSettingsMenu>();
if (m_selectedButton < 0)
m_selectedButton = 1;
if (m_selectedButton > 1)
m_selectedButton = 0;
} }
void CalibrateDisplay::triggered() void CalibrateDisplay::back()
{ {
if (m_status == Status::Begin)
{
if (!m_bootup)
switchScreen<BoardcomputerHardwareSettingsMenu>();
}
else
{
m_status = Status::Begin;
copyFromSettings();
}
}
void CalibrateDisplay::confirm()
{
if (m_status == Status::Begin)
{
if (m_bootup) if (m_bootup)
switchScreen<StatusDisplay>(); switchScreen<StatusDisplay>();
else else
switchScreen<BoardcomputerHardwareSettingsMenu>(); switchScreen<BoardcomputerHardwareSettingsMenu>();
}
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;
} }
} }

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "textinterface.h" #include "textinterface.h"
#include "widgets/label.h" #include "widgets/label.h"
@@ -13,10 +13,8 @@ class GraphsMenu;
} }
namespace { namespace {
class DualGraphDisplay : public DemoDisplay, public SwitchScreenAction<GraphsMenu>, public BackActionInterface<SwitchScreenAction<GraphsMenu>> class DualGraphDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<GraphsMenu>>, public BackActionInterface<SwitchScreenAction<GraphsMenu>>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -6,7 +6,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
namespace { namespace {
@@ -14,10 +14,8 @@ class DemosMenu;
} }
namespace { namespace {
class GameOfLifeDisplay : public DemoDisplay, public SwitchScreenAction<DemosMenu>, public BackActionInterface<SwitchScreenAction<DemosMenu>> class GameOfLifeDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<DemosMenu>>, public BackActionInterface<SwitchScreenAction<DemosMenu>>
{ {
using Base = DemoDisplay;
public: public:
void start() override; void start() override;
void initScreen() override; void initScreen() override;

View File

@@ -4,7 +4,7 @@
#include <WString.h> #include <WString.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "globals.h" #include "globals.h"
#include "texts.h" #include "texts.h"
@@ -19,10 +19,8 @@ class BoardcomputerHardwareSettingsMenu;
namespace { namespace {
#ifdef FEATURE_GAMETRAK #ifdef FEATURE_GAMETRAK
class GametrakCalibrateDisplay : public DemoDisplay, public SwitchScreenAction<BoardcomputerHardwareSettingsMenu>, public BackActionInterface<SwitchScreenAction<BoardcomputerHardwareSettingsMenu>> class GametrakCalibrateDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<BoardcomputerHardwareSettingsMenu>>, public BackActionInterface<SwitchScreenAction<BoardcomputerHardwareSettingsMenu>>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "textinterface.h" #include "textinterface.h"
#include "widgets/label.h" #include "widgets/label.h"
@@ -30,10 +30,13 @@ public:
}; };
template<size_t COUNT> template<size_t COUNT>
class GraphDisplay : public DemoDisplay, public SwitchScreenAction<GraphsMenu>, public virtual TextInterface, public BackActionInterface<SwitchScreenAction<GraphsMenu>>, public virtual MultiStatisticsInterface<COUNT> class GraphDisplay :
public Display,
public virtual TextInterface,
public ConfirmActionInterface<SwitchScreenAction<GraphsMenu>>,
public BackActionInterface<SwitchScreenAction<GraphsMenu>>,
public virtual MultiStatisticsInterface<COUNT>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -4,7 +4,7 @@
#include <Arduino.h> #include <Arduino.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "globals.h" #include "globals.h"
#include "utils.h" #include "utils.h"
@@ -16,10 +16,8 @@ class BmsDisplay;
} }
namespace { namespace {
class MetersDisplay : public DemoDisplay, public SwitchScreenAction<MainMenu>, public BackActionInterface<SwitchScreenAction<MainMenu>> class MetersDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<MainMenu>>, public BackActionInterface<SwitchScreenAction<MainMenu>>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -5,7 +5,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
namespace { namespace {
@@ -13,10 +13,8 @@ class DemosMenu;
} }
namespace { namespace {
class PingPongDisplay : public DemoDisplay, public SwitchScreenAction<DemosMenu>, public BackActionInterface<SwitchScreenAction<DemosMenu>> class PingPongDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<DemosMenu>>, public BackActionInterface<SwitchScreenAction<DemosMenu>>
{ {
using Base = DemoDisplay;
public: public:
PingPongDisplay(); PingPongDisplay();

View File

@@ -5,7 +5,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
namespace { namespace {
@@ -13,10 +13,8 @@ class DemosMenu;
} }
namespace { namespace {
class SpiroDisplay : public DemoDisplay, public SwitchScreenAction<DemosMenu>, public BackActionInterface<SwitchScreenAction<DemosMenu>> class SpiroDisplay : public Display, public SwitchScreenAction<DemosMenu>, public BackActionInterface<SwitchScreenAction<DemosMenu>>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -4,7 +4,7 @@
#include <Arduino.h> #include <Arduino.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "globals.h" #include "globals.h"
@@ -13,10 +13,8 @@ class DemosMenu;
} }
namespace { namespace {
class StarfieldDisplay : public DemoDisplay, public SwitchScreenAction<DemosMenu>, public BackActionInterface<SwitchScreenAction<DemosMenu>> class StarfieldDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<DemosMenu>>, public BackActionInterface<SwitchScreenAction<DemosMenu>>
{ {
using Base = DemoDisplay;
public: public:
StarfieldDisplay(); StarfieldDisplay();

View File

@@ -3,7 +3,7 @@
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include <WiFi.h> #include <WiFi.h>
#include "demodisplay.h" #include "display.h"
#include "actions/switchscreenaction.h" #include "actions/switchscreenaction.h"
#include "modeinterface.h" #include "modeinterface.h"
@@ -20,10 +20,8 @@ class MetersDisplay;
} }
namespace { namespace {
class StatusDisplay : public DemoDisplay, public SwitchScreenAction<MainMenu> class StatusDisplay : public Display, public ConfirmActionInterface<SwitchScreenAction<MainMenu>>
{ {
using Base = DemoDisplay;
public: public:
void initScreen() override; void initScreen() override;
void redraw() override; void redraw() override;

View File

@@ -29,10 +29,12 @@
namespace { namespace {
ModeInterface *lastMode{}; ModeInterface *lastMode{};
millis_t lastPotiRead{};
millis_t lastModeUpdate{}; millis_t lastModeUpdate{};
millis_t lastStatsUpdate{}; millis_t lastStatsUpdate{};
millis_t lastDisplayRedraw{}; millis_t lastDisplayRedraw{};
constexpr auto potiReadRate = 50;
constexpr auto modeUpdateRate = 50; constexpr auto modeUpdateRate = 50;
constexpr auto statsUpdateRate = 50; constexpr auto statsUpdateRate = 50;
constexpr auto displayRedrawRate = 50; constexpr auto displayRedrawRate = 50;
@@ -148,12 +150,19 @@ void loop()
dpad3wire::update(); dpad3wire::update();
#endif #endif
if (!lastPotiRead)
lastPotiRead = now;
else if (now - lastPotiRead >= 1000/potiReadRate)
{
readPotis();
lastPotiRead = now;
}
if (!lastModeUpdate) if (!lastModeUpdate)
lastModeUpdate = now; lastModeUpdate = now;
else if (now - lastModeUpdate >= 1000/modeUpdateRate) else if (now - lastModeUpdate >= 1000/modeUpdateRate)
{ {
readPotis();
if (lastMode != currentMode) if (lastMode != currentMode)
{ {
if (lastMode) if (lastMode)