Cleanup of controllers
This commit is contained in:
@ -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<HardwareSerial> serial;
|
||||
bool &enableLeft, &enableRight, &invertLeft, &invertRight;
|
||||
|
@ -4,12 +4,12 @@
|
||||
#include "globals.h"
|
||||
|
||||
namespace {
|
||||
template<Controller &Tcontroller, int TsuccessColor>
|
||||
class FeedbackColor : public virtual ColorInterface { public: int color() const { return Tcontroller.feedbackValid ? TsuccessColor : TFT_RED; } };
|
||||
template<typename Tcontroller, int TsuccessColor>
|
||||
class FeedbackColor : public virtual ColorInterface { public: int color() const { return Tcontroller::get().feedbackValid ? TsuccessColor : TFT_RED; } };
|
||||
|
||||
template<int TsuccessColor>
|
||||
using FrontFeedbackColor = FeedbackColor<front, TsuccessColor>;
|
||||
using FrontFeedbackColor = FeedbackColor<FrontControllerGetter, TsuccessColor>;
|
||||
|
||||
template<int TsuccessColor>
|
||||
using BackFeedbackColor = FeedbackColor<back, TsuccessColor>;
|
||||
using BackFeedbackColor = FeedbackColor<BackControllerGetter, TsuccessColor>;
|
||||
}
|
||||
|
@ -5,31 +5,31 @@
|
||||
#include "utils.h"
|
||||
|
||||
namespace {
|
||||
template<Controller &controller>
|
||||
template<typename controller>
|
||||
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<front>;
|
||||
using BackTexts = ControllerTexts<back>;
|
||||
using FrontTexts = ControllerTexts<FrontControllerGetter>;
|
||||
using BackTexts = ControllerTexts<BackControllerGetter>;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ class SettingsMenu;
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct FrontFreqAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return front.command.buzzer.freq; } };
|
||||
struct FrontFreqAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return controllers.front.command.buzzer.freq; } };
|
||||
using FrontFreqChangeScreen = makeComponent<
|
||||
ChangeValueDisplay<uint8_t>,
|
||||
StaticText<TEXT_FRONTFREQ>,
|
||||
@ -28,7 +28,7 @@ using FrontFreqChangeScreen = makeComponent<
|
||||
SwitchScreenAction<BuzzerMenu>
|
||||
>;
|
||||
|
||||
struct FrontPatternAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return front.command.buzzer.pattern; } };
|
||||
struct FrontPatternAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return controllers.front.command.buzzer.pattern; } };
|
||||
using FrontPatternChangeScreen = makeComponent<
|
||||
ChangeValueDisplay<uint8_t>,
|
||||
StaticText<TEXT_FRONTPATTERN>,
|
||||
@ -37,7 +37,7 @@ using FrontPatternChangeScreen = makeComponent<
|
||||
SwitchScreenAction<BuzzerMenu>
|
||||
>;
|
||||
|
||||
struct BackFreqAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return back.command.buzzer.freq; } };
|
||||
struct BackFreqAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return controllers.back.command.buzzer.freq; } };
|
||||
using BackFreqChangeScreen = makeComponent<
|
||||
ChangeValueDisplay<uint8_t>,
|
||||
StaticText<TEXT_BACKFREQ>,
|
||||
@ -46,7 +46,7 @@ using BackFreqChangeScreen = makeComponent<
|
||||
SwitchScreenAction<BuzzerMenu>
|
||||
>;
|
||||
|
||||
struct BackPatternAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return back.command.buzzer.pattern; } };
|
||||
struct BackPatternAccessor : public RefAccessor<uint8_t> { uint8_t &getRef() const override { return controllers.back.command.buzzer.pattern; } };
|
||||
using BackPatternChangeScreen = makeComponent<
|
||||
ChangeValueDisplay<uint8_t>,
|
||||
StaticText<TEXT_BACKPATTERN>,
|
||||
|
@ -30,8 +30,8 @@ class MainMenu;
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct FrontLedAccessor : public RefAccessor<bool> { bool &getRef() const override { return front.command.led; } };
|
||||
struct BackLedAccessor : public RefAccessor<bool> { bool &getRef() const override { return back.command.led; } };
|
||||
struct FrontLedAccessor : public RefAccessor<bool> { bool &getRef() const override { return controllers.front.command.led; } };
|
||||
struct BackLedAccessor : public RefAccessor<bool> { bool &getRef() const override { return controllers.back.command.led; } };
|
||||
|
||||
class SettingsMenu :
|
||||
public MenuDisplay,
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
|
@ -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<Controller, 2>
|
||||
{
|
||||
public:
|
||||
explicit Controllers() :
|
||||
std::array<Controller, 2>{{
|
||||
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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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':
|
||||
|
@ -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);
|
||||
|
66
src/utils.h
66
src/utils.h
@ -142,11 +142,6 @@ String toString<ota_error_t>(ota_error_t value)
|
||||
return String("Unknown: ") + int(value);
|
||||
}
|
||||
|
||||
std::array<std::reference_wrapper<Controller>, 2> controllers()
|
||||
{
|
||||
return {front, back};
|
||||
}
|
||||
|
||||
std::array<std::reference_wrapper<MotorState>, 2> motorsInController(Controller &controller)
|
||||
{
|
||||
return {std::ref(controller.command.left), std::ref(controller.command.right)};
|
||||
@ -170,22 +165,21 @@ std::array<std::reference_wrapper<const MotorFeedback>, 2> motorFeedbacksInContr
|
||||
std::array<std::reference_wrapper<MotorState>, 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;
|
||||
|
Reference in New Issue
Block a user