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 |