diff --git a/firmware/controllers/actuators/idle_thread.cpp b/firmware/controllers/actuators/idle_thread.cpp index abec567677..b76fafd06d 100644 --- a/firmware/controllers/actuators/idle_thread.cpp +++ b/firmware/controllers/actuators/idle_thread.cpp @@ -229,9 +229,14 @@ IIdleController::Phase IdleController::determinePhase(int rpm, int targetRpm, Se } float IdleController::getCrankingOpenLoop(float clt) const { - return - CONFIG(crankingIACposition) // Base cranking position (cranking page) - * interpolate2d(clt, config->cltCrankingCorrBins, config->cltCrankingCorr); + float mult = + CONFIG(overrideCrankingIacSetting) + // Override to separate table + ? interpolate2d(clt, config->cltCrankingCorrBins, config->cltCrankingCorr) + // Otherwise use plain running table + : interpolate2d(clt, config->cltIdleCorrBins, config->cltIdleCorr); + + return CONFIG(crankingIACposition) * mult; } float IdleController::getRunningOpenLoop(float clt, SensorResult tps) const { @@ -256,9 +261,7 @@ float IdleController::getRunningOpenLoop(float clt, SensorResult tps) const { float IdleController::getOpenLoop(Phase phase, float clt, SensorResult tps) const { float running = getRunningOpenLoop(clt, tps); - - // Cranking value is either its own table, or the running value if not overriden - float cranking = CONFIG(overrideCrankingIacSetting) ? getCrankingOpenLoop(clt) : running; + float cranking = getCrankingOpenLoop(clt); // if we're cranking, nothing more to do. if (phase == Phase::Cranking) { diff --git a/unit_tests/tests/test_idle_controller.cpp b/unit_tests/tests/test_idle_controller.cpp index 9d0ce03b26..7980b25f3b 100644 --- a/unit_tests/tests/test_idle_controller.cpp +++ b/unit_tests/tests/test_idle_controller.cpp @@ -162,8 +162,18 @@ TEST(idle_v2, crankingOpenLoop) { for (size_t i = 0; i < efi::size(config->cltCrankingCorrBins); i++) { config->cltCrankingCorrBins[i] = i * 10; config->cltCrankingCorr[i] = i * 0.1f; + + // different values in running so we can tell which one is used + config->cltIdleCorrBins[i] = i * 10; + config->cltIdleCorr[i] = i * 0.2f; } + // First test without override (ie, normal running CLT corr table) + EXPECT_FLOAT_EQ(10, dut.getCrankingOpenLoop(10)); + EXPECT_FLOAT_EQ(50, dut.getCrankingOpenLoop(50)); + + // Test with override (use separate table) + engineConfiguration->overrideCrankingIacSetting = true; EXPECT_FLOAT_EQ(5, dut.getCrankingOpenLoop(10)); EXPECT_FLOAT_EQ(25, dut.getCrankingOpenLoop(50)); } @@ -214,17 +224,7 @@ struct MockOpenLoopIdler : public IdleController { MOCK_METHOD(float, getRunningOpenLoop, (float clt, SensorResult tps), (const, override)); }; -TEST(idle_v2, testOpenLoopCrankingNoOverride) { - WITH_ENGINE_TEST_HELPER(TEST_ENGINE); - StrictMock dut; - INJECT_ENGINE_REFERENCE(&dut); - - EXPECT_CALL(dut, getRunningOpenLoop(30, SensorResult(0))).WillOnce(Return(33)); - - EXPECT_FLOAT_EQ(33, dut.getOpenLoop(ICP::Cranking, 30, 0)); -} - -TEST(idle_v2, testOpenLoopCrankingOverride) { +TEST(idle_v2, testOpenLoopCranking) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock dut; INJECT_ENGINE_REFERENCE(&dut); @@ -243,7 +243,6 @@ TEST(idle_v2, openLoopRunningTaper) { StrictMock dut; INJECT_ENGINE_REFERENCE(&dut); - CONFIG(overrideCrankingIacSetting) = true; CONFIG(afterCrankingIACtaperDuration) = 500; EXPECT_CALL(dut, getRunningOpenLoop(30, SensorResult(0))).WillRepeatedly(Return(25));