From cb792f30d26ad3ac6b554adb9b5588cfab9d51f8 Mon Sep 17 00:00:00 2001 From: Robert Lacroix Date: Sun, 15 Jul 2018 09:22:34 +0200 Subject: [PATCH] Delay allowing sticky modes On bootup aux channels start out at default and allow sticky modes right away, although they should only be allowed once they are actually not active. _Legal disclaimer: I am making my contributions/submissions to this project solely in my personal capacity and am not conveying any rights to any intellectual property of any third parties._ --- src/main/fc/rc_modes.c | 3 ++- src/test/unit/arming_prevention_unittest.cc | 28 ++++++++++++++++++--- src/test/unit/flight_failsafe_unittest.cc | 5 ++++ src/test/unit/rc_controls_unittest.cc | 4 +++ src/test/unit/rcdevice_unittest.cc | 1 + 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/main/fc/rc_modes.c b/src/main/fc/rc_modes.c index 510a3244b9..66179fe02f 100644 --- a/src/main/fc/rc_modes.c +++ b/src/main/fc/rc_modes.c @@ -28,6 +28,7 @@ #include "common/bitarray.h" #include "common/maths.h" +#include "drivers/time.h" #include "config/feature.h" #include "pg/pg.h" @@ -112,7 +113,7 @@ void updateActivatedModes(void) if (paralyzeModeEverDisabled) { updateMasksForMac(mac, &andMask, &newMask); } else { - paralyzeModeEverDisabled = !isRangeActive(mac->auxChannelIndex, &mac->range); + paralyzeModeEverDisabled = micros() >= 5e6 && !isRangeActive(mac->auxChannelIndex, &mac->range); } } } else if (mode < CHECKBOX_ITEM_COUNT) { diff --git a/src/test/unit/arming_prevention_unittest.cc b/src/test/unit/arming_prevention_unittest.cc index 78d9a1e2f1..3b96f8972e 100644 --- a/src/test/unit/arming_prevention_unittest.cc +++ b/src/test/unit/arming_prevention_unittest.cc @@ -616,7 +616,7 @@ TEST(ArmingPreventionTest, ParalyzeOnAtBoot) { // given simulationFeatureFlags = 0; - simulationTime = 30e6; // 30 seconds after boot + simulationTime = 0; gyroCalibDone = true; // and @@ -660,7 +660,7 @@ TEST(ArmingPreventionTest, Paralyze) { // given simulationFeatureFlags = 0; - simulationTime = 30e6; // 30 seconds after boot + simulationTime = 0; gyroCalibDone = true; // and @@ -686,7 +686,7 @@ TEST(ArmingPreventionTest, Paralyze) // given rcData[THROTTLE] = 1000; rcData[AUX1] = 1000; - rcData[AUX2] = 1000; + rcData[AUX2] = 1800; // Start out with paralyze enabled rcData[AUX3] = 1000; ENABLE_STATE(SMALL_ANGLE); @@ -726,9 +726,28 @@ TEST(ArmingPreventionTest, Paralyze) EXPECT_FALSE(ARMING_FLAG(ARMED)); EXPECT_FALSE(isArmingDisabled()); EXPECT_EQ(0, getArmingDisableFlags()); + EXPECT_FALSE(IS_RC_MODE_ACTIVE(BOXPARALYZE)); // given - // paralyze (and activate linked vtx pit mode) + simulationTime = 10e6; // 10 seconds after boot + + // when + updateActivatedModes(); + + // expect + EXPECT_FALSE(ARMING_FLAG(ARMED)); + EXPECT_FALSE(isArmingDisabled()); + EXPECT_EQ(0, getArmingDisableFlags()); + EXPECT_FALSE(IS_RC_MODE_ACTIVE(BOXPARALYZE)); + + // given + // disable paralyze once after the startup timer + rcData[AUX2] = 1000; + + // when + updateActivatedModes(); + + // enable paralyze again rcData[AUX2] = 1800; // when @@ -738,6 +757,7 @@ TEST(ArmingPreventionTest, Paralyze) // expect EXPECT_TRUE(isArmingDisabled()); EXPECT_EQ(ARMING_DISABLED_PARALYZE, getArmingDisableFlags()); + EXPECT_TRUE(IS_RC_MODE_ACTIVE(BOXPARALYZE)); EXPECT_TRUE(IS_RC_MODE_ACTIVE(BOXVTXPITMODE)); EXPECT_FALSE(IS_RC_MODE_ACTIVE(BOXBEEPERON)); diff --git a/src/test/unit/flight_failsafe_unittest.cc b/src/test/unit/flight_failsafe_unittest.cc index d40539e4fa..4fe3e4aeae 100644 --- a/src/test/unit/flight_failsafe_unittest.cc +++ b/src/test/unit/flight_failsafe_unittest.cc @@ -555,6 +555,11 @@ uint32_t millis(void) return sysTickUptime; } +uint32_t micros(void) +{ + return millis() * 1000; +} + throttleStatus_e calculateThrottleStatus() { return throttleStatus; diff --git a/src/test/unit/rc_controls_unittest.cc b/src/test/unit/rc_controls_unittest.cc index bf20ccaf28..d8b67449b5 100644 --- a/src/test/unit/rc_controls_unittest.cc +++ b/src/test/unit/rc_controls_unittest.cc @@ -224,6 +224,10 @@ extern "C" { uint32_t millis(void) { return fixedMillis; } + +uint32_t micros(void) { + return fixedMillis * 1000; +} } void resetMillis(void) { diff --git a/src/test/unit/rcdevice_unittest.cc b/src/test/unit/rcdevice_unittest.cc index 00a1bdf785..a255e4d830 100644 --- a/src/test/unit/rcdevice_unittest.cc +++ b/src/test/unit/rcdevice_unittest.cc @@ -888,6 +888,7 @@ extern "C" { } uint32_t millis(void) { return testData.millis++; } + uint32_t micros(void) { return millis() * 1000; } void beeper(beeperMode_e mode) { UNUSED(mode); } uint8_t armingFlags = 0; bool cmsInMenu;