diff --git a/firmware/controllers/algo/advance_map.cpp b/firmware/controllers/algo/advance_map.cpp index 5909c94605..a9f3927ad1 100644 --- a/firmware/controllers/algo/advance_map.cpp +++ b/firmware/controllers/algo/advance_map.cpp @@ -39,7 +39,7 @@ static Map3DtimingMode == TM_FIXED) { return engineConfiguration->fixedTiming; } @@ -120,7 +120,7 @@ static angle_t getRunningAdvance(int rpm, float engineLoad) { return advanceAngle; } -static angle_t getAdvanceCorrections(float engineLoad) { +angle_t getAdvanceCorrections(float engineLoad) { auto iat = Sensor::get(SensorType::Iat); if (!iat) { @@ -151,7 +151,7 @@ static angle_t getAdvanceCorrections(float engineLoad) { /** * @return ignition timing angle advance before TDC for Cranking */ -static angle_t getCrankingAdvance(int rpm, float engineLoad) { +angle_t getCrankingAdvance(int rpm, float engineLoad) { // get advance from the separate table for Cranking if (engineConfiguration->useSeparateAdvanceForCranking) { return interpolate2d(rpm, config->crankingAdvanceBins, config->crankingAdvance); diff --git a/firmware/controllers/algo/advance_map.h b/firmware/controllers/algo/advance_map.h index 52c976a45f..5698457afb 100644 --- a/firmware/controllers/algo/advance_map.h +++ b/firmware/controllers/algo/advance_map.h @@ -15,6 +15,10 @@ angle_t getCylinderIgnitionTrim(size_t cylinderNumber, int rpm, float ignitionLo * this method is used to build default advance map */ float getInitialAdvance(int rpm, float map, float advanceMax); +// public only for unit tests +angle_t getCrankingAdvance(int rpm, float engineLoad); +angle_t getRunningAdvance(int rpm, float engineLoad); +angle_t getAdvanceCorrections(float engineLoad); size_t getMultiSparkCount(int rpm); void initIgnitionAdvanceControl(); diff --git a/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp b/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp index 8d6168d85a..a8b14505da 100644 --- a/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp +++ b/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp @@ -6,6 +6,7 @@ */ #include "pch.h" +#include "defaults.h" #include "spark_logic.h" using ::testing::_; @@ -148,3 +149,26 @@ TEST(ignition, CylinderTimingTrim) { EXPECT_NEAR(engine->engineState.timingAdvance[2], unadjusted + 2, EPS4D); EXPECT_NEAR(engine->engineState.timingAdvance[3], unadjusted + 4, EPS4D); } + +TEST(ignition, negativeAdvance) { + EngineTestHelper eth(engine_type_e::TEST_ENGINE); + + int rpm = 0; + float load = 50; + + engineConfiguration->fixedTiming = -13; + engineConfiguration->timingMode = TM_FIXED; + // run the ignition math + engine->periodicFastCallback(); + + eth.assertRpm(0); + + ASSERT_EQ(DEFAULT_CRANKING_ANGLE, getCrankingAdvance(rpm, load)); + ASSERT_EQ(-13, getRunningAdvance(rpm, load)); + ASSERT_EQ(0, getAdvanceCorrections(load)); + ASSERT_EQ(707, getAdvance(rpm, load)); + + ASSERT_NEAR(-603.72, engine->ignitionState.baseIgnitionAdvance, EPS4D); + ASSERT_NEAR(-603.72, engine->ignitionState.correctedIgnitionAdvance, EPS4D); +} +