From 99eab9220000d9dbe387e1c8d870ea781ebad71a Mon Sep 17 00:00:00 2001 From: mikeller Date: Fri, 2 Nov 2018 01:48:06 +1300 Subject: [PATCH 1/3] Added 'crash flip active' to the list of warnings to be shown on LED_STRIP. --- src/main/io/ledstrip.c | 20 +++++++++++++++----- src/main/io/osd.c | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 3cb9725b8b..5955dbf491 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -524,6 +524,7 @@ typedef enum { WARNING_ARMING_DISABLED, WARNING_LOW_BATTERY, WARNING_FAILSAFE, + WARNING_CRASH_FLIP_ACTIVE, } warningFlags_e; static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) @@ -538,12 +539,18 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) if (warningFlashCounter == 0) { // update when old flags was processed 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; - if (failsafeIsActive()) + } + if (failsafeIsActive()) { warningFlags |= 1 << WARNING_FAILSAFE; - if (!ARMING_FLAG(ARMED) && isArmingDisabled()) + } + if (!ARMING_FLAG(ARMED) && isArmingDisabled()) { warningFlags |= 1 << WARNING_ARMING_DISABLED; + } + if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + warningFlags |= 1 << WARNING_CRASH_FLIP_ACTIVE; + } } *timer += HZ_TO_US(10); } @@ -556,10 +563,13 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) if (warningFlags & (1 << warningId)) { switch (warningId) { case WARNING_ARMING_DISABLED: - warningColor = colorOn ? &HSV(GREEN) : &HSV(BLACK); + warningColor = colorOn ? &HSV(GREEN) : &HSV(BLACK); + break; + case WARNING_CRASH_FLIP_ACTIVE: + warningColor = colorOn ? &HSV(MAGENTA) : &HSV(BLACK); break; case WARNING_LOW_BATTERY: - warningColor = colorOn ? &HSV(RED) : &HSV(BLACK); + warningColor = colorOn ? &HSV(RED) : &HSV(BLACK); break; case WARNING_FAILSAFE: warningColor = colorOn ? &HSV(YELLOW) : &HSV(BLUE); diff --git a/src/main/io/osd.c b/src/main/io/osd.c index b8d420f311..9d170533ed 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -946,7 +946,7 @@ static bool osdDrawSingleElement(uint8_t item) #endif // Warn when in flip over after crash mode - if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashMode()) { + if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { osdFormatMessage(buff, OSD_FORMAT_MESSAGE_BUFFER_SIZE, "CRASH FLIP"); break; } From 286f21150c702195bdb34d4251a2b9eaf4e2d4b5 Mon Sep 17 00:00:00 2001 From: mikeller Date: Sat, 3 Nov 2018 17:37:18 +1300 Subject: [PATCH 2/3] Unified warning activation conditions. --- src/main/fc/core.c | 9 +++++++-- src/main/fc/core.h | 2 ++ src/main/io/ledstrip.c | 3 ++- src/main/io/osd.c | 4 ++-- src/test/unit/ledstrip_unittest.cc | 2 ++ src/test/unit/osd_unittest.cc | 5 ++--- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/fc/core.c b/src/main/fc/core.c index 6da06df8e9..cf69cda955 100644 --- a/src/main/fc/core.c +++ b/src/main/fc/core.c @@ -370,7 +370,7 @@ void tryArm(void) #ifdef USE_DSHOT if (currentTimeUs - getLastDshotBeaconCommandTimeUs() < DSHOT_BEACON_GUARD_DELAY_US) { if (tryingToArm == ARMING_DELAYED_DISARMED) { - if (isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { tryingToArm = ARMING_DELAYED_CRASHFLIP; #ifdef USE_LAUNCH_CONTROL } else if (canUseLaunchControl()) { @@ -784,7 +784,7 @@ bool processRx(timeUs_t currentTimeUs) #ifdef USE_DSHOT /* Enable beep warning when the crash flip mode is active */ - if (isMotorProtocolDshot() && isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + if (isFlipOverAfterCrashWarningActive()) { beeper(BEEPER_CRASH_FLIP_MODE); } #endif @@ -1093,6 +1093,11 @@ bool isFlipOverAfterCrashMode(void) return flipOverAfterCrashMode; } +bool isFlipOverAfterCrashWarningActive(void) +{ + return flipOverAfterCrashMode || IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH); +} + timeUs_t getLastDisarmTimeUs(void) { return lastDisarmTimeUs; diff --git a/src/main/fc/core.h b/src/main/fc/core.h index 28a7e9a347..a2298d046b 100644 --- a/src/main/fc/core.h +++ b/src/main/fc/core.h @@ -66,7 +66,9 @@ bool processRx(timeUs_t currentTimeUs); void updateArmingStatus(void); void taskMainPidLoop(timeUs_t currentTimeUs); + bool isFlipOverAfterCrashMode(void); +bool isFlipOverAfterCrashWarningActive(void); void runawayTakeoffTemporaryDisable(uint8_t disableFlag); bool isAirmodeActivated(); diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 5955dbf491..23c2249c47 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -47,6 +47,7 @@ #include "drivers/vtx_common.h" #include "fc/config.h" +#include "fc/core.h" #include "fc/rc_controls.h" #include "fc/rc_modes.h" #include "fc/runtime_config.h" @@ -548,7 +549,7 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) if (!ARMING_FLAG(ARMED) && isArmingDisabled()) { warningFlags |= 1 << WARNING_ARMING_DISABLED; } - if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + if (isFlipOverAfterCrashWarningActive()) { warningFlags |= 1 << WARNING_CRASH_FLIP_ACTIVE; } } diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 9d170533ed..23ce305f04 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -483,7 +483,7 @@ static bool osdDrawSingleElement(uint8_t item) { const int angleR = attitude.values.roll / 10; const int angleP = attitude.values.pitch / 10; // still gotta update all angleR and angleP pointers. - if (IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + if (isFlipOverAfterCrashMode()) { if (angleP > 0 && ((angleR > 175 && angleR < 180) || (angleR > -180 && angleR < -175))) { buff[0] = SYM_ARROW_SOUTH; } else if (angleP > 0 && angleR > 0 && angleR < 175) { @@ -946,7 +946,7 @@ static bool osdDrawSingleElement(uint8_t item) #endif // Warn when in flip over after crash mode - if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) { + if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashWarningActive()) { osdFormatMessage(buff, OSD_FORMAT_MESSAGE_BUFFER_SIZE, "CRASH FLIP"); break; } diff --git a/src/test/unit/ledstrip_unittest.cc b/src/test/unit/ledstrip_unittest.cc index eb7594d441..eafb3fdd18 100644 --- a/src/test/unit/ledstrip_unittest.cc +++ b/src/test/unit/ledstrip_unittest.cc @@ -388,4 +388,6 @@ bool isArmingDisabled(void) { return false; } uint8_t getRssiPercent(void) { return 0; } +bool isFlipOverAfterCrashWarningActive(void) { return false; } + } diff --git a/src/test/unit/osd_unittest.cc b/src/test/unit/osd_unittest.cc index 4b9e22d1df..0121256a5e 100644 --- a/src/test/unit/osd_unittest.cc +++ b/src/test/unit/osd_unittest.cc @@ -1055,9 +1055,8 @@ extern "C" { uint16_t getCoreTemperatureCelsius(void) { return simulationCoreTemperature; } - bool isFlipOverAfterCrashMode(void) { - return false; - } + bool isFlipOverAfterCrashMode(void) { return false; } + bool isFlipOverAfterCrashWarningActive(void) { return false; } float pidItermAccelerator(void) { return 1.0; } uint8_t getMotorCount(void){ return 4; } From 79fd505a8c75dad30fcf9f60ab0712238b6184a7 Mon Sep 17 00:00:00 2001 From: mikeller Date: Sun, 4 Nov 2018 13:37:39 +1300 Subject: [PATCH 3/3] Changed warning to only be shown when armed. --- src/main/fc/core.c | 29 ++++++++++++----------------- src/main/fc/core.h | 3 +-- src/main/flight/mixer.c | 2 +- src/main/io/ledstrip.c | 2 +- src/main/io/osd.c | 4 ++-- src/test/unit/ledstrip_unittest.cc | 2 +- src/test/unit/osd_unittest.cc | 3 +-- 7 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/main/fc/core.c b/src/main/fc/core.c index cf69cda955..e7ad31794e 100644 --- a/src/main/fc/core.c +++ b/src/main/fc/core.c @@ -129,7 +129,7 @@ enum { int16_t magHold; #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 @@ -216,7 +216,7 @@ void updateArmingStatus(void) } // 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 (!isUsingSticksForArming()) { @@ -339,11 +339,11 @@ void disarm(void) #endif BEEP_OFF; #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); } #endif - flipOverAfterCrashMode = false; + flipOverAfterCrashActive = false; // if ARMING_DISABLED_RUNAWAY_TAKEOFF is set then we want to play it's beep pattern instead if (!(getArmingDisableFlags() & ARMING_DISABLED_RUNAWAY_TAKEOFF)) { @@ -384,12 +384,12 @@ void tryArm(void) } if (isMotorProtocolDshot() && isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH)) { if (!(IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH) || (tryingToArm == ARMING_DELAYED_CRASHFLIP))) { - flipOverAfterCrashMode = false; + flipOverAfterCrashActive = false; if (!featureIsEnabled(FEATURE_3D)) { pwmWriteDshotCommand(ALL_MOTORS, getMotorCount(), DSHOT_CMD_SPIN_DIRECTION_NORMAL, false); } } else { - flipOverAfterCrashMode = true; + flipOverAfterCrashActive = true; #ifdef USE_RUNAWAY_TAKEOFF runawayTakeoffCheckDisabled = false; #endif @@ -401,7 +401,7 @@ void tryArm(void) #endif #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 launchControlState = LAUNCH_CONTROL_ACTIVE; } @@ -648,7 +648,7 @@ bool processRx(timeUs_t currentTimeUs) if (ARMING_FLAG(ARMED) && pidConfig()->runaway_takeoff_prevention && !runawayTakeoffCheckDisabled - && !flipOverAfterCrashMode + && !flipOverAfterCrashActive && !runawayTakeoffTemporarilyDisabled && !STATE(FIXED_WING)) { @@ -784,7 +784,7 @@ bool processRx(timeUs_t currentTimeUs) #ifdef USE_DSHOT /* Enable beep warning when the crash flip mode is active */ - if (isFlipOverAfterCrashWarningActive()) { + if (flipOverAfterCrashActive) { beeper(BEEPER_CRASH_FLIP_MODE); } #endif @@ -934,7 +934,7 @@ static FAST_CODE void subTaskPidController(timeUs_t currentTimeUs) && !STATE(FIXED_WING) && pidConfig()->runaway_takeoff_prevention && !runawayTakeoffCheckDisabled - && !flipOverAfterCrashMode + && !flipOverAfterCrashActive && !runawayTakeoffTemporarilyDisabled && (!featureIsEnabled(FEATURE_MOTOR_STOP) || airmodeIsEnabled() || (calculateThrottleStatus() != THROTTLE_LOW))) { @@ -1088,14 +1088,9 @@ FAST_CODE void taskMainPidLoop(timeUs_t currentTimeUs) } -bool isFlipOverAfterCrashMode(void) +bool isFlipOverAfterCrashActive(void) { - return flipOverAfterCrashMode; -} - -bool isFlipOverAfterCrashWarningActive(void) -{ - return flipOverAfterCrashMode || IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH); + return flipOverAfterCrashActive; } timeUs_t getLastDisarmTimeUs(void) diff --git a/src/main/fc/core.h b/src/main/fc/core.h index a2298d046b..6d3aa646f7 100644 --- a/src/main/fc/core.h +++ b/src/main/fc/core.h @@ -67,8 +67,7 @@ void updateArmingStatus(void); void taskMainPidLoop(timeUs_t currentTimeUs); -bool isFlipOverAfterCrashMode(void); -bool isFlipOverAfterCrashWarningActive(void); +bool isFlipOverAfterCrashActive(void); void runawayTakeoffTemporaryDisable(uint8_t disableFlag); bool isAirmodeActivated(); diff --git a/src/main/flight/mixer.c b/src/main/flight/mixer.c index 429e663c71..2bbb012b27 100644 --- a/src/main/flight/mixer.c +++ b/src/main/flight/mixer.c @@ -774,7 +774,7 @@ void applyMotorStop(void) FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensation) { - if (isFlipOverAfterCrashMode()) { + if (isFlipOverAfterCrashActive()) { applyFlipOverAfterCrashModeToMotors(); return; } diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 23c2249c47..38053b4277 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -549,7 +549,7 @@ static void applyLedWarningLayer(bool updateNow, timeUs_t *timer) if (!ARMING_FLAG(ARMED) && isArmingDisabled()) { warningFlags |= 1 << WARNING_ARMING_DISABLED; } - if (isFlipOverAfterCrashWarningActive()) { + if (isFlipOverAfterCrashActive()) { warningFlags |= 1 << WARNING_CRASH_FLIP_ACTIVE; } } diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 23ce305f04..7e57f72680 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -483,7 +483,7 @@ static bool osdDrawSingleElement(uint8_t item) { const int angleR = attitude.values.roll / 10; const int angleP = attitude.values.pitch / 10; // still gotta update all angleR and angleP pointers. - if (isFlipOverAfterCrashMode()) { + if (isFlipOverAfterCrashActive()) { if (angleP > 0 && ((angleR > 175 && angleR < 180) || (angleR > -180 && angleR < -175))) { buff[0] = SYM_ARROW_SOUTH; } else if (angleP > 0 && angleR > 0 && angleR < 175) { @@ -946,7 +946,7 @@ static bool osdDrawSingleElement(uint8_t item) #endif // Warn when in flip over after crash mode - if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashWarningActive()) { + if (osdWarnGetState(OSD_WARNING_CRASH_FLIP) && isFlipOverAfterCrashActive()) { osdFormatMessage(buff, OSD_FORMAT_MESSAGE_BUFFER_SIZE, "CRASH FLIP"); break; } diff --git a/src/test/unit/ledstrip_unittest.cc b/src/test/unit/ledstrip_unittest.cc index eafb3fdd18..3a0cd8d9c8 100644 --- a/src/test/unit/ledstrip_unittest.cc +++ b/src/test/unit/ledstrip_unittest.cc @@ -388,6 +388,6 @@ bool isArmingDisabled(void) { return false; } uint8_t getRssiPercent(void) { return 0; } -bool isFlipOverAfterCrashWarningActive(void) { return false; } +bool isFlipOverAfterCrashActive(void) { return false; } } diff --git a/src/test/unit/osd_unittest.cc b/src/test/unit/osd_unittest.cc index 0121256a5e..f7e56280b4 100644 --- a/src/test/unit/osd_unittest.cc +++ b/src/test/unit/osd_unittest.cc @@ -1055,8 +1055,7 @@ extern "C" { uint16_t getCoreTemperatureCelsius(void) { return simulationCoreTemperature; } - bool isFlipOverAfterCrashMode(void) { return false; } - bool isFlipOverAfterCrashWarningActive(void) { return false; } + bool isFlipOverAfterCrashActive(void) { return false; } float pidItermAccelerator(void) { return 1.0; } uint8_t getMotorCount(void){ return 4; }