From 78e7bd4759c2f7a3c87b54c8bde40f7cc2d875dc Mon Sep 17 00:00:00 2001 From: mikeller Date: Sun, 20 Nov 2016 19:36:52 +1300 Subject: [PATCH] Cleaned up led strip timer / delay handling. --- src/main/io/ledstrip.c | 76 +++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index d535379ab7..00df39835c 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -92,7 +92,9 @@ static void ledStripDisable(void); //#define USE_LED_ANIMATION -#define HZ_TO_MICROS(hz) ((int32_t)((1000 * 1000) / (hz))) +#define HZ_TO_US(hz) ((int32_t)((1000 * 1000) / (hz))) + +#define MAX_TIMER_DELAY (5 * 1000 * 1000) #if LED_MAX_STRIP_LENGTH > WS2811_LED_STRIP_LENGTH # error "Led strip length must match driver" @@ -535,7 +537,7 @@ static void applyLedWarningLayer(bool updateNow, uint32_t *timer) if (!ARMING_FLAG(ARMED) && !ARMING_FLAG(OK_TO_ARM)) warningFlags |= 1 << WARNING_ARMING_DISABLED; } - *timer += HZ_TO_MICROS(10); + *timer += HZ_TO_US(10); } if (warningFlags) { @@ -567,27 +569,31 @@ static void applyLedBatteryLayer(bool updateNow, uint32_t *timer) static bool flash = false; int state; - int frequency = 1; + int timerDelayUs = HZ_TO_US(1); if (updateNow) { state = getBatteryState(); - switch (state) { - case BATTERY_OK: - flash = false; - frequency = 1; - break; - case BATTERY_WARNING: - frequency = 2; - break; - default: - frequency = 8; - break; - } - flash = !flash; + switch (state) { + case BATTERY_OK: + flash = true; + timerDelayUs = HZ_TO_US(1); + + break; + case BATTERY_WARNING: + flash = !flash; + timerDelayUs = HZ_TO_US(2); + + break; + default: + flash = !flash; + timerDelayUs = HZ_TO_US(8); + + break; + } } - *timer += HZ_TO_MICROS(frequency); + *timer += timerDelayUs; if (!flash) { hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND); @@ -600,24 +606,24 @@ static void applyLedRssiLayer(bool updateNow, uint32_t *timer) static bool flash = false; int state; - int frequency = 1; + int timerDelay = HZ_TO_US(1); if (updateNow) { state = (rssi * 100) / 1023; if (state > 50) { - flash = false; - frequency = 1; + flash = true; + timerDelay = HZ_TO_US(1); } else if (state > 20) { - frequency = 2; + flash = !flash; + timerDelay = HZ_TO_US(2); } else { - frequency = 8; + flash = !flash; + timerDelay = HZ_TO_US(8); } - flash = !flash; } - - *timer += HZ_TO_MICROS(frequency); + *timer += timerDelay; if (!flash) { hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND); @@ -642,7 +648,7 @@ static void applyLedGpsLayer(bool updateNow, uint32_t *timer) gpsFlashCounter++; gpsPauseCounter = 1; } - *timer += HZ_TO_MICROS(2.5f); + *timer += HZ_TO_US(2.5f); } const hsvColor_t *gpsColor; @@ -674,11 +680,11 @@ static void applyLedIndicatorLayer(bool updateNow, uint32_t *timer) // calculate update frequency int scale = MAX(ABS(rcCommand[ROLL]), ABS(rcCommand[PITCH])); // 0 - 500 scale = scale - INDICATOR_DEADBAND; // start increasing frequency right after deadband - *timer += HZ_TO_MICROS(5 + (45 * scale) / (500 - INDICATOR_DEADBAND)); // 5 - 50Hz update, 2.5 - 25Hz blink + *timer += HZ_TO_US(5 + (45 * scale) / (500 - INDICATOR_DEADBAND)); // 5 - 50Hz update, 2.5 - 25Hz blink flash = !flash; } else { - *timer += HZ_TO_MICROS(5); // try again soon + *timer += HZ_TO_US(5); } } @@ -736,7 +742,7 @@ static void applyLedThrustRingLayer(bool updateNow, uint32_t *timer) if (updateNow) { rotationPhase = rotationPhase > 0 ? rotationPhase - 1 : ledCounts.ringSeqLen - 1; - *timer += HZ_TO_MICROS(5 + (45 * scaledThrottle) / 100); // 5 - 50Hz update rate + *timer += HZ_TO_US(5 + (45 * scaledThrottle) / 100); // 5 - 50Hz update rate } for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) { @@ -804,7 +810,7 @@ static void applyLarsonScannerLayer(bool updateNow, uint32_t *timer) if (updateNow) { larsonScannerNextStep(&larsonParameters, 15); - *timer += HZ_TO_MICROS(60); + *timer += HZ_TO_US(60); } int scannerLedIndex = 0; @@ -833,7 +839,7 @@ static void applyLedBlinkLayer(bool updateNow, uint32_t *timer) if (blinkMask <= 1) blinkMask = blinkPattern; - *timer += HZ_TO_MICROS(10); + *timer += HZ_TO_US(10); } bool ledOn = (blinkMask & 1); // b_b_____... @@ -856,7 +862,7 @@ static void applyLedAnimationLayer(bool updateNow, uint32_t *timer) const int animationFrames = ledGridHeight; if(updateNow) { frameCounter = (frameCounter + 1 < animationFrames) ? frameCounter + 1 : 0; - *timer += HZ_TO_MICROS(20); + *timer += HZ_TO_US(20); } if (ARMING_FLAG(ARMED)) @@ -944,12 +950,12 @@ void ledStripUpdate(uint32_t currentTime) uint32_t timActive = 0; for (timId_e timId = 0; timId < timTimerCount; timId++) { // sanitize timer value, so that it can be safely incremented. Handles inital timerVal value. - // max delay is limited to 5s int32_t delta = cmp32(now, timerVal[timId]); - if (delta < 0 && delta > -HZ_TO_MICROS(0.2f)) + // max delay is limited to 5s + if (delta < 0 && delta > -MAX_TIMER_DELAY) continue; // not ready yet timActive |= 1 << timId; - if (delta >= HZ_TO_MICROS(10) || delta < 0) { + if (delta >= 100 * 1000 || delta < 0) { timerVal[timId] = now; } }