From 07a905b1fe0d4548b230e39d32bf4d58de0ca55d Mon Sep 17 00:00:00 2001 From: rusefillc Date: Thu, 8 Oct 2020 17:09:00 -0400 Subject: [PATCH] revering functional part of Etb function cfg, try again #1860 try again from #1831 --- .../actuators/electronic_throttle.cpp | 41 ++++-------- unit_tests/tests/test_etb.cpp | 66 ++----------------- 2 files changed, 18 insertions(+), 89 deletions(-) diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index 136b412d30..4ad660a94a 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -172,8 +172,6 @@ bool EtbController::init(etb_function_e function, DcMotor *motor, pid_s *pidPara m_pid.initPidClass(pidParameters); m_pedalMap = pedalMap; - reset(); - return true; } @@ -758,10 +756,6 @@ void setDefaultEtbParameters(DECLARE_CONFIG_PARAMETER_SIGNATURE) { } } - // Default is to run each throttle off its respective hbridge - engineConfiguration->etbFunctions[0] = ETB_Throttle1; - engineConfiguration->etbFunctions[1] = ETB_Throttle2; - engineConfiguration->etbFreq = DEFAULT_ETB_PWM_FREQUENCY; // voltage, not ADC like with TPS @@ -828,42 +822,29 @@ void doInitElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { addConsoleActionI("etb_freq", setEtbFrequency); #endif /* EFI_PROD_CODE */ + // If you don't have a pedal we have no business here. + if (!Sensor::hasSensor(SensorType::AcceleratorPedalPrimary)) { + return; + } + pedal2tpsMap.init(config->pedalToTpsTable, config->pedalToTpsPedalBins, config->pedalToTpsRpmBins); - // TODO: remove etbActualCount - engine->etbActualCount = ETB_COUNT; + engine->etbActualCount = Sensor::hasSensor(SensorType::Tps2) ? 2 : 1; - bool mustHaveEtbConfigured = Sensor::hasSensor(SensorType::AcceleratorPedalPrimary); - bool anyEtbConfigured = false; - - for (int i = 0 ; i < ETB_COUNT; i++) { + for (int i = 0 ; i < engine->etbActualCount; i++) { auto motor = initDcMotor(i, CONFIG(etb_use_two_wires) PASS_ENGINE_PARAMETER_SUFFIX); // If this motor is actually set up, init the etb if (motor) { - auto controller = engine->etbControllers[i]; - if (!controller) { - continue; - } + // TODO: configure per-motor in config so wastegate/VW idle works + auto func = i == 0 ? ETB_Throttle1 : ETB_Throttle2; - auto func = CONFIG(etbFunctions[i]); - - anyEtbConfigured |= controller->init(func, motor, &engineConfiguration->etb, &pedal2tpsMap); + engine->etbControllers[i]->init(func, motor, &engineConfiguration->etb, &pedal2tpsMap); INJECT_ENGINE_REFERENCE(engine->etbControllers[i]); } } - if (!anyEtbConfigured) { - // It's not valid to have a PPS without any ETBs - check that at least one ETB was enabled along with the pedal - if (mustHaveEtbConfigured) { - firmwareError(OBD_PCM_Processor_Fault, "A pedal position sensor was configured, but no electronic throttles are configured."); - } - - // Don't start the thread if no throttles are in use. - return; - } - #if 0 && ! EFI_UNIT_TEST percent_t startupThrottlePosition = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE); if (absF(startupThrottlePosition - engineConfiguration->etbNeutralPosition) > STARTUP_NEUTRAL_POSITION_ERROR_THRESHOLD) { @@ -877,6 +858,8 @@ void doInitElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { } #endif /* EFI_UNIT_TEST */ + etbPidReset(PASS_ENGINE_PARAMETER_SIGNATURE); + #if !EFI_UNIT_TEST etbThread.Start(); #endif diff --git a/unit_tests/tests/test_etb.cpp b/unit_tests/tests/test_etb.cpp index a58f4d96d1..5522ca1b7d 100644 --- a/unit_tests/tests/test_etb.cpp +++ b/unit_tests/tests/test_etb.cpp @@ -27,34 +27,9 @@ TEST(etb, initializationNoPedal) { engine->etbControllers[i] = &mocks[i]; } - EXPECT_CALL(mocks[0], init(ETB_Throttle1, _, _, _)).WillOnce(Return(false)); - EXPECT_CALL(mocks[1], init(ETB_Throttle2, _, _, _)).WillOnce(Return(false)); + // We expect no throttle init stuff to be called - lack of pedal should disable ETB - // This shouldn't throw, since no throttles are configured, but no pedal is configured either - EXPECT_NO_FATAL_ERROR(doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE)); -} - -TEST(etb, initializationMissingThrottle) { - StrictMock mocks[ETB_COUNT]; - - WITH_ENGINE_TEST_HELPER(TEST_ENGINE); - - for (int i = 0; i < ETB_COUNT; i++) { - engine->etbControllers[i] = &mocks[i]; - } - - engineConfiguration->etbFunctions[0] = ETB_None; - engineConfiguration->etbFunctions[1] = ETB_None; - - EXPECT_CALL(mocks[0], init(ETB_None, _, _, _)).WillOnce(Return(false)); - EXPECT_CALL(mocks[1], init(ETB_None, _, _, _)).WillOnce(Return(false)); - - // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); - Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); - - // This should throw: a pedal is configured but no throttles - EXPECT_FATAL_ERROR(doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE)); + doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); } TEST(etb, initializationSingleThrottle) { @@ -70,39 +45,11 @@ TEST(etb, initializationSingleThrottle) { Sensor::setMockValue(SensorType::AcceleratorPedal, 0); Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); - engineConfiguration->etbFunctions[0] = ETB_Throttle1; - engineConfiguration->etbFunctions[1] = ETB_None; - // Expect mock0 to be init as throttle 1, and PID params EXPECT_CALL(mocks[0], init(ETB_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true)); + EXPECT_CALL(mocks[0], reset); - // Expect mock1 to be init as none - EXPECT_CALL(mocks[1], init(ETB_None, _, _, _)).WillOnce(Return(true)); - - doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); -} - -TEST(etb, initializationSingleThrottleInSecondSlot) { - StrictMock mocks[ETB_COUNT]; - - WITH_ENGINE_TEST_HELPER(TEST_ENGINE); - - for (int i = 0; i < ETB_COUNT; i++) { - engine->etbControllers[i] = &mocks[i]; - } - - // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); - Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); - - engineConfiguration->etbFunctions[0] = ETB_None; - engineConfiguration->etbFunctions[1] = ETB_Throttle1; - - // Expect mock0 to be init as none - EXPECT_CALL(mocks[0], init(ETB_None, _, _, _)).WillOnce(Return(true)); - - // Expect mock1 to be init as throttle 1, and PID params - EXPECT_CALL(mocks[1], init(ETB_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true)); + // We do not expect throttle #2 to be initialized doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); } @@ -123,14 +70,13 @@ TEST(etb, initializationDualThrottle) { // The presence of a second TPS indicates dual throttle Sensor::setMockValue(SensorType::Tps2, 25.0f); - engineConfiguration->etbFunctions[0] = ETB_Throttle1; - engineConfiguration->etbFunctions[1] = ETB_Throttle2; - // Expect mock0 to be init as throttle 1, and PID params EXPECT_CALL(mocks[0], init(ETB_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true)); + EXPECT_CALL(mocks[0], reset); // Expect mock1 to be init as throttle 2, and PID params EXPECT_CALL(mocks[1], init(ETB_Throttle2, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true)); + EXPECT_CALL(mocks[1], reset); doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); }