first spark out of order coilIndex logic in prepareCylinderIgnitionSchedule fix #6094

This commit is contained in:
Andrey 2024-02-29 01:47:43 -05:00
parent 4347c5c82e
commit 12db01c948
2 changed files with 11 additions and 10 deletions

View File

@ -85,7 +85,13 @@ static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_
// let's save planned duration so that we can later compare it with reality // let's save planned duration so that we can later compare it with reality
event->sparkDwell = sparkDwell; event->sparkDwell = sparkDwell;
angle_t finalIgnitionTiming = getEngineState()->timingAdvance[event->coilIndex]; auto ignitionMode = getCurrentIgnitionMode();
const int index = getIgnitionPinForIndex(event->cylinderIndex, ignitionMode);
const int coilIndex = ID2INDEX(getFiringOrderCylinderId(index));
angle_t finalIgnitionTiming = getEngineState()->timingAdvance[coilIndex];
// Stash which cylinder we're scheduling so that knock sensing knows which
// cylinder just fired
event->coilIndex = coilIndex;
// 10 ATDC ends up as 710, convert it to -10 so we can log and clamp correctly // 10 ATDC ends up as 710, convert it to -10 so we can log and clamp correctly
if (finalIgnitionTiming > 360) { if (finalIgnitionTiming > 360) {
@ -107,17 +113,14 @@ static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_
// Negate because timing *before* TDC, and we schedule *after* TDC // Negate because timing *before* TDC, and we schedule *after* TDC
- finalIgnitionTiming - finalIgnitionTiming
// Offset by this cylinder's position in the cycle // Offset by this cylinder's position in the cycle
+ getPerCylinderFiringOrderOffset(event->cylinderIndex, event->coilIndex); + getPerCylinderFiringOrderOffset(event->cylinderIndex, coilIndex);
efiAssertVoid(ObdCode::CUSTOM_SPARK_ANGLE_1, !cisnan(sparkAngle), "sparkAngle#1"); efiAssertVoid(ObdCode::CUSTOM_SPARK_ANGLE_1, !cisnan(sparkAngle), "sparkAngle#1");
wrapAngle(sparkAngle, "findAngle#2", ObdCode::CUSTOM_ERR_6550); wrapAngle(sparkAngle, "findAngle#2", ObdCode::CUSTOM_ERR_6550);
event->sparkAngle = sparkAngle; event->sparkAngle = sparkAngle;
auto ignitionMode = getCurrentIgnitionMode();
engine->outputChannels.currentIgnitionMode = static_cast<uint8_t>(ignitionMode); engine->outputChannels.currentIgnitionMode = static_cast<uint8_t>(ignitionMode);
const int index = getIgnitionPinForIndex(event->cylinderIndex, ignitionMode);
const int coilIndex = ID2INDEX(getFiringOrderCylinderId(index));
IgnitionOutputPin *output = &enginePins.coils[coilIndex]; IgnitionOutputPin *output = &enginePins.coils[coilIndex];
event->outputs[0] = output; event->outputs[0] = output;
IgnitionOutputPin *secondOutput; IgnitionOutputPin *secondOutput;
@ -139,9 +142,6 @@ static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_
event->outputs[1] = secondOutput; event->outputs[1] = secondOutput;
// Stash which cylinder we're scheduling so that knock sensing knows which
// cylinder just fired
event->coilIndex = coilIndex;
angle_t dwellStartAngle = sparkAngle - dwellAngleDuration; angle_t dwellStartAngle = sparkAngle - dwellAngleDuration;
efiAssertVoid(ObdCode::CUSTOM_ERR_6590, !cisnan(dwellStartAngle), "findAngle#5"); efiAssertVoid(ObdCode::CUSTOM_ERR_6590, !cisnan(dwellStartAngle), "findAngle#5");

View File

@ -27,13 +27,14 @@ TEST(OddFire, hd) {
// ASSERT_NEAR(-200.0, eth.timeToAngle(-66.66666), EPS3D); // ASSERT_NEAR(-200.0, eth.timeToAngle(-66.66666), EPS3D);
// ASSERT_NEAR(160.0, eth.timeToAngle(53.333333), EPS3D); // ASSERT_NEAR(160.0, eth.timeToAngle(53.333333), EPS3D);
// ASSERT_NEAR(-168.0, eth.timeToAngle(-56.0), EPS3D); // ASSERT_NEAR(-168.0, eth.timeToAngle(-56.0), EPS3D);
// ASSERT_NEAR(32, eth.timeToAngle(10.66666666), EPS3D);
float expectedAngle3 = -180 - cylinderOne - timing; float expectedAngle3 = -180 + cylinderTwo - timing;
ASSERT_EQ( 8, engine->executor.size()); ASSERT_EQ( 8, engine->executor.size());
eth.assertEvent5("spark down#3", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle3)); eth.assertEvent5("spark down#3", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle3));
float expectedAngle7 = -180 - cylinderOne - timing; float expectedAngle7 = -180 + cylinderTwo - timing;
eth.assertEvent5("spark down#7", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle7)); eth.assertEvent5("spark down#7", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle7));