1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 14:25:20 +03:00

Add configurable boot grace time

This guards against the case when the RX takes longer to obtain a valid
link than the gyro takes to calibrate (previously this delay is all that
stopped immediate arming).
This commit is contained in:
Dan Nixon 2017-08-13 13:17:25 +01:00
parent fd51cda9eb
commit 0c0483d020
8 changed files with 48 additions and 22 deletions

View file

@ -134,6 +134,7 @@ PG_RESET_TEMPLATE(systemConfig_t, systemConfig,
.debug_mode = DEBUG_MODE, .debug_mode = DEBUG_MODE,
.task_statistics = true, .task_statistics = true,
.cpu_overclock = false, .cpu_overclock = false,
.powerOnArmingGraceTime = 5,
.boardIdentifier = TARGET_BOARD_IDENTIFIER .boardIdentifier = TARGET_BOARD_IDENTIFIER
); );
#else #else

View file

@ -72,6 +72,7 @@ typedef struct systemConfig_s {
#if defined(STM32F4) && !defined(DISABLE_OVERCLOCK) #if defined(STM32F4) && !defined(DISABLE_OVERCLOCK)
uint8_t cpu_overclock; uint8_t cpu_overclock;
#endif #endif
uint8_t powerOnArmingGraceTime; // in seconds
char boardIdentifier[sizeof(TARGET_BOARD_IDENTIFIER) + 1]; char boardIdentifier[sizeof(TARGET_BOARD_IDENTIFIER) + 1];
} systemConfig_t; } systemConfig_t;
#endif #endif

View file

@ -152,6 +152,12 @@ void updateArmingStatus(void)
if (ARMING_FLAG(ARMED)) { if (ARMING_FLAG(ARMED)) {
LED0_ON; LED0_ON;
} else { } else {
// Check if the power on arming grace time has elapsed
if ((getArmingDisableFlags() & ARMING_DISABLED_BOOT_GRACE_TIME) && (millis() >= systemConfig()->powerOnArmingGraceTime * 1000)) {
// If so, unset the grace time arming disable flag
unsetArmingDisabled(ARMING_DISABLED_BOOT_GRACE_TIME);
}
if (IS_RC_MODE_ACTIVE(BOXFAILSAFE)) { if (IS_RC_MODE_ACTIVE(BOXFAILSAFE)) {
setArmingDisabled(ARMING_DISABLED_BOXFAILSAFE); setArmingDisabled(ARMING_DISABLED_BOXFAILSAFE);
} else { } else {

View file

@ -719,6 +719,8 @@ void init(void)
latchActiveFeatures(); latchActiveFeatures();
pwmEnableMotors(); pwmEnableMotors();
setArmingDisabled(ARMING_DISABLED_BOOT_GRACE_TIME);
#ifdef USE_OSD_SLAVE #ifdef USE_OSD_SLAVE
osdSlaveTasksInit(); osdSlaveTasksInit();
#else #else

View file

@ -32,8 +32,8 @@ static uint32_t enabledSensors = 0;
#if defined(OSD) || !defined(MINIMAL_CLI) #if defined(OSD) || !defined(MINIMAL_CLI)
const char *armingDisableFlagNames[]= { const char *armingDisableFlagNames[]= {
"NOGYRO", "FAILSAFE", "RX LOSS", "BOXFAILSAFE", "THROTTLE", "NOGYRO", "FAILSAFE", "RX LOSS", "BOXFAILSAFE", "THROTTLE",
"ANGLE", "NO PREARM", "ARM SWITCH", "LOAD", "CALIB", "CLI", "ANGLE", "BOOT GRACE", "NO PREARM", "ARM SWITCH", "LOAD",
"CMS", "OSD", "BST" "CALIB", "CLI", "CMS", "OSD", "BST"
}; };
#endif #endif

View file

@ -35,23 +35,24 @@ extern uint8_t armingFlags;
* (Beeper code can notify the most critical reason.) * (Beeper code can notify the most critical reason.)
*/ */
typedef enum { typedef enum {
ARMING_DISABLED_NO_GYRO = (1 << 0), ARMING_DISABLED_NO_GYRO = (1 << 0),
ARMING_DISABLED_FAILSAFE = (1 << 1), ARMING_DISABLED_FAILSAFE = (1 << 1),
ARMING_DISABLED_RX_FAILSAFE = (1 << 2), ARMING_DISABLED_RX_FAILSAFE = (1 << 2),
ARMING_DISABLED_BOXFAILSAFE = (1 << 3), ARMING_DISABLED_BOXFAILSAFE = (1 << 3),
ARMING_DISABLED_THROTTLE = (1 << 4), ARMING_DISABLED_THROTTLE = (1 << 4),
ARMING_DISABLED_ANGLE = (1 << 5), ARMING_DISABLED_ANGLE = (1 << 5),
ARMING_DISABLED_NOPREARM = (1 << 6), ARMING_DISABLED_BOOT_GRACE_TIME = (1 << 6),
ARMING_DISABLED_ARM_SWITCH = (1 << 7), ARMING_DISABLED_NOPREARM = (1 << 7),
ARMING_DISABLED_LOAD = (1 << 8), ARMING_DISABLED_ARM_SWITCH = (1 << 8),
ARMING_DISABLED_CALIBRATING = (1 << 9), ARMING_DISABLED_LOAD = (1 << 9),
ARMING_DISABLED_CLI = (1 << 10), ARMING_DISABLED_CALIBRATING = (1 << 10),
ARMING_DISABLED_CMS_MENU = (1 << 11), ARMING_DISABLED_CLI = (1 << 11),
ARMING_DISABLED_OSD_MENU = (1 << 12), ARMING_DISABLED_CMS_MENU = (1 << 12),
ARMING_DISABLED_BST = (1 << 13) ARMING_DISABLED_OSD_MENU = (1 << 13),
ARMING_DISABLED_BST = (1 << 14)
} armingDisableFlags_e; } armingDisableFlags_e;
#define NUM_ARMING_DISABLE_FLAGS 14 #define NUM_ARMING_DISABLE_FLAGS 15
#if defined(OSD) || !defined(MINIMAL_CLI) #if defined(OSD) || !defined(MINIMAL_CLI)
extern const char *armingDisableFlagNames[NUM_ARMING_DISABLE_FLAGS]; extern const char *armingDisableFlagNames[NUM_ARMING_DISABLE_FLAGS];

View file

@ -704,6 +704,7 @@ const clivalue_t valueTable[] = {
#if defined(STM32F4) && !defined(DISABLE_OVERCLOCK) #if defined(STM32F4) && !defined(DISABLE_OVERCLOCK)
{ "cpu_overclock", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_SYSTEM_CONFIG, offsetof(systemConfig_t, cpu_overclock) }, { "cpu_overclock", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_SYSTEM_CONFIG, offsetof(systemConfig_t, cpu_overclock) },
#endif #endif
{ "pwr_on_arm_grace", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 30 }, PG_SYSTEM_CONFIG, offsetof(systemConfig_t, powerOnArmingGraceTime) },
// PG_VTX_CONFIG // PG_VTX_CONFIG
#ifdef VTX_RTC6705 #ifdef VTX_RTC6705

View file

@ -70,7 +70,7 @@ bool gyroCalibDone = false;
#include "gtest/gtest.h" #include "gtest/gtest.h"
TEST(ArmingPreventionTest, CalibrationAngleThrottleArmSwitch) TEST(ArmingPreventionTest, CalibrationPowerOnGraceAngleThrottleArmSwitch)
{ {
// given // given
simulationTime = 0; simulationTime = 0;
@ -91,13 +91,17 @@ TEST(ArmingPreventionTest, CalibrationAngleThrottleArmSwitch)
rcData[THROTTLE] = 1400; rcData[THROTTLE] = 1400;
rcData[4] = 1800; rcData[4] = 1800;
// and
systemConfigMutable()->powerOnArmingGraceTime = 5;
setArmingDisabled(ARMING_DISABLED_BOOT_GRACE_TIME);
// when // when
updateActivatedModes(); updateActivatedModes();
updateArmingStatus(); updateArmingStatus();
// expect // expect
EXPECT_TRUE(isArmingDisabled()); EXPECT_TRUE(isArmingDisabled());
EXPECT_EQ(ARMING_DISABLED_CALIBRATING | ARMING_DISABLED_ANGLE | ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags()); EXPECT_EQ(ARMING_DISABLED_BOOT_GRACE_TIME | ARMING_DISABLED_CALIBRATING | ARMING_DISABLED_ANGLE | ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags());
// given // given
// gyro calibration is done // gyro calibration is done
@ -109,7 +113,7 @@ TEST(ArmingPreventionTest, CalibrationAngleThrottleArmSwitch)
// expect // expect
EXPECT_TRUE(isArmingDisabled()); EXPECT_TRUE(isArmingDisabled());
EXPECT_EQ(ARMING_DISABLED_ANGLE | ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags()); EXPECT_EQ(ARMING_DISABLED_BOOT_GRACE_TIME | ARMING_DISABLED_ANGLE | ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags());
// given // given
// quad is level // quad is level
@ -120,7 +124,7 @@ TEST(ArmingPreventionTest, CalibrationAngleThrottleArmSwitch)
// expect // expect
EXPECT_TRUE(isArmingDisabled()); EXPECT_TRUE(isArmingDisabled());
EXPECT_EQ(ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags()); EXPECT_EQ(ARMING_DISABLED_BOOT_GRACE_TIME | ARMING_DISABLED_ARM_SWITCH | ARMING_DISABLED_THROTTLE, getArmingDisableFlags());
// given // given
rcData[THROTTLE] = 1000; rcData[THROTTLE] = 1000;
@ -128,6 +132,17 @@ TEST(ArmingPreventionTest, CalibrationAngleThrottleArmSwitch)
// when // when
updateArmingStatus(); updateArmingStatus();
// expect
EXPECT_TRUE(isArmingDisabled());
EXPECT_EQ(ARMING_DISABLED_BOOT_GRACE_TIME | ARMING_DISABLED_ARM_SWITCH, getArmingDisableFlags());
// given
// arming grace time has elapsed
simulationTime += systemConfig()->powerOnArmingGraceTime * 1e6;
// when
updateArmingStatus();
// expect // expect
EXPECT_TRUE(isArmingDisabled()); EXPECT_TRUE(isArmingDisabled());
EXPECT_EQ(ARMING_DISABLED_ARM_SWITCH, getArmingDisableFlags()); EXPECT_EQ(ARMING_DISABLED_ARM_SWITCH, getArmingDisableFlags());
@ -220,7 +235,6 @@ TEST(ArmingPreventionTest, ArmingGuardRadioLeftOnAndArmed)
EXPECT_FALSE(isArmingDisabled()); EXPECT_FALSE(isArmingDisabled());
} }
TEST(ArmingPreventionTest, Prearm) TEST(ArmingPreventionTest, Prearm)
{ {
// given // given