mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-19 22:35:23 +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:
parent
fd51cda9eb
commit
0c0483d020
8 changed files with 48 additions and 22 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -41,17 +41,18 @@ typedef enum {
|
||||||
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];
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue