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 |