| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /* | |||
| 2 | * @file test_ignition_scheduling.cpp | |||
| 3 | * | |||
| 4 | * @date Nov 17, 2019 | |||
| 5 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
| 6 | */ | |||
| 7 | ||||
| 8 | #include "pch.h" | |||
| 9 | #include "defaults.h" | |||
| 10 | #include "spark_logic.h" | |||
| 11 | ||||
| 12 | using ::testing::_; | |||
| 13 | using ::testing::InSequence; | |||
| 14 | using ::testing::StrictMock; | |||
| 15 | ||||
| 16 | 4 | TEST(ignition, twoCoils) { | ||
| 17 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::FRANKENSO_BMW_M73_F); | |
| 18 | ||||
| 19 | // let's recalculate with zero timing so that we can focus on relation advance between cylinders | |||
| 20 | 1 | setArrayValues(engine->engineState.timingAdvance, 0.0f); | ||
| 21 |
1/1✓ Branch 1 taken 1 time.
|
1 | initializeIgnitionActions(); | |
| 22 | ||||
| 23 | // first one to fire uses first coil | |||
| 24 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[0].coilIndex, 0); | |
| 25 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[1].coilIndex, 6); | |
| 26 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[2].coilIndex, 0); | |
| 27 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[3].coilIndex, 6); | |
| 28 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[4].coilIndex, 0); | |
| 29 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[5].coilIndex, 6); | |
| 30 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[6].coilIndex, 0); | |
| 31 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[7].coilIndex, 6); | |
| 32 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[8].coilIndex, 0); | |
| 33 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[9].coilIndex, 6); | |
| 34 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[10].coilIndex, 0); | |
| 35 |
2/6✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ(engine->ignitionEvents.elements[11].coilIndex, 6); | |
| 36 | ||||
| 37 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
|
1 | ASSERT_EQ(engine->ignitionEvents.elements[0].sparkAngle, 0); | |
| 38 |
3/8✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ((void*)engine->ignitionEvents.elements[0].outputs[0], (void*)&enginePins.coils[0]); | |
| 39 | ||||
| 40 | ||||
| 41 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
|
1 | ASSERT_EQ(engine->ignitionEvents.elements[1].sparkAngle, 720 / 12); | |
| 42 |
3/8✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ((void*)engine->ignitionEvents.elements[1].outputs[0], (void*)&enginePins.coils[6]); | |
| 43 | ||||
| 44 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
|
1 | ASSERT_EQ(engine->ignitionEvents.elements[3].sparkAngle, 3 * 720 / 12); | |
| 45 |
3/8✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ((void*)engine->ignitionEvents.elements[3].outputs[0], (void*)&enginePins.coils[6]); | |
| 46 | 1 | } | ||
| 47 | ||||
| 48 | 4 | TEST(ignition, trailingSpark) { | ||
| 49 | extern bool unitTestTaskPrecisionHack; | |||
| 50 | 1 | unitTestTaskPrecisionHack = true; | ||
| 51 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 52 | 1 | engineConfiguration->isFasterEngineSpinUpEnabled = false; | ||
| 53 | ||||
| 54 |
5/5✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 13 taken 1 time.
✓ Branch 17 taken 1 time.
|
3 | EXPECT_CALL(*eth.mockAirmass, getAirmass(_, _)) | |
| 55 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillRepeatedly(Return(AirmassResult{0.1008f, 50.0f})); | |
| 56 | ||||
| 57 |
1/1✓ Branch 1 taken 1 time.
|
1 | setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð); | |
| 58 | 1 | engineConfiguration->cylindersCount = 1; | ||
| 59 | 1 | engineConfiguration->firingOrder = FO_1; | ||
| 60 | 1 | engineConfiguration->isInjectionEnabled = false; | ||
| 61 | 1 | engineConfiguration->isIgnitionEnabled = true; | ||
| 62 | ||||
| 63 | // Fire trailing spark 10 degrees after main spark | |||
| 64 | 1 | engine->engineState.trailingSparkAngle = 10; | ||
| 65 | ||||
| 66 | 1 | engineConfiguration->injectionMode = IM_SEQUENTIAL; | ||
| 67 | ||||
| 68 |
1/1✓ Branch 1 taken 1 time.
|
1 | setWholeTimingTable(0); | |
| 69 | ||||
| 70 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireTriggerEventsWithDuration(20); | |
| 71 | // still no RPM since need to cycles measure cycle duration | |||
| 72 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireTriggerEventsWithDuration(20); | |
| 73 |
4/10✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
|
1 | ASSERT_EQ( 3000, Sensor::getOrZero(SensorType::Rpm)) << "RPM#0"; | |
| 74 | ||||
| 75 | /** | |||
| 76 | * Trigger up - scheduling fuel for full engine cycle | |||
| 77 | */ | |||
| 78 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.smartFireRise(20); | |
| 79 | ||||
| 80 | // Primary coil should be high | |||
| 81 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.coils[0].getLogicValue(), true); | |
| 82 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), false); | |
| 83 | ||||
| 84 | // Should be a TDC callback + spark firing | |||
| 85 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(engine->scheduler.size(), 2); | |
| 86 | ||||
| 87 | // execute all actions | |||
| 88 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 89 | ||||
| 90 | // Primary and secondary coils should be low - primary just fired | |||
| 91 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.coils[0].getLogicValue(), false); | |
| 92 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), false); | |
| 93 | ||||
| 94 | // Now enable trailing sparks | |||
| 95 | 1 | engineConfiguration->enableTrailingSparks = true; | ||
| 96 | ||||
| 97 | // Fire trigger fall - should schedule ignition chargings (rising edges) | |||
| 98 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireFall(20); | |
| 99 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(18); | |
| 100 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 101 | ||||
| 102 | // Primary low, scheduling trailing | |||
| 103 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.coils[0].getLogicValue(), true); | |
| 104 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), false); | |
| 105 | ||||
| 106 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(2); | |
| 107 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 108 | ||||
| 109 | // and secondary coils should be low | |||
| 110 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), true); | |
| 111 | ||||
| 112 | // Fire trigger rise - should schedule ignition firings | |||
| 113 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireRise(0); | |
| 114 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(1); | |
| 115 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 116 | ||||
| 117 | // Primary goes low, scheduling trailing | |||
| 118 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.coils[0].getLogicValue(), false); | |
| 119 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), true); | |
| 120 | ||||
| 121 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(1); | |
| 122 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 123 | // secondary coils should be low | |||
| 124 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(enginePins.trailingCoils[0].getLogicValue(), false); | |
| 125 | 1 | } | ||
| 126 | ||||
| 127 | 4 | TEST(ignition, CylinderTimingTrim) { | ||
| 128 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 129 | ||||
| 130 | // Base timing 15 degrees | |||
| 131 | 1 | setTable(config->ignitionTable, 15); | ||
| 132 | ||||
| 133 | // negative numbers retard timing, positive advance | |||
| 134 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTable(config->ignTrims[0].table, -4); | |
| 135 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTable(config->ignTrims[1].table, -2); | |
| 136 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTable(config->ignTrims[2].table, 2); | |
| 137 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTable(config->ignTrims[3].table, 4); | |
| 138 | ||||
| 139 | // run the ignition math | |||
| 140 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicFastCallback(); | |
| 141 | ||||
| 142 | // Check that each cylinder gets the expected timing | |||
| 143 | 1 | float unadjusted = 15; | ||
| 144 |
2/6✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
1 | EXPECT_NEAR(engine->engineState.timingAdvance[0], unadjusted - 4, EPS4D); | |
| 145 |
2/6✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
1 | EXPECT_NEAR(engine->engineState.timingAdvance[1], unadjusted - 2, EPS4D); | |
| 146 |
2/6✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
1 | EXPECT_NEAR(engine->engineState.timingAdvance[2], unadjusted + 2, EPS4D); | |
| 147 |
2/6✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
|
1 | EXPECT_NEAR(engine->engineState.timingAdvance[3], unadjusted + 4, EPS4D); | |
| 148 | 2 | } | ||
| 149 | ||||
| 150 | 4 | TEST(ignition, negativeAdvance) { | ||
| 151 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 152 | ||||
| 153 | 1 | int rpm = 0; | ||
| 154 | 1 | float load = 50; | ||
| 155 | ||||
| 156 | 1 | engineConfiguration->fixedTiming = -13; | ||
| 157 | 1 | engineConfiguration->timingMode = TM_FIXED; | ||
| 158 | // run the ignition math | |||
| 159 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicFastCallback(); | |
| 160 | ||||
| 161 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm)); | |
| 162 | ||||
| 163 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(DEFAULT_CRANKING_ANGLE, getCrankingAdvance(rpm, load)); | |
| 164 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(0, getAdvanceCorrections(load)); | |
| 165 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(707, engine->ignitionState.getWrappedAdvance(rpm, load)); | |
| 166 | ||||
| 167 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
|
1 | ASSERT_NEAR(-13, engine->ignitionState.baseIgnitionAdvance, EPS4D); | |
| 168 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
|
1 | ASSERT_NEAR(-13, engine->ignitionState.correctedIgnitionAdvance, EPS4D); | |
| 169 | 1 | } | ||
| 170 | ||||
| 171 | 4 | TEST(ignition, negativeAdvance2stroke) { | ||
| 172 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::SACHS); | |
| 173 | ||||
| 174 | 1 | int rpm = 0; | ||
| 175 | 1 | float load = 50; | ||
| 176 | ||||
| 177 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
|
1 | ASSERT_EQ(360, getEngineState()->engineCycle); | |
| 178 | ||||
| 179 | 1 | engineConfiguration->fixedTiming = -13; | ||
| 180 | 1 | engineConfiguration->timingMode = TM_FIXED; | ||
| 181 | // run the ignition math | |||
| 182 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicFastCallback(); | |
| 183 | ||||
| 184 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm)); | |
| 185 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(347, engine->ignitionState.getWrappedAdvance(rpm, load)); | |
| 186 | ||||
| 187 |
3/8✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
|
1 | ASSERT_NEAR(-13, engine->ignitionState.correctedIgnitionAdvance, EPS4D); | |
| 188 | 1 | } | ||
| 189 | ||||
| 190 | 4 | TEST(ignition, oddCylinderWastedSpark) { | ||
| 191 |
1/1✓ Branch 2 taken 1 time.
|
1 | StrictMock<MockExecutor> mockExec; | |
| 192 | ||||
| 193 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 194 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->scheduler.setMockExecutor(&mockExec); | |
| 195 | 1 | engineConfiguration->cylindersCount = 1; | ||
| 196 | 1 | engineConfiguration->firingOrder = FO_1; | ||
| 197 | 1 | engineConfiguration->ignitionMode = IM_WASTED_SPARK; | ||
| 198 | ||||
| 199 | 1 | efitick_t nowNt1 = 1000000; | ||
| 200 | 1 | efitick_t nowNt2 = 2222222; | ||
| 201 | ||||
| 202 | ||||
| 203 | 1 | engine->rpmCalculator.oneDegreeUs = 100; | ||
| 204 | ||||
| 205 | { | |||
| 206 |
1/1✓ Branch 2 taken 1 time.
|
1 | InSequence is; | |
| 207 | ||||
| 208 | // Should schedule one dwell+fire pair: | |||
| 209 | // Dwell 5 deg from now | |||
| 210 | 1 | float nt1deg = USF2NT(engine->rpmCalculator.oneDegreeUs); | ||
| 211 | 1 | efitick_t startTime = nowNt1 + nt1deg * 5; | ||
| 212 |
8/8✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
|
1 | EXPECT_CALL(mockExec, schedule(testing::NotNull(), _, startTime, _)); | |
| 213 | // Spark 15 deg from now | |||
| 214 | 1 | efitick_t endTime = startTime + nt1deg * 10; | ||
| 215 |
8/8✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
|
1 | EXPECT_CALL(mockExec, schedule(testing::NotNull(), _, endTime, _)); | |
| 216 | ||||
| 217 | ||||
| 218 | // Should schedule second dwell+fire pair, the out of phase copy | |||
| 219 | // Dwell 5 deg from now | |||
| 220 | 1 | startTime = nowNt2 + nt1deg * 5; | ||
| 221 |
8/8✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
|
1 | EXPECT_CALL(mockExec, schedule(testing::NotNull(), _, startTime, _)); | |
| 222 | // Spark 15 deg from now | |||
| 223 | 1 | endTime = startTime + nt1deg * 10; | ||
| 224 |
8/8✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
|
1 | EXPECT_CALL(mockExec, schedule(testing::NotNull(), _, endTime, _)); | |
| 225 | 1 | } | ||
| 226 | ||||
| 227 | 1 | engine->ignitionState.sparkDwell = 1; | ||
| 228 | ||||
| 229 | // dwell should start at 15 degrees ATDC and firing at 25 deg ATDC | |||
| 230 | 1 | engine->ignitionState.dwellDurationAngle = 10; | ||
| 231 | 1 | engine->engineState.timingAdvance[0] = -25; | ||
| 232 | 1 | engine->engineState.useOddFireWastedSpark = true; | ||
| 233 | 1 | engineConfiguration->minimumIgnitionTiming = -25; | ||
| 234 | ||||
| 235 | // expect to schedule the on-phase dwell and spark (not the wasted spark copy) | |||
| 236 |
1/1✓ Branch 1 taken 1 time.
|
1 | onTriggerEventSparkLogic(1200, nowNt1, 10, 30); | |
| 237 | ||||
| 238 | // expect to schedule second events, the out-of-phase dwell and spark (the wasted spark copy) | |||
| 239 |
1/1✓ Branch 1 taken 1 time.
|
1 | onTriggerEventSparkLogic(1200, nowNt2, 360 + 10, 360 + 30); | |
| 240 | 2 | } | ||
| 241 | ||||
| 242 | 4 | TEST(ignition, hardwareLatencyCorrection) { | ||
| 243 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 244 | // we dont need corrections nor diferent values on timing table for this test | |||
| 245 | 1 | engineConfiguration->fixedTiming = 15; | ||
| 246 | 1 | engineConfiguration->timingMode = TM_FIXED; | ||
| 247 | 1 | engineConfiguration->sparkHardwareLatencyCorrection = 0; | ||
| 248 | ||||
| 249 | // simulate some RPM for the getSparkHardwareLatencyCorrection() func | |||
| 250 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.smartFireTriggerEvents2(/*count*/2, /*delay*/ 20); | |
| 251 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.smartFireTriggerEvents2(/*count*/2, /*delay*/ 20); | |
| 252 | ||||
| 253 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(1500, Sensor::getOrZero(SensorType::Rpm)); | |
| 254 | ||||
| 255 | // default == no correction, should be 15 deg | |||
| 256 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
| 257 |
3/8✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
|
1 | ASSERT_NEAR(15, engine->engineState.timingAdvance[0], EPS4D); | |
| 258 | ||||
| 259 | // 200us of latency correction, should be 16.8 deg (at 1500 rpm) | |||
| 260 | 1 | engineConfiguration->sparkHardwareLatencyCorrection = 200; | ||
| 261 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
| 262 |
3/8✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
|
1 | ASSERT_NEAR(16.8, engine->engineState.timingAdvance[0], EPS4D); | |
| 263 | 1 | } | ||
| 264 |