From 44653da2e57541847eab83da1358126b49128b70 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sun, 18 Oct 2020 14:26:38 -0700 Subject: [PATCH] Etb function cfg: actually read config (#1884) * two throttles one thread * look at all this RAM! * add enum * switch from index to function * test fixup * improve init logic * remove old vw idle mode bit * add config * better spot for it * use config init values * handle null controller array * fatal error testability * test new init config * defaults * fix for default config --- .../actuators/electronic_throttle.cpp | 15 ++--- unit_tests/tests/test_etb.cpp | 63 ++++++++++++++++++- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index f8df471807..136b412d30 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -828,19 +828,15 @@ 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)) { - engine->etbActualCount = Sensor::hasSensor(SensorType::Tps2) ? 2 : 1; - } else { - engine->etbActualCount = 0; - } - pedal2tpsMap.init(config->pedalToTpsTable, config->pedalToTpsPedalBins, config->pedalToTpsRpmBins); + // TODO: remove etbActualCount + engine->etbActualCount = ETB_COUNT; + bool mustHaveEtbConfigured = Sensor::hasSensor(SensorType::AcceleratorPedalPrimary); bool anyEtbConfigured = false; - for (int i = 0 ; i < engine->etbActualCount; i++) { + for (int i = 0 ; i < ETB_COUNT; i++) { auto motor = initDcMotor(i, CONFIG(etb_use_two_wires) PASS_ENGINE_PARAMETER_SUFFIX); // If this motor is actually set up, init the etb @@ -851,8 +847,7 @@ void doInitElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { 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); INJECT_ENGINE_REFERENCE(engine->etbControllers[i]); diff --git a/unit_tests/tests/test_etb.cpp b/unit_tests/tests/test_etb.cpp index 86b75b3cc2..a58f4d96d1 100644 --- a/unit_tests/tests/test_etb.cpp +++ b/unit_tests/tests/test_etb.cpp @@ -27,9 +27,34 @@ TEST(etb, initializationNoPedal) { engine->etbControllers[i] = &mocks[i]; } - // We expect no throttle init stuff to be called - lack of pedal should disable ETB + EXPECT_CALL(mocks[0], init(ETB_Throttle1, _, _, _)).WillOnce(Return(false)); + EXPECT_CALL(mocks[1], init(ETB_Throttle2, _, _, _)).WillOnce(Return(false)); - doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); + // 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)); } TEST(etb, initializationSingleThrottle) { @@ -45,10 +70,39 @@ 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)); - // We do not expect throttle #2 to be initialized + // 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)); doInitElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); } @@ -69,6 +123,9 @@ 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));