progress towards ETB controller mocking

This commit is contained in:
rusefi 2019-12-13 13:52:34 -05:00
parent e9e7a66cf8
commit 236d952335
6 changed files with 38 additions and 19 deletions

View File

@ -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<trigger_state_s*>(&engine->triggerCentral.triggerState);
#if EFI_ELECTRONIC_THROTTLE_BODY
case LDS_ETB_PID_STATE_INDEX:
return etbController[0].getPidState();
return static_cast<EtbController*>(engine->etbControllers[0])->getPidState();
#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
#ifndef EFI_IDLE_CONTROL

View File

@ -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 */

View File

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

View File

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

View File

@ -35,7 +35,7 @@ public:
/**
* This invokes PeriodicTask() immediately and starts the cycle of invocations and sleeps
*/
void Start() {
virtual void Start() {
runAndScheduleNext(this);
}
};

View File

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