Revise ledstrip optimization to use overlay disable bitmask (#5270)
Clean up the logic to use a bitmask indicating which overlays are disabled rather than an array to indicate which are enabled. Performance remains unchanged from the previous optimization but a few bytes of RAM are saved and the code is cleaner.
This commit is contained in:
parent
742cb5f93b
commit
f96f9672d1
|
@ -1014,7 +1014,9 @@ typedef enum {
|
||||||
} timId_e;
|
} timId_e;
|
||||||
|
|
||||||
static timeUs_t timerVal[timTimerCount];
|
static timeUs_t timerVal[timTimerCount];
|
||||||
static bool requiredTimerLayer[timTimerCount];
|
static uint16_t disabledTimerMask;
|
||||||
|
|
||||||
|
STATIC_ASSERT(timTimerCount <= sizeof(disabledTimerMask) * 8, disabledTimerMask_too_small);
|
||||||
|
|
||||||
// function to apply layer.
|
// function to apply layer.
|
||||||
// function must replan self using timer pointer
|
// function must replan self using timer pointer
|
||||||
|
@ -1055,16 +1057,14 @@ bool isOverlayTypeUsed(ledOverlayId_e overlayType)
|
||||||
|
|
||||||
void updateRequiredOverlay(void)
|
void updateRequiredOverlay(void)
|
||||||
{
|
{
|
||||||
for (int timID = 0; timID < timTimerCount; timID++) {
|
disabledTimerMask = 0;
|
||||||
requiredTimerLayer[timID] = true;
|
disabledTimerMask |= !isOverlayTypeUsed(LED_OVERLAY_BLINK) << timBlink;
|
||||||
}
|
disabledTimerMask |= !isOverlayTypeUsed(LED_OVERLAY_LARSON_SCANNER) << timLarson;
|
||||||
requiredTimerLayer[timBlink] = isOverlayTypeUsed(LED_OVERLAY_BLINK);
|
disabledTimerMask |= !isOverlayTypeUsed(LED_OVERLAY_WARNING) << timWarning;
|
||||||
requiredTimerLayer[timLarson] = isOverlayTypeUsed(LED_OVERLAY_LARSON_SCANNER);
|
|
||||||
requiredTimerLayer[timWarning] = isOverlayTypeUsed(LED_OVERLAY_WARNING);
|
|
||||||
#ifdef USE_VTX_COMMON
|
#ifdef USE_VTX_COMMON
|
||||||
requiredTimerLayer[timVtx] = isOverlayTypeUsed(LED_OVERLAY_VTX);
|
disabledTimerMask |= !isOverlayTypeUsed(LED_OVERLAY_VTX) << timVtx;
|
||||||
#endif
|
#endif
|
||||||
requiredTimerLayer[timIndicator] = isOverlayTypeUsed(LED_OVERLAY_INDICATOR);
|
disabledTimerMask |= !isOverlayTypeUsed(LED_OVERLAY_INDICATOR) << timIndicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ledStripUpdate(timeUs_t currentTimeUs)
|
void ledStripUpdate(timeUs_t currentTimeUs)
|
||||||
|
@ -1087,7 +1087,7 @@ void ledStripUpdate(timeUs_t currentTimeUs)
|
||||||
// test all led timers, setting corresponding bits
|
// test all led timers, setting corresponding bits
|
||||||
uint32_t timActive = 0;
|
uint32_t timActive = 0;
|
||||||
for (timId_e timId = 0; timId < timTimerCount; timId++) {
|
for (timId_e timId = 0; timId < timTimerCount; timId++) {
|
||||||
if (requiredTimerLayer[timId]) {
|
if (!(disabledTimerMask & (1 << timId))) {
|
||||||
// sanitize timer value, so that it can be safely incremented. Handles inital timerVal value.
|
// sanitize timer value, so that it can be safely incremented. Handles inital timerVal value.
|
||||||
const timeDelta_t delta = cmpTimeUs(now, timerVal[timId]);
|
const timeDelta_t delta = cmpTimeUs(now, timerVal[timId]);
|
||||||
// max delay is limited to 5s
|
// max delay is limited to 5s
|
||||||
|
|
Loading…
Reference in New Issue