1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-17 13:25:30 +03:00

Merge pull request #7028 from mikeller/add_crash_flip_led_warning

Added 'crash flip active' to the list of warnings to be shown on LED_STRIP.
This commit is contained in:
Michael Keller 2018-11-04 14:52:40 +13:00 committed by GitHub
commit 3492bcff3d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 37 additions and 25 deletions

View file

@ -129,7 +129,7 @@ enum {
int16_t magHold; int16_t magHold;
#endif #endif
static bool flipOverAfterCrashMode = false; static bool flipOverAfterCrashActive = false;
static timeUs_t disarmAt; // Time of automatic disarm when "Don't spin the motors when armed" is enabled and auto_disarm_delay is nonzero static timeUs_t disarmAt; // Time of automatic disarm when "Don't spin the motors when armed" is enabled and auto_disarm_delay is nonzero
@ -216,7 +216,7 @@ void updateArmingStatus(void)
} }
// Clear the crash flip active status // Clear the crash flip active status
flipOverAfterCrashMode = false; flipOverAfterCrashActive = false;
// If switch is used for arming then check it is not defaulting to on when the RX link recovers from a fault // If switch is used for arming then check it is not defaulting to on when the RX link recovers from a fault
if (!isUsingSticksForArming()) { if (!isUsingSticksForArming()) {
@ -339,11 +339,11 @@ void disarm(void)
#endif #endif
BEEP_OFF; BEEP_OFF;
#ifdef USE_DSHOT #ifdef USE_DSHOT
if (isMotorProtocolDshot() && flipOverAfterCrashMode && !featureIsEnabled(FEATURE_3D)) { if (isMotorProtocolDshot() && flipOverAfterCrashActive && !featureIsEnabled(FEATURE_3D)) {
pwmWriteDshotCommand(ALL_MOTORS, getMotorCount(), DSHOT_CMD_SPIN_DIRECTION_NORMAL, false); pwmWriteDshotCommand(ALL_MOTORS, getMotorCount(), DSHOT_CMD_SPIN_DIRECTION_NORMAL, false);
} }
#endif #endif
flipOverAfterCrashMode = false; flipOverAfterCrashActive = false;
// if ARMING_DISABLED_RUNAWAY_TAKEOFF is set then we want to play it's beep pattern instead // if ARMING_DISABLED_RUNAWAY_TAKEOFF is set then we want to play it's beep pattern instead
if (!(getArmingDisableFlags() & ARMING_DISABLED_RUNAWAY_TAKEOFF)) { if (!(getArmingDisableFlags() & ARMING_DISABLED_RUNAWAY_TAKEOFF)) {
@ -370,7 +370,7 @@ void tryArm(void)
#ifdef USE_DSHOT #ifdef USE_DSHOT
if (currentTimeUs - getLastDshotBeaconCommandTimeUs() < DSHOT_BEACON_GUARD_DELAY_US) { if (currentTimeUs - getLastDshotBeaconCommandTimeUs() < DSHOT_BEACON_GUARD_DELAY_US) {
if (tryingToArm == ARMING_DELAYED_DISARMED) { if (tryingToArm == ARMING_DELAYED_DISARMED) {
if (isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) {
tryingToArm = ARMING_DELAYED_CRASHFLIP; tryingToArm = ARMING_DELAYED_CRASHFLIP;
#ifdef USE_LAUNCH_CONTROL #ifdef USE_LAUNCH_CONTROL
} else if (canUseLaunchControl()) { } else if (canUseLaunchControl()) {
@ -384,12 +384,12 @@ void tryArm(void)
} }
if (isMotorProtocolDshot() && isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH)) { if (isMotorProtocolDshot() && isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH)) {
if (!(IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH) || (tryingToArm == ARMING_DELAYED_CRASHFLIP))) { if (!(IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH) || (tryingToArm == ARMING_DELAYED_CRASHFLIP))) {
flipOverAfterCrashMode = false; flipOverAfterCrashActive = false;
if (!featureIsEnabled(FEATURE_3D)) { if (!featureIsEnabled(FEATURE_3D)) {
pwmWriteDshotCommand(ALL_MOTORS, getMotorCount(), DSHOT_CMD_SPIN_DIRECTION_NORMAL, false); pwmWriteDshotCommand(ALL_MOTORS, getMotorCount(), DSHOT_CMD_SPIN_DIRECTION_NORMAL, false);
} }
} else { } else {
flipOverAfterCrashMode = true; flipOverAfterCrashActive = true;
#ifdef USE_RUNAWAY_TAKEOFF #ifdef USE_RUNAWAY_TAKEOFF
runawayTakeoffCheckDisabled = false; runawayTakeoffCheckDisabled = false;
#endif #endif
@ -401,7 +401,7 @@ void tryArm(void)
#endif #endif
#ifdef USE_LAUNCH_CONTROL #ifdef USE_LAUNCH_CONTROL
if (!flipOverAfterCrashMode && (canUseLaunchControl() || (tryingToArm == ARMING_DELAYED_LAUNCH_CONTROL))) { if (!flipOverAfterCrashActive && (canUseLaunchControl() || (tryingToArm == ARMING_DELAYED_LAUNCH_CONTROL))) {
if (launchControlState == LAUNCH_CONTROL_DISABLED) { // only activate if it hasn't already been triggered if (launchControlState == LAUNCH_CONTROL_DISABLED) { // only activate if it hasn't already been triggered
launchControlState = LAUNCH_CONTROL_ACTIVE; launchControlState = LAUNCH_CONTROL_ACTIVE;
} }
@ -648,7 +648,7 @@ bool processRx(timeUs_t currentTimeUs)
if (ARMING_FLAG(ARMED) if (ARMING_FLAG(ARMED)
&& pidConfig()->runaway_takeoff_prevention && pidConfig()->runaway_takeoff_prevention
&& !runawayTakeoffCheckDisabled && !runawayTakeoffCheckDisabled
&& !flipOverAfterCrashMode && !flipOverAfterCrashActive
&& !runawayTakeoffTemporarilyDisabled && !runawayTakeoffTemporarilyDisabled
&& !STATE(FIXED_WING)) { && !STATE(FIXED_WING)) {
@ -784,7 +784,7 @@ bool processRx(timeUs_t currentTimeUs)
#ifdef USE_DSHOT #ifdef USE_DSHOT
/* Enable beep warning when the crash flip mode is active */ /* Enable beep warning when the crash flip mode is active */
if (isMotorProtocolDshot() && isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { if (flipOverAfterCrashActive) {
beeper(BEEPER_CRASH_FLIP_MODE); beeper(BEEPER_CRASH_FLIP_MODE);
} }
#endif #endif
@ -934,7 +934,7 @@ static FAST_CODE void subTaskPidController(timeUs_t currentTimeUs)
&& !STATE(FIXED_WING) && !STATE(FIXED_WING)
&& pidConfig()->runaway_takeoff_prevention && pidConfig()->runaway_takeoff_prevention
&& !runawayTakeoffCheckDisabled && !runawayTakeoffCheckDisabled
&& !flipOverAfterCrashMode && !flipOverAfterCrashActive
&& !runawayTakeoffTemporarilyDisabled && !runawayTakeoffTemporarilyDisabled
&& (!featureIsEnabled(FEATURE_MOTOR_STOP) || airmodeIsEnabled() || (calculateThrottleStatus() != THROTTLE_LOW))) { && (!featureIsEnabled(FEATURE_MOTOR_STOP) || airmodeIsEnabled() || (calculateThrottleStatus() != THROTTLE_LOW))) {
@ -1088,9 +1088,9 @@ FAST_CODE void taskMainPidLoop(timeUs_t currentTimeUs)
} }
bool isFlipOverAfterCrashMode(void) bool isFlipOverAfterCrashActive(void)
{ {
return flipOverAfterCrashMode; return flipOverAfterCrashActive;
} }
timeUs_t getLastDisarmTimeUs(void) timeUs_t getLastDisarmTimeUs(void)

View file

@ -66,7 +66,8 @@ bool processRx(timeUs_t currentTimeUs);
void updateArmingStatus(void); void updateArmingStatus(void);
void taskMainPidLoop(timeUs_t currentTimeUs); void taskMainPidLoop(timeUs_t currentTimeUs);
bool isFlipOverAfterCrashMode(void);
bool isFlipOverAfterCrashActive(void);
void runawayTakeoffTemporaryDisable(uint8_t disableFlag); void runawayTakeoffTemporaryDisable(uint8_t disableFlag);
bool isAirmodeActivated(); bool isAirmodeActivated();

View file

@ -798,7 +798,7 @@ void updateDynLpfCutoffs(timeUs_t currentTimeUs, float throttle)
FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensation) FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensation)
{ {
if (isFlipOverAfterCrashMode()) { if (isFlipOverAfterCrashActive()) {
applyFlipOverAfterCrashModeToMotors(); applyFlipOverAfterCrashModeToMotors();
return; return;
} }

View file

@ -47,6 +47,7 @@
#include "drivers/vtx_common.h" #include "drivers/vtx_common.h"
#include "fc/config.h" #include "fc/config.h"
#include "fc/core.h"
#include "fc/rc_controls.h" #include "fc/rc_controls.h"
#include "fc/rc_modes.h" #include "fc/rc_modes.h"
#include "fc/runtime_config.h" #include "fc/runtime_config.h"
@ -522,6 +523,7 @@ typedef enum {
WARNING_ARMING_DISABLED, WARNING_ARMING_DISABLED,
WARNING_LOW_BATTERY, WARNING_LOW_BATTERY,
WARNING_FAILSAFE, WARNING_FAILSAFE,
WARNING_CRASH_FLIP_ACTIVE,
} warningFlags_e; } warningFlags_e;
static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) static void applyLedWarningLayer(bool updateNow, timeUs_t *timer)
@ -536,13 +538,19 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer)
if (warningFlashCounter == 0) { // update when old flags was processed if (warningFlashCounter == 0) { // update when old flags was processed
warningFlags = 0; warningFlags = 0;
if (batteryConfig()->voltageMeterSource != VOLTAGE_METER_NONE && getBatteryState() != BATTERY_OK) if (batteryConfig()->voltageMeterSource != VOLTAGE_METER_NONE && getBatteryState() != BATTERY_OK) {
warningFlags |= 1 << WARNING_LOW_BATTERY; warningFlags |= 1 << WARNING_LOW_BATTERY;
if (failsafeIsActive()) }
if (failsafeIsActive()) {
warningFlags |= 1 << WARNING_FAILSAFE; warningFlags |= 1 << WARNING_FAILSAFE;
if (!ARMING_FLAG(ARMED) && isArmingDisabled()) }
if (!ARMING_FLAG(ARMED) && isArmingDisabled()) {
warningFlags |= 1 << WARNING_ARMING_DISABLED; warningFlags |= 1 << WARNING_ARMING_DISABLED;
} }
if (isFlipOverAfterCrashActive()) {
warningFlags |= 1 << WARNING_CRASH_FLIP_ACTIVE;
}
}
*timer += HZ_TO_US(10); *timer += HZ_TO_US(10);
} }
@ -556,6 +564,9 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer)
case WARNING_ARMING_DISABLED: case WARNING_ARMING_DISABLED:
warningColor = colorOn ? &HSV(GREEN) : &HSV(BLACK); warningColor = colorOn ? &HSV(GREEN) : &HSV(BLACK);
break; break;
case WARNING_CRASH_FLIP_ACTIVE:
warningColor = colorOn ? &HSV(MAGENTA) : &HSV(BLACK);
break;
case WARNING_LOW_BATTERY: case WARNING_LOW_BATTERY:
warningColor = colorOn ? &HSV(RED) : &HSV(BLACK); warningColor = colorOn ? &HSV(RED) : &HSV(BLACK);
break; break;

View file

@ -483,7 +483,7 @@ static bool osdDrawSingleElement(uint8_t item)
{ {
const int angleR = attitude.values.roll / 10; const int angleR = attitude.values.roll / 10;
const int angleP = attitude.values.pitch / 10; // still gotta update all angleR and angleP pointers. const int angleP = attitude.values.pitch / 10; // still gotta update all angleR and angleP pointers.
if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { if (isFlipOverAfterCrashActive()) {
if (angleP > 0 && ((angleR > 175 && angleR < 180) || (angleR > -180 && angleR < -175))) { if (angleP > 0 && ((angleR > 175 && angleR < 180) || (angleR > -180 && angleR < -175))) {
buff[0] = SYM_ARROW_SOUTH; buff[0] = SYM_ARROW_SOUTH;
} else if (angleP > 0 && angleR > 0 && angleR < 175) { } else if (angleP > 0 && angleR > 0 && angleR < 175) {
@ -946,7 +946,7 @@ static bool osdDrawSingleElement(uint8_t item)
#endif #endif
// Warn when in flip over after crash mode // Warn when in flip over after crash mode
if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashMode()) { if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashActive()) {
osdFormatMessage(buff, OSD_FORMAT_MESSAGE_BUFFER_SIZE, "CRASH FLIP"); osdFormatMessage(buff, OSD_FORMAT_MESSAGE_BUFFER_SIZE, "CRASH FLIP");
break; break;
} }

View file

@ -388,4 +388,6 @@ bool isArmingDisabled(void) { return false; }
uint8_t getRssiPercent(void) { return 0; } uint8_t getRssiPercent(void) { return 0; }
bool isFlipOverAfterCrashActive(void) { return false; }
} }

View file

@ -1055,9 +1055,7 @@ extern "C" {
uint16_t getCoreTemperatureCelsius(void) { return simulationCoreTemperature; } uint16_t getCoreTemperatureCelsius(void) { return simulationCoreTemperature; }
bool isFlipOverAfterCrashMode(void) { bool isFlipOverAfterCrashActive(void) { return false; }
return false;
}
float pidItermAccelerator(void) { return 1.0; } float pidItermAccelerator(void) { return 1.0; }
uint8_t getMotorCount(void){ return 4; } uint8_t getMotorCount(void){ return 4; }