| 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 |