GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/actuators/test_etb.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 590 0 590
Functions: 100.0% 102 0 102
Branches: 66.3% 803 0 1211
Decisions: 100.0% 16 - 16

Line Branch Decision Exec Source
1 /*
2 * @file test_etb.cpp
3 *
4 * @date Dec 13, 2019
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #include "electronic_throttle_impl.h"
11 #include "dc_motor.h"
12 #include "idle_thread.h"
13
14 #include "mocks.h"
15
16 using ::testing::_;
17 using ::testing::Ne;
18 using ::testing::Return;
19 using ::testing::StrictMock;
20
21 4 TEST(etb, initializationNoPedal) {
22
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
23
24
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
25
26
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
27 2 engine->etbControllers[i] = &mocks[i];
28 }
29
30
10/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 31 taken 1 time.
✓ Branch 34 taken 1 time.
✓ Branch 37 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_Throttle1, _, _, _)).WillOnce(Return(false));
31
10/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 31 taken 1 time.
✓ Branch 34 taken 1 time.
✓ Branch 37 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_Throttle2, _, _, _)).WillOnce(Return(false));
32
33 // This shouldn't throw, since no throttles are configured, but no pedal is configured either
34
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 11 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 57 not taken.
✗ Branch 61 not taken.
✗ Branch 64 not taken.
✗ Branch 69 not taken.
✗ Branch 72 not taken.
1 EXPECT_NO_FATAL_ERROR(doInitElectronicThrottle(true));
35 5 }
36
37 4 TEST(etb, initializationMissingThrottle) {
38
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
39
40 2 EngineTestHelper eth(engine_type_e::TEST_ENGINE, [](engine_configuration_s* engineConfiguration) {
41 engineConfiguration->etbFunctions[0] = DC_None;
42 engineConfiguration->etbFunctions[1] = DC_None;
43
1/1
✓ Branch 3 taken 1 time.
1 });
44
45
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
46 2 engine->etbControllers[i] = &mocks[i];
47 }
48
49
8/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_None, _, _, _)).Times(0);
50
8/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_None, _, _, _)).Times(0);
51
52 // Must have a sensor configured before init
53
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
54
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0);
55
56 // This should throw: a pedal is configured but no throttles
57
5/23
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 45 not taken.
✗ Branch 50 not taken.
✗ Branch 53 not taken.
✗ Branch 59 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 71 not taken.
✗ Branch 74 not taken.
1 EXPECT_FATAL_ERROR(doInitElectronicThrottle(true));
58 5 }
59
60 4 TEST(etb, initializationSingleThrottle) {
61
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
62
63
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(mocks[0], isEtbMode())
64
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(true));
65
66 2 EngineTestHelper eth(engine_type_e::TEST_ENGINE, [](engine_configuration_s* engineConfiguration) {
67 engineConfiguration->etbFunctions[0] = DC_Throttle1;
68 engineConfiguration->etbFunctions[1] = DC_None;
69
1/1
✓ Branch 3 taken 1 time.
1 });
70
71
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
72 2 engine->etbControllers[i] = &mocks[i];
73 }
74
75 // Must have a sensor configured before init
76
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
77
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0);
78
79 // Expect mock0 to be init as throttle 1, and PID params
80
11/11
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 41 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true));
81
82 // Expect mock1 to be init as none
83
8/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_None, _, _, _)).Times(0);
84
85
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(false);
86 5 }
87
88 4 TEST(etb, initializationSingleThrottleInSecondSlot) {
89
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
90
91
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(mocks[1], isEtbMode())
92
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(true));
93
94 2 EngineTestHelper eth(engine_type_e::TEST_ENGINE, [](engine_configuration_s* engineConfiguration) {
95 engineConfiguration->etbFunctions[0] = DC_None;
96 engineConfiguration->etbFunctions[1] = DC_Throttle1;
97
1/1
✓ Branch 3 taken 1 time.
1 });
98
99
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
100 2 engine->etbControllers[i] = &mocks[i];
101 }
102
103 // Must have a sensor configured before init
104
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
105
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0, false);
106
107 // Expect mock0 to be init as none
108
8/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_None, _, _, _)).Times(0);
109
110 // Expect mock1 to be init as throttle 1, and PID params
111
11/11
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 41 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true));
112
113
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(false);
114 5 }
115
116 4 TEST(etb, initializationDualThrottle) {
117
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
118
119
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(mocks[0], isEtbMode())
120
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(true));
121
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(mocks[1], isEtbMode())
122
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(true));
123
124
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
125
126
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
127 2 engine->etbControllers[i] = &mocks[i];
128 }
129
130 // Must have a sensor configured before init
131
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
132
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0, false);
133
134
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 25.0f, true);
135
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps2, 25.0f, true);
136
137 1 engineConfiguration->etbFunctions[0] = DC_Throttle1;
138 1 engineConfiguration->etbFunctions[1] = DC_Throttle2;
139
140 // Expect mock0 to be init as throttle 1, and PID params
141
11/11
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 41 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_Throttle1, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true));
142
143 // Expect mock1 to be init as throttle 2, and PID params
144
11/11
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 41 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_Throttle2, _, &engineConfiguration->etb, Ne(nullptr))).WillOnce(Return(true));
145
146
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(false);
147 5 }
148
149 4 TEST(etb, initializationWastegate) {
150
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
151
152
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(mocks[0], isEtbMode())
153
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(false));
154
155 2 EngineTestHelper eth(engine_type_e::TEST_ENGINE, [](engine_configuration_s* engineConfiguration) {
156 engineConfiguration->etbFunctions[0] = DC_Wastegate;
157 engineConfiguration->etbFunctions[1] = DC_None;
158
1/1
✓ Branch 3 taken 1 time.
1 });
159
160
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
161 2 engine->etbControllers[i] = &mocks[i];
162 }
163
164 // Expect mock0 to be init as throttle 1, and PID wastegate params
165
11/11
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 35 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 41 taken 1 time.
1 EXPECT_CALL(mocks[0], init(DC_Wastegate, _, &engineConfiguration->etbWastegatePid, Ne(nullptr))).WillOnce(Return(true));
166
167 // Expect mock1 to be init as none
168
8/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 29 taken 1 time.
1 EXPECT_CALL(mocks[1], init(DC_None, _, _, _)).Times(0);
169
170
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(false);
171 5 }
172
173 4 TEST(etb, initializationNoFunction) {
174
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
175
176
1/1
✓ Branch 2 taken 1 time.
1 EtbController dut;
177
178 // When init called with DC_None, should ignore the provided params and return false
179
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.init(DC_None, &motor, nullptr, nullptr));
180
181 // This should no-op, it shouldn't call motor.set(float duty)
182
1/1
✓ Branch 3 taken 1 time.
1 dut.setOutput(0.5f);
183 2 }
184
185 4 TEST(etb, initializationNotRedundantTps) {
186
1/1
✓ Branch 2 taken 1 time.
1 EtbController dut;
187
188 // Needs pedal for init
189
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
190
191 // Not redundant, should fail upon init
192
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
193
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, false);
194
195
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ 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(dut.init(DC_Throttle1, nullptr, nullptr, nullptr));
196 }
197
198 4 TEST(etb, initializationNotRedundantPedal) {
199
1/1
✓ Branch 2 taken 1 time.
1 EtbController dut;
200
201 // Init pedal without redundancy
202
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, false);
203
204 // Normal redundant TPS
205
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
206
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
207
208 // we require redundancy at runtime, not at initialization time. that would allow for Lua pedal to appear later on.
209
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ 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_TRUE(dut.init(DC_Throttle1, nullptr, nullptr, nullptr));
210 }
211
212 4 TEST(etb, initializationNoSensor) {
213
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetAllMocks();
214
215
1/1
✓ Branch 2 taken 1 time.
1 EtbController dut;
216
217 // Needs pedal for init
218
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
219
220
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.init(DC_Throttle1, nullptr, nullptr, nullptr));
221
222 // Redundant
223
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, /*value*/0, /*mockRedundant*/true);
224
225 // With primary TPS, should return true (ie, throttle was configured)
226
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.init(DC_Throttle1, nullptr, nullptr, nullptr));
227 1 }
228
229 4 TEST(etb, initializationNoThrottles) {
230 // This tests the case where you don't want an ETB, and expect everything to go fine
231
3/3
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
3 EtbController duts[2];
232
233
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
234
235
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
236 2 engine->etbControllers[i] = &duts[i];
237 }
238
239 // Configure ETB functions, but no pedal
240 1 engineConfiguration->etbFunctions[0] = DC_Throttle1;
241 1 engineConfiguration->etbFunctions[1] = DC_Throttle2;
242
243 // No pedal - don't init ETBs
244
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::AcceleratorPedal);
245
246 // Not redundant TPS (aka cable throttle)
247
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
248
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, false);
249
250
1/1
✓ Branch 1 taken 1 time.
1 initElectronicThrottle();
251 2 }
252
253 4 TEST(etb, idlePlumbing) {
254
3/7
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
6 StrictMock<MockEtb> mocks[ETB_COUNT];
255
256
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
257
258
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
259
260
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1 time.
3 for (int i = 0; i < ETB_COUNT; i++) {
261 2 engine->etbControllers[i] = &mocks[i];
262
263
4/4
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 11 taken 2 times.
✓ Branch 15 taken 2 times.
2 EXPECT_CALL(mocks[i], setIdlePosition(33.0f));
264 }
265
266
1/1
✓ Branch 1 taken 1 time.
1 applyIACposition(33.0f);
267 5 }
268
269 4 TEST(etb, testSetpointOnlyPedal) {
270
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
271
272
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
273
274 // Mock pedal map that's just passthru pedal -> target
275
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
276
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(pedalMap, getValue(_, _))
277
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float y) {
278 return y;
279 });
280
281 // Uninitialized ETB must return unexpected (and not deference a null pointer)
282
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(etb.getSetpoint(), unexpected);
283
284 // Must have TPS & PPS initialized for ETB setup
285
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
286
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
287
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
288
289
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
290
291 // Check endpoints and midpoint
292
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
293
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(1, etb.getSetpoint().value_or(-1));
294
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
295
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(50, etb.getSetpoint().value_or(-1));
296
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true);
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(100, etb.getSetpoint().value_or(-1));
298
299 // Test some floating point pedal/output values
300
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.8302f, true);
301
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_NEAR(50.8302, etb.getSetpoint().value_or(-1), EPS4D);
302
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 51.6605f, true);
303
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_NEAR(51.6605, etb.getSetpoint().value_or(-1), EPS4D);
304
305 // Valid but out of range - should clamp to [0, 100]
306
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, -5, true);
307
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(1, etb.getSetpoint().value_or(-1));
308
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 105, true);
309
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(100, etb.getSetpoint().value_or(-1));
310
311 // Test invalid pedal position - should give 0 position
312
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::AcceleratorPedal);
313
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(1, etb.getSetpoint().value_or(-1));
314
315 // Check that adjustable clamping works correctly
316
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
317
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(1, etb.getSetpoint().value_or(-1));
318
319 1 engineConfiguration->etbMaximumPosition = 90;
320
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 85, true);
321
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(85, etb.getSetpoint().value_or(-1));
322
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 90, true);
323
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(90, etb.getSetpoint().value_or(-1));
324
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 95, true);
325
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(90, etb.getSetpoint().value_or(-1));
326 2 }
327
328 4 TEST(etb, setpointSecondThrottleTrim) {
329
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
330
331 // Mock pedal map that's just passthru pedal -> target
332
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
333
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(pedalMap, getValue(_, _))
334
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float y) {
335 return y;
336 });
337
338 // Should get called with the un-adjusted setpoint
339
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> throttleTrimTable;
340
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(throttleTrimTable, getValue(0, 47))
341
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(4));
342
343 // Must have TPS & PPS initialized for ETB setup
344
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
345
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
346
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
347
348
1/1
✓ Branch 2 taken 1 time.
1 EtbController2 etb(throttleTrimTable);
349
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
350
351
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 47, true);
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(51, etb.getSetpoint().value_or(-1));
353 2 }
354
355 4 TEST(etb, setpointIdle) {
356
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
357
358 // Use ETB for idle, but don't give it any range (yet)
359 1 engineConfiguration->etbIdleThrottleRange = 0;
360
361 // Must have TPS & PPS initialized for ETB setup
362
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
363
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
364
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
365
366
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
367
368 // Mock pedal map that's just passthru pedal -> target
369
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
370
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(pedalMap, getValue(_, _))
371
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float y) {
372 return y;
373 });
374
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
375
376 // No idle range, should just pass pedal
377
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
378
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(1, etb.getSetpoint().value_or(-1));
379
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
380
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(50, etb.getSetpoint().value_or(-1));
381
382 // Idle should now have 10% range
383 1 engineConfiguration->etbIdleThrottleRange = 10;
384
385 // 50% idle position should increase setpoint by 5% when closed, and 0% when open
386
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(50);
387
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
388
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(5, etb.getSetpoint().value_or(-1));
389
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
390
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(52.5, etb.getSetpoint().value_or(-1));
391
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true);
392
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(100, etb.getSetpoint().value_or(-1));
393
394 // 100% setpoint should increase by 10% closed, scaled 0% at wot
395
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(100);
396
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
397
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(10, etb.getSetpoint().value_or(-1));
398
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
399
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(55, etb.getSetpoint().value_or(-1));
400
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true);
401
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(100, etb.getSetpoint().value_or(-1));
402
403 // 125% setpoint should clamp to 10% increase
404
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(125);
405
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
406
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(10, etb.getSetpoint().value_or(-1));
407
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true);
408
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(55, etb.getSetpoint().value_or(-1));
409 2 }
410
411 4 TEST(etb, setpointRevLimit) {
412
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
413
414 // Configure 5000 limit start, with 750 rpm taper
415 1 engineConfiguration->etbRevLimitStart = 5000;
416 1 engineConfiguration->etbRevLimitRange = 750;
417
418 // Must have TPS & PPS initialized for ETB setup
419
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
420
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
421
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
422
423
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
424
425 // Mock pedal map to just return 80%
426
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
427
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(pedalMap, getValue(_, _))
428
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float, float) {
429 return 80;
430 });
431
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
432
433 // Below threshold, should return unadjusted throttle
434
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1000);
435
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_NEAR(80, etb.getSetpoint().value_or(-1), 1e-4);
436
437 // At threshold, should return unadjusted throttle
438
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 5000);
439
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_NEAR(80, etb.getSetpoint().value_or(-1), 1e-4);
440
441 // Middle of range, should return half of unadjusted
442
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 5375);
443
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_NEAR(40, etb.getSetpoint().value_or(-1), 1e-4);
444
445 // At limit+range, should return 0
446
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 5750);
447
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_NEAR(1, etb.getSetpoint().value_or(-1), 1e-4);
448
449 // Above limit+range, should return 0
450
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 6000);
451
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_NEAR(1, etb.getSetpoint().value_or(-1), 1e-4);
452 2 }
453
454 4 TEST(etb, setpointNoPedalMap) {
455
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
456
457 // Must have TPS & PPS initialized for ETB setup
458
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
459
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
460
461 // Don't pass a pedal map
462
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, nullptr);
463
464
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(etb.getSetpoint(), unexpected);
465 1 }
466
467 4 TEST(etb, setpointIdleValveController) {
468
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
469
470
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_IdleValve, nullptr, nullptr, nullptr);
471
472
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(0);
473
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, etb.getSetpoint().value_or(-1));
474
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(50);
475
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, etb.getSetpoint().value_or(-1));
476
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(100);
477
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(100, etb.getSetpoint().value_or(-1));
478
479 // Out of range should be clamped
480
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(-10);
481
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, etb.getSetpoint().value_or(-1));
482
1/1
✓ Branch 1 taken 1 time.
1 etb.setIdlePosition(110);
483
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(100, etb.getSetpoint().value_or(-1));
484 1 }
485
486 4 TEST(etb, setpointWastegateController) {
487
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
488
489
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Wastegate, nullptr, nullptr, nullptr);
490
491
1/1
✓ Branch 1 taken 1 time.
1 etb.setWastegatePosition(0);
492
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, etb.getSetpoint().value_or(-1));
493
1/1
✓ Branch 1 taken 1 time.
1 etb.setWastegatePosition(50);
494
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, etb.getSetpoint().value_or(-1));
495
1/1
✓ Branch 1 taken 1 time.
1 etb.setWastegatePosition(100);
496
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(100, etb.getSetpoint().value_or(-1));
497
498 // Out of range should be clamped
499
1/1
✓ Branch 1 taken 1 time.
1 etb.setWastegatePosition(-10);
500
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, etb.getSetpoint().value_or(-1));
501
1/1
✓ Branch 1 taken 1 time.
1 etb.setWastegatePosition(110);
502
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(100, etb.getSetpoint().value_or(-1));
503 1 }
504
505 4 TEST(etb, setpointLuaAdder) {
506
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
507
508 // Must have TPS & PPS initialized for ETB setup
509
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
510
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
511
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
512
513
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
514
515 // Mock pedal map to just return 50%
516
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
517
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(pedalMap, getValue(_, _))
518
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float, float) {
519 return 50;
520 });
521
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
522
523 // No adjustment, should be unadjusted
524
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(0);
525
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(50, etb.getSetpoint().value_or(-1));
526
527 // Normal adjustments should do as expected
528
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(10);
529
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(60, etb.getSetpoint().value_or(-1));
530
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(-10);
531
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(40, etb.getSetpoint().value_or(-1));
532
533 // Crazy adjustments don't cause unreasonable target
534
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(1000);
535
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(100, etb.getSetpoint().value_or(-1));
536
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(-1000);
537
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(1, etb.getSetpoint().value_or(-1));
538
539 1 int startTime = 1e6;
540
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(startTime);
541
542 // Adjustment works immediately after setting
543
1/1
✓ Branch 1 taken 1 time.
1 etb.setLuaAdjustment(10);
544
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(60, etb.getSetpoint().value_or(-1));
545
546 // Adjustment works 0.19 second after setting
547
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(startTime + 0.19 * 1e6);
548
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(60, etb.getSetpoint().value_or(-1));
549
550 // Adjustment resets to 0 after 0.21 second
551
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(startTime + 0.21 * 1e6);
552
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(50, etb.getSetpoint().value_or(-1));
553 2 }
554
555 4 TEST(etb, etbTpsSensor) {
556 // Throw some distinct values on the TPS sensors so we can identify that we're getting the correct one
557 1 Sensor::setMockValue(SensorType::Tps1, 25.0f, true);
558 1 Sensor::setMockValue(SensorType::Tps2, 75.0f, true);
559 1 Sensor::setMockValue(SensorType::WastegatePosition, 33.0f);
560 1 Sensor::setMockValue(SensorType::IdlePosition, 66.0f);
561
562 // Redundant accelerator pedal required for init
563 1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
564
565 // Test first throttle
566 {
567
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
568
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, nullptr);
569
3/7
✓ 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.
1 EXPECT_EQ(etb.observePlant().Value, 25.0f);
570 }
571
572 // Test second throttle
573 {
574
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
575
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle2, nullptr, nullptr, nullptr);
576
3/7
✓ 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.
1 EXPECT_EQ(etb.observePlant().Value, 75.0f);
577 }
578
579 // Test wastegate control
580 {
581
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
582
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Wastegate, nullptr, nullptr, nullptr);
583
3/7
✓ 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.
1 EXPECT_EQ(etb.observePlant().Value, 33.0f);
584 }
585
586 // Test idle valve control
587 {
588
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
589
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_IdleValve, nullptr, nullptr, nullptr);
590
3/7
✓ 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.
1 EXPECT_EQ(etb.observePlant().Value, 66.0f);
591 }
592 1 }
593
594 4 TEST(etb, setOutputInvalid) {
595
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
596
597 // Redundant TPS & accelerator pedal required for init
598
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
599
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0, true);
600
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
601
602
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
603
604
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
605
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
606
607 // Should be disabled in case of unexpected
608
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(motor, disable(_));
609
610
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(unexpected);
611 2 }
612
613 4 TEST(etb, setOutputValid) {
614
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
615
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
616
617 // Must have TPS & PPS initialized for ETB setup
618
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
619
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
620
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
621
622
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
623
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
624
625 // Should be enabled and value set
626
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(motor, enable());
627
4/4
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 12 taken 1 time.
3 EXPECT_CALL(motor, set(0.25f))
628
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(false));
629
630
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(25.0f);
631 2 }
632
633 4 TEST(etb, setOutputValid2) {
634
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
635
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
636
637 // Must have TPS & PPS initialized for ETB setup
638
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
639
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
640
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
641
642
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
643
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
644
645 // Should be enabled and value set
646
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(motor, enable());
647
4/4
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 12 taken 1 time.
3 EXPECT_CALL(motor, set(-0.25f))
648
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(false));
649
650
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(-25.0f);
651 2 }
652
653 4 TEST(etb, setOutputOutOfRangeHigh) {
654
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
655
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
656
657 // Must have TPS & PPS initialized for ETB setup
658
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
659
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
660
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
661
662
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
663
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
664
665 // Should be enabled and value set
666
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(motor, enable());
667
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(motor, set(0.90f));
668
669 // Off scale - should get clamped to 90%
670
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(110);
671 2 }
672
673 4 TEST(etb, setOutputOutOfRangeLow) {
674
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
675
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
676
677 // Must have TPS & PPS initialized for ETB setup
678
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
679
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
680
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
681
682
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
683
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
684
685 // Should be enabled and value set
686
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(motor, enable());
687
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(motor, set(-0.90f));
688
689 // Off scale - should get clamped to -90%
690
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(-110);
691 2 }
692
693 4 TEST(etb, setOutputPauseControl) {
694
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
695
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
696
697 // Must have TPS & PPS initialized for ETB setup
698
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
699
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
700
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
701
702
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
703
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
704
705 // Pause control - should get no output
706 1 engineConfiguration->pauseEtbControl = true;
707
708 // Disable should be called, and set shouldn't be called
709
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(motor, disable(_));
710
711
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(25.0f);
712 2 }
713
714 4 TEST(etb, setOutputLimpHome) {
715
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
716
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockMotor> motor;
717
718 // Must have TPS & PPS initialized for ETB setup
719
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
720
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
721
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
722
723
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
724
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, &motor, nullptr, nullptr);
725
726 // Should be disabled when in ETB limp mode
727
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(motor, disable(_));
728
729 // Trip a fatal error
730
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 getLimpManager()->fatalError();
731
732
1/1
✓ Branch 3 taken 1 time.
1 etb.setOutput(25.0f);
733 2 }
734
735 4 TEST(etb, closedLoopPid) {
736
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
737
738 1 pid_s pid = {};
739 1 pid.pFactor = 5;
740 1 pid.maxValue = 75;
741 1 pid.minValue = -60;
742
743 // Must have TPS & PPS initialized for ETB setup
744
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
745
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
746
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
747
748
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
749
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, &pid, nullptr);
750
751 // Disable autotune for now
752 1 engine->etbAutoTune = false;
753
754 // Setpoint greater than actual, should be positive output
755
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(etb.getClosedLoop(50, 40).value_or(-1), 50);
756 // Likewise but negative
757
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(etb.getClosedLoop(50, 52).value_or(-1), -10);
758
759 // Test PID limiting
760
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(etb.getClosedLoop(50, 70).value_or(-1), -60);
761
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(etb.getClosedLoop(50, 30).value_or(-1), 75);
762 2 }
763
764 4 TEST(etb, jamDetection) {
765
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
766
767
1/1
✓ Branch 2 taken 1 time.
1 MockIgnitionController ignController;
768
769
6/6
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 20 taken 1 time.
1 EXPECT_CALL(ignController, getIgnState).WillRepeatedly(Return(true));
770
771 // This only works when the ignition is on!
772
1/1
✓ Branch 1 taken 1 time.
1 engine->module<IgnitionController>().set(&ignController);
773
774 // Must have TPS & PPS initialized for ETB setup
775
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
776
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
777
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
778
779 // Limit of 5%, 1 second
780 1 engineConfiguration->etbJamDetectThreshold = 5;
781 1 engineConfiguration->etbJamTimeout = 1;
782
783
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
784
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, nullptr);
785
786
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(0);
787
788 // Reset timer while under error limit
789
1/1
✓ Branch 1 taken 1 time.
1 etb.checkJam(10, 14);
790
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(etb.jamTimer, 0);
791
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(etb.jamDetected);
792
793 // Start a jam
794
1/1
✓ Branch 1 taken 1 time.
1 etb.checkJam(10, 16);
795
796 // Just under time limit, no jam yet
797
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(0.9e6);
798
1/1
✓ Branch 1 taken 1 time.
1 etb.checkJam(10, 16);
799
2/6
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
1 EXPECT_NEAR(etb.jamTimer, 0.9f, 1e-3);
800
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(etb.jamDetected);
801
802 // Above the time limit, jam detected!
803
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(1.1e6);
804
1/1
✓ Branch 1 taken 1 time.
1 etb.checkJam(10, 16);
805
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE(etb.jamDetected);
806 2 }
807
808 4 TEST(etb, openLoopThrottle) {
809
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
810
811 // Redundant TPS & accelerator pedal required for init
812
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
813
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0, true);
814
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
815
816
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
817
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, nullptr);
818
819 // Map [0, 100] -> [-50, 50]
820
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->etbBiasBins, 0, 100);
821
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->etbBiasValues, -50, 50);
822
823
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_NEAR(-50, etb.getOpenLoop(0).value_or(-1), EPS4D);
824
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_NEAR(-25, etb.getOpenLoop(25).value_or(-1), EPS4D);
825
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_NEAR(0, etb.getOpenLoop(50).value_or(-1), EPS4D);
826
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_NEAR(25, etb.getOpenLoop(75).value_or(-1), EPS4D);
827
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_NEAR(50, etb.getOpenLoop(100).value_or(-1), EPS4D);
828 2 }
829
830 4 TEST(etb, openLoopDCWastegate) {
831
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
832
833 // Redundant TPS & accelerator pedal required for init
834
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
835
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0, true);
836
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
837
838
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
839
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Wastegate, nullptr, nullptr, nullptr);
840
841 // Map [0, 100] -> [-50, 50]
842
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->dcWastegateBiasBins, 0, 100);
843
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->dcWastegateBiasValues, -50, 50);
844
845
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_NEAR(-50, etb.getOpenLoop(0).value_or(-1), EPS2D);
846
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_NEAR(-24.48, etb.getOpenLoop(25).value_or(-1), EPS2D);
847
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_NEAR(0.47, etb.getOpenLoop(50).value_or(-1), EPS2D);
848
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_NEAR(25.51, etb.getOpenLoop(75).value_or(-1), EPS2D);
849
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_NEAR(50, etb.getOpenLoop(100).value_or(-1), EPS2D);
850 2 }
851
852 4 TEST(etb, openLoopNonThrottle) {
853
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
854
855 // Redundant TPS & accelerator pedal required for init
856
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
857
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0, true);
858
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true);
859
860
1/1
✓ Branch 2 taken 1 time.
1 EtbController etb;
861
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_IdleValve, nullptr, nullptr, nullptr);
862
863 // Map [0, 100] -> [-50, 50]
864
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->etbBiasBins, 0, 100);
865
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(config->etbBiasValues, -50, 50);
866
867 // Should all return 0, as non-throttles don't use open loop table
868
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, etb.getOpenLoop(0).value_or(-1));
869
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, etb.getOpenLoop(25).value_or(-1));
870
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, etb.getOpenLoop(50).value_or(-1));
871
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, etb.getOpenLoop(75).value_or(-1));
872
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, etb.getOpenLoop(100).value_or(-1));
873 2 }
874
875 4 TEST(etb, tractionControlEtbDrop) {
876
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
877
878 1 setTable(engineConfiguration->tractionControlEtbDrop, -10);
879
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(engineConfiguration->tractionControlSlipBins, /*from*/0.9, /*to*/1.2, 0.05);
880
1/1
✓ Branch 1 taken 1 time.
1 setLinearCurve(engineConfiguration->tractionControlSpeedBins, /*from*/10, /*to*/120, 5);
881
882 // Mock pedal map that's just passthru pedal -> target
883
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> pedalMap;
884
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(pedalMap, getValue(_, _))
885
2/2
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
3 .WillRepeatedly([](float xRpm, float y) {
886 return y;
887 });
888
889 // Must have TPS & PPS initialized for ETB setup
890
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1Primary, 0);
891
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0.0f, true);
892
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true);
893
894
1/1
✓ Branch 2 taken 1 time.
1 EtbController1 etb;
895
1/1
✓ Branch 1 taken 1 time.
1 etb.init(DC_Throttle1, nullptr, nullptr, &pedalMap);
896
897
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 47, true);
898
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(37, etb.getSetpoint().value_or(-1));
899
900 // test correct X/Y on table
901
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 40.0);
902
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::WheelSlipRatio, 0.9);
903
904 1 engineConfiguration->tractionControlEtbDrop[0][0] = -15;
905 1 engineConfiguration->tractionControlEtbDrop[0][1] = -15;
906
907 1 size_t lastYIndex = TRACTION_CONTROL_ETB_DROP_SLIP_SIZE - 1;
908 1 size_t lastXIndex = TRACTION_CONTROL_ETB_DROP_SPEED_SIZE - 1;
909
910 1 engineConfiguration->tractionControlEtbDrop[lastYIndex - 1][lastXIndex - 1] = 15;
911 1 engineConfiguration->tractionControlEtbDrop[lastYIndex][lastXIndex] = 15;
912
913 // we expect here that the first values are 37, and the last on the rigth side of the table are 62
914
915
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(37, etb.getSetpoint().value_or(-1));
916
917
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 120.0);
918
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::WheelSlipRatio, 1.2);
919
920
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(62, etb.getSetpoint().value_or(-1));
921 2 }
922