diff --git a/NERODevelopment/content/EfficiencyScreen.qml b/NERODevelopment/content/EfficiencyScreen.qml index c32d1f6..d4fe3fb 100644 --- a/NERODevelopment/content/EfficiencyScreen.qml +++ b/NERODevelopment/content/EfficiencyScreen.qml @@ -18,6 +18,7 @@ Item { property int timerValue: efficiencyController.currentTime property int lastRunTime: efficiencyController.lastTime property int fastestRunTime: efficiencyController.fastestTime + property int powerDrawPercent: efficiencyController.powerDrawPercent property int xMargin: width / 20 property int yMargin: height / 20 property int verticalSpacing: height / 40 @@ -158,6 +159,18 @@ Item { unitFontSize: efficiency.valueFontSize / 1.5 } + BatteryValueComponent { + id: powerDraw + title: "PWR DRAW" + batteryValue: efficiency.powerDrawPercent + Layout.fillWidth: true + Layout.fillHeight: true + radius: efficiency.borderRadii + valueFontSize: efficiency.valueFontSize + labelFontSize: efficiency.labelFontSize + unitFontSize: efficiency.valueFontSize / 1.5 + } + TorqueValueComponent { id: torqueValue torqueValue: efficiency.torqueLimit diff --git a/NERODevelopment/content/SpeedMode.qml b/NERODevelopment/content/SpeedMode.qml index 20ddc53..2ead5b5 100644 --- a/NERODevelopment/content/SpeedMode.qml +++ b/NERODevelopment/content/SpeedMode.qml @@ -19,6 +19,7 @@ Item { property int maxDraw: speedController.maxCurrent property int dcl: speedController.currentDischarge property double regen: speedController.regen + property int powerDrawPercent: speedController.powerDrawPercent property int xMargin: width / 20 property int yMargin: height / 20 @@ -121,6 +122,18 @@ Item { valueFontSize: speedMode.valueFontSize labelFontSize: speedMode.labelFontSize } + + BatteryValueComponent { + title: "PWR DRAW" + batteryValue: speedMode.powerDrawPercent + Layout.fillHeight: true + Layout.fillWidth: true + Layout.preferredHeight: 1 + radius: speedMode.borderRadii + valueFontSize: speedMode.valueFontSize + labelFontSize: speedMode.labelFontSize + unitFontSize: speedMode.valueFontSize / 1.5 + } } ColumnLayout { diff --git a/NERODevelopment/src/controllers/efficiencycontroller.cpp b/NERODevelopment/src/controllers/efficiencycontroller.cpp index b2a6ff2..d481e2c 100644 --- a/NERODevelopment/src/controllers/efficiencycontroller.cpp +++ b/NERODevelopment/src/controllers/efficiencycontroller.cpp @@ -72,6 +72,26 @@ void EfficiencyController::setSpeed(int speed) { } } +int EfficiencyController::powerDrawPercent() const { + return m_powerDrawPercent; +} +void EfficiencyController::setPowerDrawPercent(int percent) { + if (percent != m_powerDrawPercent) { + m_powerDrawPercent = percent; + emit powerDrawPercentChanged(percent); + } +} + +int EfficiencyController::maxDCCurrentTarget() const { + return m_maxDCCurrentTarget; +} +void EfficiencyController::setMaxDCCurrentTarget(int target) { + if (target != m_maxDCCurrentTarget) { + m_maxDCCurrentTarget = target; + emit maxDCCurrentTargetChanged(target); + } +} + void EfficiencyController::currentDataDidChange() { std::optional torque = m_model->getTorquePower(); std::optional regen = m_model->getRegenPower(); @@ -80,6 +100,8 @@ void EfficiencyController::currentDataDidChange() { std::optional packTemp = m_model->getPackTemp(); std::optional lowVoltageSoc = m_model->getLowVoltageStateOfCharge(); std::optional speed = m_model->getMph(); + std::optional dcCurrent = m_model->getDCCurrent(); + std::optional maxDCTarget = m_model->getMaxDCCurrentTarget(); if (torque) { setCurrentMaxTorque(*torque); @@ -102,6 +124,18 @@ void EfficiencyController::currentDataDidChange() { if (speed) { setSpeed(*speed); } + if (maxDCTarget) { + setMaxDCCurrentTarget(static_cast(std::round(std::abs(*maxDCTarget)))); + } + if (dcCurrent && maxDCTarget && std::abs(*maxDCTarget) > 0) { + int percent = static_cast( + std::round(std::abs(*dcCurrent) / std::abs(*maxDCTarget) * 100.0f)); + if (percent > 100) + percent = 100; + if (percent < 0) + percent = 0; + setPowerDrawPercent(percent); + } } int EfficiencyController::currentTime() const { return m_currentTime; } diff --git a/NERODevelopment/src/controllers/efficiencycontroller.h b/NERODevelopment/src/controllers/efficiencycontroller.h index 1b9a9bd..2165330 100644 --- a/NERODevelopment/src/controllers/efficiencycontroller.h +++ b/NERODevelopment/src/controllers/efficiencycontroller.h @@ -33,6 +33,10 @@ class EfficiencyController : public ButtonController { fastestTimeChanged) Q_PROPERTY( int lastTime READ lastTime WRITE setLastTime NOTIFY lastTimeChanged) + Q_PROPERTY(int powerDrawPercent READ powerDrawPercent WRITE + setPowerDrawPercent NOTIFY powerDrawPercentChanged FINAL) + Q_PROPERTY(int maxDCCurrentTarget READ maxDCCurrentTarget WRITE + setMaxDCCurrentTarget NOTIFY maxDCCurrentTargetChanged FINAL) public: explicit EfficiencyController(Model *model, QObject *parent = nullptr); @@ -46,6 +50,8 @@ class EfficiencyController : public ButtonController { int currentTime() const; int fastestTime() const; int lastTime() const; + int powerDrawPercent() const; + int maxDCCurrentTarget() const; signals: void currentMaxTorqueChanged(int); @@ -58,6 +64,8 @@ class EfficiencyController : public ButtonController { void currentTimeChanged(int); void fastestTimeChanged(int); void lastTimeChanged(int); + void powerDrawPercentChanged(int); + void maxDCCurrentTargetChanged(int); public slots: void setCurrentMaxTorque(int); @@ -71,6 +79,8 @@ public slots: void setCurrentTime(int); void setFastestTime(int); void setLastTime(int); + void setPowerDrawPercent(int); + void setMaxDCCurrentTarget(int); void enterButtonPressed() override; void updateCurrentTime(); @@ -86,6 +96,8 @@ public slots: int m_currentTime = 0; int m_fastestTime = 0; int m_lastTime = 0; + int m_powerDrawPercent = 0; + int m_maxDCCurrentTarget = 0; bool m_timerRunning = false; QElapsedTimer m_timer; QTimer *m_updateTimer; diff --git a/NERODevelopment/src/controllers/speedcontroller.cpp b/NERODevelopment/src/controllers/speedcontroller.cpp index f822860..40257f9 100644 --- a/NERODevelopment/src/controllers/speedcontroller.cpp +++ b/NERODevelopment/src/controllers/speedcontroller.cpp @@ -113,6 +113,22 @@ void SpeedController::setMaxCurrentDischarge(float maxCurrentDischarge) { } } +int SpeedController::powerDrawPercent() const { return m_powerDrawPercent; } +void SpeedController::setPowerDrawPercent(int percent) { + if (percent != m_powerDrawPercent) { + m_powerDrawPercent = percent; + emit powerDrawPercentChanged(percent); + } +} + +int SpeedController::maxDCCurrentTarget() const { return m_maxDCCurrentTarget; } +void SpeedController::setMaxDCCurrentTarget(int target) { + if (target != m_maxDCCurrentTarget) { + m_maxDCCurrentTarget = target; + emit maxDCCurrentTargetChanged(target); + } +} + void SpeedController::enterButtonPressed() { if (m_timerRunning) { m_timerRunning = false; @@ -154,4 +170,20 @@ void SpeedController::update() { setMaxCurrent(m_model->getMaxDraw()); setCurrentDischarge(*m_model->getDcl()); setRegen(*m_model->getRegenPower()); + + std::optional dcCurrent = m_model->getDCCurrent(); + std::optional maxDCTarget = m_model->getMaxDCCurrentTarget(); + + if (maxDCTarget) { + setMaxDCCurrentTarget(static_cast(std::round(std::abs(*maxDCTarget)))); + } + if (dcCurrent && maxDCTarget && std::abs(*maxDCTarget) > 0) { + int percent = static_cast( + std::round(std::abs(*dcCurrent) / std::abs(*maxDCTarget) * 100.0f)); + if (percent > 100) + percent = 100; + if (percent < 0) + percent = 0; + setPowerDrawPercent(percent); + } } diff --git a/NERODevelopment/src/controllers/speedcontroller.h b/NERODevelopment/src/controllers/speedcontroller.h index f790ee5..03c9d70 100644 --- a/NERODevelopment/src/controllers/speedcontroller.h +++ b/NERODevelopment/src/controllers/speedcontroller.h @@ -35,6 +35,10 @@ class SpeedController : public ButtonController { setCurrentDischarge NOTIFY currentDischargeChanged) Q_PROPERTY(float maxCurrentDischarge READ maxCurrentDischarge WRITE setMaxCurrentDischarge NOTIFY maxCurrentDischargeChanged) + Q_PROPERTY(int powerDrawPercent READ powerDrawPercent WRITE + setPowerDrawPercent NOTIFY powerDrawPercentChanged) + Q_PROPERTY(int maxDCCurrentTarget READ maxDCCurrentTarget WRITE + setMaxDCCurrentTarget NOTIFY maxDCCurrentTargetChanged) public: explicit SpeedController(Model *model, QObject *parent = nullptr); @@ -53,6 +57,8 @@ class SpeedController : public ButtonController { float currentDischarge() const; float maxCurrentDischarge() const; float regen() const; + int powerDrawPercent() const; + int maxDCCurrentTarget() const; signals: void tractionControlChanged(bool); @@ -69,6 +75,8 @@ class SpeedController : public ButtonController { void currentDischargeChanged(float); void maxCurrentDischargeChanged(float); void regenChanged(float); + void powerDrawPercentChanged(int); + void maxDCCurrentTargetChanged(int); public slots: void setTractionControl(bool); @@ -85,6 +93,8 @@ public slots: void setCurrentDischarge(float); void setMaxCurrentDischarge(float); void setRegen(float); + void setPowerDrawPercent(int); + void setMaxDCCurrentTarget(int); void enterButtonPressed() override; void updateCurrentTime(); @@ -106,6 +116,8 @@ public slots: float m_currentDischarge = 0; float m_maxCurrentDischarge = 0; float m_regen = 0; + int m_powerDrawPercent = 0; + int m_maxDCCurrentTarget = 0; bool m_timerRunning = false; QElapsedTimer m_timer; diff --git a/NERODevelopment/src/models/model.h b/NERODevelopment/src/models/model.h index 00ebce4..ee7f498 100644 --- a/NERODevelopment/src/models/model.h +++ b/NERODevelopment/src/models/model.h @@ -30,6 +30,8 @@ class Model : public QObject { virtual std::optional getMotorTemp() = 0; virtual std::optional getStateOfCharge() = 0; virtual std::optional getCurrent() = 0; + virtual std::optional getDCCurrent() = 0; + virtual std::optional getMaxDCCurrentTarget() = 0; virtual std::optional getBalancingCells() = 0; virtual std::optional getPackVoltage() = 0; virtual std::optional getMaxCellTemp() = 0; diff --git a/NERODevelopment/src/models/raspberry_model.cpp b/NERODevelopment/src/models/raspberry_model.cpp index 82ed3cb..a855756 100644 --- a/NERODevelopment/src/models/raspberry_model.cpp +++ b/NERODevelopment/src/models/raspberry_model.cpp @@ -47,6 +47,8 @@ void RaspberryModel::connectToMQTT() { MOTORTEMP, STATEOFCHARGE, CURRENT, + DCCURRENT, + MAXDCCURRENTTARGET, BALANCINGCELLS, PACKVOLTAGE, MAXCELLTEMP, @@ -176,6 +178,14 @@ std::optional RaspberryModel::getCurrent() { return this->getById(CURRENT); } +std::optional RaspberryModel::getDCCurrent() { + return this->getById(DCCURRENT); +} + +std::optional RaspberryModel::getMaxDCCurrentTarget() { + return this->getById(MAXDCCURRENTTARGET); +} + std::optional RaspberryModel::getMaxCellVoltage() { std::optional voltage = this->getById(MAXCELLVOLTAGE); return voltage ? std::optional(std::round(*voltage * 1000)) diff --git a/NERODevelopment/src/models/raspberry_model.h b/NERODevelopment/src/models/raspberry_model.h index da2e911..983701c 100644 --- a/NERODevelopment/src/models/raspberry_model.h +++ b/NERODevelopment/src/models/raspberry_model.h @@ -26,6 +26,8 @@ class RaspberryModel : public Model { std::optional getMotorTemp() override; std::optional getStateOfCharge() override; std::optional getCurrent() override; + std::optional getDCCurrent() override; + std::optional getMaxDCCurrentTarget() override; std::optional getBalancingCells() override; std::optional getPackVoltage() override; std::optional getMaxCellTemp() override; diff --git a/NERODevelopment/src/utils/data_type_names.h b/NERODevelopment/src/utils/data_type_names.h index eaca198..ba2e5bc 100644 --- a/NERODevelopment/src/utils/data_type_names.h +++ b/NERODevelopment/src/utils/data_type_names.h @@ -9,6 +9,8 @@ #define MOTORTEMP "DTI/Temps/Motor_Temperature" #define STATEOFCHARGE "BMS/Pack/SOC" #define CURRENT "DTI/Power/AC_Current" +#define DCCURRENT "DTI/Power/DC_Current" +#define MAXDCCURRENTTARGET "BMS/Commands/Max_DC_Current_Target" #define BALANCINGCELLS "balancingcells" #define PACKVOLTAGE "BMS/Pack/Voltage" #define MAXCELLTEMP "BMS/Cells/Temp_High_Value"