GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/trigger/test_fasterEngineSpinningUp.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 82 0 82
Functions: 100.0% 7 0 7
Branches: 48.7% 134 0 275
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 /*
2 * test_fasterEngineSpinningUp.cpp
3 *
4 * Created on: Mar 6, 2018
5 */
6
7 #include "pch.h"
8 #include "fuel_math.h"
9 #include "util/injection_crank_helper.h"
10
11 4 TEST(cranking, testFasterEngineSpinningUp) {
12
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
13 extern bool unitTestBusyWaitHack;
14 1 unitTestBusyWaitHack = true;
15 1 float phase = 181;
16 1 setTable(config->injectionPhase, -phase);
17 1 engine->tdcMarkEnabled = false;
18 // turn on FasterEngineSpinUp mode
19 1 engineConfiguration->isFasterEngineSpinUpEnabled = true;
20
1/1
✓ Branch 1 taken 1 time.
1 setTestFuelCrankingTable(12);
21
22 // set ignition mode
23 1 engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS;
24 // set cranking threshold (used below)
25 1 engineConfiguration->cranking.rpm = 999;
26 // set sequential injection mode to test auto-change to simultaneous when spinning-up
27
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth, IM_SEQUENTIAL);
28 // Lie that this trigger requires disambiguation
29 1 engine->triggerCentral.triggerState.setNeedsDisambiguation(true);
30
31
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(IM_WASTED_SPARK, getCurrentIgnitionMode());
32
33
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(1000 /*ms*/);
34
35 // check if it's true
36
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(IM_SEQUENTIAL, getCurrentInjectionMode());
37
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(IM_WASTED_SPARK, getCurrentIgnitionMode());
38 // check if the engine has the right state
39
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(SPINNING_UP, engine->rpmCalculator.getState());
40
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(0, getInjectionMass(200), EPS5D);
41 // check RPM
42
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm));
43 // the queue should be empty, no trigger events yet
44
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()) << "plain#1";
45
46 // check all events starting from now
47 // advance 1 revolution
48 // because we have trivial TT_ONE trigger here synchronization would happen with just one rise front
49
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(200);
50
51 // check if the mode is changed
52
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(SPINNING_UP, engine->rpmCalculator.getState());
53 // due to isFasterEngineSpinUp=true, we should have already detected RPM!
54
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(300, Sensor::getOrZero(SensorType::Rpm));
55 // two simultaneous injections
56
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()) << "plain#2";
57 // test if they are simultaneous
58
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(IM_SIMULTANEOUS, getCurrentInjectionMode());
59 // test if ignition mode is temporary changed to wasted spark, if set to individual coils
60
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(IM_WASTED_SPARK, getCurrentIgnitionMode());
61 // check real events
62
63 1 float expectedSimultaneousTimestamp = eth.angleToTimeUs(360 - phase);
64
65 1 auto const startSimultaneousInjectionAction{ action_s::make<startSimultaneousInjection>() };
66 1 auto const endSimultaneousInjectionAction{ action_s::make<endSimultaneousInjection>((InjectionEvent*){})};
67
68
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj start#1", 0, startSimultaneousInjectionAction, expectedSimultaneousTimestamp - MS2US(engine->engineState.injectionDuration));
69
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj end#1", 1, endSimultaneousInjectionAction, expectedSimultaneousTimestamp);
70
71 // skip the rest of the cycle
72
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(MS2US(200));
73
74 // now clear and advance more
75
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
76
77
1/1
✓ Branch 1 taken 1 time.
1 eth.fireRise(200);
78
79 // check if the mode is changed when fully synched
80
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(CRANKING, engine->rpmCalculator.getState());
81 // check RPM
82
3/7
✓ 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.
1 EXPECT_NEAR(200, Sensor::getOrZero(SensorType::Rpm), 0.01);
83 // test if they are simultaneous in cranking mode too
84
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(IM_SIMULTANEOUS, getCurrentInjectionMode());
85 // Should still be in wasted spark since we don't have cam sync yet
86
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(IM_WASTED_SPARK, getCurrentIgnitionMode());
87 // two simultaneous injections
88
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()) << "plain#2";
89 // check real events
90 1 expectedSimultaneousTimestamp = eth.angleToTimeUs(360 - phase);
91
92
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj start#2", 0, startSimultaneousInjectionAction, expectedSimultaneousTimestamp - 1625);
93
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj end#2", 1, endSimultaneousInjectionAction, expectedSimultaneousTimestamp);
94
95 // Now perform a fake VVT sync and check that ignition mode changes to sequential
96
1/1
✓ Branch 1 taken 1 time.
1 engine->triggerCentral.syncEnginePhaseAndReport(2, 0);
97
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(IM_INDIVIDUAL_COILS, getCurrentIgnitionMode());
98
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(IM_SIMULTANEOUS, getCurrentInjectionMode());
99 // still cranking fuel
100
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(0.0039, getInjectionMass(200), EPS3D);
101
102 // skip, clear & advance 1 more revolution at higher RPM
103
1/1
✓ Branch 1 taken 1 time.
1 eth.fireFall(60);
104
105
1/1
✓ Branch 1 taken 1 time.
1 eth.clearQueue();
106
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEventsWithDuration(60);
107
108 // check if the mode is now changed to 'running' at higher RPM
109
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(RUNNING, engine->rpmCalculator.getState());
110 // check RPM
111
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(1000, Sensor::getOrZero(SensorType::Rpm));
112 // check if the injection mode is back to sequential now
113
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(IM_SEQUENTIAL, getCurrentInjectionMode());
114
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(0.0, getInjectionMass(200), EPS3D); // in this test fuel calculation is not active in running mode
115 // 4 sequential injections for the full cycle
116
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()) << "plain#3";
117
118 // check real events for sequential injection
119 // Note: See addFuelEvents() fix inside setRpmValue()!
120 1 expectedSimultaneousTimestamp = eth.angleToTimeUs(phase);
121
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(180, eth.timeToAngle(30.000));
122
123 1 auto const turnInjectionPinHighAction{ action_s::make<turnInjectionPinHigh>(uintptr_t{}) };
124 1 auto const turnInjectionPinLowAction{ action_s::make<turnInjectionPinLow>((InjectionEvent*){})};
125
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj start#3", 0, turnInjectionPinHighAction, -expectedSimultaneousTimestamp - 1625);
126
1/1
✓ Branch 1 taken 1 time.
1 eth.assertEvent5("inj end#3", 1, turnInjectionPinLowAction, -expectedSimultaneousTimestamp);
127 1 }
128
129 3 static void doTestFasterEngineSpinningUp60_2(int startUpDelayMs, int rpm1, int expectedRpm) {
130
1/1
✓ Branch 2 taken 3 times.
3 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
131 // turn on FasterEngineSpinUp mode
132 3 engineConfiguration->isFasterEngineSpinUpEnabled = true;
133
134
1/1
✓ Branch 1 taken 3 times.
3 setupSimpleTestEngineWithMaf(&eth, IM_SEQUENTIAL, trigger_type_e::TT_TOOTHED_WHEEL_60_2);
135
1/1
✓ Branch 1 taken 3 times.
3 eth.moveTimeForwardMs(startUpDelayMs);
136
137 // fire 30 tooth rise/fall signals
138
1/1
✓ Branch 1 taken 3 times.
3 eth.fireTriggerEvents2(30 /* count */, 1 /*ms*/);
139 // now fire missed tooth rise/fall
140
1/1
✓ Branch 1 taken 3 times.
3 eth.fireRise(5 /*ms*/);
141
3/7
✓ Branch 3 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
3 EXPECT_EQ(rpm1, round(Sensor::getOrZero(SensorType::Rpm)));
142
143
1/1
✓ Branch 1 taken 3 times.
3 eth.fireFall(1);
144
1/1
✓ Branch 1 taken 3 times.
3 eth.fireTriggerEvents2(30, 1);
145
146 // After some more regular teeth, instant RPM is still correct
147
3/7
✓ Branch 3 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
3 EXPECT_EQ(rpm1, round(Sensor::getOrZero(SensorType::Rpm)));
148 6 }
149
150 4 TEST(cranking, testFasterEngineSpinningUp60_2) {
151 1 doTestFasterEngineSpinningUp60_2(0, 1000, 1000);
152 1 doTestFasterEngineSpinningUp60_2(100, 1000, 1000);
153 1 doTestFasterEngineSpinningUp60_2(1000, 1000, 1000);
154 1 }
155