GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/actuators/test_boost.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 232 0 232
Functions: 100.0% 24 0 24
Branches: 53.0% 257 0 485
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "boost_control.h"
4
5 using ::testing::_;
6 using ::testing::StrictMock;
7
8 static Map2D<BOOST_CURVE_SIZE, float, float> testBoostCltCorr { "clt" };
9 static Map2D<BOOST_CURVE_SIZE, float, float> testBoostIatCorr { "iat" };
10 static Map2D<BOOST_CURVE_SIZE, float, float> testBoostCltAdder { "clt (adder)" };
11 static Map2D<BOOST_CURVE_SIZE, float, float> testBoostIatAdder { "iat (adder)" };
12
13 4 TEST(BoostControl, Setpoint) {
14
1/1
✓ Branch 2 taken 1 time.
1 MockVp3d targetMap;
15
16 // Just pass TPS input to output
17
5/5
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
3 EXPECT_CALL(targetMap, getValue(_, _))
18
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float tps) { return tps; });
19
20
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
21 1 engineConfiguration->boostType = CLOSED_LOOP;
22
23
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
24
25 // Should return unexpected without a pedal map cfg'd
26
3/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_EQ(bc.getSetpoint(), unexpected);
27
28 1 testBoostCltCorr.initTable(config->cltBoostCorr, config->cltBoostCorrBins);
29 1 testBoostIatCorr.initTable(config->iatBoostCorr, config->iatBoostCorrBins);
30 1 testBoostCltAdder.initTable(config->cltBoostAdder, config->cltBoostAdderBins);
31 1 testBoostIatAdder.initTable(config->iatBoostAdder, config->iatBoostAdderBins);
32
33 // Now init with mock target map
34
1/1
✓ Branch 1 taken 1 time.
1 bc.init(nullptr, nullptr, &targetMap, testBoostCltCorr, testBoostIatCorr, testBoostCltAdder, testBoostIatAdder, nullptr);
35
36 // Should still return unxepected since TPS is invalid
37
3/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_EQ(bc.getSetpoint(), unexpected);
38
39 // Configure TPS, should get passthru of tps value
40
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 35.0f);
41
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getSetpoint().value_or(-1), 35.0f);
42
43 // Back in open loop mode, setpoint should be 0
44 1 engineConfiguration->boostType = OPEN_LOOP;
45
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getSetpoint().value_or(-1), 0);
46 2 }
47
48 4 TEST(BoostControl, ObservePlant) {
49
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
50 1 engineConfiguration->boostType = CLOSED_LOOP;
51
52
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
53
54
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::Map);
55 // Check that invalid MAP returns unexpected
56
3/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_EQ(bc.observePlant(), unexpected);
57
58 // Test valid MAP value
59
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 150);
60
61
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.observePlant().value_or(0), 150.0f);
62 2 }
63
64 4 TEST(BoostControl, OpenLoop) {
65
1/1
✓ Branch 2 taken 1 time.
1 MockVp3d openMap;
66
67 // Just pass MAP input to output
68
5/5
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
3 EXPECT_CALL(openMap, getValue(_, _))
69
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float tps) { return tps; });
70
71
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
72
73
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
74
75 // Without table set, should return unexpected
76
3/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_EQ(bc.getOpenLoop(0), unexpected);
77
78
79 1 testBoostCltCorr.initTable(config->cltBoostCorr, config->cltBoostCorrBins);
80 1 testBoostIatCorr.initTable(config->iatBoostCorr, config->iatBoostCorrBins);
81 1 testBoostCltAdder.initTable(config->cltBoostAdder, config->cltBoostAdderBins);
82 1 testBoostIatAdder.initTable(config->iatBoostAdder, config->iatBoostAdderBins);
83
84
1/1
✓ Branch 1 taken 1 time.
1 bc.init(
85 nullptr,
86 &openMap,
87 nullptr,
88 testBoostCltCorr,
89 testBoostIatCorr,
90 testBoostCltAdder,
91 testBoostIatAdder,
92 nullptr
93 );
94
95 // Should pass TPS value thru
96
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 47.0f);
97
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), 47.0f);
98 2 }
99
100 4 TEST(BoostControl, BoostOpenLoopYAxis)
101 {
102
1/1
✓ Branch 2 taken 1 time.
1 MockVp3d openMap;
103 // Just pass MAP input to output
104
5/5
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
3 EXPECT_CALL(openMap, getValue(_, _))
105
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float tps) { return tps; });
106
107
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
108
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
109
110 1 testBoostCltCorr.initTable(config->cltBoostCorr, config->cltBoostCorrBins);
111 1 testBoostIatCorr.initTable(config->iatBoostCorr, config->iatBoostCorrBins);
112 1 testBoostCltAdder.initTable(config->cltBoostAdder, config->cltBoostAdderBins);
113 1 testBoostIatAdder.initTable(config->iatBoostAdder, config->iatBoostAdderBins);
114
115
1/1
✓ Branch 1 taken 1 time.
1 bc.init(
116 nullptr,
117 &openMap,
118 nullptr,
119 testBoostCltCorr,
120 testBoostIatCorr,
121 testBoostCltAdder,
122 testBoostIatAdder,
123 nullptr
124 );
125
126 1 constexpr float RPM_TEST_VALUE = 42.0f;
127
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, RPM_TEST_VALUE);
128 1 constexpr float TPS1_TEST_VALUE = 42.1f;
129
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, TPS1_TEST_VALUE);
130 1 constexpr float MAP_TEST_VALUE = 42.3f;
131
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, MAP_TEST_VALUE);
132 1 constexpr float CLT_TEST_VALUE = 42.4f;
133
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, CLT_TEST_VALUE);
134 1 constexpr float IAT_TEST_VALUE = 42.5f;
135
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Iat, IAT_TEST_VALUE);
136 1 constexpr float LUA_GAUGE1_TEST_VALUE = 42.6f;
137
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::LuaGauge1, LUA_GAUGE1_TEST_VALUE);
138 1 constexpr float LUA_GAUGE2_TEST_VALUE = 42.7f;
139
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::LuaGauge2, LUA_GAUGE2_TEST_VALUE);
140 1 constexpr float AUX_TEMP1_TEST_VALUE = 42.7f;
141
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AuxTemp1, AUX_TEMP1_TEST_VALUE);
142 1 constexpr float AUX_TEMP2_TEST_VALUE = 42.8f;
143
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AuxTemp2, AUX_TEMP2_TEST_VALUE);
144 1 constexpr float ACCELERATOR_PEDAL_TEST_VALUE = 42.9f;
145
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, ACCELERATOR_PEDAL_TEST_VALUE);
146 1 constexpr float BATTERY_VOLTAGE_TEST_VALUE = 43.0f;
147
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BatteryVoltage, BATTERY_VOLTAGE_TEST_VALUE);
148 1 constexpr float FUEL_ETANOL_PERCENT_TEST_VALUE = 43.1f;
149
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelEthanolPercent, FUEL_ETANOL_PERCENT_TEST_VALUE);
150 1 constexpr float AUX_LINEAR1_TEST_VALUE = 43.2f;
151
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AuxLinear1, AUX_LINEAR1_TEST_VALUE);
152 1 constexpr float AUX_LINEAR2_TEST_VALUE = 43.3f;
153
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AuxLinear2, AUX_LINEAR2_TEST_VALUE);
154 // we cannot use value 43.4f for the DetectedGear sensor because gear should be less then TCU_GEAR_COUNT
155 1 constexpr float DETECTED_GEAR_TEST_VALUE = TCU_GEAR_COUNT - 1;
156
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DetectedGear, DETECTED_GEAR_TEST_VALUE);
157 1 constexpr float BAROMETRIC_PRESSURE_TEST_VALUE = 43.5f;
158
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BarometricPressure, BAROMETRIC_PRESSURE_TEST_VALUE);
159 1 constexpr float EGT1_TEST_VALUE = 43.6f;
160
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::EGT1, EGT1_TEST_VALUE);
161 1 constexpr float EGT2_TEST_VALUE = 43.7f;
162
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::EGT2, EGT2_TEST_VALUE);
163
164
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(engineConfiguration->boostOpenLoopYAxis, gppwm_channel_e::GPPWM_Tps); // default value
165
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), TPS1_TEST_VALUE);
166
167 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Zero;
168
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), 0.0f);
169
170 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Rpm;
171
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), RPM_TEST_VALUE);
172
173 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Tps;
174
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), TPS1_TEST_VALUE);
175
176 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Map;
177
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), MAP_TEST_VALUE);
178
179 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Clt;
180
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), CLT_TEST_VALUE);
181
182 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Iat;
183
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), IAT_TEST_VALUE);
184
185 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_LuaGauge1;
186
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), LUA_GAUGE1_TEST_VALUE);
187
188 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_LuaGauge2;
189
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), LUA_GAUGE2_TEST_VALUE);
190
191 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_FuelLoad;
192
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), engine->engineState.fuelingLoad);
193
194 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_IgnLoad;
195
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), engine->engineState.ignitionLoad);
196
197 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_AuxTemp1;
198
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), AUX_TEMP1_TEST_VALUE);
199
200 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_AuxTemp2;
201
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), AUX_TEMP2_TEST_VALUE);
202
203 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_AccelPedal;
204
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), ACCELERATOR_PEDAL_TEST_VALUE);
205
206 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Vbatt;
207
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), BATTERY_VOLTAGE_TEST_VALUE);
208
209 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_VVT_1I;
210
4/8
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
1 EXPECT_FLOAT_EQ(
211 bc.getOpenLoop(0).value_or(-1),
212 engine->triggerCentral.getVVTPosition(/*bankIndex*/0, /*camIndex*/0)
213 1 );
214
215 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_VVT_1E;
216
4/8
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
1 EXPECT_FLOAT_EQ(
217 bc.getOpenLoop(0).value_or(-1),
218 engine->triggerCentral.getVVTPosition(/*bankIndex*/0, /*camIndex*/1)
219 1 );
220
221 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_VVT_2I;
222
4/8
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
1 EXPECT_FLOAT_EQ(
223 bc.getOpenLoop(0).value_or(-1),
224 engine->triggerCentral.getVVTPosition(/*bankIndex*/1, /*camIndex*/0)
225 1 );
226
227 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_VVT_2E;
228
4/8
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
1 EXPECT_FLOAT_EQ(
229 bc.getOpenLoop(0).value_or(-1),
230 engine->triggerCentral.getVVTPosition(/*bankIndex*/1, /*camIndex*/1)
231 1 );
232
233 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_EthanolPercent;
234
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), FUEL_ETANOL_PERCENT_TEST_VALUE);
235
236 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_AuxLinear1;
237
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), AUX_LINEAR1_TEST_VALUE);
238
239 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_AuxLinear2;
240
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), AUX_LINEAR2_TEST_VALUE);
241
242 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_GppwmOutput1;
243
3/7
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), (float)engine->outputChannels.gppwmOutput[0]);
244
245 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_GppwmOutput2;
246
3/7
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), (float)engine->outputChannels.gppwmOutput[1]);
247
248 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_GppwmOutput3;
249
3/7
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), (float)engine->outputChannels.gppwmOutput[2]);
250
251 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_GppwmOutput4;
252
3/7
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), (float)engine->outputChannels.gppwmOutput[3]);
253
254 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_DetectedGear;
255
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), DETECTED_GEAR_TEST_VALUE);
256
257 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_BaroPressure;
258
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), BAROMETRIC_PRESSURE_TEST_VALUE);
259
260 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Egt1;
261
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), EGT1_TEST_VALUE);
262
263 1 engineConfiguration->boostOpenLoopYAxis = GPPWM_Egt2;
264
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(bc.getOpenLoop(0).value_or(-1), EGT2_TEST_VALUE);
265 2 }
266
267 4 TEST(BoostControl, TestClosedLoop) {
268
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
269
270
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
271
272 1 pid_s pidCfg = {
273 1, 0, 0, // P controller, easier to test
274 0, // no offset
275 5, // 5ms period
276 -100, 100 // min/max output
277 };
278
279
1/1
✓ Branch 1 taken 1 time.
1 bc.init(
280 nullptr,
281 nullptr,
282 nullptr,
283 testBoostCltCorr,
284 testBoostIatCorr,
285 testBoostCltAdder,
286 testBoostIatAdder,
287 &pidCfg
288 );
289
290 // Enable closed loop
291 1 engineConfiguration->boostType = CLOSED_LOOP;
292 // Minimum 75kpa
293 1 engineConfiguration->minimumBoostClosedLoopMap = 75;
294
295 // At 0 RPM, closed loop is disabled
296
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 0);
297
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(0, bc.getClosedLoop(150, 100).value_or(-1000));
298
299 // Stopped engine, disable closed loop
300
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 0);
301
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(0, bc.getClosedLoop(150, 50).value_or(-1000));
302
303 // With RPM, we should get an output
304
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1000);
305 // Actual is below target -> positive output
306
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(50, bc.getClosedLoop(150, 100).value_or(-1000));
307 // MAP below target -> returns 0, closed loop disabled
308
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(0, bc.getClosedLoop(150, 50).value_or(-1000));
309 // Actual is above target -> negative output
310
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(-25.0f, bc.getClosedLoop(150, 175).value_or(-1000));
311
312 // Disabling closed loop should return 0
313 1 engineConfiguration->boostType = OPEN_LOOP;
314
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(0, bc.getClosedLoop(150, 175).value_or(-1000));
315 2 }
316
317
318 4 TEST(BoostControl, TestClosedLoopUint8Overflow) {
319
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
320
321
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
322
323 1 pid_s pidCfg = {
324 1, 0, 0, // P controller, easier to test
325 0, // no offset
326 5, // 5ms period
327 -100, 100 // min/max output
328 };
329
330
1/1
✓ Branch 1 taken 1 time.
1 bc.init(
331 nullptr,
332 nullptr,
333 nullptr,
334 testBoostCltCorr,
335 testBoostIatCorr,
336 testBoostCltAdder,
337 testBoostIatAdder,
338 &pidCfg
339 );
340
341 // Enable closed loop
342 1 engineConfiguration->boostType = CLOSED_LOOP;
343 // Minimum 260kpa
344 1 engineConfiguration->minimumBoostClosedLoopMap = 260;
345
346 // At 0 RPM, closed loop is disabled
347
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 0);
348
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(0, bc.getClosedLoop(350, 100).value_or(-1000));
349
350 // too low MAP, disable closed loop
351
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 0);
352
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(0, bc.getClosedLoop(350, 50).value_or(-1000));
353
354 // With RPM, we should get an output
355
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1000);
356
357 // Actual is above target -> negative output
358
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(-53.0f, bc.getClosedLoop(650, 575).value_or(-1000));
359
360 // Disabling closed loop should return 0
361 1 engineConfiguration->boostType = OPEN_LOOP;
362
3/7
✓ Branch 3 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.
1 EXPECT_FLOAT_EQ(0, bc.getClosedLoop(350, 375).value_or(-1000));
363 2 }
364
365
366 4 TEST(BoostControl, SetOutputPWM) {
367
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
368
369 1 engineConfiguration->isBoostControlEnabled = true;
370 1 engineConfiguration->boostControlPin = Gpio::A0;
371
372
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockPwm> pwm;
373
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockEtb> etb;
374
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
375
376 // only PWM should be set
377
5/5
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
1 EXPECT_CALL(etb, setWastegatePosition(25.0f)).Times(0);
378
4/4
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
1 EXPECT_CALL(pwm, setSimplePwmDutyCycle(0.25f));
379
380 // Don't crash if not init'd (don't deref null ptr m_pwm)
381
4/20
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✗ Branch 35 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 49 not taken.
✗ Branch 54 not taken.
✗ Branch 57 not taken.
✗ Branch 63 not taken.
✗ Branch 67 not taken.
✗ Branch 70 not taken.
✗ Branch 75 not taken.
✗ Branch 78 not taken.
1 EXPECT_NO_THROW(bc.setOutput(25.0f));
382
383 // Init with mock PWM device and ETB
384
1/1
✓ Branch 1 taken 1 time.
1 bc.init(&pwm, nullptr, nullptr, testBoostCltCorr, testBoostIatCorr, testBoostCltAdder, testBoostIatAdder, nullptr);
385 1 engine->etbControllers[0] = &etb;
386
387
1/1
✓ Branch 3 taken 1 time.
1 bc.setOutput(25.0f);
388 2 }
389
390 4 TEST(BoostControl, SetOutputETB) {
391
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
392
393 1 engineConfiguration->isBoostControlEnabled = true;
394
395
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockPwm> pwm;
396
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockEtb> etb;
397
1/1
✓ Branch 2 taken 1 time.
1 BoostController bc;
398
399 // only ETB should be set
400
4/4
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
1 EXPECT_CALL(etb, setWastegatePosition(25.0f));
401
5/5
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
1 EXPECT_CALL(pwm, setSimplePwmDutyCycle(0.25f)).Times(0);
402
403 // Don't crash if not init'd (don't deref null ptr m_pwm)
404
4/20
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✗ Branch 35 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 49 not taken.
✗ Branch 54 not taken.
✗ Branch 57 not taken.
✗ Branch 63 not taken.
✗ Branch 67 not taken.
✗ Branch 70 not taken.
✗ Branch 75 not taken.
✗ Branch 78 not taken.
1 EXPECT_NO_THROW(bc.setOutput(25.0f));
405
406 // Init with mock PWM device and ETB
407
1/1
✓ Branch 1 taken 1 time.
1 bc.init(&pwm, nullptr, nullptr, testBoostCltCorr, testBoostIatCorr, testBoostCltAdder, testBoostIatAdder, nullptr);
408 1 engine->etbControllers[0] = &etb;
409
410
1/1
✓ Branch 3 taken 1 time.
1 bc.setOutput(25.0f);
411 2 }
412