diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index 0fb655e747..d070e9d54f 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -257,8 +257,6 @@ static void onlineApplyWorkingCopyBytes(int currentPageId, uint32_t offset, int } } -extern EtbController etbController[ETB_COUNT]; - static const void * getStructAddr(int structId) { switch (structId) { case LDS_CLT_STATE_INDEX: @@ -275,7 +273,7 @@ static const void * getStructAddr(int structId) { return static_cast(&engine->triggerCentral.triggerState); #if EFI_ELECTRONIC_THROTTLE_BODY case LDS_ETB_PID_STATE_INDEX: - return etbController[0].getPidState(); + return static_cast(engine->etbControllers[0])->getPidState(); #endif /* EFI_ELECTRONIC_THROTTLE_BODY */ #ifndef EFI_IDLE_CONTROL diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index df6bbe1188..b1f53ac66e 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -355,7 +355,8 @@ DISPLAY(DISPLAY_IF(hasEtbPedalPositionSensor)) } static EtbHardware etbHardware[ETB_COUNT]; -EtbController etbController[ETB_COUNT]; +// real implementation (we mock for some unit tests) +EtbController etbControllers[ETB_COUNT]; static void showEthInfo(void) { #if EFI_PROD_CODE @@ -389,7 +390,7 @@ static void showEthInfo(void) { scheduleMsg(&logger, "ETB %%d", i); scheduleMsg(&logger, "Motor: dir=%d DC=%f", etb->dcMotor.isOpenDirection(), etb->dcMotor.get()); - etbController[i].showStatus(&logger); + etbControllers[i].showStatus(&logger); } #endif /* EFI_PROD_CODE */ @@ -397,7 +398,7 @@ static void showEthInfo(void) { static void etbPidReset(DECLARE_ENGINE_PARAMETER_SIGNATURE) { for (int i = 0 ; i < engine->etbActualCount; i++) { - etbController[i].reset(); + engine->etbControllers[i]->reset(); } } @@ -576,7 +577,7 @@ void stopETBPins(void) { void onConfigurationChangeElectronicThrottleCallback(engine_configuration_s *previousConfiguration) { for (int i = 0; i < ETB_COUNT; i++) { - etbController[i].onConfigurationChange(&previousConfiguration->etb); + etbControllers[i].onConfigurationChange(&previousConfiguration->etb); } } @@ -655,10 +656,18 @@ void setDefaultEtbBiasCurve(DECLARE_CONFIG_PARAMETER_SIGNATURE) { } void unregisterEtbPins() { - + // todo: we probably need an implementation here?! } void initElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { + for (int i = 0; i < ETB_COUNT; i++) { + engine->etbControllers[i] = &etbControllers[i]; + } + doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); +} + +void doInitElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { + efiAssertVoid(OBD_PCM_Processor_Fault, engine->etbControllers != NULL, "etbControllers NULL"); #if EFI_PROD_CODE addConsoleAction("ethinfo", showEthInfo); addConsoleAction("etbreset", etbReset); @@ -666,8 +675,8 @@ void initElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #endif /* EFI_PROD_CODE */ for (int i = 0 ; i < ETB_COUNT; i++) { - etbController[i].init(&etbHardware[i].dcMotor, i, &engineConfiguration->etb); - INJECT_ENGINE_REFERENCE(&etbController[i]); + engine->etbControllers[i]->init(&etbHardware[i].dcMotor, i, &engineConfiguration->etb); + INJECT_ENGINE_REFERENCE(engine->etbControllers[i]); } @@ -742,9 +751,10 @@ void initElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { etbPidReset(PASS_ENGINE_PARAMETER_SIGNATURE); for (int i = 0 ; i < engine->etbActualCount; i++) { - etbController[i].Start(); + engine->etbControllers[i]->Start(); } } + #endif /* EFI_ELECTRONIC_THROTTLE_BODY */ diff --git a/firmware/controllers/actuators/electronic_throttle.h b/firmware/controllers/actuators/electronic_throttle.h index 130701ff6b..c09e697bcf 100644 --- a/firmware/controllers/actuators/electronic_throttle.h +++ b/firmware/controllers/actuators/electronic_throttle.h @@ -17,15 +17,21 @@ class DcMotor; class Logging; -class EtbController final : public PeriodicTimerController { +class IEtbController : public PeriodicTimerController{ public: DECLARE_ENGINE_PTR; - void init(DcMotor *motor, int ownIndex, pid_s *pidParameters); - void reset(); + virtual void init(DcMotor *motor, int ownIndex, pid_s *pidParameters) = 0; + virtual void reset() = 0; +}; + +class EtbController final : public IEtbController { +public: + void init(DcMotor *motor, int ownIndex, pid_s *pidParameters) override; // PeriodicTimerController implementation int getPeriodMs() override; void PeriodicTask() override; + void reset() override; // Called when the configuration may have changed. Controller will // reset if necessary. @@ -45,6 +51,8 @@ private: }; void initElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE); +void doInitElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE); + void setDefaultEtbBiasCurve(DECLARE_CONFIG_PARAMETER_SIGNATURE); void setDefaultEtbParameters(DECLARE_CONFIG_PARAMETER_SIGNATURE); void setBoschVNH2SP30Curve(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 2a6f68ff2c..6458535a37 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -47,11 +47,15 @@ class RpmCalculator; #define CYCLE_ALTERNATION 2 +class IEtbController; + class Engine : public TriggerStateListener { public: explicit Engine(persistent_config_s *config); Engine(); + IEtbController *etbControllers[ETB_COUNT]; + void OnTriggerStateDecodingError() override; void OnTriggerStateProperState(efitick_t nowNt) override; diff --git a/firmware/controllers/system/periodic_task.h b/firmware/controllers/system/periodic_task.h index 1b3e4eccf6..c1586c1a9e 100644 --- a/firmware/controllers/system/periodic_task.h +++ b/firmware/controllers/system/periodic_task.h @@ -35,7 +35,7 @@ public: /** * This invokes PeriodicTask() immediately and starts the cycle of invocations and sleeps */ - void Start() { + virtual void Start() { runAndScheduleNext(this); } }; diff --git a/unit_tests/tests/test_idle_controller.cpp b/unit_tests/tests/test_idle_controller.cpp index c9e548ed21..b0557b2a6b 100644 --- a/unit_tests/tests/test_idle_controller.cpp +++ b/unit_tests/tests/test_idle_controller.cpp @@ -129,23 +129,22 @@ TEST(idle, timingPid) { } // not great that we are reusing shared instance. todo: move EtbController to Engine? -extern EtbController etbController; TEST(idle, testTargetTpsIsFloatBug945) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); setMockThrottlePedalSensorVoltage(3 PASS_ENGINE_PARAMETER_SUFFIX); - etbController.PeriodicTask(); + engine->etbControllers[0]->PeriodicTask(); ASSERT_NEAR(50, engine->engineState.targetFromTable, EPS4D); setMockThrottlePedalSensorVoltage(3.05 PASS_ENGINE_PARAMETER_SUFFIX); ASSERT_NEAR(50.8302, getPedalPosition(PASS_ENGINE_PARAMETER_SIGNATURE), EPS4D); - etbController.PeriodicTask(); + engine->etbControllers[0]->PeriodicTask(); ASSERT_NEAR(50.8302, engine->engineState.targetFromTable, EPS4D); setMockThrottlePedalSensorVoltage(3.1 PASS_ENGINE_PARAMETER_SUFFIX); - etbController.PeriodicTask(); + engine->etbControllers[0]->PeriodicTask(); ASSERT_NEAR(51.6605, engine->engineState.targetFromTable, EPS4D); }