GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/trigger/test_trigger_decoder.cpp
Date: 2025-10-03 00:57:22
Warnings: 5 unchecked decisions!
Coverage Exec Excl Total
Lines: 99.3% 698 0 703
Functions: 98.3% 59 0 60
Branches: 48.5% 1026 0 2114
Decisions: 40.9% 9 - 22

Line Branch Decision Exec Source
1 /**
2 * @file test_trigger_decoder.cpp
3 *
4 * @date Dec 24, 2013
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #include "trigger_decoder.h"
11 #include "ford_aspire.h"
12 #include "dodge_neon.h"
13 #include "ford_1995_inline_6.h"
14 #include "event_queue.h"
15 #include "trigger_mazda.h"
16 #include "trigger_chrysler.h"
17 #include "speed_density.h"
18 #include "fuel_math.h"
19 #include "spark_logic.h"
20 #include "trigger_universal.h"
21 #include "engine_configuration_defaults.h"
22
23 using ::testing::_;
24
25 2 static int getTriggerZeroEventIndex(engine_type_e engineType) {
26
1/1
✓ Branch 2 taken 2 times.
2 EngineTestHelper eth(engineType);
27
28
1/1
✓ Branch 1 taken 2 times.
2 initDataStructures();
29
30 2 const auto& triggerConfiguration = engine->triggerCentral.primaryTriggerConfiguration;
31
32 2 TriggerWaveform& shape = eth.engine.triggerCentral.triggerShape;
33
1/1
✓ Branch 1 taken 2 times.
4 return eth.engine.triggerCentral.triggerState.findTriggerZeroEventIndex(shape, triggerConfiguration);
34 2 }
35
36 4 TEST(trigger, testSkipped2_0) {
37
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
38 // for this test we need a trigger with isSynchronizationNeeded=true
39 1 engineConfiguration->trigger.customTotalToothCount = 2;
40 1 engineConfiguration->trigger.customSkippedToothCount = 0;
41
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL);
42
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( 0, round(Sensor::getOrZero(SensorType::Rpm))) << "testNoStartUpWarnings RPM";
43 1 }
44
45 4 TEST(trigger, testSomethingWeird) {
46
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::FORD_INLINE_6_1995);
47
48
1/1
✓ Branch 2 taken 1 time.
1 TriggerDecoderBase state_("test");
49
50 1 const auto& triggerConfiguration = engine->triggerCentral.primaryTriggerConfiguration;
51
52
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(state_.shaft_is_synchronized) << "shaft_is_synchronized";
53 1 int r = 10;
54
1/1
✓ Branch 1 taken 1 time.
1 state_.decodeTriggerEvent("t", engine->triggerCentral.triggerShape, /* override */ nullptr, triggerConfiguration, SHAFT_PRIMARY_RISING, ++r);
55
2/8
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_TRUE(state_.shaft_is_synchronized); // first signal rise synchronize
56
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, state_.getCurrentIndex());
57
58
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 4 times.
✓ Decision 'false' taken 1 time.
5 for (int i = 2; i < 10; i += 2) {
59
1/1
✓ Branch 1 taken 4 times.
4 state_.decodeTriggerEvent("t", engine->triggerCentral.triggerShape, /* override */ nullptr, triggerConfiguration, SHAFT_PRIMARY_RISING, r++);
60
4/10
✓ Branch 2 taken 4 times.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 4 times.
✗ Branch 31 not taken.
4 ASSERT_NEAR(i, state_.getCurrentIndex(), 0.0001) << "even";
61 }
62
63
1/1
✓ Branch 1 taken 1 time.
1 state_.decodeTriggerEvent("test", engine->triggerCentral.triggerShape, /* override */ nullptr, triggerConfiguration, SHAFT_PRIMARY_RISING, r++);
64
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(10, state_.getCurrentIndex());
65
66
1/1
✓ Branch 1 taken 1 time.
1 state_.decodeTriggerEvent("test", engine->triggerCentral.triggerShape, /* override */ nullptr, triggerConfiguration, SHAFT_PRIMARY_RISING, r++);
67
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, state_.getCurrentIndex()); // new revolution
68 1 }
69
70 4 TEST(trigger, test1995FordInline6TriggerDecoder) {
71
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( 0, getTriggerZeroEventIndex(engine_type_e::FORD_INLINE_6_1995)) << "triggerIndex ";
72
73
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::FORD_INLINE_6_1995);
74 1 setTable(config->ignitionIatCorrTable, 0);
75 1 engineConfiguration->isFasterEngineSpinUpEnabled = false;
76
77 1 engineConfiguration->minimumIgnitionTiming = -15;
78
1/1
✓ Branch 1 taken 1 time.
1 setWholeTimingTable(-13);
79
80
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Iat, 49.579071f);
81
82 1 TriggerWaveform * shape = &engine->triggerCentral.triggerShape;
83
84
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( 0, shape->getTriggerWaveformSynchPointIndex()) << "triggerShapeSynchPointIndex";
85
86
1/1
✓ Branch 1 taken 1 time.
1 eth.applyTriggerWaveform();
87
88
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
89
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents(48);
90
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(2000, Sensor::getOrZero(SensorType::Rpm));
91
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
92
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents(48);
93
94 1 IgnitionEventList *ecl = &engine->ignitionEvents;
95
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ(true, ecl->isReady) << "ford inline ignition events size";
96
97
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(ecl->elements[0].dwellAngle, 7, 1e-3);
98
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(ecl->elements[0].sparkAngle, 13, 1e-3);
99
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(ecl->elements[5].dwellAngle, 607, 1e-3);
100
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(ecl->elements[5].sparkAngle, 613.0f, 1e-3);
101
102
1/1
✓ Branch 1 taken 1 time.
1 engine->ignitionState.updateDwell(2000, false);
103
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_FLOAT_EQ(0.5, engine->ignitionState.getDwell()) << "running dwell";
104 }
105
106 4 TEST(misc, testGetCoilDutyCycleIssue977) {
107
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
108
1/1
✓ Branch 1 taken 1 time.
1 setSingleCoilDwell();
109 1 engineConfiguration->ignitionMode = IM_ONE_COIL;
110
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_FORD_ASPIRE);
111
112 1 float rpm = 2000;
113
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(rpm);
114
1/1
✓ Branch 1 taken 1 time.
1 engine->ignitionState.updateDwell(rpm, false);
115
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( 4, engine->ignitionState.getDwell()) << "running dwell";
116
117
4/9
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR( 26.66666, getCoilDutyCycle(rpm), 0.0001);
118 1 }
119
120 4 TEST(misc, testFordAspire) {
121
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** testFordAspire\r\n");
122
123
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( 4, getTriggerZeroEventIndex(engine_type_e::FORD_ASPIRE_1996)) << "getTriggerZeroEventIndex";
124
125
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::FORD_ASPIRE_1996);
126
127
5/11
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✓ Branch 37 taken 1 time.
✗ Branch 38 not taken.
1 ASSERT_EQ( 4, getTriggerCentral()->triggerShape.getTriggerWaveformSynchPointIndex()) << "getTriggerWaveformSynchPointIndex";
128
129 1 engineConfiguration->crankingTimingAngle = 31;
130
131 1 int rpm = 2000;
132
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(rpm);
133
1/1
✓ Branch 1 taken 1 time.
1 engine->ignitionState.updateDwell(rpm, false);
134
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( 4, engine->ignitionState.getDwell()) << "running dwell";
135
136
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(6000);
137
1/1
✓ Branch 1 taken 1 time.
1 engine->ignitionState.updateDwell(6000, false);
138
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(3.25, engine->ignitionState.getDwell(), 0.0001) << "higher rpm dwell";
139
140 }
141
142 extern TriggerDecoderBase initState;
143
144 13 static void testTriggerDecoder2(const char *msg, engine_type_e type, int synchPointIndex, float channel1duty, float channel2duty, float expectedGapRatio = NAN) {
145
1/1
✓ Branch 1 taken 13 times.
13 printf("====================================================================================== testTriggerDecoder2 msg=%s\r\n", msg);
146
147 // Some configs use aux valves, which requires this sensor
148
1/1
✓ Branch 6 taken 13 times.
39 std::unordered_map<SensorType, float> sensorVals = {{SensorType::DriverThrottleIntent, 0}};
149
1/1
✓ Branch 2 taken 13 times.
13 EngineTestHelper eth(type, sensorVals);
150
151 13 TriggerWaveform *t = &engine->triggerCentral.triggerShape;
152
153
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 13 times.
✗ Branch 34 not taken.
13 ASSERT_FALSE(t->shapeDefinitionError) << "isError";
154
155
4/11
✓ Branch 3 taken 13 times.
✓ Branch 6 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 13 times.
✗ Branch 36 not taken.
13 ASSERT_EQ(synchPointIndex, t->getTriggerWaveformSynchPointIndex()) << "synchPointIndex " << msg;
156
2/2
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 12 times.
2/2
✓ Decision 'true' taken 1 time.
✓ Decision 'false' taken 12 times.
13 if (!std::isnan(expectedGapRatio)) {
157
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(expectedGapRatio, initState.triggerSyncGapRatio, 0.001) << "actual gap ratio";
158 }
159 13 }
160
161 //same as testTriggerDecoder2 but using trigger type not engine type
162 2 static void testTriggerDecoderByTriggerType(const char *msg, trigger_type_e type, int synchPointIndex, float channel1duty, float channel2duty, float expectedGapRatio = NAN) {
163
1/1
✓ Branch 1 taken 2 times.
2 printf("====================================================================================== testTriggerDecoderByTriggerName msg=%s\r\n", msg);
164
165 // Some configs use aux valves, which requires this sensor
166
1/1
✓ Branch 6 taken 2 times.
6 std::unordered_map<SensorType, float> sensorVals = {{SensorType::DriverThrottleIntent, 0}};
167
1/1
✓ Branch 2 taken 2 times.
2 EngineTestHelper eth(engine_type_e::TEST_ENGINE, sensorVals);
168
1/1
✓ Branch 1 taken 2 times.
2 eth.setTriggerType(type);
169
170 2 TriggerWaveform *t = &engine->triggerCentral.triggerShape;
171
172
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
2 ASSERT_FALSE(t->shapeDefinitionError) << "isError";
173
174
4/11
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
2 ASSERT_EQ(synchPointIndex, t->getTriggerWaveformSynchPointIndex()) << "synchPointIndex " << msg;
175
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 2 times.
2 if (!std::isnan(expectedGapRatio)) {
176 ASSERT_NEAR(expectedGapRatio, initState.triggerSyncGapRatio, 0.001) << "actual gap ratio";
177 }
178 2 }
179
180 2 static void assertActionCallbacksEqual(const char *msg, action_s const& expected_action, action_s const& actual_action) {
181
3/9
✓ Branch 6 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
2 ASSERT_EQ(expected_action.getCallback(), actual_action.getCallback()) << msg;
182 }
183
184 extern bool debugSignalExecutor;
185
186 1 void configureTestDefaultLambdas() {
187 1 constexpr size_t TEST_LAMBDA_TABLE_COLUMN_COUNT = efi::size(engine_configuration_defaults::DEFAULT_LAMBDA_TABLE_ROW);
188 static_assert(TEST_LAMBDA_TABLE_COLUMN_COUNT == efi::size(engine_configuration_defaults::DEFAULT_LAMBDA_LOAD_BINS));
189 static_assert(TEST_LAMBDA_TABLE_COLUMN_COUNT <= FUEL_LOAD_COUNT);
190 1 copyArray(config->lambdaLoadBins, engine_configuration_defaults::DEFAULT_LAMBDA_LOAD_BINS);
191
192 // Set each row to the corresponding value from rowValues
193
2/2
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 1 time.
2/2
✓ Decision 'true' taken 16 times.
✓ Decision 'false' taken 1 time.
17 for (size_t i = 0; i < efi::size(config->lambdaTable); i++) {
194
2/2
✓ Branch 2 taken 256 times.
✓ Branch 3 taken 16 times.
2/2
✓ Decision 'true' taken 256 times.
✓ Decision 'false' taken 16 times.
272 for (size_t j = 0; j < efi::size(config->lambdaTable[i]); j++) {
195 256 config->lambdaTable[i][j] = engine_configuration_defaults::DEFAULT_LAMBDA_TABLE_ROW[i];
196 }
197 }
198 1 }
199
200 4 TEST(misc, testRpmCalculator) {
201
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::FORD_INLINE_6_1995);
202
1/3
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 3 not taken.
1 efiAssertVoid(ObdCode::CUSTOM_ERR_6670, engineConfiguration!=NULL, "null config in engine");
203
204
1/1
✓ Branch 1 taken 1 time.
1 configureTestDefaultLambdas();
205 1 setTable(config->injectionPhase, -180.0f);
206
207 1 engine->tdcMarkEnabled = false;
208
209 // These tests were written when the default target AFR was 14.0, so replicate that
210 1 engineConfiguration->stoichRatioPrimary = 14;
211
212
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(_, _))
213
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(AirmassResult{0.3024f, 50.0f}));
214
215 1 IgnitionEventList *ilist = &engine->ignitionEvents;
216
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 0, ilist->isReady) << "size #1";
217
218
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 720, engine->engineState.engineCycle) << "engineCycle";
219
220 1 engineConfiguration->minimumIgnitionTiming = -15;
221 1 float timingAdvance = -13;
222
1/1
✓ Branch 1 taken 1 time.
1 setWholeTimingTable(timingAdvance);
223
224 1 engineConfiguration->trigger.customTotalToothCount = 8;
225
1/1
✓ Branch 1 taken 1 time.
1 eth.applyTriggerWaveform();
226
227
1/1
✓ Branch 1 taken 1 time.
1 setFlatInjectorLag(0);
228
229
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSlowSensors();
230
231
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, round(Sensor::getOrZero(SensorType::Rpm)));
232
233 // triggerIndexByAngle update is now fixed! prepareOutputSignals() wasn't reliably called
234
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(4, engine->triggerCentral.triggerShape.findAngleIndex(&engine->triggerCentral.triggerFormDetails, 240));
235
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(4, engine->triggerCentral.triggerShape.findAngleIndex(&engine->triggerCentral.triggerFormDetails, 241));
236
237
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents(/* count */ 48);
238
239
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));
240
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( 14, engine->triggerCentral.triggerState.getCurrentIndex()) << "index #1";
241
242
243
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
244
245 // debugSignalExecutor = true;
246
247
4/9
✓ 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.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(engine->triggerCentral.triggerState.getShaftSynchronized(), 1);
248
249
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardMs(5 /*ms*/);
250
251
1/1
✓ Branch 2 taken 1 time.
1 int start = getTimeNowUs();
252
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 485000, start) << "start value";
253
254
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
255
256
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(engine->engineState.timingAdvance[0], 720 + timingAdvance, 0.1f);
257
258
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(4.5450, engine->engineState.injectionDuration, EPS4D) << "fuel #1";
259 1 InjectionEvent *ie0 = &engine->injectionEvents.elements[0];
260
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(499.095, ie0->injectionStartAngle, EPS4D) << "injection angle";
261
262
1/1
✓ Branch 1 taken 1 time.
1 eth.firePrimaryTriggerRise();
263
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));
264
265
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(eth.timeToAngle(FORD_INLINE_DWELL), engine->ignitionState.dwellDurationAngle, EPS4D) << "dwell";
266
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(4.5450, engine->engineState.injectionDuration, EPS4D) << "fuel #2";
267
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(111.1111, engine->rpmCalculator.oneDegreeUs, EPS4D) << "one degree";
268
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, ilist->isReady) << "size #2";
269
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(ilist->elements[0].dwellAngle, 8.5f, 1e-3);
270
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(ilist->elements[0].sparkAngle, 13.0f, 1e-3);
271
272
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( 0, engine->triggerCentral.triggerState.getCurrentIndex()) << "index #2";
273
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( 4, engine->scheduler.size()) << "queue size/2";
274 {
275
1/1
✓ Branch 1 taken 1 time.
1 auto const ev0{ engine->scheduler.getForUnitTest(0) };
276 1 auto const turnSparkPinHighStartChargingAction{ action_s::make<turnSparkPinHighStartCharging>((IgnitionEvent*){}) };
277
1/1
✓ Branch 1 taken 1 time.
1 assertActionCallbacksEqual("Call@0", ev0->action, turnSparkPinHighStartChargingAction);
278
3/9
✓ Branch 5 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
1 ASSERT_EQ(start + 944, ev0->getMomentUs()) << "ev 0";
279
2/7
✓ Branch 4 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_EQ(&enginePins.coils[0], ev0->action.getArgument<IgnitionEvent*>()->outputs[0]) << "coil 0";
280
281
1/1
✓ Branch 1 taken 1 time.
1 auto const ev1{ engine->scheduler.getForUnitTest(1) };
282 1 auto const fireSparkAndPrepareNextScheduleAction{ action_s::make<fireSparkAndPrepareNextSchedule>((IgnitionEvent*){}) };
283
1/1
✓ Branch 1 taken 1 time.
1 assertActionCallbacksEqual("Call@1", ev1->action, fireSparkAndPrepareNextScheduleAction);
284
3/9
✓ Branch 5 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
1 ASSERT_EQ(start + 944 + 1000 * FORD_INLINE_DWELL, ev1->getMomentUs()) << "ev 1";
285
2/7
✓ Branch 4 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_EQ(&enginePins.coils[0], ev1->action.getArgument<IgnitionEvent*>()->outputs[0]) << "coil 1";
286 }
287
288
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
289
290
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
291
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(5);
292
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
293
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( 2, engine->triggerCentral.triggerState.getCurrentIndex()) << "index #3";
294
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( 4, engine->scheduler.size()) << "queue size 3";
295
296
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 13333 - 1515 + 2459, engine->scheduler.getForUnitTest(0)->getMomentUs()) << "ev 3";
297
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 14277 + 500, engine->scheduler.getForUnitTest(1)->getMomentUs()) << "ev 5";
298
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 14777 + 677, engine->scheduler.getForUnitTest(2)->getMomentUs()) << "3/3";
299
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
300
301
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(4, engine->triggerCentral.triggerShape.findAngleIndex(&engine->triggerCentral.triggerFormDetails, 240));
302
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(4, engine->triggerCentral.triggerShape.findAngleIndex(&engine->triggerCentral.triggerFormDetails, 241));
303
304
305
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
306
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( 0, engine->scheduler.size()) << "queue size 4.1";
307
308
309
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(5);
310
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( 4, engine->scheduler.size()) << "queue size 4.2";
311
312
313
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(5);
314
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( 4, engine->scheduler.size()) << "queue size 4.3";
315
316
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(eth.timeToAngle(FORD_INLINE_DWELL), engine->ignitionState.dwellDurationAngle, EPS4D) << "dwell";
317
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(4.5450, engine->engineState.injectionDuration, EPS4D) << "fuel #3";
318
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));
319
320
321
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( 6, engine->triggerCentral.triggerState.getCurrentIndex()) << "index #4";
322
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( 4, engine->scheduler.size()) << "queue size 4";
323
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
324
325
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
326
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( 0, engine->scheduler.size()) << "queue size 5";
327 // todo: assert queue elements
328
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
329
330
331
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(5);
332
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( 4, engine->scheduler.size()) << "queue size 6";
333
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 40944, engine->scheduler.getForUnitTest(0)->getMomentUs()) << "6/0";
334
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 41444, engine->scheduler.getForUnitTest(1)->getMomentUs()) << "6/1";
335
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
336
337
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
338
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( 0, engine->scheduler.size()) << "queue size 7";
339
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
340
341
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(5 /*ms*/);
342
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(5);
343
344
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( 4, engine->scheduler.size()) << "queue size 8";
345
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 53333 - 1515 + 2459, engine->scheduler.getForUnitTest(0)->getMomentUs()) << "8/0";
346
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ(start + 54277 + 2459 - 1959, engine->scheduler.getForUnitTest(1)->getMomentUs()) << "8/1";
347
1/1
✓ Branch 1 taken 1 time.
1 engine->scheduler.clear();
348 1 }
349
350 4 TEST(trigger, testAnotherTriggerDecoder) {
351 1 testTriggerDecoder2("Miata 2003", engine_type_e::MAZDA_MIATA_NB2, 3, 0.38888889, 0.0);
352 1 }
353
354 4 TEST(trigger, testTriggerDecoder) {
355 1 printf("====================================================================================== testTriggerDecoder\r\n");
356
357 {
358
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
359 1 TriggerWaveform * s = &engine->triggerCentral.triggerShape;
360
361
1/1
✓ Branch 1 taken 1 time.
1 initializeSkippedToothTrigger(s, 2, 0, FOUR_STROKE_CAM_SENSOR, SyncEdge::Rise);
362
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(4u, s->getSize()) << "shape size";
363
3/8
✓ Branch 5 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(s->wave.getSwitchTime(0), 0.25);
364
3/8
✓ Branch 5 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(s->wave.getSwitchTime(1), 0.5);
365
3/8
✓ Branch 5 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(s->wave.getSwitchTime(2), 0.75);
366
3/8
✓ Branch 5 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(s->wave.getSwitchTime(3), 1);
367 1 }
368
369 1 printf("====================================================================================== testTriggerDecoder part 2\r\n");
370 1 testTriggerDecoder2("Dodge Neon 1995", engine_type_e::DODGE_NEON_1995, 0, 0.4931, 0.2070);
371
372 1 testTriggerDecoder2("ford aspire", engine_type_e::FORD_ASPIRE_1996, 4, 0.0000, 0.5);
373
374 1 testTriggerDecoder2("dodge ram", engine_type_e::DODGE_RAM, 16, 0.5000, 0.06);
375
376 1 testTriggerDecoder2("Miata NB2", engine_type_e::MAZDA_MIATA_NB2, 3, 0.3888888955, 0);
377
378 1 printf("====================================================================================== testTriggerDecoder part 3\r\n");
379
380 1 testTriggerDecoder2("test 2/1 both", engine_type_e::TEST_ISSUE_366_BOTH, 0, 0.2500, 0.0);
381 1 testTriggerDecoder2("test 2/1 rise", engine_type_e::TEST_ISSUE_366_RISE, 0, 0.0000, 0.0);
382
383 1 testTriggerDecoder2("test engine", engine_type_e::TEST_ENGINE, 0, 0.7500, 0.2500);
384 1 testTriggerDecoder2("testGY6_139QMB", engine_type_e::GY6_139QMB, 0, 0.4375, 0.0);
385
386 1 testTriggerDecoderByTriggerType("testFordEscortGt", trigger_type_e::TT_MAZDA_DOHC_1_4, 0, 0.8096, 0.3844);
387
388 1 testTriggerDecoderByTriggerType("NISSAN_PRIMERA", trigger_type_e::TT_NISSAN_SR20VE, 2, 0.9611, 0.0);
389
390 1 testTriggerDecoder2("test1+1", engine_type_e::DEFAULT_FRANKENSO, 0, 0.7500, 0.2500);
391
392 1 testTriggerDecoder2("neon NGC4", engine_type_e::DODGE_NEON_2003_CRANK, 6, 0.5000, 0.0, CHRYSLER_NGC4_GAP);
393
394 {
395
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::DODGE_NEON_2003_CRANK);
396
397
1/1
✓ Branch 1 taken 1 time.
1 printf("!!!!!!!!!!!!!!!!!! Now trying with only rising edges !!!!!!!!!!!!!!!!!\r\n");
398
399
1/1
✓ Branch 1 taken 1 time.
1 applyNonPersistentConfiguration();
400
1/1
✓ Branch 1 taken 1 time.
1 prepareOutputSignals();
401
402 1 }
403
404 1 testTriggerDecoder2("sachs", engine_type_e::SACHS, 0, 0.4800, 0.000);
405
406 1 testTriggerDecoder2("vw ABA", engine_type_e::VW_ABA, 0, 0.51666, 0.0);
407 }
408
409 54 static void assertInjectionEventBase(const char *msg, InjectionEvent *ev, int injectorIndex, int eventIndex, angle_t angleOffset) {
410
2/8
✓ Branch 2 taken 54 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 54 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
54 EXPECT_EQ(injectorIndex, ev->outputs[0]->injectorIndex) << msg << "inj index";
411
2/8
✓ Branch 2 taken 54 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 54 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
54 EXPECT_NEAR_M4(angleOffset, ev->injectionStartAngle) << msg << "inj index";
412 54 }
413
414 8 static void assertInjectionEvent(const char *msg, InjectionEvent *ev, int injectorIndex, int eventIndex, angle_t angleOffset) {
415 8 assertInjectionEventBase(msg, ev, injectorIndex, eventIndex, angleOffset);
416
417 // There should NOT be a second injector configured
418
2/6
✓ Branch 2 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
8 EXPECT_EQ(nullptr, ev->outputs[1]);
419 8 }
420
421 46 static void assertInjectionEventBatch(const char *msg, InjectionEvent *ev, int injectorIndex, int secondInjectorIndex, int eventIndex, angle_t angleOffset) {
422 46 assertInjectionEventBase(msg, ev, injectorIndex, eventIndex, angleOffset);
423
424 // There should be a second injector - confirm it's the correct one
425
3/8
✓ Branch 3 taken 46 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 46 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 46 times.
✗ Branch 27 not taken.
46 ASSERT_NE(nullptr, ev->outputs[1]);
426
2/6
✓ Branch 2 taken 46 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 46 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
46 EXPECT_EQ(secondInjectorIndex, ev->outputs[1]->injectorIndex);
427 }
428
429 // https://sourceforge.net/p/rusefi/tickets/299/
430 3 static void setTestBug299(EngineTestHelper *eth) {
431 3 setupSimpleTestEngineWithMafAndTT_ONE_trigger(eth);
432
5/5
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 10 taken 3 times.
✓ Branch 13 taken 3 times.
✓ Branch 17 taken 3 times.
9 EXPECT_CALL(*eth->mockAirmass, getAirmass(_, _))
433
3/3
✓ Branch 5 taken 3 times.
✓ Branch 8 taken 3 times.
✓ Branch 11 taken 3 times.
9 .WillRepeatedly(Return(AirmassResult{0.1008001f, 50.0f}));
434
435 3 Engine *engine = &eth->engine;
436
437
438
4/9
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
3 ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm));
439
440 3 eth->fireTriggerEventsWithDuration(20);
441 // still no RPM since need to cycles measure cycle duration
442
4/9
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
3 ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm));
443 3 eth->fireTriggerEventsWithDuration(20);
444
4/9
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 32 not taken.
3 ASSERT_EQ(3000, Sensor::getOrZero(SensorType::Rpm));
445
446 3 eth->clearQueue();
447
448 /**
449 * Trigger up - scheduling fuel for full engine cycle
450 */
451 3 eth->fireRise(20);
452 // fuel schedule - short pulses.
453 // time...|0.......|10......|20......|30......|40
454 // inj #0 |.......#|........|.......#|........|
455 // inj #1 |........|.......#|........|.......#|
456
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#00";
457
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 3u, getRevolutionCounter()) << "rev cnt#3";
458 3 eth->assertInjectorUpEvent("setTestBug299: 1@0", 0, MS2US(8.5), 2);
459 3 eth->assertInjectorDownEvent("@1", 1, MS2US(10), 2);
460 3 eth->assertInjectorUpEvent("1@2", 2, MS2US(18.5), 3);
461 3 eth->assertInjectorDownEvent("1@3", 3, MS2US(20), 3);
462
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 0, eth->executeActions()) << "exec#0";
463
464 3 FuelSchedule * t = &engine->injectionEvents;
465
466 3 assertInjectionEventBatch("#0", &t->elements[0], 0, 3, 1, 153 + 360);
467 3 assertInjectionEventBatch("#1_i_@", &t->elements[1], 2, 1, 1, 333 + 360);
468 3 assertInjectionEventBatch("#2@", &t->elements[2], 3, 0, 0, 153);
469 3 assertInjectionEventBatch("inj#3@", &t->elements[3], 1, 2, 0, 153 + 180);
470
471 /**
472 * Trigger down - no new events, executing some
473 */
474 3 eth->fireFall(20);
475 // same exact picture
476 // time...|-20.....|-10.....|0.......|10......|20
477 // inj #0 |.......#|........|.......#|........|
478 // inj #1 |........|.......#|........|.......#|
479
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 8, engine->scheduler.size()) << "qs#0";
480
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 3u, getRevolutionCounter()) << "rev cnt#3";
481 3 eth->assertInjectorUpEvent("02@0", 0, MS2US(-11.5), 2);
482 3 eth->assertInjectorDownEvent("@1", 1, MS2US(-10), 2);
483 3 eth->assertInjectorUpEvent("@2", 2, MS2US(-1.5), 3);
484 3 eth->assertInjectorDownEvent("02@3", 3, MS2US(0), 3);
485 3 eth->assertInjectorUpEvent("02@4", 4, MS2US(8.5), 0);
486 3 eth->assertInjectorDownEvent("@5", 5, MS2US(10), 0);
487 3 eth->assertInjectorUpEvent("02@6", 6, MS2US(18.5), 1);
488 3 eth->assertInjectorDownEvent("@7", 7, MS2US(20), 1);
489
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4, eth->executeActions()) << "exec#1";
490
491
492 /**
493 * Trigger up again
494 */
495 3 eth->moveTimeForwardMs(20 /*ms*/);
496 3 eth->assertInjectorUpEvent("22@0", 0, MS2US(-11.5), 0);
497 3 eth->assertInjectorDownEvent("22@1", 1, MS2US(-10), 0);
498 3 eth->assertInjectorUpEvent("22@2", 2, MS2US(-1.5), 1);
499 3 eth->assertInjectorDownEvent("22@3", 3, MS2US(0), 1);
500
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4, eth->executeActions()) << "exec#20";
501
502 3 eth->firePrimaryTriggerRise();
503
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#0-2";
504 // fuel schedule - short pulses. and more realistic schedule this time
505 // time...|-20.....|-10.....|0.......|10......|20
506 // inj #0 |.......#|........|.......#|........|
507 // inj #1 |........|.......#|........|.......#|
508 3 eth->assertInjectorUpEvent("2@0", 0, MS2US(8.5), 2);
509 3 eth->assertInjectorDownEvent("@1", 1, MS2US(10), 2);
510 3 eth->assertInjectorUpEvent("@2", 2, MS2US(18.5), 3);
511 3 eth->assertInjectorDownEvent("2@3", 3, MS2US(20), 3);
512
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 0, eth->executeActions()) << "exec#2";
513
514
515 3 eth->moveTimeForwardUs(MS2US(20));
516 3 eth->executeActions();
517 3 eth->firePrimaryTriggerFall();
518 // fuel schedule - short pulses. and more realistic schedule this time
519 // time...|-20.....|-10.....|0.......|10......|20
520 // inj #0 |.......#|........|........|........|
521 // inj #1 |........|.......#|........|........|
522
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#0-2";
523
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 4u, getRevolutionCounter()) << "rev cnt#4";
524 3 eth->assertInjectorUpEvent("0@0", 0, MS2US(8.5), 0);
525 3 eth->assertInjectorDownEvent("0@1", 1, MS2US(10), 0);
526 3 eth->assertInjectorUpEvent("0@2", 2, MS2US(18.5), 1);
527 3 eth->assertInjectorDownEvent("0@3", 3, MS2US(20), 1);
528
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 0, eth->executeActions()) << "exec#3";
529
530
531
3/9
✓ Branch 3 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
3 ASSERT_EQ( 1, engine->fuelComputer.running.intakeTemperatureCoefficient) << "iatC";
532
3/9
✓ Branch 3 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
3 ASSERT_EQ( 1, engine->fuelComputer.running.coolantTemperatureCoefficient) << "cltC";
533
5/11
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✓ Branch 11 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 3 times.
✗ Branch 39 not taken.
3 ASSERT_EQ( 0, engine->module<InjectorModelPrimary>()->getDeadtime()) << "lag";
534
535
4/10
✓ Branch 3 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 35 not taken.
3 ASSERT_EQ( 3000, round(Sensor::getOrZero(SensorType::Rpm))) << "setTestBug299: RPM";
536
537
3/9
✓ Branch 2 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
3 ASSERT_NEAR(1.5, engine->engineState.injectionDuration, EPS4D) << "fuel #1";
538
5/11
✓ Branch 2 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 3 times.
✗ Branch 34 not taken.
0/1
? Decision couldn't be analyzed.
3 ASSERT_NEAR(7.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))), EPS4D) << "duty for maf=0";
539 }
540
541 #define assertInjectors(msg, value0, value1) \
542 { \
543 EXPECT_EQ(value0, enginePins.injectors[0].currentLogicValue) << msg; \
544 EXPECT_EQ(value1, enginePins.injectors[1].currentLogicValue) << msg; \
545 }
546
547 static void setArray(float* p, size_t count, float value) {
548 while (count--) {
549 *p++ = value;
550 }
551 }
552
553 2 void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
554
1/1
✓ Branch 1 taken 2 times.
2 printf("*************************************************** testFuelSchedulerBug299 small to medium\r\n");
555
556
1/1
✓ Branch 2 taken 2 times.
2 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
557 extern bool unitTestBusyWaitHack;
558 2 unitTestBusyWaitHack = true;
559 2 setTable(config->injectionPhase, -180.0f);
560 2 engineConfiguration->isFasterEngineSpinUpEnabled = false;
561 2 engine->tdcMarkEnabled = false;
562
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardMs(startUpDelayMs); // nice to know that same test works the same with different anount of idle time on start
563
1/1
✓ Branch 1 taken 2 times.
2 setTestBug299(&eth);
564
565 FuelSchedule * t;
566
567
4/14
✓ Branch 3 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
4 assertInjectors("#0_inj", 0, 0);
568
569
1/1
✓ Branch 1 taken 2 times.
2 engine->periodicFastCallback();
570
571 2 engine->engineState.injectionDuration = 12.5f;
572 // Injection duration of 12.5ms
573
1/1
✓ Branch 2 taken 2 times.
2 MockInjectorModel2 im;
574
7/7
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 19 taken 2 times.
✓ Branch 22 taken 2 times.
✓ Branch 25 taken 2 times.
2 EXPECT_CALL(im, getInjectionDuration(_)).WillRepeatedly(Return(12.5f));
575
1/1
✓ Branch 1 taken 2 times.
2 engine->module<InjectorModelPrimary>().set(&im);
576
577
5/11
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
0/1
? Decision couldn't be analyzed.
2 ASSERT_NEAR(62.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))), EPS4D) << "duty for maf=3";
578
579
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#1";
580
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
581
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, eth.executeActions()) << "exec#2#0";
582
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, engine->scheduler.size()) << "qs#1#2";
583
584
585
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4u, getRevolutionCounter()) << "rev cnt#4#0";
586
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerRise();
587
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5u, getRevolutionCounter()) << "rev cnt#4#1";
588 // time...|0.......|10......|20......|30......|40......|50......|60......|
589 // inj #0 |########|##...###|########|.....###|########|........|........|
590 // inj #1 |.....###|########|....####|########|........|........|........|
591
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 6, engine->scheduler.size()) << "qs#4";
592 //todo assertInjectorUpEvent("04@0", 0, MS2US(0), 0);
593 // assertInjectorUpEvent("04@1", 1, MS2US(7.5), 1);
594 // assertInjectorDownEvent("04@2", 2, MS2US(12.5), 0);
595 // assertInjectorUpEvent("04@3", 3, MS2US(17.5), 0);
596 // assertInjectorDownEvent("04@4", 4, MS2US(20), 1);
597 // assertInjectorDownEvent("04@5", 5, MS2US(30), 0);
598 // assertInjectorDownEvent("04@6", 6, MS2US(30), 0);
599 // assertInjectorUpEvent("04@7", 7, MS2US(37.5), 0);
600 // assertInjectorDownEvent("04@8", 8, MS2US(40.0), 1);
601 // assertInjectorDownEvent("04@9", 9, MS2US(50.0), 0);
602
603 // {
604 // scheduling_s *ev = engine->scheduler.getForUnitTest(9);
605 // ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#4#2";
606 // ASSERT_TRUE(ev == &engineConfiguration->fuelActuators[2].signalPair[1].signalTimerDown) << "down 50";
607 // }
608
609
610
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, eth.executeActions()) << "exec#4";
611
612
613
1/1
✓ Branch 1 taken 2 times.
2 eth.fireFall(20);
614
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 8, engine->scheduler.size()) << "qs#2#1";
615
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5u, getRevolutionCounter()) << "rev cnt#5";
616 // using old fuel schedule - but already wider pulses
617 // time...|-20.....|-10.....|0.......|10......|20......|30......|40......|
618 // inj #0 |........|.....###|########|.....###|########|........|........|
619 // inj #1 |.....###|########|.....###|########|........|........|........|
620 // assertInjectorUpEvent("5@0", 0, MS2US(-12.5), 1);
621 // assertInjectorDownEvent("5@1", 1, MS2US(-7.5), 0);
622 // assertInjectorUpEvent("5@2", 2, MS2US(-2.5), 0);
623 // assertInjectorDownEvent("5@3", 3, MS2US(0), 1);
624 // assertInjectorUpEvent("5@4", 4, MS2US(7.5), 1);
625 //
626 // assertInjectorDownEvent("5@4", 5, MS2US(10), 0);
627 // assertInjectorUpEvent("5@6", 6, MS2US(17.5), 0);
628 // assertInjectorDownEvent("5@7", 7, MS2US(20.0), 1);
629 // assertInjectorDownEvent("5@8", 8, MS2US(30.0), 0);
630
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 3, eth.executeActions()) << "exec#5";
631
632 /**
633 * one more revolution
634 */
635
636 2 t = &engine->injectionEvents;
637
638
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#0", &t->elements[0], 0, 3, 0, 315);
639
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#1__", &t->elements[1], 2, 1, 1, 495);
640
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("inj#2", &t->elements[2], 3, 0, 0, 153);
641
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("inj#3", &t->elements[3], 1, 2, 0, 333);
642
643
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
644
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5, engine->scheduler.size()) << "qs#02";
645 // assertInjectorUpEvent("6@0", 0, MS2US(-12.5), 1);
646 // assertInjectorDownEvent("6@1", 1, MS2US(-10.0), 0);
647 // assertInjectorUpEvent("6@2", 2, MS2US(-2.5), 0);
648 // assertInjectorDownEvent("6@3", 3, MS2US(0), 1);
649 // assertInjectorDownEvent("6@4", 4, MS2US(10.0), 0);
650
651 // so placing this 'executeAll' changes much?
652
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5, eth.executeActions()) << "exec#07";
653
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, engine->scheduler.size()) << "qs#07";
654 // assertInjectorDownEvent("26@0", 0, MS2US(10.0), 0);
655
656
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerRise();
657
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#2#2";
658
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 6u, getRevolutionCounter()) << "rev cnt6";
659 // time...|-20.....|-10.....|0.......|10......|20......|30......|40......|
660 // inj #0 |########|.....###|########|....####|........|........|........|
661 // inj #1 |.....###|########|.....###|########|........|........|........|
662 // assertInjectorDownEvent("06@5", 5, MS2US(30.0), 0);
663 // assertInjectorUpEvent("06@6", 6, MS2US(37.5), 0);
664 // assertInjectorDownEvent("06@7", 7, MS2US(40.0), 1);
665
666
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, eth.executeActions()) << "exec#7";
667
668
4/14
✓ Branch 3 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
4 assertInjectors("#1_ij_", 0, 0);
669
670
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
671
672 // time...|-20.....|-10.....|0.......|10......|20......|30......|40......|
673 // inj #0 |########|.......#|........|........|........|........|........|
674 // inj #1 |....####|########|........|........|........|........|........|
675
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, engine->scheduler.size()) << "qs#022";
676 // assertInjectorUpEvent("7@0", 0, MS2US(-12.5), 1);
677 // assertInjectorDownEvent("7@1", 1, MS2US(-10.0), 0);
678 // assertInjectorUpEvent("7@2", 2, MS2US(-2.5), 0);
679 // assertInjectorDownEvent("7@3", 3, MS2US(0), 1);
680 // assertInjectorDownEvent("7@4", 4, MS2US(10), 0);
681 //// assertInjectorDownEvent("i7@5", 5, MS2US(20.0), 0);
682 //// assertInjectorUpEvent("7@6", 6, MS2US(17.5), 0);
683 //// assertInjectorDownEvent("7@7", 7, MS2US(20), 1);
684 // // todo index 8
685
686
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 3, eth.executeActions()) << "executed #06";
687
4/14
✓ Branch 3 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
4 assertInjectors("#4", 1, 0);
688
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 1, engine->scheduler.size()) << "qs#06";
689
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorDownEvent("17@0", 0, MS2US(10), 0);
690 // assertInjectorDownEvent("17@1", 1, MS2US(10.0), 0);
691 // assertInjectorUpEvent("17@2", 2, MS2US(17.5), 0);
692 // assertInjectorDownEvent("17@3", 3, MS2US(20), 1);
693 // todo index 4
694
695
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerFall();
696
697
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5, engine->scheduler.size()) << "qs#3";
698
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 6u, getRevolutionCounter()) << "rev cnt6";
699
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, eth.executeActions()) << "executed #6";
700
701
702
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
703
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, eth.executeActions()) << "executed #06";
704
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 1, engine->scheduler.size()) << "qs#06";
705
4/14
✓ Branch 3 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
4 assertInjectors("inj#2", 1, 0);
706
707
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerRise();
708
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 5, engine->scheduler.size()) << "Queue.size#03";
709
710
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorUpEvent("07@0", 0, MS2US(7.5), 3);
711
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorDownEvent("07@1", 1, MS2US(10), 2);
712
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorUpEvent("07@2", 2, MS2US(17.5), 0);
713
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorDownEvent("07@3", 3, MS2US(20), 3);
714
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorDownEvent("07@4", 4, MS2US(30), 0);
715 // assertInjectorDownEvent("07@5", 5, MS2US(30), 0);
716 // assertInjectorUpEvent("07@6", 6, MS2US(37.5), 0);
717 // assertInjectorDownEvent("07@7", 7, MS2US(40), 1);
718 // assertInjectorDownEvent("07@8", 8, MS2US(50), 0);
719
720
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 0, eth.executeActions()) << "executeAll#3";
721
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
722
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 4, eth.executeActions()) << "executeAll#4";
723
724 2 t = &engine->injectionEvents;
725
726
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#0#", &t->elements[0], 0, 3, 0, 135 + 180);
727
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#1#", &t->elements[1], 2, 1, 1, 135 + 360);
728
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#2#", &t->elements[2], 3, 0, 1, 135 + 540);
729
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#3#", &t->elements[3], 1, 2, 0, 135);
730
731 2 engine->engineState.injectionDuration = 17.5;
732 // Injection duration of 17.5ms
733
1/1
✓ Branch 2 taken 2 times.
2 MockInjectorModel2 im2;
734
7/7
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 19 taken 2 times.
✓ Branch 22 taken 2 times.
✓ Branch 25 taken 2 times.
2 EXPECT_CALL(im2, getInjectionDuration(_)).WillRepeatedly(Return(17.5f));
735
1/1
✓ Branch 1 taken 2 times.
2 engine->module<InjectorModelPrimary>().set(&im2);
736
737 // duty cycle above 75% is a special use-case because 'special' fuel event overlappes the next normal event in batch mode
738
5/11
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
0/1
? Decision couldn't be analyzed.
2 ASSERT_NEAR(87.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))), EPS4D) << "duty for maf=3";
739
740
741
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#03", &t->elements[0], 0, 3, 0, 315);
742
743
744
3/9
✓ Branch 3 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
2 ASSERT_EQ( 1, enginePins.injectors[0].currentLogicValue) << "inj#0";
745
746
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ( 1, engine->scheduler.size()) << "Queue.size#04";
747
1/1
✓ Branch 1 taken 2 times.
2 eth.assertInjectorDownEvent("08@0", 0, MS2US(10), 0);
748 // assertInjectorDownEvent("08@1", 1, MS2US(10), 0);
749 // assertInjectorUpEvent("08@2", 2, MS2US(17.5), 0);
750 // assertInjectorDownEvent("08@3", 3, MS2US(20), 1);
751 // assertInjectorDownEvent("08@4", 4, MS2US(30), 0);
752
753
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerFall();
754
755
756
1/1
✓ Branch 1 taken 2 times.
2 eth.executeActions();
757
1/1
✓ Branch 1 taken 2 times.
2 eth.fireRise(20);
758
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ(9, engine->scheduler.size()) << "Queue.size#05";
759
1/1
✓ Branch 1 taken 2 times.
2 eth.executeActions();
760
761
762
1/1
✓ Branch 1 taken 2 times.
2 eth.fireFall(20);
763
1/1
✓ Branch 1 taken 2 times.
2 eth.executeActions();
764
765
1/1
✓ Branch 1 taken 2 times.
2 eth.moveTimeForwardUs(MS2US(20));
766
1/1
✓ Branch 1 taken 2 times.
2 eth.executeActions();
767
1/1
✓ Branch 1 taken 2 times.
2 eth.firePrimaryTriggerRise();
768
769 2 t = &engine->injectionEvents;
770
771
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#00", &t->elements[0], 0, 3, 0, 225); // 87.5 duty cycle
772
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#10", &t->elements[1], 2, 1, 1, 45 + 360);
773
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#20", &t->elements[2], 3, 0, 1, 225 + 360);
774
1/1
✓ Branch 1 taken 2 times.
2 assertInjectionEventBatch("#30", &t->elements[3], 1, 2, 0, 45);
775
776 // todo: what's what? a mix of new something and old something?
777
4/10
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
2 ASSERT_EQ(6, engine->scheduler.size()) << "qs#5";
778 // assertInjectorDownEvent("8@0", 0, MS2US(5.0), 1);
779 // assertInjectorUpEvent("8@1", 1, MS2US(7.5), 1);
780 // assertInjectorDownEvent("8@2", 2, MS2US(15.0), 0);
781 // assertInjectorUpEvent("8@3", 3, MS2US(17.5), 0);
782 // assertInjectorDownEvent("8@4", 4, MS2US(25), 1);
783 // assertInjectorDownEvent("8@5", 5, MS2US(35), 0);
784 //// assertInjectorDownEvent("8@6", 6, MS2US(35), 0);
785 //// assertInjectorUpEvent("8@7", 7, MS2US(37.5), 0);
786 //// assertInjectorDownEvent("8@8", 8, MS2US(45), 1);
787 //// assertInjectorDownEvent("8@9", 9, MS2US(55), 0);
788
789
4/10
✓ Branch 3 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
2 ASSERT_EQ( 0u, getRecentWarnings()->getCount()) << "warningCounter#testFuelSchedulerBug299smallAndMedium";
790 2 }
791
792 4 void setInjectionMode(int value) {
793 4 engineConfiguration->injectionMode = (injection_mode_e) value;
794 4 incrementGlobalConfigurationVersion();
795 4 }
796
797 #if FUEL_RPM_COUNT == 16
798 4 TEST(big, testFuelSchedulerBug299smallAndMedium) {
799 1 doTestFuelSchedulerBug299smallAndMedium(0);
800 1 doTestFuelSchedulerBug299smallAndMedium(1000);
801 1 }
802 #endif //FUEL_RPM_COUNT == 16
803
804 #if FUEL_RPM_COUNT == 16
805 4 TEST(big, testTwoWireBatch) {
806
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
807 1 setTable(config->injectionPhase, -180.0f);
808
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
809
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(_, _))
810
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}));
811
812 1 engineConfiguration->injectionMode = IM_BATCH;
813
814
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
815 // still no RPM since need to cycles measure cycle duration
816
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
817
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
818
819 /**
820 * Trigger up - scheduling fuel for full engine cycle
821 */
822
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
823
824 1 FuelSchedule * t = &engine->injectionEvents;
825
826
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#0", &t->elements[0], 0, 3, 1, 153 + 360); // Cyl 1 and 4
827
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#1_i_@", &t->elements[1], 2, 1, 1, 153 + 540); // Cyl 3 and 2
828
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#2@", &t->elements[2], 3, 0, 0, 153); // Cyl 4 and 1
829
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("inj#3@", &t->elements[3], 1, 2, 0, 153 + 180); // Cyl 2 and 3
830 2 }
831 #endif //FUEL_RPM_COUNT == 16
832
833 #if FUEL_RPM_COUNT == 16
834 4 TEST(big, testSequential) {
835
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
836 1 setTable(config->injectionPhase, -180.0f);
837
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(_, _))
838
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}));
839
840
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
841
842 1 engineConfiguration->injectionMode = IM_SEQUENTIAL;
843
844
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
845 // still no RPM since need to cycles measure cycle duration
846
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
847
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
848
849 /**
850 * Trigger up - scheduling fuel for full engine cycle
851 */
852
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
853
854 1 FuelSchedule * t = &engine->injectionEvents;
855
856
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#0", &t->elements[0], 0, 1, 126 + 360); // Cyl 1
857
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#1_i_@", &t->elements[1], 2, 1, 126 + 540); // Cyl 3
858
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#2@", &t->elements[2], 3, 0, 126); // Cyl 4
859
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("inj#3@", &t->elements[3], 1, 0, 126 + 180); // Cyl 2
860 2 }
861 #endif //FUEL_RPM_COUNT == 16
862
863 #if FUEL_RPM_COUNT == 16
864 4 TEST(big, testBatch) {
865
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
866 1 setTable(config->injectionPhase, -180.0f);
867
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(_, _))
868
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}));
869
870
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
871
872 1 engineConfiguration->injectionMode = IM_BATCH;
873
874
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
875 // still no RPM since need to cycles measure cycle duration
876
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
877
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
878
879 /**
880 * Trigger up - scheduling fuel for full engine cycle
881 */
882
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
883
884 1 FuelSchedule * t = &engine->injectionEvents;
885
886
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#0", &t->elements[0], 0, 3, 1, 153 + 360); // Cyl 1 + 4
887
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#1_i_@", &t->elements[1], 2, 1, 1, 153 + 540); // Cyl 3 + 2
888
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("#2@", &t->elements[2], 3, 0, 0, 153); // Cyl 4 + 1
889
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEventBatch("inj#3@", &t->elements[3], 1, 2, 0, 153 + 180); // Cyl 2 + 3
890 2 }
891 #endif //FUEL_RPM_COUNT == 16
892
893 #if FUEL_RPM_COUNT == 16
894 4 TEST(big, testSinglePoint) {
895
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
896 1 engineConfiguration->hpfpCamLobes = 0;
897 1 setTable(config->injectionPhase, -180.0f);
898
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(_, _))
899
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}));
900
901
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
902
903 1 engineConfiguration->injectionMode = IM_SINGLE_POINT;
904
905
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
906 // still no RPM since need to cycles measure cycle duration
907
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(20);
908
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
909
910 /**
911 * Trigger up - scheduling fuel for full engine cycle
912 */
913
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
914
915 1 FuelSchedule * t = &engine->injectionEvents;
916
917
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#0", &t->elements[0], 0, 1, 126 + 360); // Cyl 1
918
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#1_i_@", &t->elements[1], 0, 1, 126 + 540); // Cyl 3
919
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("#2@", &t->elements[2], 0, 0, 126); // Cyl 4
920
1/1
✓ Branch 1 taken 1 time.
1 assertInjectionEvent("inj#3@", &t->elements[3], 0, 0, 126 + 180); // Cyl 2
921 2 }
922 #endif //FUEL_RPM_COUNT == 16
923
924 #if FUEL_RPM_COUNT == 16
925 4 TEST(big, testFuelSchedulerBug299smallAndLarge) {
926
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
927 extern bool unitTestBusyWaitHack;
928 1 unitTestBusyWaitHack = true;
929 1 engineConfiguration->hpfpCamLobes = 0;
930 1 setTable(config->injectionPhase, -180.0f);
931 1 engineConfiguration->isFasterEngineSpinUpEnabled = false;
932 1 engine->tdcMarkEnabled = false;
933
1/1
✓ Branch 1 taken 1 time.
1 setTestBug299(&eth);
934
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( 4, engine->scheduler.size()) << "Lqs#0";
935
936
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
937
938 1 engine->engineState.injectionDuration = 17.5f;
939 // Injection duration of 17.5ms
940
1/1
✓ Branch 2 taken 1 time.
1 MockInjectorModel2 im;
941
7/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 25 taken 1 time.
1 EXPECT_CALL(im, getInjectionDuration(_)).WillRepeatedly(Return(17.5f));
942
1/1
✓ Branch 1 taken 1 time.
1 engine->module<InjectorModelPrimary>().set(&im);
943
944
5/11
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
0/1
? Decision couldn't be analyzed.
1 ASSERT_NEAR(87.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))), EPS4D) << "Lduty for maf=3";
945
946
947
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( 4, engine->scheduler.size()) << "Lqs#1";
948
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(20));
949
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
950
951 // injector #1 is low before the test
952
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(enginePins.injectors[0].currentLogicValue) << "injector@0";
953
954
1/1
✓ Branch 1 taken 1 time.
1 eth.firePrimaryTriggerRise();
955
956 // time...|0.......|10......|20......|30......|40......|50......|60......|
957 // inj #0 |########|########|########|.....###|########|........|........|
958 // inj #1 |..######|########|....####|########|........|........|........|
959
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( 6, engine->scheduler.size()) << "Lqs#4";
960
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L04@0", 0, MS2US(8.5), 2);
961
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L04@1", 1, MS2US(12.5), 0);
962 // special overlapping injection is merged with one of the scheduled injections
963
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L04@2", 2, MS2US(18.5), 3);
964
965
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L04@3", 3, MS2US(26), 2);
966
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L04@4", 4, MS2US(30), 0);
967
968 // assertInjectorDownEvent("L04@5", 5, MS2US(30), 0);
969 // assertInjectorUpEvent("L04@6", 6, MS2US(32.5), 0);
970 // assertInjectorDownEvent("L04@7", 7, MS2US(40.0), 1);
971 // assertInjectorDownEvent("L04@8", 8, MS2US(50.0), 0);
972
973
974
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 engine->scheduler.executeAll(getTimeNowUs() + 1);
975 // injector goes high...
976
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(enginePins.injectors[0].currentLogicValue) << "injector@1";
977
978
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 engine->scheduler.executeAll(getTimeNowUs() + MS2US(17.5) + 1);
979 // injector does not go low too soon, that's a feature :)
980
2/9
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_TRUE(enginePins.injectors[0].currentLogicValue) << "injector@2";
981
982
983
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
984
985
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( 6, engine->scheduler.size()) << "Lqs#04";
986
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L015@0", 0, MS2US(-1.5), 3);
987
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L015@1", 1, MS2US(2.5), 1);
988
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L015@2", 2, MS2US(6), 2);
989
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L015@3", 3, MS2US(10), 0);
990
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L015@4", 4, MS2US(16), 3);
991 //todo assertInjectorDownEvent("L015@5", 5, MS2US(30), 0);
992
993
994
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 engine->scheduler.executeAll(getTimeNowUs() + MS2US(10) + 1);
995 // end of combined injection
996
2/9
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(enginePins.injectors[0].currentLogicValue) << "injector@3";
997
998
999
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(20));
1000
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1001
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( 0, engine->scheduler.size()) << "Lqs#04";
1002
1003
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
1004
1005 // Injection duration of 2ms
1006 1 engine->engineState.injectionDuration = 2.0f;
1007
1/1
✓ Branch 2 taken 1 time.
1 MockInjectorModel2 im2;
1008
7/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 25 taken 1 time.
1 EXPECT_CALL(im2, getInjectionDuration(_)).WillRepeatedly(Return(2.0f));
1009
1/1
✓ Branch 1 taken 1 time.
1 engine->module<InjectorModelPrimary>().set(&im2);
1010
1011
5/11
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✓ Branch 37 taken 1 time.
✗ Branch 38 not taken.
0/1
? Decision couldn't be analyzed.
1 ASSERT_EQ( 10, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm)))) << "Lduty for maf=3";
1012
1013
1014
1/1
✓ Branch 1 taken 1 time.
1 eth.firePrimaryTriggerRise();
1015
1016 //todoASSERT_EQ( 5, engine->scheduler.size()) << "Lqs#05";
1017 //todo assertInjectorUpEvent("L016@0", 0, MS2US(8), 0);
1018 //todo assertInjectorDownEvent("L016@1", 1, MS2US(10), 0);
1019 //todo assertInjectorDownEvent("L016@2", 2, MS2US(10), 0);
1020
1021
1022
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(20));
1023
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions(); // issue here
1024
1/1
✓ Branch 1 taken 1 time.
1 eth.firePrimaryTriggerFall();
1025
1026
1027
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(20));
1028
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1029
1/1
✓ Branch 1 taken 1 time.
1 eth.firePrimaryTriggerRise();
1030
1031
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( 4, engine->scheduler.size()) << "Lqs#5";
1032
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L05@0", 0, MS2US(8), 2);
1033
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L05@1", 1, MS2US(10), 2);
1034
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorUpEvent("L05@2", 2, MS2US(18), 3);
1035
1/1
✓ Branch 1 taken 1 time.
1 eth.assertInjectorDownEvent("L05@3", 3, MS2US(20), 3);
1036
1037
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(20));
1038
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1039
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ( 0u, getRecentWarnings()->getCount()) << "warningCounter#testFuelSchedulerBug299smallAndLarge";
1040 1 }
1041 #endif //FUEL_RPM_COUNT == 16
1042
1043 4 TEST(big, testSparkReverseOrderBug319) {
1044
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** testSparkReverseOrderBug319 small to medium\r\n");
1045
1046
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
1047 1 engineConfiguration->isFasterEngineSpinUpEnabled = false;
1048 1 engine->tdcMarkEnabled = false;
1049
1050 1 engineConfiguration->isInjectionEnabled = false;
1051 1 engineConfiguration->cylindersCount = 4;
1052 1 engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS;
1053
1054
1/1
✓ Branch 1 taken 1 time.
1 setConstantDwell(45);
1055
1056
1/1
✓ Branch 1 taken 1 time.
1 engine->triggerCentral.syncEnginePhaseAndReport(2, 0);
1057
1058 // this is needed to update injectorLag
1059
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSlowSensors();
1060
1061
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_HALF_MOON);
1062
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
1063
1064
1/1
✓ Branch 1 taken 1 time.
1 setWholeTimingTable(0);
1065
1066
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1067
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1068
1069
1/1
✓ Branch 1 taken 1 time.
1 engine->triggerCentral.syncEnginePhaseAndReport(2, 0);
1070
1071
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1072
1073
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1074
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1075
1076
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, round(Sensor::getOrZero(SensorType::Rpm))) << "testSparkReverseOrderBug319: RPM";
1077
1078
1079
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( 8, engine->scheduler.size()) << "testSparkReverseOrderBug319: queue size";
1080
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1081
1/1
✓ Branch 1 taken 1 time.
1 printf("***************************************************\r\n");
1082
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 0, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #1";
1083
1084
1085
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1086
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1087
1088 /**
1089 * here we throw scheduling logic off
1090 */
1091
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(0.1); // executing new signal too early
1092
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1093
1094
1095
1096
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(200)); // moving time forward to execute all pending actions
1097
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1098
1099
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #2";
1100
1101
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** now let's have a good engine cycle and confirm things work\r\n");
1102
1103
1104
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1105
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1106
1107
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( 545, round(Sensor::getOrZero(SensorType::Rpm))) << "RPM#2";
1108
1109
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #3";
1110
1111
1112
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1113
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1114
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1u, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #4";
1115
1116
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** (rpm is back) now let's have a good engine cycle and confirm things work\r\n");
1117
1118
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1119
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1120
1121
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, round(Sensor::getOrZero(SensorType::Rpm))) << "RPM#3";
1122
1123
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #5 on c4";
1124
1125
1126
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1127
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1128
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #6 on c4";
1129
1130
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** (rpm is back 2) now let's have a good engine cycle and confirm things work\r\n");
1131
1132
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1133
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1134
1135
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, round(Sensor::getOrZero(SensorType::Rpm))) << "RPM#4";
1136
1137
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #7";
1138
1139
1140
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1141
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1142
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1, engine->engineState.sparkOutOfOrderCounter) << "out-of-order #8";
1143
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ( 2u, getRecentWarnings()->getCount()) << "warningCounter#SparkReverseOrderBug319";
1144
4/10
✓ Branch 2 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(ObdCode::CUSTOM_DWELL_TOO_LONG, getRecentWarnings()->get(0).Code) << "warning @0";
1145
4/9
✓ Branch 2 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_EQ(ObdCode::CUSTOM_OUT_OF_ORDER_COIL, getRecentWarnings()->get(1).Code);
1146 1 }
1147
1148 // https://sourceforge.net/p/rusefi/tickets/299/
1149 // this is not a test of wasted spark!
1150 4 TEST(big, testAssertWeAreNotMissingASpark299) {
1151
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** testMissedSpark299\r\n");
1152
1153
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
1154 1 engineConfiguration->ignitionMode = IM_WASTED_SPARK;
1155
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
1156 1 engineConfiguration->isIgnitionEnabled = true;
1157 1 engineConfiguration->isInjectionEnabled = false;
1158
1159
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ( 0u, getRecentWarnings()->getCount()) << "warningCounter#0";
1160
1161 // todo: migrate to 'smartFireRise' see header which explains the difference
1162
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1163
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1164
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 0u, engine->triggerCentral.triggerState.currentCycle.current_index) << "ci#0";
1165
1166
1167
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1168
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1169
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1u, engine->triggerCentral.triggerState.currentCycle.current_index) << "ci#1";
1170
1171
1172
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1173
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1174
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 0u, engine->triggerCentral.triggerState.currentCycle.current_index) << "ci#2";
1175
1176
1177
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1178
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1179
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1u, engine->triggerCentral.triggerState.currentCycle.current_index) << "ci#3";
1180
1181
1182
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1183
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1184
1185
1186
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1187
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1188
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 1u, eth.engine.triggerCentral.triggerState.currentCycle.current_index) << "ci#5";
1189
1190
1191
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** testMissedSpark299 start\r\n");
1192
1193
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(3000, Sensor::getOrZero(SensorType::Rpm));
1194
1195 // positive advance scenario which is the typical case
1196
1/1
✓ Branch 1 taken 1 time.
1 setWholeTimingTable(3);
1197
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
1198
1199
1200
1201
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1202
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1203
1204
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1205
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1206
1207
1208
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1209
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1210
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1211
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1212
1213 // negative advance is rarely used but worth testing considering all out angleWrap.
1214
1/1
✓ Branch 1 taken 1 time.
1 setWholeTimingTable(-5);
1215
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
1216
1217
1218
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1219
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1220
1221
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1222
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1223
1224
1225
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(20);
1226
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1227
1228
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(20);
1229
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
1230
1231
4/10
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_EQ( 0u, getRecentWarnings()->getCount()) << "warningCounter#1";
1232 1 }
1233