diff --git a/src/controller.h b/src/controller.h index bd6ad63..770b080 100644 --- a/src/controller.h +++ b/src/controller.h @@ -14,6 +14,8 @@ struct Controller { serial{serial}, enableLeft{enableLeft}, enableRight{enableRight}, invertLeft{invertLeft}, invertRight{invertRight} { } +// Controller(const Controller &) = delete; +// Controller &operator=(const Controller &) = delete; std::reference_wrapper serial; bool &enableLeft, &enableRight, &invertLeft, &invertRight; diff --git a/src/debugcolorhelpers.h b/src/debugcolorhelpers.h index bb0ced0..0d20cde 100644 --- a/src/debugcolorhelpers.h +++ b/src/debugcolorhelpers.h @@ -4,12 +4,12 @@ #include "globals.h" namespace { -template -class FeedbackColor : public virtual ColorInterface { public: int color() const { return Tcontroller.feedbackValid ? TsuccessColor : TFT_RED; } }; +template +class FeedbackColor : public virtual ColorInterface { public: int color() const { return Tcontroller::get().feedbackValid ? TsuccessColor : TFT_RED; } }; template -using FrontFeedbackColor = FeedbackColor; +using FrontFeedbackColor = FeedbackColor; template -using BackFeedbackColor = FeedbackColor; +using BackFeedbackColor = FeedbackColor; } diff --git a/src/debugtexthelpers.h b/src/debugtexthelpers.h index 28cf877..cdf0d2b 100644 --- a/src/debugtexthelpers.h +++ b/src/debugtexthelpers.h @@ -5,31 +5,31 @@ #include "utils.h" namespace { -template +template struct ControllerTexts { ControllerTexts() = delete; ~ControllerTexts() = delete; - struct BuzzerFreqText : public virtual TextInterface { public: String text() const override { return String{"buzzerFreq: "} + toString(controller.command.buzzer.freq); } }; - struct BuzzerPatternText : public virtual TextInterface { public: String text() const override { return String{"buzzerPattern: "} + toString(controller.command.buzzer.pattern); } }; - struct PoweroffText : public virtual TextInterface { public: String text() const override { return String{"poweroff: "} + toString(controller.command.poweroff); } }; - struct LedText : public virtual TextInterface { public: String text() const override { return String{"led: "} + toString(controller.command.led); } }; + struct BuzzerFreqText : public virtual TextInterface { public: String text() const override { return String{"buzzerFreq: "} + toString(controller::get().command.buzzer.freq); } }; + struct BuzzerPatternText : public virtual TextInterface { public: String text() const override { return String{"buzzerPattern: "} + toString(controller::get().command.buzzer.pattern); } }; + 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; - struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller.command.left.enable); } }; - struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller.command.left.pwm); } }; - struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller.command.left.ctrlTyp); } }; - struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller.command.left.ctrlMod); } }; - struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller.command.left.iMotMax); } }; - struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller.command.left.iDcMax); } }; - struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller.command.left.nMotMax); } }; - struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller.command.left.fieldWeakMax); } }; - struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller.command.left.phaseAdvMax); } }; + 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); } }; }; struct RightCommand @@ -37,36 +37,36 @@ struct ControllerTexts RightCommand() = delete; ~RightCommand() = delete; - struct EnableText : public virtual TextInterface { public: String text() const override { return String{"enable: "} + toString(controller.command.right.enable); } }; - struct PwmText : public virtual TextInterface { public: String text() const override { return String{"pwm: "} + toString(controller.command.right.pwm); } }; - struct CtrlTypText : public virtual TextInterface { public: String text() const override { return String{"ctrlTyp: "} + toString(controller.command.right.ctrlTyp); } }; - struct CtrlModText : public virtual TextInterface { public: String text() const override { return String{"ctrlMod: "} + toString(controller.command.right.ctrlMod); } }; - struct IMotMaxText : public virtual TextInterface { public: String text() const override { return String{"iMotMax: "} + toString(controller.command.right.iMotMax); } }; - struct IDcMaxText : public virtual TextInterface { public: String text() const override { return String{"iDcMax: "} + toString(controller.command.right.iDcMax); } }; - struct NMotMaxText : public virtual TextInterface { public: String text() const override { return String{"nMotMax: "} + toString(controller.command.right.nMotMax); } }; - struct FieldWeakMaxText : public virtual TextInterface { public: String text() const override { return String{"fieldWeakMax: "} + toString(controller.command.right.fieldWeakMax); } }; - struct PhaseAdvMaxText : public virtual TextInterface { public: String text() const override { return String{"phaseAdvMax: "} + toString(controller.command.right.phaseAdvMax); } }; + 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); } }; }; - struct BatVoltageText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller.feedbackValid) line += toString(controller.feedback.batVoltage); return line; } }; - struct BatVoltageFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"batVoltage: "}; if (controller.feedbackValid) line += toString(fixBatVoltage(controller.feedback.batVoltage)) + 'V'; return line; } }; - struct BoardTempText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller.feedbackValid) line += toString(controller.feedback.boardTemp); return line; } }; - struct BoardTempFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller.feedbackValid) line += toString(fixBoardTemp(controller.feedback.boardTemp)) + 'C'; return line; } }; - struct TimeoutCntSerialText : public virtual TextInterface { public: String text() const override { auto line = String{"timeoutCntSerial: "}; if (controller.feedbackValid) line += toString(controller.feedback.timeoutCntSerial); return line; } }; + 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; } }; + struct BoardTempText : public virtual TextInterface { public: String text() const override { auto line = String{"boardTemp: "}; if (controller::get().feedbackValid) line += toString(controller::get().feedback.boardTemp); return line; } }; + 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; - struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.angle); return line; } }; - struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.speed); return line; } }; - struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller.feedbackValid) line += toString(convertToKmh(controller.feedback.left.speed)); return line; } }; - struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.error); return line; } }; - struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.current); return line; } }; - struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(fixCurrent(controller.feedback.left.current)) + 'A'; return line; } }; - struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller.feedbackValid) line += toString(controller.feedback.left.chops); return line; } }; - struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller.feedbackValid) line += hallString(controller.feedback.left); return line; } }; + 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; } }; }; struct RightFeedback @@ -74,17 +74,17 @@ struct ControllerTexts RightFeedback() = delete; ~RightFeedback() = delete; - struct AngleText : public virtual TextInterface { public: String text() const override { auto line = String{"angle: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.angle); return line; } }; - struct SpeedText : public virtual TextInterface { public: String text() const override { auto line = String{"speed: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.speed); return line; } }; - struct SpeedKmhText : public virtual TextInterface { public: String text() const override { auto line = String{"speed kmh: "}; if (controller.feedbackValid) line += toString(convertToKmh(controller.feedback.right.speed)); return line; } }; - struct ErrorText : public virtual TextInterface { public: String text() const override { auto line = String{"error: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.error); return line; } }; - struct CurrentText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.current); return line; } }; - struct CurrentFixedText : public virtual TextInterface { public: String text() const override { auto line = String{"current: "}; if (controller.feedbackValid) line += toString(fixCurrent(controller.feedback.right.current)) + 'A'; return line; } }; - struct ChopsText : public virtual TextInterface { public: String text() const override { auto line = String{"chops: "}; if (controller.feedbackValid) line += toString(controller.feedback.right.chops); return line; } }; - struct HallText : public virtual TextInterface { public: String text() const override { auto line = String{"hall: "}; if (controller.feedbackValid) line += hallString(controller.feedback.right); return line; } }; + 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; } }; }; }; -using FrontTexts = ControllerTexts; -using BackTexts = ControllerTexts; +using FrontTexts = ControllerTexts; +using BackTexts = ControllerTexts; } diff --git a/src/displays/menus/buzzermenu.h b/src/displays/menus/buzzermenu.h index dfcab2e..898d24d 100644 --- a/src/displays/menus/buzzermenu.h +++ b/src/displays/menus/buzzermenu.h @@ -19,7 +19,7 @@ class SettingsMenu; } namespace { -struct FrontFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return front.command.buzzer.freq; } }; +struct FrontFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return controllers.front.command.buzzer.freq; } }; using FrontFreqChangeScreen = makeComponent< ChangeValueDisplay, StaticText, @@ -28,7 +28,7 @@ using FrontFreqChangeScreen = makeComponent< SwitchScreenAction >; -struct FrontPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return front.command.buzzer.pattern; } }; +struct FrontPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return controllers.front.command.buzzer.pattern; } }; using FrontPatternChangeScreen = makeComponent< ChangeValueDisplay, StaticText, @@ -37,7 +37,7 @@ using FrontPatternChangeScreen = makeComponent< SwitchScreenAction >; -struct BackFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return back.command.buzzer.freq; } }; +struct BackFreqAccessor : public RefAccessor { uint8_t &getRef() const override { return controllers.back.command.buzzer.freq; } }; using BackFreqChangeScreen = makeComponent< ChangeValueDisplay, StaticText, @@ -46,7 +46,7 @@ using BackFreqChangeScreen = makeComponent< SwitchScreenAction >; -struct BackPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return back.command.buzzer.pattern; } }; +struct BackPatternAccessor : public RefAccessor { uint8_t &getRef() const override { return controllers.back.command.buzzer.pattern; } }; using BackPatternChangeScreen = makeComponent< ChangeValueDisplay, StaticText, diff --git a/src/displays/menus/settingsmenu.h b/src/displays/menus/settingsmenu.h index 5717501..6aeb986 100644 --- a/src/displays/menus/settingsmenu.h +++ b/src/displays/menus/settingsmenu.h @@ -30,8 +30,8 @@ class MainMenu; } namespace { -struct FrontLedAccessor : public RefAccessor { bool &getRef() const override { return front.command.led; } }; -struct BackLedAccessor : public RefAccessor { bool &getRef() const override { return back.command.led; } }; +struct FrontLedAccessor : public RefAccessor { bool &getRef() const override { return controllers.front.command.led; } }; +struct BackLedAccessor : public RefAccessor { bool &getRef() const override { return controllers.back.command.led; } }; class SettingsMenu : public MenuDisplay, diff --git a/src/displays/poweroffdisplay.h b/src/displays/poweroffdisplay.h index c7c8fe7..a6f2b2e 100644 --- a/src/displays/poweroffdisplay.h +++ b/src/displays/poweroffdisplay.h @@ -29,7 +29,7 @@ void PoweroffDisplay::start() { m_startTime = millis(); - for (Controller &controller : controllers()) + for (Controller &controller : controllers) controller.command.poweroff = true; } @@ -56,7 +56,7 @@ void PoweroffDisplay::update() void PoweroffDisplay::stop() { - for (Controller &controller : controllers()) + for (Controller &controller : controllers) controller.command.poweroff = false; } } diff --git a/src/displays/statusdisplay.h b/src/displays/statusdisplay.h index 3ec84eb..799b2f4 100644 --- a/src/displays/statusdisplay.h +++ b/src/displays/statusdisplay.h @@ -152,14 +152,14 @@ void StatusDisplay::redraw() m_labelBrems.redraw(String{brems}); m_progressBarBrems.redraw(brems); - m_frontStatus.redraw(::front); - m_backStatus.redraw(::back); + m_frontStatus.redraw(controllers.front); + m_backStatus.redraw(controllers.back); tft.setTextFont(2); m_labelWifiStatus.redraw(toString(WiFi.status())); - m_labelLimit0.redraw(String{front.command.left.iMotMax} + "A"); + m_labelLimit0.redraw(String{controllers.front.command.left.iMotMax} + "A"); m_labelIpAddress.redraw(WiFi.localIP().toString()); - m_labelLimit1.redraw(String{front.command.left.iDcMax} + "A"); + m_labelLimit1.redraw(String{controllers.front.command.left.iDcMax} + "A"); m_labelPerformance.redraw(String{performance.last}); m_labelMode.redraw(currentMode->displayName()); m_labelName.redraw(&deviceName[0]); diff --git a/src/globals.h b/src/globals.h index 9b8bc6f..9eca80a 100644 --- a/src/globals.h +++ b/src/globals.h @@ -28,8 +28,31 @@ char deviceName[32]; Settings settings; SettingsSaver settingsSaver; -Controller front{Serial1, settings.controllerHardware.enableFrontLeft, settings.controllerHardware.enableFrontRight, settings.controllerHardware.invertFrontLeft, settings.controllerHardware.invertFrontRight}; -Controller back{Serial2, settings.controllerHardware.enableBackLeft, settings.controllerHardware.enableBackRight, settings.controllerHardware.invertBackLeft, settings.controllerHardware.invertBackRight}; +class Controllers : public std::array +{ +public: + explicit Controllers() : + 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); } +}; + +Controllers controllers; +struct FrontControllerGetter { static Controller &get() { return controllers.front; }}; +struct BackControllerGetter { static Controller &get() { return controllers.back; }}; struct { millis_t lastTime = millis(); diff --git a/src/main.cpp b/src/main.cpp index 3b56f55..0645d38 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -109,15 +109,15 @@ void setup() } else if (settings.bluetoothSettings.autoBluetoothMode == BluetoothMode::Slave) BluetoothBeginAction{}.triggered(); - front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1); - back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2); + controllers.front.serial.get().begin(38400, SERIAL_8N1, PINS_RX1, PINS_TX1); + controllers.back.serial.get().begin(38400, SERIAL_8N1, PINS_RX2, PINS_TX2); raw_gas = 0; raw_brems = 0; gas = 0; brems = 0; - for (Controller &controller : controllers()) + for (Controller &controller : controllers) controller.command.buzzer = {}; currentMode = &modes::defaultMode; @@ -196,7 +196,7 @@ void loop() performance.lastTime = now; } - for (Controller &controller : controllers()) + for (Controller &controller : controllers) controller.parser.update(); handleSerial(); diff --git a/src/modes/defaultmode.h b/src/modes/defaultmode.h index f1c1e53..99ab987 100644 --- a/src/modes/defaultmode.h +++ b/src/modes/defaultmode.h @@ -76,14 +76,19 @@ void DefaultMode::update() lastPwm = pwm; lastTime = now; - for (Controller &controller : controllers()) - for (MotorState &motor : motorsInController(controller)) - { - const auto pair = split(settings.defaultMode.modelMode); - motor.ctrlTyp = pair.first; - motor.ctrlMod = pair.second; - motor.pwm = pwm / 100. * (&controller == &front ? settings.defaultMode.frontPercentage : settings.defaultMode.backPercentage); - } + const auto pair = split(settings.defaultMode.modelMode); + for (MotorState &motor : motorsInController(controllers.front)) + { + motor.ctrlTyp = pair.first; + motor.ctrlMod = pair.second; + motor.pwm = pwm / 100. * settings.defaultMode.frontPercentage; + } + for (MotorState &motor : motorsInController(controllers.back)) + { + motor.ctrlTyp = pair.first; + motor.ctrlMod = pair.second; + motor.pwm = pwm / 100. * settings.defaultMode.backPercentage; + } fixCommonParams(); diff --git a/src/serialhandler.h b/src/serialhandler.h index 8ed6e52..aab936d 100644 --- a/src/serialhandler.h +++ b/src/serialhandler.h @@ -42,16 +42,16 @@ void handleSerial() case 'p': case 'P': { - const auto firstPower = front.command.poweroff; - for (Controller &controller : controllers()) + const auto firstPower = controllers.front.command.poweroff; + for (Controller &controller : controllers) controller.command.poweroff = !firstPower; break; } case 'l': case 'L': { - const auto firstLed = front.command.led; - for (Controller &controller : controllers()) + const auto firstLed = controllers.front.command.led; + for (Controller &controller : controllers) controller.command.led = !firstLed; break; } @@ -73,7 +73,7 @@ void handleSerial() case '7': case '8': case '9': - for (Controller &controller : controllers()) + for (Controller &controller : controllers) controller.command.buzzer.freq = c-'0'; break; case 'A': diff --git a/src/statistics.h b/src/statistics.h index c562a93..ea4bbba 100644 --- a/src/statistics.h +++ b/src/statistics.h @@ -24,17 +24,17 @@ void pushStats() statistics::avgSpeedKmh.push_back(avgSpeedKmh); statistics::sumCurrent.push_back(sumCurrent); statistics::sumAbsoluteCurrent.push_back(sumAbsoluteCurrent); - if (front.feedbackValid) + if (controllers.front.feedbackValid) { - statistics::frontVoltage.push_back(fixBatVoltage(front.feedback.batVoltage)); - statistics::frontLeftCurrent.push_back(fixCurrent(front.feedback.left.current)); - statistics::frontRightCurrent.push_back(fixCurrent(front.feedback.right.current)); + statistics::frontVoltage.push_back(fixBatVoltage(controllers.front.feedback.batVoltage)); + statistics::frontLeftCurrent.push_back(fixCurrent(controllers.front.feedback.left.current)); + statistics::frontRightCurrent.push_back(fixCurrent(controllers.front.feedback.right.current)); } - if (back.feedbackValid) + if (controllers.back.feedbackValid) { - statistics::backVoltage.push_back(fixBatVoltage(back.feedback.batVoltage)); - statistics::backLeftCurrent.push_back(fixCurrent(back.feedback.left.current)); - statistics::backRightCurrent.push_back(fixCurrent(back.feedback.right.current)); + statistics::backVoltage.push_back(fixBatVoltage(controllers.back.feedback.batVoltage)); + statistics::backLeftCurrent.push_back(fixCurrent(controllers.back.feedback.left.current)); + statistics::backRightCurrent.push_back(fixCurrent(controllers.back.feedback.right.current)); } #ifdef FEATURE_BMS statistics::bmsVoltage.push_back(bms::voltage); diff --git a/src/utils.h b/src/utils.h index ab5cfd5..38f621f 100644 --- a/src/utils.h +++ b/src/utils.h @@ -142,11 +142,6 @@ String toString(ota_error_t value) return String("Unknown: ") + int(value); } -std::array, 2> controllers() -{ - return {front, back}; -} - std::array, 2> motorsInController(Controller &controller) { return {std::ref(controller.command.left), std::ref(controller.command.right)}; @@ -170,22 +165,21 @@ std::array, 2> motorFeedbacksInContr std::array, 4> motors() { return { - std::ref(front.command.left), std::ref(front.command.right), - std::ref(back.command.left), std::ref(back.command.right) + std::ref(controllers.front.command.left), std::ref(controllers.front.command.right), + std::ref(controllers.back.command.left), std::ref(controllers.back.command.right) }; } void fixCommonParams() { - for (Controller &controller : controllers()) - for (MotorState &motor : motorsInController(controller)) - { - motor.iMotMax = settings.limits.iMotMax; - motor.iDcMax = settings.limits.iDcMax; - motor.nMotMax = settings.limits.nMotMax; - motor.fieldWeakMax = settings.limits.fieldWeakMax; - motor.phaseAdvMax = settings.limits.phaseAdvMax; - } + for (MotorState &motor : motors()) + { + motor.iMotMax = settings.limits.iMotMax; + motor.iDcMax = settings.limits.iDcMax; + motor.nMotMax = settings.limits.nMotMax; + motor.fieldWeakMax = settings.limits.fieldWeakMax; + motor.phaseAdvMax = settings.limits.phaseAdvMax; + } if (settings.reverseBeep) { @@ -198,12 +192,12 @@ void fixCommonParams() { reverseBeepToggle = true; lastReverseBeepToggle = millis(); - for (const auto &ref : controllers()) - ref.get().command.buzzer = {.freq=settings.reverseBeepFreq0, .pattern=0}; + for (auto &controller : controllers) + controller.command.buzzer = {.freq=settings.reverseBeepFreq0, .pattern=0}; } else - for (const auto &ref : controllers()) - ref.get().command.buzzer = {}; + for (auto &controller : controllers) + controller.command.buzzer = {}; currentlyReverseBeeping = shouldBeep; } @@ -211,37 +205,37 @@ void fixCommonParams() { reverseBeepToggle = !reverseBeepToggle; - for (const auto &ref : controllers()) - ref.get().command.buzzer = {.freq=uint8_t(reverseBeepToggle?settings.reverseBeepFreq0:settings.reverseBeepFreq1), .pattern=0}; + for (auto &controller : controllers) + controller.command.buzzer = {.freq=uint8_t(reverseBeepToggle?settings.reverseBeepFreq0:settings.reverseBeepFreq1), .pattern=0}; lastReverseBeepToggle = millis(); } } else if (currentlyReverseBeeping) { - for (const auto &ref : controllers()) - ref.get().command.buzzer = {}; + for (auto &controller : controllers) + controller.command.buzzer = {}; currentlyReverseBeeping = false; } - front.command.left.enable = settings.controllerHardware.enableFrontLeft; - front.command.right.enable = settings.controllerHardware.enableFrontRight; - back.command.left.enable = settings.controllerHardware.enableBackLeft; - back.command.right.enable = settings.controllerHardware.enableBackRight; + controllers.front.command.left.enable = settings.controllerHardware.enableFrontLeft; + controllers.front.command.right.enable = settings.controllerHardware.enableFrontRight; + controllers.back.command.left.enable = settings.controllerHardware.enableBackLeft; + controllers.back.command.right.enable = settings.controllerHardware.enableBackRight; if (settings.controllerHardware.invertFrontLeft) - front.command.left.pwm = -front.command.left.pwm; + controllers.front.command.left.pwm = -controllers.front.command.left.pwm; if (settings.controllerHardware.invertFrontRight) - front.command.right.pwm = -front.command.right.pwm; + controllers.front.command.right.pwm = -controllers.front.command.right.pwm; if (settings.controllerHardware.invertBackLeft) - back.command.left.pwm = -back.command.left.pwm; + controllers.back.command.left.pwm = -controllers.back.command.left.pwm; if (settings.controllerHardware.invertBackRight) - back.command.right.pwm = -back.command.right.pwm; + controllers.back.command.right.pwm = -controllers.back.command.right.pwm; } void sendCommands() { - for (Controller &controller : controllers()) + for (Controller &controller : controllers) { controller.command.start = Command::VALID_HEADER; controller.command.checksum = calculateChecksum(controller.command); @@ -254,8 +248,8 @@ void switchScreen(Args&&... args); void updateSwapFrontBack() { - front.serial = settings.controllerHardware.swapFrontBack ? Serial2 : Serial1; - back.serial = settings.controllerHardware.swapFrontBack ? Serial1 : Serial2; + controllers.front.serial = settings.controllerHardware.swapFrontBack ? Serial2 : Serial1; + controllers.back.serial = settings.controllerHardware.swapFrontBack ? Serial1 : Serial2; } void loadSettings() @@ -275,7 +269,7 @@ void updateAccumulators() sumAbsoluteCurrent = 0.f; uint8_t count{0}; - for (const Controller &controller : controllers()) + for (const Controller &controller : controllers) { if (!controller.feedbackValid) continue;