diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index ff76b20..f3e653d 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -133,6 +133,7 @@ set(headers displays/menus/mosfetsmenu.h displays/menus/motorfeedbackdebugmenu.h displays/menus/motorstatedebugmenu.h + displays/menus/motortestmodesettingsmenu.h displays/menus/otamenu.h displays/menus/selectotabuildmenu.h displays/menus/presetsmenu.h @@ -188,6 +189,7 @@ set(headers modes/larsmmode.h modes/remotecontrolmode.h modes/tempomatmode.h + modes/motortestmode.h ) set(sources @@ -325,6 +327,7 @@ set(sources displays/menus/mosfetsmenu.cpp displays/menus/motorfeedbackdebugmenu.cpp displays/menus/motorstatedebugmenu.cpp + displays/menus/motortestmodesettingsmenu.cpp displays/menus/otamenu.cpp displays/menus/selectotabuildmenu.cpp displays/menus/statisticsmenu.cpp @@ -380,6 +383,7 @@ set(sources modes/larsmmode.cpp modes/remotecontrolmode.cpp modes/tempomatmode.cpp + modes/motortestmode.cpp ) set(dependencies diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index f790b17..9a08b17 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -159,6 +159,9 @@ struct LarsmModeModelModeAccessor : public RefAccessorSaveSettings { LarsmModeMode &getRef() const override { return settings.larsmMode.mode; } }; struct LarsmModeIterationsAccessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.larsmMode.iterations; } }; +struct MotortestModeMultiplikatorAccessor : public RefAccessorSaveSettings { uint8_t &getRef() const override { return settings.motortestMode.multiplikator; } }; +struct MotortestMaxPwmAccessor : public RefAccessorSaveSettings { uint16_t &getRef() const override { return settings.motortestMode.maxPwm; } }; + #ifdef FEATURE_LEDSTRIP struct EnableLedAnimationAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.ledstrip.enableLedAnimation; } }; struct EnableBrakeLightsAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.ledstrip.enableBrakeLights; } }; diff --git a/main/actions/modesettingsaction.h b/main/actions/modesettingsaction.h index 2b61f31..c7e51f2 100644 --- a/main/actions/modesettingsaction.h +++ b/main/actions/modesettingsaction.h @@ -6,10 +6,12 @@ #include "modes/tempomatmode.h" #include "modes/larsmmode.h" #include "modes/gametrakmode.h" +#include "modes/motortestmode.h" #include "displays/menus/defaultmodesettingsmenu.h" #include "displays/menus/tempomatmodesettingsmenu.h" #include "displays/menus/larsmmodesettingsmenu.h" #include "displays/menus/gametrakmodesettingsmenu.h" +#include "displays/menus/motortestmodesettingsmenu.h" #include "screenmanager.h" using namespace espgui; @@ -29,6 +31,8 @@ void ModeSettingsAction::triggered() switchScreen(); else if (currentMode == &modes::larsmMode) switchScreen(); + else if (currentMode == &modes::motortestMode) + switchScreen(); #ifdef FEATURE_GAMETRAK else if (currentMode == &modes::gametrakMode) switchScreen(); diff --git a/main/displays/menus/motortestmodesettingsmenu.cpp b/main/displays/menus/motortestmodesettingsmenu.cpp new file mode 100644 index 0000000..5eaaa22 --- /dev/null +++ b/main/displays/menus/motortestmodesettingsmenu.cpp @@ -0,0 +1,44 @@ +#include "motortestmodesettingsmenu.h" + +// 3rdparty lib includes +#include "changevaluedisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "icons/back.h" + +// local includes +#include "utils.h" +#include "accessors/settingsaccessors.h" +#include "displays/menus/modessettingsmenu.h" + +namespace { +using MotortestMultiplikatorChangeDisplay = espgui::makeComponent< + espgui::ChangeValueDisplay, + espgui::StaticText, + MotortestModeMultiplikatorAccessor, + espgui::BackActionInterface>, + espgui::SwitchScreenAction +>; + +using MotortestMaxPwmChangeDisplay = espgui::makeComponent< + espgui::ChangeValueDisplay, + espgui::StaticText, + MotortestMaxPwmAccessor, + espgui::BackActionInterface>, + espgui::SwitchScreenAction +>; +} // namespace + +using namespace espgui; + +MotortestModeSettingsMenu::MotortestModeSettingsMenu() +{ + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); +} + +void MotortestModeSettingsMenu::back() +{ + switchScreen(); +} diff --git a/main/displays/menus/motortestmodesettingsmenu.h b/main/displays/menus/motortestmodesettingsmenu.h new file mode 100644 index 0000000..91fa62f --- /dev/null +++ b/main/displays/menus/motortestmodesettingsmenu.h @@ -0,0 +1,17 @@ +#pragma once + +// 3rdparty lib includes + +// local includes +#include "menudisplay.h" +#include "texts.h" + +class MotortestModeSettingsMenu : + public espgui::MenuDisplay, + public espgui::StaticText +{ +public: + MotortestModeSettingsMenu(); + + void back() override; +}; diff --git a/main/displays/menus/selectmodemenu.cpp b/main/displays/menus/selectmodemenu.cpp index db96c9f..6da3ad0 100644 --- a/main/displays/menus/selectmodemenu.cpp +++ b/main/displays/menus/selectmodemenu.cpp @@ -11,6 +11,7 @@ #include "modes/larsmmode.h" #include "modes/remotecontrolmode.h" #include "modes/gametrakmode.h" +#include "modes/motortestmode.h" #include "accessors/globalaccessors.h" #include "displays/menus/mainmenu.h" @@ -25,6 +26,7 @@ using SetDefaultModeAction = SetterAction; using SetLarsmModeAction = SetterAction; using SetRemoteControlModeAction = SetterAction; +using SetMotorTestModeAction = SetterAction; #ifdef FEATURE_GAMETRAK using SetGametrakModeAction = SetterAction; #endif @@ -41,6 +43,7 @@ SelectModeMenu::SelectModeMenu() #ifdef FEATURE_GAMETRAK constructMenuItem, MultiAction>>>(); #endif + if (!simplified) { constructMenuItem, MultiAction>>>(); } constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } @@ -54,10 +57,12 @@ void SelectModeMenu::start() setSelectedIndex(1); else if (currentMode == &modes::larsmMode) setSelectedIndex(2); + else if (currentMode == &modes::motortestMode) + setSelectedIndex(3); else { //Serial.printf("Unknown mode: %s", currentMode?currentMode->displayName():""); - setSelectedIndex(3); + setSelectedIndex(4); } } diff --git a/main/modes/motortestmode.cpp b/main/modes/motortestmode.cpp new file mode 100644 index 0000000..57f3628 --- /dev/null +++ b/main/modes/motortestmode.cpp @@ -0,0 +1,40 @@ +#include "motortestmode.h" + +// local includes +#include "globals.h" +#include "utils.h" + +namespace modes { +MotortestMode motortestMode; +} // namespace modes + +void MotortestMode::start() +{ + m_pwm = 0; + m_dir = 1; +} + +void MotortestMode::update() +{ + const auto m_pwmMax = settings.motortestMode.maxPwm; + m_pwm += m_dir * settings.motortestMode.multiplikator; + if (m_pwm > m_pwmMax) { + m_pwm = m_pwmMax; + m_dir = -m_dir; + } else if (m_pwm < -m_pwmMax) { + m_pwm = -m_pwmMax; + m_dir = -m_dir; + } + + for (bobbycar::protocol::serial::MotorState &motor : motors()) + { + motor.ctrlTyp = bobbycar::protocol::ControlType::Sinusoidal; + motor.ctrlMod = bobbycar::protocol::ControlMode::Voltage; + motor.pwm = m_pwm; + motor.cruiseCtrlEna = false; + motor.nCruiseMotTgt = 0; + } + + fixCommonParams(); + sendCommands(); +} diff --git a/main/modes/motortestmode.h b/main/modes/motortestmode.h new file mode 100644 index 0000000..be5e475 --- /dev/null +++ b/main/modes/motortestmode.h @@ -0,0 +1,20 @@ +#pragma once + +// local includes +#include "bobbycar-common.h" +#include "modeinterface.h" + +class MotortestMode : public ModeInterface +{ +public: + void update() override; + void start() override; + const char *displayName() const override { return "Motortest"; } +private: + int16_t m_pwm{}; + int8_t m_dir{}; +}; + +namespace modes { +extern MotortestMode motortestMode; +} // namespace modes diff --git a/main/presets.h b/main/presets.h index 765264f..57117dd 100644 --- a/main/presets.h +++ b/main/presets.h @@ -230,6 +230,11 @@ constexpr Settings::LarsmMode defaultLarsmMode { .iterations = 100 }; +constexpr Settings::MotortestMode defaultMotortestMode { + .multiplikator = 2, + .maxPwm = 400 +}; + #ifdef FEATURE_LEDSTRIP constexpr Settings::Ledstrip defaultLedstrip { .enableLedAnimation = true, @@ -307,6 +312,7 @@ constexpr Settings defaultSettings { .defaultMode = defaultDefaultMode, .tempomatMode = defaultTempomatMode, .larsmMode = defaultLarsmMode, + .motortestMode = defaultMotortestMode, #ifdef FEATURE_LEDSTRIP .ledstrip = defaultLedstrip, #endif diff --git a/main/settings.h b/main/settings.h index 9ed70f9..5abda53 100644 --- a/main/settings.h +++ b/main/settings.h @@ -158,6 +158,11 @@ struct Settings uint8_t iterations; } larsmMode; + struct MotortestMode { + uint8_t multiplikator; + uint16_t maxPwm; + } motortestMode; + #ifdef FEATURE_LEDSTRIP struct Ledstrip { bool enableLedAnimation; diff --git a/main/texts.h b/main/texts.h index a1bb6ee..b52a2b9 100644 --- a/main/texts.h +++ b/main/texts.h @@ -277,6 +277,11 @@ constexpr char TEXT_SETMODE[] = "Set mode"; constexpr char TEXT_SETITERATIONS[] = "Set iterations"; //constexpr char TEXT_BACK[] = "Back"; +//MotortestModeSettingsMenu +constexpr char TEXT_MOTORTESTMODESETTINGS[] = "Motortest mode seetings"; +constexpr char TEXT_MOTORTESTMAXPWM[] = "Max Pwm"; +constexpr char TEXT_MOTORTESTMULTIPLIKATOR[] = "Acceleration"; + //LedstripMenu constexpr char TEXT_LEDSTRIP[] = "Ledstrip"; constexpr char TEXT_LEDANIMATION[] = "LED Animation"; @@ -407,6 +412,7 @@ constexpr char TEXT_TEMPOMAT[] = "Tempomat"; constexpr char TEXT_LARSM[] = "Larsm"; constexpr char TEXT_REMOTECONTROL[] = "Remote control"; constexpr char TEXT_GAMETRAK[] = "Gametrak"; +constexpr char TEXT_MOTORTEST[] = "Motortest"; //constexpr char TEXT_BACK[] = "Back"; //TimersMenu