From 810c392bb2cbd830675c78ba521ded50ca7f3173 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sat, 18 Jan 2025 02:51:15 -0800 Subject: [PATCH] OneCylinder::getSparkAngle --- firmware/controllers/algo/engine.h | 4 +++ .../controllers/engine_cycle/spark_logic.cpp | 35 ++++++++++--------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 58c71f75dc..b4c6f50f31 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -141,6 +141,10 @@ class OneCylinder final { angle_t getIgnitionTimingBtdc() const { return m_timingAdvance; } + + // Get angle of the spark firing in engine cycle coordinates, relative to #1 TDC + angle_t getSparkAngle(angle_t lateAdjustment) const; + private: bool m_valid = false; diff --git a/firmware/controllers/engine_cycle/spark_logic.cpp b/firmware/controllers/engine_cycle/spark_logic.cpp index 47cf12cdfa..9ecff14644 100644 --- a/firmware/controllers/engine_cycle/spark_logic.cpp +++ b/firmware/controllers/engine_cycle/spark_logic.cpp @@ -60,20 +60,9 @@ static int getIgnitionPinForIndex(int cylinderIndex, ignition_mode_e ignitionMod } } -static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_t sparkDwell, IgnitionEvent *event) { - // todo: clean up this implementation? does not look too nice as is. - - const int realCylinderNumber = getCylinderNumberAtIndex(event->cylinderIndex); - - // let's save planned duration so that we can later compare it with reality - event->sparkDwell = sparkDwell; - - const auto& cylinder = engine->cylinders[realCylinderNumber]; - +angle_t OneCylinder::getSparkAngle(angle_t lateAdjustment) const { // Compute the final ignition timing including all "late" adjustments - angle_t finalIgnitionTiming = cylinder.getIgnitionTimingBtdc() - // Pull any extra timing for knock retard - - engine->module()->getKnockRetard(); + angle_t finalIgnitionTiming = m_timingAdvance + lateAdjustment; // 10 ATDC ends up as 710, convert it to -10 so we can log and clamp correctly if (finalIgnitionTiming > 360) { @@ -86,13 +75,27 @@ static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_ // maximumIgnitionTiming limits maximum advance finalIgnitionTiming = clampF(engineConfiguration->minimumIgnitionTiming, finalIgnitionTiming, engineConfiguration->maximumIgnitionTiming); - engine->outputChannels.ignitionAdvanceCyl[realCylinderNumber] = finalIgnitionTiming; + engine->outputChannels.ignitionAdvanceCyl[m_cylinderNumber] = finalIgnitionTiming; - angle_t sparkAngle = + return // Negate because timing *before* TDC, and we schedule *after* TDC - finalIgnitionTiming // Offset by this cylinder's position in the cycle - + cylinder.getAngleOffset(); + + getAngleOffset(); +} + +static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_t sparkDwell, IgnitionEvent *event) { + // todo: clean up this implementation? does not look too nice as is. + + const int realCylinderNumber = getCylinderNumberAtIndex(event->cylinderIndex); + + // let's save planned duration so that we can later compare it with reality + event->sparkDwell = sparkDwell; + + angle_t sparkAngle = engine->cylinders[realCylinderNumber].getSparkAngle( + // Pull any extra timing for knock retard + - engine->module()->getKnockRetard() + ); efiAssertVoid(ObdCode::CUSTOM_SPARK_ANGLE_1, !std::isnan(sparkAngle), "sparkAngle#1"); wrapAngle(sparkAngle, "findAngle#2", ObdCode::CUSTOM_ERR_6550);