diff --git a/firmware/CHANGELOG.md b/firmware/CHANGELOG.md index 6ce3b9b761..f719e6b1c9 100644 --- a/firmware/CHANGELOG.md +++ b/firmware/CHANGELOG.md @@ -40,6 +40,7 @@ Release template (copy/paste this for new release): - hellen128 better ETB pin choice between rev A/B and C - Base map values for Open Loop Boost Duty should be 0% #6188 - HPFP control on cam with variable timing #6245 + - Negative timing is not displayed correctly fix #5250 ### Breaking Changes - wrong trigger naming for missing teeth #6258 diff --git a/firmware/controllers/algo/engine2.cpp b/firmware/controllers/algo/engine2.cpp index 2b3c289662..57baade851 100644 --- a/firmware/controllers/algo/engine2.cpp +++ b/firmware/controllers/algo/engine2.cpp @@ -95,6 +95,8 @@ void EngineState::updateSparkSkip() { #endif // EFI_LAUNCH_CONTROL } +#define MAKE_HUMAN_READABLE_ADVANCE(advance) (advance > getEngineState()->engineCycle / 2 ? advance - getEngineState()->engineCycle : advance) + void EngineState::periodicFastCallback() { ScopePerf perf(PE::EngineStatePeriodicFastCallback); @@ -172,8 +174,8 @@ void EngineState::periodicFastCallback() { // Degrees of timing REMOVED from actual timing during soft RPM limit window - getLimpManager()->getLimitingTimingRetard(); // these fields are scaled_channel so let's only use for observability, with a local variables holding value while it matters locally - engine->ignitionState.baseIgnitionAdvance = baseAdvance; - engine->ignitionState.correctedIgnitionAdvance = correctedIgnitionAdvance; + engine->ignitionState.baseIgnitionAdvance = MAKE_HUMAN_READABLE_ADVANCE(baseAdvance); + engine->ignitionState.correctedIgnitionAdvance = MAKE_HUMAN_READABLE_ADVANCE(correctedIgnitionAdvance); // compute per-bank fueling diff --git a/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp b/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp index a8b14505da..04bc620097 100644 --- a/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp +++ b/unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp @@ -168,7 +168,26 @@ TEST(ignition, negativeAdvance) { 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); + ASSERT_NEAR(-13, engine->ignitionState.baseIgnitionAdvance, EPS4D); + ASSERT_NEAR(-13, engine->ignitionState.correctedIgnitionAdvance, EPS4D); +} + +TEST(ignition, negativeAdvance2stroke) { + EngineTestHelper eth(engine_type_e::SACHS); + + int rpm = 0; + float load = 50; + + ASSERT_EQ(360, getEngineState()->engineCycle); + + engineConfiguration->fixedTiming = -13; + engineConfiguration->timingMode = TM_FIXED; + // run the ignition math + engine->periodicFastCallback(); + + eth.assertRpm(0); + ASSERT_EQ(347, getAdvance(rpm, load)); + + ASSERT_NEAR(-13, engine->ignitionState.correctedIgnitionAdvance, EPS4D); }