Cleanup of controllers

This commit is contained in:
2020-06-07 22:28:27 +02:00
parent 2309e6c1a1
commit 885183c7c8
13 changed files with 149 additions and 125 deletions

View File

@ -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;

View File

@ -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>;
}

View File

@ -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>;
}

View File

@ -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>,

View File

@ -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,

View File

@ -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;
}
}

View File

@ -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]);

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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':

View File

@ -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);

View File

@ -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;