Line | Branch | Decision | Exec | Source |
---|---|---|---|---|
1 | /* | |||
2 | * @file test_fuelCut.cpp | |||
3 | * | |||
4 | * @date Mar 22, 2018 | |||
5 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
6 | */ | |||
7 | ||||
8 | #include "pch.h" | |||
9 | ||||
10 | #include "event_queue.h" | |||
11 | ||||
12 | using ::testing::_; | |||
13 | ||||
14 | // Define some helpers for not-cut and cut | |||
15 | #define EXPECT_NORMAL() EXPECT_FLOAT_EQ(normalInjDuration, engine->engineState.injectionDuration) | |||
16 | #define EXPECT_CUT() EXPECT_FLOAT_EQ(0, engine->engineState.injectionDuration) | |||
17 | ||||
18 | #if FUEL_RPM_COUNT == 16 | |||
19 | 4 | TEST(fuelCut, coasting) { | ||
20 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
21 |
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(_, _)) | |
22 |
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})); | |
23 | ||||
24 | // configure coastingFuelCut | |||
25 | 1 | engineConfiguration->coastingFuelCutEnabled = true; | ||
26 | 1 | engineConfiguration->coastingFuelCutRpmLow = 1300; | ||
27 | 1 | engineConfiguration->coastingFuelCutRpmHigh = 1500; | ||
28 | 1 | engineConfiguration->coastingFuelCutTps = 2; | ||
29 | 1 | engineConfiguration->coastingFuelCutClt = 30; | ||
30 | 1 | engineConfiguration->coastingFuelCutMap = 100; | ||
31 | // set cranking threshold | |||
32 | 1 | engineConfiguration->cranking.rpm = 999; | ||
33 | ||||
34 | // basic engine setup | |||
35 |
1/1✓ Branch 1 taken 1 time.
|
1 | setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð); | |
36 | ||||
37 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Map, 0); | |
38 | ||||
39 | // mock CLT - just above threshold ('hot engine') | |||
40 | 1 | float hotClt = engineConfiguration->coastingFuelCutClt + 1; | ||
41 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Clt, hotClt); | |
42 | // mock TPS - throttle is opened | |||
43 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::DriverThrottleIntent, 60); | |
44 | // set 'running' RPM - just above RpmHigh threshold | |||
45 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1); | |
46 | // 'advance' time (amount doesn't matter) | |||
47 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardUs(1000); | |
48 | ||||
49 | 1 | const float normalInjDuration = 1.5f; | ||
50 | /* | |||
51 | * We need to pass through all rpm changes (high-mid-low-mid-high) because of state-machine | |||
52 | */ | |||
53 | ||||
54 | // process | |||
55 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
56 | ||||
57 | // this is normal injection mode (the throttle is opened), no fuel cut-off | |||
58 |
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_NORMAL(); | |
59 | ||||
60 | // 'releasing' the throttle | |||
61 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::DriverThrottleIntent, 0); | |
62 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
63 | ||||
64 | // Fuel cut-off is enabled now | |||
65 |
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_CUT(); | |
66 | ||||
67 | // Now drop the CLT below threshold | |||
68 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Clt, engineConfiguration->coastingFuelCutClt - 1); | |
69 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
70 | ||||
71 | // Fuel cut-off should be diactivated - the engine is 'cold' | |||
72 |
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_NORMAL(); | |
73 | ||||
74 | // restore CLT | |||
75 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Clt, hotClt); | |
76 | // And set RPM - somewhere between RpmHigh and RpmLow threshold | |||
77 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, (engineConfiguration->coastingFuelCutRpmHigh + engineConfiguration->coastingFuelCutRpmLow) / 2); | |
78 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
79 | ||||
80 | // Fuel cut-off is enabled - nothing should change | |||
81 |
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_NORMAL(); | |
82 | ||||
83 | // Now drop RPM just below RpmLow threshold | |||
84 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmLow - 1); | |
85 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
86 | ||||
87 | // Fuel cut-off is now disabled (the engine is idling) | |||
88 |
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_NORMAL(); | |
89 | ||||
90 | // Now change RPM just below RpmHigh threshold | |||
91 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh - 1); | |
92 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
93 | ||||
94 | // Fuel cut-off is still disabled | |||
95 |
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_NORMAL(); | |
96 | ||||
97 | // Now set RPM just above RpmHigh threshold | |||
98 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1); | |
99 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
100 | ||||
101 | // Fuel cut-off is active again! | |||
102 |
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_CUT(); | |
103 | ||||
104 | // Configure vehicle speed thresholds | |||
105 | 1 | engineConfiguration->coastingFuelCutVssHigh = 50; | ||
106 | 1 | engineConfiguration->coastingFuelCutVssLow = 40; | ||
107 | ||||
108 | // High speed, should still be cut. | |||
109 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::VehicleSpeed, 55); | |
110 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
111 |
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_CUT(); | |
112 | ||||
113 | // Between thresholds, still cut. | |||
114 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::VehicleSpeed, 45); | |
115 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
116 |
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_CUT(); | |
117 | ||||
118 | // Below lower threshold, normal fuel resumes | |||
119 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::VehicleSpeed, 35); | |
120 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
121 |
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_NORMAL(); | |
122 | ||||
123 | // Between thresholds, still normal. | |||
124 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::VehicleSpeed, 45); | |
125 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
126 |
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_NORMAL(); | |
127 | ||||
128 | // Back above upper, cut again. | |||
129 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::VehicleSpeed, 55); | |
130 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
131 |
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_CUT(); | |
132 | 2 | } | ||
133 | #endif //FUEL_RPM_COUNT == 16 | |||
134 | ||||
135 | #if FUEL_RPM_COUNT == 16 | |||
136 | 4 | TEST(fuelCut, delay) { | ||
137 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
138 |
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(_, _)) | |
139 |
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})); | |
140 | ||||
141 | // configure coastingFuelCut | |||
142 | 1 | engineConfiguration->coastingFuelCutEnabled = true; | ||
143 | 1 | engineConfiguration->coastingFuelCutRpmLow = 1300; | ||
144 | 1 | engineConfiguration->coastingFuelCutRpmHigh = 1500; | ||
145 | 1 | engineConfiguration->coastingFuelCutTps = 2; | ||
146 | 1 | engineConfiguration->coastingFuelCutClt = 30; | ||
147 | 1 | engineConfiguration->coastingFuelCutMap = 100; | ||
148 | // set cranking threshold | |||
149 | 1 | engineConfiguration->cranking.rpm = 999; | ||
150 | ||||
151 | // delay is 1 second | |||
152 | 1 | engineConfiguration->dfcoDelay = 1.0f; | ||
153 | ||||
154 | // basic engine setup | |||
155 |
1/1✓ Branch 1 taken 1 time.
|
1 | setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð); | |
156 | ||||
157 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Map, 0); | |
158 | ||||
159 | // mock CLT - just above threshold ('hot engine') | |||
160 | 1 | float hotClt = engineConfiguration->coastingFuelCutClt + 1; | ||
161 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Clt, hotClt); | |
162 | // mock TPS - throttle is opened | |||
163 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::DriverThrottleIntent, 60); | |
164 | // set 'running' RPM - just above RpmHigh threshold | |||
165 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1); | |
166 | // 'advance' time (amount doesn't matter) | |||
167 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardUs(1000); | |
168 | ||||
169 | 1 | const float normalInjDuration = 1.5f; | ||
170 | ||||
171 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTimeNowUs(1e6); | |
172 | ||||
173 | // process | |||
174 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
175 | ||||
176 | // this is normal injection mode (the throttle is opened), no fuel cut-off | |||
177 |
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_NORMAL(); | |
178 | ||||
179 | // 'releasing' the throttle | |||
180 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::DriverThrottleIntent, 0); | |
181 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
182 | ||||
183 | // Shouldn't cut yet, since not enough time has elapsed | |||
184 |
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_NORMAL(); | |
185 | ||||
186 | // Change nothing else, but advance time and update again | |||
187 |
1/1✓ Branch 1 taken 1 time.
|
1 | advanceTimeUs(0.9e6); | |
188 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
189 | ||||
190 | // too soon, still no cut | |||
191 |
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_NORMAL(); | |
192 | ||||
193 | // Change nothing else, but advance time and update again | |||
194 |
1/1✓ Branch 1 taken 1 time.
|
1 | advanceTimeUs(0.2e6); | |
195 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
196 | ||||
197 | // Should now be cut! | |||
198 |
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_CUT(); | |
199 | ||||
200 | // Put the throtle back, and it should come back instantly | |||
201 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::DriverThrottleIntent, 30); | |
202 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
203 |
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_NORMAL(); | |
204 | 2 | } | ||
205 | #endif //FUEL_RPM_COUNT == 16 | |||
206 |