GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/ignition_injection/test_ignition_scheduling.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 162 0 162
Functions: 100.0% 21 0 21
Branches: 50.6% 214 0 423
Decisions: -% 0 - 0

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(&eth);
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