From bc9a0c396ccd2d9c1d62761a837f82a4ac37c06c Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Fri, 7 Oct 2022 00:07:53 +0200 Subject: [PATCH] Unfinished button calibration --- main/CMakeLists.txt | 2 - main/displays/buttoncalibratedisplay.cpp | 4 +- main/displays/buttoncalibratedisplay.h | 4 +- main/displays/lockscreen.cpp | 10 +- .../boardcomputerhardwaresettingsmenu.cpp | 5 +- main/displays/potiscalibratedisplay.cpp | 3 +- main/displays/potiscalibratedisplay.h | 3 +- main/displays/setupdisplay.cpp | 171 +++++++++++++++++- main/displays/setupdisplay.h | 57 +++++- 9 files changed, 233 insertions(+), 26 deletions(-) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 372e822..f143b67 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -529,8 +529,6 @@ idf_component_register( ${dependencies} ) -add_library(bobbyboardcomputer ${BOBBY_SOURCES} ${BOBBY_HEADERS}) - execute_process(COMMAND git rev-parse HEAD OUTPUT_VARIABLE GIT_REV ERROR_QUIET ) diff --git a/main/displays/buttoncalibratedisplay.cpp b/main/displays/buttoncalibratedisplay.cpp index d1c4d3a..46cc49f 100644 --- a/main/displays/buttoncalibratedisplay.cpp +++ b/main/displays/buttoncalibratedisplay.cpp @@ -17,7 +17,7 @@ namespace { constexpr const char TAG[] = "BUTTON"; } // namespace - +/* std::string ButtonCalibrateDisplay::text() const { return "Button calibrate"; @@ -220,4 +220,4 @@ void ButtonCalibrateDisplay::buttonReleased(espgui::Button button) { //Base::buttonReleased(button); } - +*/ diff --git a/main/displays/buttoncalibratedisplay.h b/main/displays/buttoncalibratedisplay.h index 9aee10f..0aa3317 100644 --- a/main/displays/buttoncalibratedisplay.h +++ b/main/displays/buttoncalibratedisplay.h @@ -9,7 +9,7 @@ #include "modeinterface.h" #include "modes/ignoreinputmode.h" - +/* class ButtonCalibrateDisplay : public espgui::DisplayWithTitle { using Base = espgui::DisplayWithTitle; @@ -52,4 +52,4 @@ private: bool m_finished; }; - +*/ diff --git a/main/displays/lockscreen.cpp b/main/displays/lockscreen.cpp index a1d51d5..dbdb7ff 100644 --- a/main/displays/lockscreen.cpp +++ b/main/displays/lockscreen.cpp @@ -106,10 +106,7 @@ void Lockscreen::redraw() { if (isValid1stPin(m_numbers)) { - if (!gas || !brems || *gas > 200.f || *brems > 200.f) - espgui::switchScreen(true); - else - espgui::popScreen(); + espgui::popScreen(); #ifdef LOCKSCREEN_PLUGIN #include LOCKSCREEN_PLUGIN LOCKSCREEN_PLUGIN_FIXES_1 @@ -118,10 +115,7 @@ LOCKSCREEN_PLUGIN_FIXES_1 } else if(isValid2ndPin(m_numbers)) { - if (!gas || !brems || *gas > 200.f || *brems > 200.f) - espgui::switchScreen(true); - else - espgui::popScreen(); + espgui::popScreen(); #ifdef LOCKSCREEN_PLUGIN_FIXES_2 LOCKSCREEN_PLUGIN_FIXES_2 #endif diff --git a/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp b/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp index bb5c871..785f7a5 100644 --- a/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp +++ b/main/displays/menus/boardcomputerhardwaresettingsmenu.cpp @@ -19,6 +19,7 @@ #include "displays/menus/setupquickactionsmenu.h" #include "displays/menus/timersmenu.h" #include "displays/potiscalibratedisplay.h" +#include "displays/setupdisplay.h" #include "icons/lock.h" #ifdef FEATURE_JOYSTICK @@ -192,12 +193,12 @@ using namespace espgui; BoardcomputerHardwareSettingsMenu::BoardcomputerHardwareSettingsMenu() { constructMenuItem, PushScreenAction, StaticMenuItemIcon<&bobbyicons::lock>>>(); - // constructMenuItem, PushScreenAction>>(); + constructMenuItem>>(SetupStep::BASIC_BUTTONS, true); constructMenuItem, PushScreenAction>>(); constructMenuItem, PushScreenAction>>(); constructMenuItem, DummyAction>>(); constructMenuItem, DummyAction>>(); - // constructMenuItem, PushScreenAction>>(); + constructMenuItem>>(SetupStep::CALIBRATE_POTIS, true); #ifdef FEATURE_JOYSTICK constructMenuItem, PushScreenAction>>(); #endif diff --git a/main/displays/potiscalibratedisplay.cpp b/main/displays/potiscalibratedisplay.cpp index 43e32c8..0b75e91 100644 --- a/main/displays/potiscalibratedisplay.cpp +++ b/main/displays/potiscalibratedisplay.cpp @@ -16,7 +16,7 @@ namespace { constexpr char TEXT_CALIBRATE[] = "Potis Calibrate"; } // namespace - +/* std::string PotisCalibrateDisplay::text() const { return TEXT_CALIBRATE; @@ -321,3 +321,4 @@ void PotisCalibrateDisplay::copyToSettings() configs.write_config(configs.bremsMin, m_bremsMin); configs.write_config(configs.bremsMax, m_bremsMax); } +*/ diff --git a/main/displays/potiscalibratedisplay.h b/main/displays/potiscalibratedisplay.h index fd56f84..82c6b86 100644 --- a/main/displays/potiscalibratedisplay.h +++ b/main/displays/potiscalibratedisplay.h @@ -16,7 +16,7 @@ #include "modeinterface.h" #include "modes/ignoreinputmode.h" - +/* class PotisCalibrateDisplay : public BobbyDisplayWithTitle { using Base = BobbyDisplayWithTitle; @@ -91,3 +91,4 @@ private: ; std::optional m_gas, m_brems; }; +*/ diff --git a/main/displays/setupdisplay.cpp b/main/displays/setupdisplay.cpp index 7e0712d..9c0ee99 100644 --- a/main/displays/setupdisplay.cpp +++ b/main/displays/setupdisplay.cpp @@ -6,17 +6,31 @@ // 3rdparty lib includes #include +// local includes +#include "globals.h" + using namespace espgui; using namespace std::chrono_literals; namespace setupdisplay { constexpr char const InformationText[] = "Congratulations on your new\nbobbycar! This guide will help\nyou through initial setup,\ncalibrate everything and\nget you ready!"; +constexpr char const ButtonText[] = "Please press the highlighted\n buttons!"; } // setupdisplay +namespace { +constexpr const char * const TAG = "SETUPDISPLAY"; +} // namespace + void SetupDisplay::start() { Base::start(); m_menu_opened_timestamp = espchrono::millis_clock::now(); + + m_oldMode = currentMode; + currentMode = &m_mode; + m_lastButton = std::nullopt; + m_button_cal_status = setupdisplay::LEFT; + m_button_cal_finished = false; } void SetupDisplay::initScreen() @@ -27,15 +41,22 @@ void SetupDisplay::initScreen() void SetupDisplay::update() { Base::update(); + + switch(m_current_setupStep) + { + case SetupStep::BASIC_BUTTONS: + break; + default:; + } } void SetupDisplay::redraw() { Base::redraw(); - if (m_current_setupStep != m_last_setupStep || initialRender) + if (m_current_setupStep != m_last_setupStep || m_initialRender) { - initialRender = false; + m_initialRender = false; m_last_setupStep = m_current_setupStep; switch(m_current_setupStep) @@ -44,7 +65,9 @@ void SetupDisplay::redraw() drawLargeText(setupdisplay::InformationText); break; case SetupStep::BASIC_BUTTONS: - clearLargeText(); + clearArea(); + drawLargeText(setupdisplay::ButtonText); + drawButtons(m_button_cal_status); break; case SetupStep::CALIBRATE_POTIS: break; @@ -70,13 +93,99 @@ void SetupDisplay::redraw() void SetupDisplay::stop() { Base::stop(); + + if (currentMode == &m_mode) + { + // to avoid crash after deconstruction + m_mode.stop(); + lastMode = nullptr; + + currentMode = m_oldMode; + } } void SetupDisplay::buttonPressed(espgui::Button button) { + if (m_current_setupStep == SetupStep::BASIC_BUTTONS) + { + return; + } + Base::buttonPressed(button); } +void SetupDisplay::buttonReleased(espgui::Button button) +{ + if (m_current_setupStep == SetupStep::BASIC_BUTTONS) + { + return; + } + + Base::buttonReleased(button); +} + +void SetupDisplay::rawButtonPressed(uint8_t button) +{ + Base::rawButtonPressed(button); + + if (m_current_setupStep != SetupStep::BASIC_BUTTONS) + { + return; + } + + if (m_button_cal_status == setupdisplay::FINISHED) + { + if (button == m_rightButton) + { + ESP_LOGI(TAG, "correct button"); + m_button_cal_finished = true; + } + else + ESP_LOGI(TAG, "wrong button"); + } + else if (!m_lastButton || *m_lastButton != button) + m_lastButton = button; + else + { + switch (m_button_cal_status) + { + case setupdisplay::LEFT: + m_leftButton = button; + m_lastButton = std::nullopt; + m_button_cal_status = setupdisplay::RIGHT; + break; + case setupdisplay::RIGHT: + m_rightButton = button; + m_lastButton = std::nullopt; + m_button_cal_status = setupdisplay::UP; + break; + case setupdisplay::UP: + m_upButton = button; + m_lastButton = std::nullopt; + m_button_cal_status = setupdisplay::DOWN; + break; + case setupdisplay::DOWN: + m_downButton = button; + m_lastButton = std::nullopt; + m_button_cal_status = setupdisplay::FINISHED; + break; + case setupdisplay::FINISHED:; + } + } + + drawButtons(m_button_cal_status); +} + +void SetupDisplay::saveButtons() +{ + +} + +void SetupDisplay::rawButtonReleased(uint8_t button) +{ + // Base::rawButtonReleased(button); +} + std::string SetupDisplay::text() const { switch (m_current_setupStep) @@ -164,7 +273,61 @@ void SetupDisplay::nextStep() ESP_LOGI("SetupDisplay", "nextStep after (%s)", toString(m_current_setupStep).c_str()); } -void SetupDisplay::clearLargeText() +void SetupDisplay::clearArea() { tft.fillRect(0, 50, tft.width(), tft.height()-50, TFT_BLACK); } + +void SetupDisplay::drawButtons(setupdisplay::CurrentButton button) +{ + const int16_t x_mid = tft.width() / 2; + const int16_t y_mid = tft.height() / 2; + + const auto offset = 40; + const auto radius = 15; + const auto subtract = 2; + + const auto up_x = x_mid; + const auto up_y = y_mid - offset; + + const auto down_x = x_mid; + const auto down_y = y_mid + offset; + + const auto left_x = x_mid - offset; + const auto left_y = y_mid; + + const auto right_x = x_mid + offset; + const auto right_y = y_mid; + + tft.fillCircle(up_x, up_y, radius-subtract, TFT_BLACK); + tft.fillCircle(down_x, down_y, radius-subtract, TFT_BLACK); + tft.fillCircle(left_x, left_y, radius-subtract, TFT_BLACK); + tft.fillCircle(right_x, right_y, radius-subtract, TFT_BLACK); + + tft.drawCircle(up_x, up_y, radius, TFT_WHITE); + tft.drawCircle(down_x, down_y, radius, TFT_WHITE); + tft.drawCircle(left_x, left_y, radius, TFT_WHITE); + tft.drawCircle(right_x, right_y, radius, TFT_WHITE); + + switch(button) + { + case setupdisplay::UP: + tft.fillCircle(up_x, up_y, radius-subtract, m_lastButton ? TFT_YELLOW : TFT_WHITE); + break; + case setupdisplay::DOWN: + tft.fillCircle(down_x, down_y, radius-subtract, m_lastButton ? TFT_YELLOW : TFT_WHITE); + break; + case setupdisplay::LEFT: + tft.fillCircle(left_x, left_y, radius-subtract, m_lastButton ? TFT_YELLOW : TFT_WHITE); + break; + case setupdisplay::RIGHT: + tft.fillCircle(right_x, right_y, radius-subtract, m_lastButton ? TFT_YELLOW : TFT_WHITE); + break; + default:; + } + + if (m_button_cal_status == setupdisplay::FINISHED) + { + tft.fillCircle(right_x, right_y, radius-subtract, TFT_GREEN); + } +} diff --git a/main/displays/setupdisplay.h b/main/displays/setupdisplay.h index 2b60e03..4bbe32f 100644 --- a/main/displays/setupdisplay.h +++ b/main/displays/setupdisplay.h @@ -2,13 +2,18 @@ // system includes #include +#include // 3rdparty lib includes +#include #include +#include // local includes #include "bobbydisplaywithtitle.h" #include "bobbytypesafeenum.h" +#include "modeinterface.h" +#include "modes/ignoreinputmode.h" #define SetupStepValues(x) \ x(INFORMATION) \ @@ -22,13 +27,25 @@ DECLARE_BOBBYTYPESAFE_ENUM(SetupStep, : uint8_t, SetupStepValues); +namespace setupdisplay { +enum CurrentButton : int8_t +{ + UP, + DOWN, + LEFT, + RIGHT, + FINISHED +}; +} + class SetupDisplay : public BobbyDisplayWithTitle { using Base = BobbyDisplayWithTitle; public: - explicit SetupDisplay(SetupStep initialStep = SetupStep::INFORMATION) : + explicit SetupDisplay(SetupStep initialStep = SetupStep::INFORMATION, bool early_return = false) : m_current_setupStep{initialStep}, - m_last_setupStep{initialStep} + m_last_setupStep{initialStep}, + m_early_return{early_return} {} void start() override; @@ -37,16 +54,48 @@ public: void update() override; void stop() override; + void rawButtonPressed(uint8_t button) override; + void rawButtonReleased(uint8_t button) override; void buttonPressed(espgui::Button button) override; + void buttonReleased(espgui::Button button) override; std::string text() const override; private: SetupStep m_current_setupStep; SetupStep m_last_setupStep; espchrono::millis_clock::time_point m_menu_opened_timestamp; - bool initialRender{true}; + bool m_initialRender{true}; + const bool m_early_return; static void drawLargeText(const std::string&& text); - static void clearLargeText(); + static void clearArea(); + void drawButtons(setupdisplay::CurrentButton button); void nextStep(); + + // button calibration + ModeInterface *m_oldMode; + IgnoreInputMode m_mode{0, bobbycar::protocol::ControlType::FieldOrientedControl, bobbycar::protocol::ControlMode::Torque}; + + std::optional m_lastButton; + + setupdisplay::CurrentButton m_button_cal_status; + uint8_t m_leftButton, m_rightButton, m_upButton, m_downButton; + bool m_button_cal_finished; + void saveButtons(); +}; + +class PushSetupDisplayAction : public virtual espgui::ActionInterface { +public: + explicit PushSetupDisplayAction(SetupStep setupStep, bool early_return = false) : + m_setupStep{setupStep}, + m_early_return{early_return} + {} + + void triggered() override + { + espgui::pushScreen(m_setupStep, m_early_return); + } +private: + const SetupStep m_setupStep; + const bool m_early_return; };