static void applyLedAnimationLayer(bool updateNow, uint32_t *timer) { static uint8_t frameCounter = 0; const int animationFrames = ledGridHeight; if(updateNow) { frameCounter = (frameCounter + 1 < animationFrames) ? frameCounter + 1 : 0; *timer += LED_STRIP_HZ(20); } if (ARMING_FLAG(ARMED)) return; int previousRow = frameCounter > 0 ? frameCounter - 1 : animationFrames - 1; int currentRow = frameCounter; int nextRow = (frameCounter + 1 < animationFrames) ? frameCounter + 1 : 0; for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) { const ledConfig_t *ledConfig = &masterConfig.ledConfigs[ledIndex]; if (ledGetY(ledConfig) == previousRow) { setLedHsv(ledIndex, getSC(LED_SCOLOR_ANIMATION)); scaleLedValue(ledIndex, 50); } else if (ledGetY(ledConfig) == currentRow) { setLedHsv(ledIndex, getSC(LED_SCOLOR_ANIMATION)); } else if (ledGetY(ledConfig) == nextRow) { scaleLedValue(ledIndex, 50); } } }
static quadrant_e getLedQuadrant(const int ledIndex) { const ledConfig_t *ledConfig = &masterConfig.ledConfigs[ledIndex]; int x = ledGetX(ledConfig); int y = ledGetY(ledConfig); int quad = 0; if (y <= highestYValueForNorth) quad |= QUADRANT_NORTH; else if (y >= lowestYValueForSouth) quad |= QUADRANT_SOUTH; if (x >= lowestXValueForEast) quad |= QUADRANT_EAST; else if (x <= highestXValueForWest) quad |= QUADRANT_WEST; if ((quad & (QUADRANT_NORTH | QUADRANT_SOUTH)) && (quad & (QUADRANT_EAST | QUADRANT_WEST)) ) { // is led in one of NE/SE/NW/SW? quad |= 1 << (4 + ((quad & QUADRANT_SOUTH) ? 1 : 0) + ((quad & QUADRANT_WEST) ? 2 : 0)); } else { quad |= QUADRANT_NOTDIAG; } if ((quad & (QUADRANT_NORTH | QUADRANT_SOUTH | QUADRANT_EAST | QUADRANT_WEST)) == 0) quad |= QUADRANT_NONE; return quad; }
void generateLedConfig(ledConfig_t *ledConfig, char *ledConfigBuffer, size_t bufferSize) { char directions[LED_DIRECTION_COUNT + 1]; char baseFunctionOverlays[LED_OVERLAY_COUNT + 2]; memset(ledConfigBuffer, 0, bufferSize); char *dptr = directions; for (ledDirectionId_e dir = 0; dir < LED_DIRECTION_COUNT; dir++) { if (ledGetDirectionBit(ledConfig, dir)) { *dptr++ = directionCodes[dir]; } } *dptr = 0; char *fptr = baseFunctionOverlays; *fptr++ = baseFunctionCodes[ledGetFunction(ledConfig)]; for (ledOverlayId_e ol = 0; ol < LED_OVERLAY_COUNT; ol++) { if (ledGetOverlayBit(ledConfig, ol)) { *fptr++ = overlayCodes[ol]; } } *fptr = 0; // TODO - check buffer length sprintf(ledConfigBuffer, "%u,%u:%s:%s:%u", ledGetX(ledConfig), ledGetY(ledConfig), directions, baseFunctionOverlays, ledGetColor(ledConfig)); }
//udate all leds with flag color void applyLedColor(void * ptr) { UNUSED(ptr); for (int ledIndex = 0; ledIndex < LED_MAX_STRIP_LENGTH; ledIndex++) { ledConfig_t *ledConfig = &masterConfig.ledConfigs[ledIndex]; if (ledGetFunction(ledConfig) == LED_FUNCTION_COLOR) *ledConfig = DEFINE_LED(ledGetX(ledConfig), ledGetY(ledConfig), ledColor, ledGetDirection(ledConfig), ledGetFunction(ledConfig), ledGetOverlay(ledConfig), 0); } }
STATIC_UNIT_TESTED void determineLedStripDimensions(void) { int maxX = 0; int maxY = 0; for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) { const ledConfig_t *ledConfig = &masterConfig.ledConfigs[ledIndex]; maxX = MAX(ledGetX(ledConfig), maxX); maxY = MAX(ledGetY(ledConfig), maxY); } ledGridWidth = maxX + 1; ledGridHeight = maxY + 1; }
static quadrant_e getLedQuadrant(const int ledIndex) { const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex]; int x = ledGetX(ledConfig); int y = ledGetY(ledConfig); int quad = 0; if (y <= highestYValueForNorth) quad |= QUADRANT_NORTH; else if (y >= lowestYValueForSouth) quad |= QUADRANT_SOUTH; if (x >= lowestXValueForEast) quad |= QUADRANT_EAST; else if (x <= highestXValueForWest) quad |= QUADRANT_WEST; return quad; }
STATIC_UNIT_TESTED void updateDimensions(void) { int maxX = 0; int minX = LED_XY_MASK; int maxY = 0; int minY = LED_XY_MASK; for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) { const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex]; int ledX = ledGetX(ledConfig); maxX = MAX(ledX, maxX); minX = MIN(ledX, minX); int ledY = ledGetY(ledConfig); maxY = MAX(ledY, maxY); minY = MIN(ledY, minY); } ledGridRows = maxY - minY + 1; if (minX < maxX) { lowestXValueForEast = (minX + maxX) / 2 + 1; highestXValueForWest = (minX + maxX - 1) / 2; } else { lowestXValueForEast = LED_XY_MASK / 2; highestXValueForWest = lowestXValueForEast - 1; } if (minY < maxY) { lowestYValueForSouth = (minY + maxY) / 2 + 1; highestYValueForNorth = (minY + maxY - 1) / 2; } else { lowestYValueForSouth = LED_XY_MASK / 2; highestYValueForNorth = lowestYValueForSouth - 1; } }