Added display to calibrate other buttons
This commit is contained in:
@ -136,6 +136,7 @@ set(headers
|
|||||||
displays/menus/enablemenu.h
|
displays/menus/enablemenu.h
|
||||||
displays/menus/espnowmenu.h
|
displays/menus/espnowmenu.h
|
||||||
displays/menus/espnowsettingsmenu.h
|
displays/menus/espnowsettingsmenu.h
|
||||||
|
displays/menus/extrabuttoncalibratemenu.h
|
||||||
displays/menus/feedbackdebugmenu.h
|
displays/menus/feedbackdebugmenu.h
|
||||||
displays/menus/gametrakmodesettingsmenu.h
|
displays/menus/gametrakmodesettingsmenu.h
|
||||||
displays/menus/garagenmenu.h
|
displays/menus/garagenmenu.h
|
||||||
@ -360,6 +361,7 @@ set(sources
|
|||||||
displays/menus/enablemenu.cpp
|
displays/menus/enablemenu.cpp
|
||||||
displays/menus/espnowmenu.cpp
|
displays/menus/espnowmenu.cpp
|
||||||
displays/menus/espnowsettingsmenu.cpp
|
displays/menus/espnowsettingsmenu.cpp
|
||||||
|
displays/menus/extrabuttoncalibratemenu.cpp
|
||||||
displays/menus/feedbackdebugmenu.cpp
|
displays/menus/feedbackdebugmenu.cpp
|
||||||
displays/menus/gametrakmodesettingsmenu.cpp
|
displays/menus/gametrakmodesettingsmenu.cpp
|
||||||
displays/menus/garagenmenu.cpp
|
displays/menus/garagenmenu.cpp
|
||||||
|
@ -238,3 +238,19 @@ struct ESPNowSyncTimeEnabledAccessor : public RefAccessorSaveSettings<bool> { bo
|
|||||||
struct ESPNowSyncTimeWithOthersEnabledAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.espnow.syncTimeWithOthers; } };
|
struct ESPNowSyncTimeWithOthersEnabledAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.espnow.syncTimeWithOthers; } };
|
||||||
struct ESPNowSyncBlinkEnabledAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.espnow.syncBlink; } };
|
struct ESPNowSyncBlinkEnabledAccessor : public RefAccessorSaveSettings<bool> { bool &getRef() const override { return settings.espnow.syncBlink; } };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Button Mapping accessors
|
||||||
|
struct ButtonLeftAccessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingLeft; } };
|
||||||
|
struct ButtonRightAccessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingRight; } };
|
||||||
|
struct ButtonUpAccessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingUp; } };
|
||||||
|
struct ButtonDownAccessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingDown; } };
|
||||||
|
|
||||||
|
struct ButtonLeft2Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingLeft2; } };
|
||||||
|
struct ButtonRight2Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingRight2; } };
|
||||||
|
struct ButtonUp2Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingUp2; } };
|
||||||
|
struct ButtonDown2Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingDown2; } };
|
||||||
|
|
||||||
|
struct ButtonProfile0Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingProfile0; } };
|
||||||
|
struct ButtonProfile1Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingProfile1; } };
|
||||||
|
struct ButtonProfile2Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingProfile2; } };
|
||||||
|
struct ButtonProfile3Accessor : public NewSettingsAccessor<uint8_t> { ConfigWrapper<uint8_t> &getConfig() const override { return configs.dpadMappingProfile3; } };
|
||||||
|
@ -18,10 +18,12 @@
|
|||||||
#include "displays/menus/timersmenu.h"
|
#include "displays/menus/timersmenu.h"
|
||||||
#include "displays/menus/settingsmenu.h"
|
#include "displays/menus/settingsmenu.h"
|
||||||
#include "displays/buttoncalibratedisplay.h"
|
#include "displays/buttoncalibratedisplay.h"
|
||||||
|
#include "displays/menus/extrabuttoncalibratemenu.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings";
|
constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings";
|
||||||
constexpr char TEXT_BUTTONCALIBRATE[] = "Button Calibrate";
|
constexpr char TEXT_BUTTONCALIBRATE[] = "Button Calibrate";
|
||||||
|
constexpr char TEXT_EXTRABUTTONCALIBRATE[] = "Cal other Buttons";
|
||||||
constexpr char TEXT_LOCKSCREENSETTINGS[] = "Lockscreen Settings";
|
constexpr char TEXT_LOCKSCREENSETTINGS[] = "Lockscreen Settings";
|
||||||
constexpr char TEXT_POTISCALIBRATE[] = "Potis Calibrate";
|
constexpr char TEXT_POTISCALIBRATE[] = "Potis Calibrate";
|
||||||
constexpr char TEXT_SAMPLECOUNT[] = "sampleCount";
|
constexpr char TEXT_SAMPLECOUNT[] = "sampleCount";
|
||||||
@ -174,6 +176,7 @@ BoardcomputerHardwareSettingsMenu::BoardcomputerHardwareSettingsMenu()
|
|||||||
{
|
{
|
||||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LOCKSCREENSETTINGS>, SwitchScreenAction<LockscreenSettingsMenu>, StaticMenuItemIcon<&bobbyicons::lock>>>();
|
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LOCKSCREENSETTINGS>, SwitchScreenAction<LockscreenSettingsMenu>, StaticMenuItemIcon<&bobbyicons::lock>>>();
|
||||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BUTTONCALIBRATE>, SwitchScreenAction<ButtonCalibrateDisplay>>>();
|
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BUTTONCALIBRATE>, SwitchScreenAction<ButtonCalibrateDisplay>>>();
|
||||||
|
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_EXTRABUTTONCALIBRATE>, SwitchScreenAction<ExtraButtonCalibrateMenu>>>();
|
||||||
constructMenuItem<makeComponent<MenuItem, GasText, DisabledColor, StaticFont<2>, DummyAction>>();
|
constructMenuItem<makeComponent<MenuItem, GasText, DisabledColor, StaticFont<2>, DummyAction>>();
|
||||||
constructMenuItem<makeComponent<MenuItem, BremsText, DisabledColor, StaticFont<2>, DummyAction>>();
|
constructMenuItem<makeComponent<MenuItem, BremsText, DisabledColor, StaticFont<2>, DummyAction>>();
|
||||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POTISCALIBRATE>, SwitchScreenAction<PotisCalibrateDisplay>>>();
|
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POTISCALIBRATE>, SwitchScreenAction<PotisCalibrateDisplay>>>();
|
||||||
|
246
main/displays/menus/extrabuttoncalibratemenu.cpp
Normal file
246
main/displays/menus/extrabuttoncalibratemenu.cpp
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
#include "extrabuttoncalibratemenu.h"
|
||||||
|
|
||||||
|
// 3rd party includes
|
||||||
|
#include <TFT_eSPI.h>
|
||||||
|
#include <menuitem.h>
|
||||||
|
#include <icons/back.h>
|
||||||
|
#include <textwithvaluehelper.h>
|
||||||
|
|
||||||
|
// local includes
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "accessors/settingsaccessors.h"
|
||||||
|
#include "actions/switchscreenaction.h"
|
||||||
|
#include "bobbyerrorhandler.h"
|
||||||
|
#include "displays/menus/boardcomputerhardwaresettingsmenu.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
using namespace espgui;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
Status currentStatus;
|
||||||
|
|
||||||
|
constexpr const char TAG[] = "BUTTON";
|
||||||
|
|
||||||
|
constexpr char TEXT_EXTRABUTTONCALIBRATEMENU[] = "Calibrate Buttons";
|
||||||
|
constexpr char TEXT_BUTTON_LEFT2[] = "Left2";
|
||||||
|
constexpr char TEXT_BUTTON_RIGHT2[] = "Right2";
|
||||||
|
constexpr char TEXT_BUTTON_UP2[] = "Up2";
|
||||||
|
constexpr char TEXT_BUTTON_DOWN2[] = "Down2";
|
||||||
|
|
||||||
|
constexpr char TEXT_BUTTON_PROFILE0[] = "Profile0";
|
||||||
|
constexpr char TEXT_BUTTON_PROFILE1[] = "Profile1";
|
||||||
|
constexpr char TEXT_BUTTON_PROFILE2[] = "Profile2";
|
||||||
|
constexpr char TEXT_BUTTON_PROFILE3[] = "Profile3";
|
||||||
|
|
||||||
|
constexpr char TEXT_BACK[] = "Back";
|
||||||
|
|
||||||
|
template<const char *Tprefix, typename Taccessor, Status status>
|
||||||
|
class ButtonCalibrateMenuItem :
|
||||||
|
public MenuItem,
|
||||||
|
public TextWithValueHelper<Tprefix, Taccessor>
|
||||||
|
{
|
||||||
|
using StandardText = TextWithValueHelper<Tprefix, Taccessor>;
|
||||||
|
public:
|
||||||
|
void triggered() override
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Pressed menu item for %s", Tprefix);
|
||||||
|
currentStatus = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int color() const override
|
||||||
|
{
|
||||||
|
return (status == currentStatus || currentStatus == Idle) ? TFT_WHITE : TFT_DARKGREY;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string text() const override
|
||||||
|
{
|
||||||
|
if (status == currentStatus)
|
||||||
|
{
|
||||||
|
return fmt::format("Press {}", Tprefix);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return StandardText::text();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
ExtraButtonCalibrateMenu::ExtraButtonCalibrateMenu()
|
||||||
|
{
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_LEFT2, ButtonLeft2Accessor, Status::WaitingLeft2>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_RIGHT2, ButtonRight2Accessor, Status::WaitingRight2>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_UP2, ButtonUp2Accessor, Status::WaitingUp2>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_DOWN2, ButtonDown2Accessor, Status::WaitingDown2>>();
|
||||||
|
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_PROFILE0, ButtonProfile0Accessor, Status::WaitingProfile0>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_PROFILE1, ButtonProfile1Accessor, Status::WaitingProfile1>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_PROFILE2, ButtonProfile2Accessor, Status::WaitingProfile2>>();
|
||||||
|
constructMenuItem<ButtonCalibrateMenuItem<TEXT_BUTTON_PROFILE3, ButtonProfile3Accessor, Status::WaitingProfile3>>();
|
||||||
|
|
||||||
|
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<BoardcomputerHardwareSettingsMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::start()
|
||||||
|
{
|
||||||
|
Base::start();
|
||||||
|
m_oldMode = currentMode;
|
||||||
|
currentMode = &m_mode;
|
||||||
|
currentStatus = Idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::update()
|
||||||
|
{
|
||||||
|
Base::update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::stop()
|
||||||
|
{
|
||||||
|
Base::stop();
|
||||||
|
|
||||||
|
if (currentMode == &m_mode)
|
||||||
|
{
|
||||||
|
m_mode.stop();
|
||||||
|
lastMode = nullptr;
|
||||||
|
currentMode = m_oldMode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::rawButtonPressed(uint8_t button)
|
||||||
|
{
|
||||||
|
if (currentStatus == Idle)
|
||||||
|
{
|
||||||
|
Base::rawButtonPressed(button);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (validateNewButton(button))
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Valid new button: %i", button);
|
||||||
|
switch(currentStatus)
|
||||||
|
{
|
||||||
|
case WaitingUp2:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingUp2, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingDown2:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingDown2, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingLeft2:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingLeft2, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingRight2:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingRight2, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingProfile0:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingProfile0, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingProfile1:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingProfile1, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingProfile2:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingProfile2, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WaitingProfile3:
|
||||||
|
if (auto result = configs.write_config(configs.dpadMappingProfile3, button); !result)
|
||||||
|
{
|
||||||
|
BobbyErrorHandler{}.errorOccured(std::move(result).error());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
currentStatus = Idle;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Invalid new button: %i", button);
|
||||||
|
currentStatus = Idle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::rawButtonReleased(uint8_t button)
|
||||||
|
{
|
||||||
|
// if (currentStatus == Idle)
|
||||||
|
// {
|
||||||
|
// Base::rawButtonReleased(button);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::buttonPressed(espgui::Button button)
|
||||||
|
{
|
||||||
|
if (currentStatus == Idle)
|
||||||
|
{
|
||||||
|
Base::buttonPressed(button);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (button)
|
||||||
|
{
|
||||||
|
case Left:
|
||||||
|
ESP_LOGI(TAG, "Canceling procedure");
|
||||||
|
currentStatus = Idle;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::buttonReleased(espgui::Button button)
|
||||||
|
{
|
||||||
|
// if (currentStatus == Idle)
|
||||||
|
// {
|
||||||
|
// Base::buttonReleased(button);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ExtraButtonCalibrateMenu::text() const
|
||||||
|
{
|
||||||
|
return TEXT_EXTRABUTTONCALIBRATEMENU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtraButtonCalibrateMenu::back()
|
||||||
|
{
|
||||||
|
switchScreen<BoardcomputerHardwareSettingsMenu>();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExtraButtonCalibrateMenu::validateNewButton(uint8_t button)
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
button != configs.dpadMappingDown.value &&
|
||||||
|
button != configs.dpadMappingUp.value &&
|
||||||
|
button != configs.dpadMappingLeft.value &&
|
||||||
|
button != configs.dpadMappingRight.value
|
||||||
|
);
|
||||||
|
}
|
45
main/displays/menus/extrabuttoncalibratemenu.h
Normal file
45
main/displays/menus/extrabuttoncalibratemenu.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// local includes
|
||||||
|
#include "displays/bobbymenudisplay.h"
|
||||||
|
#include "modeinterface.h"
|
||||||
|
#include "modes/ignoreinputmode.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
enum Status : uint8_t
|
||||||
|
{
|
||||||
|
Idle,
|
||||||
|
WaitingLeft2,
|
||||||
|
WaitingRight2,
|
||||||
|
WaitingUp2,
|
||||||
|
WaitingDown2,
|
||||||
|
WaitingProfile0,
|
||||||
|
WaitingProfile1,
|
||||||
|
WaitingProfile2,
|
||||||
|
WaitingProfile3
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
class ExtraButtonCalibrateMenu :
|
||||||
|
public BobbyMenuDisplay
|
||||||
|
{
|
||||||
|
using Base = BobbyMenuDisplay;
|
||||||
|
public:
|
||||||
|
ExtraButtonCalibrateMenu();
|
||||||
|
std::string text() const override;
|
||||||
|
void back() override;
|
||||||
|
|
||||||
|
void start() override;
|
||||||
|
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;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ModeInterface *m_oldMode;
|
||||||
|
IgnoreInputMode m_mode{0, bobbycar::protocol::ControlType::FieldOrientedControl, bobbycar::protocol::ControlMode::Torque};
|
||||||
|
bool validateNewButton(uint8_t button);
|
||||||
|
};
|
Reference in New Issue
Block a user