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(ð, 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(ð, 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 |