diff --git a/src/actions/modesettingsaction.h b/src/actions/modesettingsaction.h new file mode 100644 index 0000000..df7d861 --- /dev/null +++ b/src/actions/modesettingsaction.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "actioninterface.h" +#include "globals.h" +#include "modes/defaultmode.h" +#include "modes/tempomatmode.h" +#include "modes/larsmmode.h" +#include "modes/gametrakmode.h" +#include "displays/menus/defaultmodesettingsmenu.h" +#include "displays/menus/tempomatmodesettingsmenu.h" +#include "displays/menus/larsmmodesettingsmenu.h" +#include "displays/menus/gametrakmodesettingsmenu.h" + +namespace { +class ModeSettingsAction : public virtual ActionInterface +{ +public: + void triggered() override; +}; + +void ModeSettingsAction::triggered() +{ + if (currentMode == &modes::defaultMode) + switchScreen(); + else if (currentMode == &modes::tempomatMode) + switchScreen(); + else if (currentMode == &modes::larsmMode) + switchScreen(); + else if (currentMode == &modes::gametrakMode) + switchScreen(); + else + Serial.println("Unknown mode, cannot open settings for it"); +} +} diff --git a/src/debugtexthelpers.h b/src/debugtexthelpers.h index cdf0d2b..0a9d96c 100644 --- a/src/debugtexthelpers.h +++ b/src/debugtexthelpers.h @@ -16,37 +16,30 @@ struct ControllerTexts struct PoweroffText : public virtual TextInterface { public: String text() const override { return String{"poweroff: "} + toString(controller::get().command.poweroff); } }; struct LedText : public virtual TextInterface { public: String text() const override { return String{"led: "} + toString(controller::get().command.led); } }; - struct LeftCommand - { - LeftCommand() = delete; - ~LeftCommand() = delete; +private: + struct LeftCommandGetter { static const MotorState &get() { return controller::get().command.left; } }; + struct RightCommandGetter { static const MotorState &get() { return controller::get().command.right; } }; - struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller::get().command.left.enable); } }; - struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller::get().command.left.pwm); } }; - struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller::get().command.left.ctrlTyp); } }; - struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller::get().command.left.ctrlMod); } }; - struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller::get().command.left.iMotMax); } }; - struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller::get().command.left.iDcMax); } }; - struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller::get().command.left.nMotMax); } }; - struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller::get().command.left.fieldWeakMax); } }; - struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller::get().command.left.phaseAdvMax); } }; + template + struct CommandTexts + { + CommandTexts() = delete; + ~CommandTexts() = delete; + + struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(MotorStateGetter::get().enable); } }; + struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(MotorStateGetter::get().pwm); } }; + struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(MotorStateGetter::get().ctrlTyp); } }; + struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(MotorStateGetter::get().ctrlMod); } }; + struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(MotorStateGetter::get().iMotMax); } }; + struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(MotorStateGetter::get().iDcMax); } }; + struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(MotorStateGetter::get().nMotMax); } }; + struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(MotorStateGetter::get().fieldWeakMax); } }; + struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(MotorStateGetter::get().phaseAdvMax); } }; }; - struct RightCommand - { - RightCommand() = delete; - ~RightCommand() = delete; - - struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller::get().command.right.enable); } }; - struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller::get().command.right.pwm); } }; - struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller::get().command.right.ctrlTyp); } }; - struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller::get().command.right.ctrlMod); } }; - struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller::get().command.right.iMotMax); } }; - struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller::get().command.right.iDcMax); } }; - struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller::get().command.right.nMotMax); } }; - struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller::get().command.right.fieldWeakMax); } }; - struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller::get().command.right.phaseAdvMax); } }; - }; +public: + using LeftCommand = CommandTexts; + using RightCommand = CommandTexts; struct BatVoltageText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.batVoltage); return line; } }; struct BatVoltageFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller::get().feedbackValid) line += toString(fixBatVoltage(controller::get().feedback.batVoltage)) + 'V'; return line; } }; @@ -54,35 +47,29 @@ struct ControllerTexts struct BoardTempFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller::get().feedbackValid) line += toString(fixBoardTemp(controller::get().feedback.boardTemp)) + 'C'; return line; } }; struct TimeoutCntSerialText : public virtual TextInterface { public: String text() const override { auto line = String{"timeoutCntSerial: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.timeoutCntSerial); return line; } }; - struct LeftFeedback - { - LeftFeedback() = delete; - ~LeftFeedback() = delete; +private: + struct LeftFeedbackGetter { static const MotorFeedback &get() { return controller::get().feedback.left; } }; + struct RightFeedbackGetter { static const MotorFeedback &get() { return controller::get().feedback.right; } }; - struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.left.angle); return line; } }; - struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.left.speed); return line; } }; - struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller::get().feedbackValid) line += toString(convertToKmh(controller::get().feedback.left.speed)); return line; } }; - struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.left.error); return line; } }; - struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.left.current); return line; } }; - struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(fixCurrent(controller::get().feedback.left.current)) + 'A'; return line; } }; - struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.left.chops); return line; } }; - struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller::get().feedbackValid) line += hallString(controller::get().feedback.left); return line; } }; + template + struct FeedbackTexts + { + FeedbackTexts() = delete; + ~FeedbackTexts() = delete; + + struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller::get().feedbackValid) line += toString(MotorFeedbackGetter::get().angle); return line; } }; + struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller::get().feedbackValid) line += toString(MotorFeedbackGetter::get().speed); return line; } }; + struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller::get().feedbackValid) line += toString(convertToKmh(MotorFeedbackGetter::get().speed)); return line; } }; + struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller::get().feedbackValid) line += toString(MotorFeedbackGetter::get().error); return line; } }; + struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(MotorFeedbackGetter::get().current); return line; } }; + struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(fixCurrent(MotorFeedbackGetter::get().current)) + 'A'; return line; } }; + struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller::get().feedbackValid) line += toString(MotorFeedbackGetter::get().chops); return line; } }; + struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller::get().feedbackValid) line += hallString(MotorFeedbackGetter::get()); return line; } }; }; - struct RightFeedback - { - RightFeedback() = delete; - ~RightFeedback() = delete; - - struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.right.angle); return line; } }; - struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.right.speed); return line; } }; - struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller::get().feedbackValid) line += toString(convertToKmh(controller::get().feedback.right.speed)); return line; } }; - struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.right.error); return line; } }; - struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.right.current); return line; } }; - struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller::get().feedbackValid) line += toString(fixCurrent(controller::get().feedback.right.current)) + 'A'; return line; } }; - struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.right.chops); return line; } }; - struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller::get().feedbackValid) line += hallString(controller::get().feedback.right); return line; } }; - }; +public: + using LeftFeedback = FeedbackTexts; + using RightFeedback = FeedbackTexts; }; using FrontTexts = ControllerTexts; diff --git a/src/displays/menus/mainmenu.h b/src/displays/menus/mainmenu.h index 753184f..e1374ef 100644 --- a/src/displays/menus/mainmenu.h +++ b/src/displays/menus/mainmenu.h @@ -4,6 +4,7 @@ #include "staticmenudefinition.h" #include "menuitem.h" #include "actions/switchscreenaction.h" +#include "actions/modesettingsaction.h" #include "actions/rebootaction.h" #include "texts.h" #include "icons/back.h" @@ -37,22 +38,23 @@ class MainMenu : public StaticText, public BackActionInterface>, public StaticMenuDefinition< - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::modes>>, + makeComponent, ModeSettingsAction>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::presets>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::graph>>, #ifdef FEATURE_BMS - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::bms>>, #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::settings>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, #ifdef FEATURE_MOSFETS - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::lock>>, // TODO icon + makeComponent, SwitchScreenAction>, #endif - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>, - makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>, - makeComponent, RebootAction, StaticMenuItemIcon<&icons::reboot>>, - makeComponent, SwitchScreenAction> + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::demos>>, + makeComponent, SwitchScreenAction, StaticMenuItemIcon<&icons::poweroff>>, + makeComponent, RebootAction, StaticMenuItemIcon<&icons::reboot>>, + makeComponent, SwitchScreenAction> > {}; }; diff --git a/src/feedbackparser.h b/src/feedbackparser.h index b9a979a..037958e 100644 --- a/src/feedbackparser.h +++ b/src/feedbackparser.h @@ -24,7 +24,7 @@ public: while (m_serial.get().available()) { m_incomingByte = m_serial.get().read(); // Read the incoming byte - m_bufStartFrame = ((uint16_t)(m_incomingBytePrev) << 8) + m_incomingByte; // Construct the start frame + m_bufStartFrame = ((uint16_t)(m_incomingBytePrev) << 8) + m_incomingByte; // Construct the start frame //Serial.printf("received: %x\r\n", m_incomingByte); diff --git a/src/globals.h b/src/globals.h index 50fd733..3cba3d0 100644 --- a/src/globals.h +++ b/src/globals.h @@ -37,19 +37,14 @@ public: std::array{{ Controller{Serial1, settings.controllerHardware.enableFrontLeft, settings.controllerHardware.enableFrontRight, settings.controllerHardware.invertFrontLeft, settings.controllerHardware.invertFrontRight}, Controller{Serial2, settings.controllerHardware.enableBackLeft, settings.controllerHardware.enableBackRight, settings.controllerHardware.invertBackLeft, settings.controllerHardware.invertBackRight} - }}, - front{getFront()}, - back(getBack()) + }} {} + Controllers(const Controllers &) = delete; Controllers &operator=(const Controllers &) = delete; - Controller &front; - Controller &back; - -private: - Controller &getFront() { return operator[](0); } - Controller &getBack() { return operator[](1); } + Controller &front{operator[](0)}; + Controller &back{operator[](1)}; }; Controllers controllers; diff --git a/src/modes/defaultmode.h b/src/modes/defaultmode.h index 99ab987..a6cca51 100644 --- a/src/modes/defaultmode.h +++ b/src/modes/defaultmode.h @@ -38,7 +38,6 @@ void DefaultMode::update() else gas = 0; } - const auto gas_squared = (gas * gas) / 1000; if (waitForBremsLoslass) { @@ -47,6 +46,8 @@ void DefaultMode::update() else brems = 0; } + + const auto gas_squared = (gas * gas) / 1000; const auto brems_squared = (brems * brems) / 1000; const auto now = millis(); diff --git a/src/texts.h b/src/texts.h index f62ea92..8f5a3f4 100644 --- a/src/texts.h +++ b/src/texts.h @@ -54,6 +54,7 @@ constexpr char TEXT_BACKRIGHTFEEDBACK[] = "Back right feedback"; constexpr char TEXT_MAINMENU[] = "Main menu"; constexpr char TEXT_STATUS[] = "Status"; constexpr char TEXT_SELECTMODE[] = "Select mode"; +constexpr char TEXT_MODESETTINGS[] = "Mode settings"; constexpr char TEXT_PRESETS[] = "Presets"; constexpr char TEXT_GRAPHS[] = "Graphs"; //constexpr char TEXT_BMS[] = "BMS";