From 312a7d73b9fbbd8df56ed2c886eec62a0723b665 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Sun, 30 Jul 2017 15:48:02 +0100 Subject: [PATCH] Disable arming as soon as an RX link is lost --- src/main/fc/runtime_config.c | 3 ++- src/main/fc/runtime_config.h | 3 ++- src/main/flight/failsafe.c | 2 ++ src/test/unit/flight_failsafe_unittest.cc | 17 +++++++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/fc/runtime_config.c b/src/main/fc/runtime_config.c index 14b8325d4e..4fc722fece 100644 --- a/src/main/fc/runtime_config.c +++ b/src/main/fc/runtime_config.c @@ -32,7 +32,8 @@ static uint32_t enabledSensors = 0; #if defined(OSD) || !defined(MINIMAL_CLI) const char *armingDisableFlagNames[]= { "NOGYRO", "FAILSAFE", "BOXFAILSAFE", "THROTTLE", - "ANGLE", "LOAD", "CALIB", "CLI", "CMS", "OSD", "BST" + "ANGLE", "LOAD", "CALIB", "CLI", "CMS", "OSD", "BST", + "RX LOSS" }; #endif diff --git a/src/main/fc/runtime_config.h b/src/main/fc/runtime_config.h index 6fdf3f2113..477372a5af 100644 --- a/src/main/fc/runtime_config.h +++ b/src/main/fc/runtime_config.h @@ -45,9 +45,10 @@ typedef enum { ARMING_DISABLED_CMS_MENU = (1 << 8), ARMING_DISABLED_OSD_MENU = (1 << 9), ARMING_DISABLED_BST = (1 << 10), + ARMING_DISABLED_RX_FAILSAFE = (1 << 11), } armingDisableFlags_e; -#define NUM_ARMING_DISABLE_FLAGS 11 +#define NUM_ARMING_DISABLE_FLAGS 12 #if defined(OSD) || !defined(MINIMAL_CLI) extern const char *armingDisableFlagNames[NUM_ARMING_DISABLE_FLAGS]; #endif diff --git a/src/main/flight/failsafe.c b/src/main/flight/failsafe.c index 0a91f4532f..32c2c1bab9 100644 --- a/src/main/flight/failsafe.c +++ b/src/main/flight/failsafe.c @@ -154,11 +154,13 @@ void failsafeOnValidDataReceived(void) failsafeState.validRxDataReceivedAt = millis(); if ((failsafeState.validRxDataReceivedAt - failsafeState.validRxDataFailedAt) > PERIOD_RXDATA_RECOVERY) { failsafeState.rxLinkState = FAILSAFE_RXLINK_UP; + unsetArmingDisabled(ARMING_DISABLED_RX_FAILSAFE); } } void failsafeOnValidDataFailed(void) { + setArmingDisabled(ARMING_DISABLED_RX_FAILSAFE); // To prevent arming with no RX link failsafeState.validRxDataFailedAt = millis(); if ((failsafeState.validRxDataFailedAt - failsafeState.validRxDataReceivedAt) > failsafeState.rxDataFailurePeriod) { failsafeState.rxLinkState = FAILSAFE_RXLINK_DOWN; diff --git a/src/test/unit/flight_failsafe_unittest.cc b/src/test/unit/flight_failsafe_unittest.cc index 219db6cbc1..0ad2bba3a7 100644 --- a/src/test/unit/flight_failsafe_unittest.cc +++ b/src/test/unit/flight_failsafe_unittest.cc @@ -405,6 +405,23 @@ TEST(FlightFailsafeTest, TestFailsafeNotActivatedWhenDisarmedAndRXLossIsDetected EXPECT_EQ(false, failsafeIsActive()); EXPECT_EQ(FAILSAFE_IDLE, failsafePhase()); EXPECT_EQ(1, CALL_COUNTER(COUNTER_MW_DISARM)); + EXPECT_TRUE(isArmingDisabled()); + + // given + // enough valid data is received + uint32_t sysTickTarget = sysTickUptime + PERIOD_RXDATA_RECOVERY; + for (; sysTickUptime < sysTickTarget; sysTickUptime++) { + failsafeOnValidDataReceived(); + failsafeUpdateState(); + + EXPECT_TRUE(isArmingDisabled()); + } + + // and + sysTickUptime++; // adjust time to point just past the failure time to + failsafeOnValidDataReceived(); // cause link recovery + + // then EXPECT_FALSE(isArmingDisabled()); }