From c75291f415222f8f7fce1cc1731ce5a564789674 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Tue, 23 Nov 2021 15:52:43 -0500 Subject: [PATCH] live data for wastegate #3588 i want to persist state so no 'const' sorry --- .../controllers/actuators/boost_control.cpp | 23 ++++++++++++------- .../controllers/actuators/boost_control.h | 8 +++---- .../actuators/electronic_throttle.cpp | 4 ++-- .../actuators/electronic_throttle_impl.h | 4 ++-- .../controllers/actuators/idle_thread.cpp | 2 +- firmware/controllers/actuators/idle_thread.h | 4 ++-- firmware/controllers/actuators/vvt.cpp | 4 ++-- firmware/controllers/actuators/vvt.h | 4 ++-- firmware/controllers/closed_loop_controller.h | 4 ++-- unit_tests/mocks.h | 4 ++-- unit_tests/tests/test_idle_controller.cpp | 2 +- .../util/test_closed_loop_controller.cpp | 4 ++-- 12 files changed, 37 insertions(+), 30 deletions(-) diff --git a/firmware/controllers/actuators/boost_control.cpp b/firmware/controllers/actuators/boost_control.cpp index adcbe05918..76707fa8bb 100644 --- a/firmware/controllers/actuators/boost_control.cpp +++ b/firmware/controllers/actuators/boost_control.cpp @@ -40,18 +40,20 @@ expected BoostController::observePlant() const { return Sensor::get(SensorType::Map); } -expected BoostController::getSetpoint() const { +expected BoostController::getSetpoint() { // If we're in open loop only mode, disregard any target computation. // Open loop needs to work even in case of invalid closed loop config if (engineConfiguration->boostType != CLOSED_LOOP) { - return 0; + closedLoopPart = 0; + return closedLoopPart; } float rpm = GET_RPM(); auto tps = Sensor::get(SensorType::DriverThrottleIntent); + isTpsValid = tps.Valid; - if (!tps) { + if (!isTpsValid) { return unexpected; } @@ -62,14 +64,16 @@ expected BoostController::getSetpoint() const { return m_closedLoopTargetMap->getValue(rpm / RPM_1_BYTE_PACKING_MULT, tps.Value / TPS_1_BYTE_PACKING_MULT); } -expected BoostController::getOpenLoop(float target) const { +expected BoostController::getOpenLoop(float target) { // Boost control open loop doesn't care about target - only TPS/RPM UNUSED(target); float rpm = GET_RPM(); auto tps = Sensor::get(SensorType::DriverThrottleIntent); - if (!tps) { + isTpsValid = tps.Valid; + + if (!isTpsValid) { return unexpected; } @@ -106,13 +110,16 @@ percent_t BoostController::getClosedLoopImpl(float target, float manifoldPressur return 0; } - if (manifoldPressure < engineConfiguration->minimumBoostClosedLoopMap) { + isBelowClosedLoopThreshold = manifoldPressure < engineConfiguration->minimumBoostClosedLoopMap; + if (isBelowClosedLoopThreshold) { // We're below the CL threshold, inhibit CL for now m_pid.reset(); - return 0; + closedLoopPart = 0; + return closedLoopPart; } - return m_pid.getOutput(target, manifoldPressure, SLOW_CALLBACK_PERIOD_MS / 1000.0f); + closedLoopPart = m_pid.getOutput(target, manifoldPressure, SLOW_CALLBACK_PERIOD_MS / 1000.0f); + return closedLoopPart; } expected BoostController::getClosedLoop(float target, float manifoldPressure) { diff --git a/firmware/controllers/actuators/boost_control.h b/firmware/controllers/actuators/boost_control.h index 69245bf966..9a324dd0ed 100644 --- a/firmware/controllers/actuators/boost_control.h +++ b/firmware/controllers/actuators/boost_control.h @@ -9,10 +9,11 @@ #include "periodic_task.h" #include "closed_loop_controller.h" #include "pid.h" +#include "boost_control_generated.h" struct IPwm; -class BoostController : public ClosedLoopController { +class BoostController : public boost_control_s, public ClosedLoopController { public: void init(IPwm* pmw, const ValueProvider3D* openLoopMap, const ValueProvider3D* closedLoopTargetMap, pid_s* pidParams); void update(); @@ -23,9 +24,9 @@ public: // Helpers for individual parts of boost control expected observePlant() const override; - expected getSetpoint() const override; + expected getSetpoint() override; - expected getOpenLoop(float target) const override; + expected getOpenLoop(float target) override; expected getClosedLoop(float target, float manifoldPressure) override; void setOutput(expected outputValue) override; @@ -33,7 +34,6 @@ public: private: percent_t getClosedLoopImpl(float target, float manifoldPressure); - bool m_shouldResetPid = false; Pid m_pid; const ValueProvider3D* m_openLoopMap = nullptr; diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index 3aa02cec85..0b01c2b2c6 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -248,7 +248,7 @@ void EtbController::setWastegatePosition(percent_t pos) { m_wastegatePosition = pos; } -expected EtbController::getSetpoint() const { +expected EtbController::getSetpoint() { switch (m_function) { case ETB_Throttle1: case ETB_Throttle2: @@ -342,7 +342,7 @@ expected EtbController::getSetpointEtb() const { return clampF(1, targetPosition, maxPosition); } -expected EtbController::getOpenLoop(percent_t target) const { +expected EtbController::getOpenLoop(percent_t target) { float ff = 0; // Don't apply open loop for wastegate/idle valve, only real ETB diff --git a/firmware/controllers/actuators/electronic_throttle_impl.h b/firmware/controllers/actuators/electronic_throttle_impl.h index 71ce93220c..31306225d8 100644 --- a/firmware/controllers/actuators/electronic_throttle_impl.h +++ b/firmware/controllers/actuators/electronic_throttle_impl.h @@ -43,12 +43,12 @@ public: // Helpers for individual parts of throttle control expected observePlant() const override; - expected getSetpoint() const override; + expected getSetpoint() override; expected getSetpointEtb() const; expected getSetpointWastegate() const; expected getSetpointIdleValve() const; - expected getOpenLoop(percent_t target) const override; + expected getOpenLoop(percent_t target) override; expected getClosedLoop(percent_t setpoint, percent_t observation) override; expected getClosedLoopAutotune(percent_t setpoint, percent_t actualThrottlePosition); diff --git a/firmware/controllers/actuators/idle_thread.cpp b/firmware/controllers/actuators/idle_thread.cpp index f0feb5b0a3..6c18780585 100644 --- a/firmware/controllers/actuators/idle_thread.cpp +++ b/firmware/controllers/actuators/idle_thread.cpp @@ -216,7 +216,7 @@ float IdleController::getRunningOpenLoop(float clt, SensorResult tps) const { return clampF(0, running, 100); } -float IdleController::getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) const { +float IdleController::getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) { float cranking = getCrankingOpenLoop(clt); // if we're cranking, nothing more to do. diff --git a/firmware/controllers/actuators/idle_thread.h b/firmware/controllers/actuators/idle_thread.h index 9520a38ab5..07769daf35 100644 --- a/firmware/controllers/actuators/idle_thread.h +++ b/firmware/controllers/actuators/idle_thread.h @@ -26,7 +26,7 @@ struct IIdleController { virtual int getTargetRpm(float clt) const = 0; virtual float getCrankingOpenLoop(float clt) const = 0; virtual float getRunningOpenLoop(float clt, SensorResult tps) const = 0; - virtual float getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) const = 0; + virtual float getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) = 0; virtual float getClosedLoop(Phase phase, float tps, int rpm, int target) = 0; virtual float getCrankingTaperFraction() const = 0; }; @@ -49,7 +49,7 @@ public: // OPEN LOOP CORRECTIONS float getCrankingOpenLoop(float clt) const override; float getRunningOpenLoop(float clt, SensorResult tps) const override; - float getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) const override; + float getOpenLoop(Phase phase, float clt, SensorResult tps, float crankingTaperFraction) override; float getIdleTimingAdjustment(int rpm); float getIdleTimingAdjustment(int rpm, int targetRpm, Phase phase); diff --git a/firmware/controllers/actuators/vvt.cpp b/firmware/controllers/actuators/vvt.cpp index 12fef1ea9b..538f2036eb 100644 --- a/firmware/controllers/actuators/vvt.cpp +++ b/firmware/controllers/actuators/vvt.cpp @@ -49,7 +49,7 @@ expected VvtController::observePlant() const { return engine->triggerCentral.getVVTPosition(m_bank, m_cam); } -expected VvtController::getSetpoint() const { +expected VvtController::getSetpoint() { int rpm = GET_RPM(); float load = getFuelingLoad(); float target = m_targetMap->getValue(rpm, load); @@ -61,7 +61,7 @@ expected VvtController::getSetpoint() const { return target; } -expected VvtController::getOpenLoop(angle_t target) const { +expected VvtController::getOpenLoop(angle_t target) { // TODO: could we do VVT open loop? UNUSED(target); return 0; diff --git a/firmware/controllers/actuators/vvt.h b/firmware/controllers/actuators/vvt.h index 529c7fe30a..51b484bc10 100644 --- a/firmware/controllers/actuators/vvt.h +++ b/firmware/controllers/actuators/vvt.h @@ -29,8 +29,8 @@ public: // ClosedLoopController implementation expected observePlant() const override; - expected getSetpoint() const override; - expected getOpenLoop(angle_t target) const override; + expected getSetpoint() override; + expected getOpenLoop(angle_t target) override; expected getClosedLoop(angle_t setpoint, angle_t observation) override; void setOutput(expected outputValue) override; diff --git a/firmware/controllers/closed_loop_controller.h b/firmware/controllers/closed_loop_controller.h index a7e25a7beb..d2d1ceb1fd 100644 --- a/firmware/controllers/closed_loop_controller.h +++ b/firmware/controllers/closed_loop_controller.h @@ -44,13 +44,13 @@ private: } // Get the setpoint: where should the controller put the plant? - virtual expected getSetpoint() const = 0; + virtual expected getSetpoint() = 0; // Get the current observation: what is the current state of the world? virtual expected observePlant() const = 0; // Get the open-loop output: output state based on only the setpoint - virtual expected getOpenLoop(TInput setpoint) const = 0; + virtual expected getOpenLoop(TInput setpoint) = 0; // Get the closed-loop output: output state based on setpoint and observation virtual expected getClosedLoop(TInput setpoint, TInput observation) = 0; diff --git a/unit_tests/mocks.h b/unit_tests/mocks.h index a6fdd134d9..c58ac9b348 100644 --- a/unit_tests/mocks.h +++ b/unit_tests/mocks.h @@ -26,9 +26,9 @@ public: MOCK_METHOD(const pid_state_s*, getPidState, (), (const, override)); // ClosedLoopController mocks - MOCK_METHOD(expected, getSetpoint, (), (const, override)); + MOCK_METHOD(expected, getSetpoint, (), (override)); MOCK_METHOD(expected, observePlant, (), (const, override)); - MOCK_METHOD(expected, getOpenLoop, (percent_t setpoint), (const, override)); + MOCK_METHOD(expected, getOpenLoop, (percent_t setpoint), (override)); MOCK_METHOD(expected, getClosedLoop, (percent_t setpoint, percent_t observation), (override)); MOCK_METHOD(void, setOutput, (expected outputValue), (override)); }; diff --git a/unit_tests/tests/test_idle_controller.cpp b/unit_tests/tests/test_idle_controller.cpp index 6a5bf6c935..d62c906342 100644 --- a/unit_tests/tests/test_idle_controller.cpp +++ b/unit_tests/tests/test_idle_controller.cpp @@ -354,7 +354,7 @@ TEST(idle_v2, closedLoopDeadzone) { struct IntegrationIdleMock : public IdleController { MOCK_METHOD(int, getTargetRpm, (float clt), (const, override)); MOCK_METHOD(ICP, determinePhase, (int rpm, int targetRpm, SensorResult tps, float vss, float crankingTaperFraction), (const, override)); - MOCK_METHOD(float, getOpenLoop, (ICP phase, float clt, SensorResult tps, float crankingTaperFraction), (const, override)); + MOCK_METHOD(float, getOpenLoop, (ICP phase, float clt, SensorResult tps, float crankingTaperFraction), (override)); MOCK_METHOD(float, getClosedLoop, (ICP phase, float tps, int rpm, int target), (override)); MOCK_METHOD(float, getCrankingTaperFraction, (), (const, override)); }; diff --git a/unit_tests/tests/util/test_closed_loop_controller.cpp b/unit_tests/tests/util/test_closed_loop_controller.cpp index 3c731e516b..94b837bd5c 100644 --- a/unit_tests/tests/util/test_closed_loop_controller.cpp +++ b/unit_tests/tests/util/test_closed_loop_controller.cpp @@ -9,9 +9,9 @@ using ::testing::Eq; class TestController : public ClosedLoopController { public: - MOCK_METHOD(expected, getSetpoint, (), (const, override)); + MOCK_METHOD(expected, getSetpoint, (), (override)); MOCK_METHOD(expected, observePlant, (), (const, override)); - MOCK_METHOD(expected, getOpenLoop, (float setpoint), (const, override)); + MOCK_METHOD(expected, getOpenLoop, (float setpoint), (override)); MOCK_METHOD(expected, getClosedLoop, (float setpoint, float observation), (override)); MOCK_METHOD(void, setOutput, (expected outputValue), (override)); };