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

Update LedStrip warnings indication so it's clearer what warnings are

active.

This also has better performance, warning colors are only calculated
once per led strip update cycle.
This commit is contained in:
Dominic Clifton 2014-11-22 18:17:22 +00:00
parent 4db1d58aaf
commit 386c14c9e7
3 changed files with 4524 additions and 4904 deletions

View file

@ -117,8 +117,13 @@ led 4 0,0::
This mode simply uses the leds to flash when warnings occur.
* Battery warning flashes the LEDs between red and off when the battery is low if battery monitoring is enabled.
* Failsafe warning flashes the LEDs between light blue and lime green when failsafe is active.
| Warning | Led Pattern | Notes |
|---------|-------------|-------|
| Arm-lock enabled | flash between green and off | occurs calibration or when unarmed and the aircraft is tilted too much |
| Low Battery | flash red and off | battery monitoring must be enabled. May trigger temporarily under high-throttle due to voltage drop |
| Failsafe | flash between light blue and yellow | Failsafe must be enabled |
Flash patterns appear in order, so that it's clear which warnings are enabled.
#### Flight Mode & Orientation

File diff suppressed because it is too large Load diff

View file

@ -560,17 +560,49 @@ typedef enum {
WARNING_FLAG_ARMING_DISABLED = (1 << 2)
} warningFlags_e;
void applyLedWarningLayer(uint8_t warningState, uint8_t warningFlags)
static uint8_t warningFlags = WARNING_FLAG_NONE;
void applyLedWarningLayer(uint8_t updateNow)
{
const ledConfig_t *ledConfig;
uint8_t ledIndex;
static uint8_t warningFlashCounter = 0;
if (warningState) {
warningFlashCounter++;
warningFlashCounter = warningFlashCounter % 4;
debug[0] = warningFlashCounter;
if (updateNow && warningFlashCounter == 0) {
warningFlags = WARNING_FLAG_NONE;
if (feature(FEATURE_VBAT) && shouldSoundBatteryAlarm()) {
warningFlags |= WARNING_FLAG_LOW_BATTERY;
}
if (failsafe->vTable->hasTimerElapsed()) {
warningFlags |= WARNING_FLAG_FAILSAFE;
}
if (!ARMING_FLAG(ARMED) && !ARMING_FLAG(OK_TO_ARM)) {
warningFlags |= WARNING_FLAG_ARMING_DISABLED;
}
}
if (warningFlags || warningFlashCounter > 0) {
const hsvColor_t *warningColor = &hsv_black;
if ((warningFlashCounter & 1) == 0) {
if (warningFlashCounter < 4 && (warningFlags & WARNING_FLAG_ARMING_DISABLED)) {
warningColor = &hsv_green;
}
if (warningFlashCounter >= 4 && warningFlashCounter < 12 && (warningFlags & WARNING_FLAG_LOW_BATTERY)) {
warningColor = &hsv_red;
}
if (warningFlashCounter >= 12 && warningFlashCounter < 16 && (warningFlags & WARNING_FLAG_FAILSAFE)) {
warningColor = &hsv_yellow;
}
} else {
if (warningFlashCounter >= 12 && warningFlashCounter < 16 && (warningFlags & WARNING_FLAG_FAILSAFE)) {
warningColor = &hsv_blue;
}
}
uint8_t ledIndex;
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
ledConfig = &ledConfigs[ledIndex];
@ -578,27 +610,14 @@ void applyLedWarningLayer(uint8_t warningState, uint8_t warningFlags)
if (!(ledConfig->flags & LED_FUNCTION_WARNING)) {
continue;
}
setLedHsv(ledIndex, warningColor);
}
}
if (warningState == 0) {
if (warningFlashCounter == 0 && (warningFlags & WARNING_FLAG_ARMING_DISABLED)) {
setLedHsv(ledIndex, &hsv_yellow);
}
if (warningFlashCounter == 1 && (warningFlags & WARNING_FLAG_LOW_BATTERY)) {
setLedHsv(ledIndex, &hsv_red);
}
if (warningFlashCounter > 1 && (warningFlags & WARNING_FLAG_FAILSAFE)) {
setLedHsv(ledIndex, &hsv_lightBlue);
}
} else {
if (warningFlashCounter == 0 && (warningFlags & WARNING_FLAG_ARMING_DISABLED)) {
setLedHsv(ledIndex, &hsv_black);
}
if (warningFlashCounter == 1 && (warningFlags & WARNING_FLAG_LOW_BATTERY)) {
setLedHsv(ledIndex, &hsv_black);
}
if (warningFlashCounter > 1 && (warningFlags & WARNING_FLAG_FAILSAFE)) {
setLedHsv(ledIndex, &hsv_limeGreen);
}
if (updateNow && (warningFlags || warningFlashCounter)) {
warningFlashCounter++;
if (warningFlashCounter == 20) {
warningFlashCounter = 0;
}
}
}
@ -731,8 +750,6 @@ void updateLedStrip(void)
}
static uint8_t indicatorFlashState = 0;
static uint8_t warningState = 0;
static uint8_t warningFlags;
// LAYER 1
applyLedModeLayer();
@ -742,29 +759,8 @@ void updateLedStrip(void)
if (warningFlashNow) {
nextWarningFlashAt = now + LED_STRIP_10HZ;
if (warningState == 0) {
warningState = 1;
warningFlags = WARNING_FLAG_NONE;
if (feature(FEATURE_VBAT) && shouldSoundBatteryAlarm()) {
warningFlags |= WARNING_FLAG_LOW_BATTERY;
}
if (failsafe->vTable->hasTimerElapsed()) {
warningFlags |= WARNING_FLAG_FAILSAFE;
}
if (!ARMING_FLAG(ARMED) && !ARMING_FLAG(OK_TO_ARM)) {
warningFlags |= WARNING_FLAG_ARMING_DISABLED;
}
} else {
warningState = 0;
}
}
if (warningFlags) {
applyLedWarningLayer(warningState, warningFlags);
}
applyLedWarningLayer(warningFlashNow);
// LAYER 3