From ec8e1eee69683af2e575c76b04ba48fca2f481f8 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sun, 30 May 2021 16:19:57 -0700 Subject: [PATCH] require redundant pedal (#2758) * require redundant pedal * return false * I don't typing good * tests * tests --- .../actuators/electronic_throttle.cpp | 9 ++ unit_tests/tests/test_etb.cpp | 96 ++++++++++++------- 2 files changed, 68 insertions(+), 37 deletions(-) diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index 6186f5fdbb..e694ce5c6d 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -200,6 +200,15 @@ bool EtbController::init(etb_function_e function, DcMotor *motor, pid_s *pidPara return false; } + + if (!Sensor::isRedundant(SensorType::AcceleratorPedal)) { + firmwareError( + OBD_Throttle_Position_Sensor_Circuit_Malfunction, + "Use of electronic throttle requires accelerator pedal to be redundant." + ); + + return false; + } } m_motor = motor; diff --git a/unit_tests/tests/test_etb.cpp b/unit_tests/tests/test_etb.cpp index 72723a8866..3e510288f0 100644 --- a/unit_tests/tests/test_etb.cpp +++ b/unit_tests/tests/test_etb.cpp @@ -50,7 +50,7 @@ TEST(etb, initializationMissingThrottle) { EXPECT_CALL(mocks[1], init(ETB_None, _, _, _, true)).WillOnce(Return(false)); // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true); Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); // This should throw: a pedal is configured but no throttles @@ -67,7 +67,7 @@ TEST(etb, initializationSingleThrottle) { } // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true); Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); engineConfiguration->etbFunctions[0] = ETB_Throttle1; @@ -92,8 +92,8 @@ TEST(etb, initializationSingleThrottleInSecondSlot) { } // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); - Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true); + Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0, false); engineConfiguration->etbFunctions[0] = ETB_None; engineConfiguration->etbFunctions[1] = ETB_Throttle1; @@ -117,8 +117,8 @@ TEST(etb, initializationDualThrottle) { } // Must have a sensor configured before init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); - Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true); + Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 0, false); Sensor::setMockValue(SensorType::Tps1, 25.0f, true); Sensor::setMockValue(SensorType::Tps2, 25.0f, true); @@ -172,7 +172,7 @@ TEST(etb, initializationNotRedundantTps) { EtbController dut; // Needs pedal for init - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); // Not redundant, should fail upon init Sensor::setMockValue(SensorType::Tps1, 0.0f, false); @@ -180,6 +180,18 @@ TEST(etb, initializationNotRedundantTps) { EXPECT_FATAL_ERROR(dut.init(ETB_Throttle1, nullptr, nullptr, nullptr, true)); } +TEST(etb, initializationNotRedundantPedal) { + EtbController dut; + + // Init pedal without redundancy + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, false); + + // Normal redundant TPS + Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + + EXPECT_FATAL_ERROR(dut.init(ETB_Throttle1, nullptr, nullptr, nullptr, true)); +} + TEST(etb, initializationNoThrottles) { // This tests the case where you don't want an ETB, and expect everything to go fine EtbController duts[2]; @@ -209,7 +221,7 @@ TEST(etb, idlePlumbing) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); engineConfiguration->useETBforIdleControl = true; - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); for (int i = 0; i < ETB_COUNT; i++) { engine->etbControllers[i] = &mocks[i]; @@ -239,36 +251,37 @@ TEST(etb, testSetpointOnlyPedal) { // Uninitialized ETB must return unexpected (and not deference a null pointer) EXPECT_EQ(etb.getSetpoint(), unexpected); - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); etb.init(ETB_Throttle1, nullptr, nullptr, &pedalMap, true); // Check endpoints and midpoint - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EXPECT_EQ(0, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); EXPECT_EQ(50, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true); EXPECT_EQ(100, etb.getSetpoint().value_or(-1)); // Test some floating point pedal/output values - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.8302f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.8302f, true); EXPECT_NEAR(50.8302, etb.getSetpoint().value_or(-1), EPS4D); - Sensor::setMockValue(SensorType::AcceleratorPedal, 51.6605f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 51.6605f, true); EXPECT_NEAR(51.6605, etb.getSetpoint().value_or(-1), EPS4D); // Valid but out of range - should clamp to [0, 100] - Sensor::setMockValue(SensorType::AcceleratorPedal, -5); + Sensor::setMockValue(SensorType::AcceleratorPedal, -5, true); EXPECT_EQ(0, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 105); + Sensor::setMockValue(SensorType::AcceleratorPedal, 105, true); EXPECT_EQ(100, etb.getSetpoint().value_or(-1)); // Check that ETB idle does NOT work - it's disabled etb.setIdlePosition(50); - Sensor::setMockValue(SensorType::AcceleratorPedal, 0); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0, true); EXPECT_EQ(0, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 20); + Sensor::setMockValue(SensorType::AcceleratorPedal, 20, true); EXPECT_EQ(20, etb.getSetpoint().value_or(-1)); // Test invalid pedal position - should give 0 position @@ -283,8 +296,9 @@ TEST(etb, setpointIdle) { engineConfiguration->useETBforIdleControl = true; engineConfiguration->etbIdleThrottleRange = 0; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -298,9 +312,9 @@ TEST(etb, setpointIdle) { etb.init(ETB_Throttle1, nullptr, nullptr, &pedalMap, true); // No idle range, should just pass pedal - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EXPECT_EQ(0, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); EXPECT_EQ(50, etb.getSetpoint().value_or(-1)); // Idle should now have 10% range @@ -308,35 +322,36 @@ TEST(etb, setpointIdle) { // 50% idle position should increase setpoint by 5% when closed, and 0% when open etb.setIdlePosition(50); - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EXPECT_FLOAT_EQ(5, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); EXPECT_FLOAT_EQ(52.5, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true); EXPECT_FLOAT_EQ(100, etb.getSetpoint().value_or(-1)); // 100% setpoint should increase by 10% closed, scaled 0% at wot etb.setIdlePosition(100); - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EXPECT_FLOAT_EQ(10, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); EXPECT_FLOAT_EQ(55, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 100.0f, true); EXPECT_FLOAT_EQ(100, etb.getSetpoint().value_or(-1)); // 125% setpoint should clamp to 10% increase etb.setIdlePosition(125); - Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EXPECT_FLOAT_EQ(10, etb.getSetpoint().value_or(-1)); - Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f); + Sensor::setMockValue(SensorType::AcceleratorPedal, 50.0f, true); EXPECT_FLOAT_EQ(55, etb.getSetpoint().value_or(-1)); } TEST(etb, setpointNoPedalMap) { EtbController etb; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); // Don't pass a pedal map etb.init(ETB_Throttle1, nullptr, nullptr, nullptr, true); @@ -437,8 +452,9 @@ TEST(etb, setOutputValid) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -456,8 +472,9 @@ TEST(etb, setOutputValid2) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -475,8 +492,9 @@ TEST(etb, setOutputOutOfRangeHigh) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -494,8 +512,9 @@ TEST(etb, setOutputOutOfRangeLow) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -513,8 +532,9 @@ TEST(etb, setOutputPauseControl) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -533,8 +553,9 @@ TEST(etb, setOutputLimpHome) { WITH_ENGINE_TEST_HELPER(TEST_ENGINE); StrictMock motor; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; INJECT_ENGINE_REFERENCE(&etb); @@ -555,8 +576,9 @@ TEST(etb, closedLoopPid) { pid.maxValue = 75; pid.minValue = -60; - // Must have TPS initialized for ETB setup + // Must have TPS & PPS initialized for ETB setup Sensor::setMockValue(SensorType::Tps1, 0.0f, true); + Sensor::setMockValue(SensorType::AcceleratorPedal, 0.0f, true); EtbController etb; etb.init(ETB_Throttle1, nullptr, &pid, nullptr, true);