1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-24 08:45:36 +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

@ -560,45 +560,64 @@ 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;
}
}
uint8_t ledIndex;
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
if (warningFlags || warningFlashCounter > 0) {
const hsvColor_t *warningColor = &hsv_black;
ledConfig = &ledConfigs[ledIndex];
if (!(ledConfig->flags & LED_FUNCTION_WARNING)) {
continue;
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;
}
}
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);
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
ledConfig = &ledConfigs[ledIndex];
if (!(ledConfig->flags & LED_FUNCTION_WARNING)) {
continue;
}
setLedHsv(ledIndex, warningColor);
}
}
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