//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); } }
bool parseLedStripConfig(int ledIndex, const char *config) { if (ledIndex >= LED_MAX_STRIP_LENGTH) return false; enum parseState_e { X_COORDINATE, Y_COORDINATE, DIRECTIONS, FUNCTIONS, RING_COLORS, PARSE_STATE_COUNT }; static const char chunkSeparators[PARSE_STATE_COUNT] = {',', ':', ':',':', '\0'}; ledConfig_t *ledConfig = &masterConfig.ledConfigs[ledIndex]; memset(ledConfig, 0, sizeof(ledConfig_t)); int x = 0, y = 0, color = 0; // initialize to prevent warnings int baseFunction = 0; int overlay_flags = 0; int direction_flags = 0; for (enum parseState_e parseState = 0; parseState < PARSE_STATE_COUNT; parseState++) { char chunk[CHUNK_BUFFER_SIZE]; { char chunkSeparator = chunkSeparators[parseState]; int chunkIndex = 0; while (*config && *config != chunkSeparator && chunkIndex < (CHUNK_BUFFER_SIZE - 1)) { chunk[chunkIndex++] = *config++; } chunk[chunkIndex++] = 0; // zero-terminate chunk if (*config != chunkSeparator) { return false; } config++; // skip separator } switch (parseState) { case X_COORDINATE: x = atoi(chunk); break; case Y_COORDINATE: y = atoi(chunk); break; case DIRECTIONS: for (char *ch = chunk; *ch; ch++) { for (ledDirectionId_e dir = 0; dir < LED_DIRECTION_COUNT; dir++) { if (directionCodes[dir] == *ch) { direction_flags |= LED_FLAG_DIRECTION(dir); break; } } } break; case FUNCTIONS: for (char *ch = chunk; *ch; ch++) { for (ledBaseFunctionId_e fn = 0; fn < LED_BASEFUNCTION_COUNT; fn++) { if (baseFunctionCodes[fn] == *ch) { baseFunction = fn; break; } } for (ledOverlayId_e ol = 0; ol < LED_OVERLAY_COUNT; ol++) { if (overlayCodes[ol] == *ch) { overlay_flags |= LED_FLAG_OVERLAY(ol); break; } } } break; case RING_COLORS: color = atoi(chunk); if (color >= LED_CONFIGURABLE_COLOR_COUNT) color = 0; break; case PARSE_STATE_COUNT:; // prevent warning } } *ledConfig = DEFINE_LED(x, y, color, direction_flags, baseFunction, overlay_flags, 0); reevaluateLedConfig(); return true; }
// grid offsets STATIC_UNIT_TESTED uint8_t highestYValueForNorth; STATIC_UNIT_TESTED uint8_t lowestYValueForSouth; STATIC_UNIT_TESTED uint8_t highestXValueForWest; STATIC_UNIT_TESTED uint8_t lowestXValueForEast; STATIC_UNIT_TESTED ledCounts_t ledCounts; // macro for initializer #define LF(name) LED_FUNCTION_ ## name #define LO(name) LED_FLAG_OVERLAY(LED_OVERLAY_ ## name) #define LD(name) LED_FLAG_DIRECTION(LED_DIRECTION_ ## name) #ifdef USE_LED_RING_DEFAULT_CONFIG static const ledConfig_t defaultLedStripConfig[] = { DEFINE_LED( 2, 2, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 2, 1, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 2, 0, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 0, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 0, 0, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 0, 1, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 0, 2, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 2, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 1, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 1, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 1, 3, 0, LF(THRUST_RING), 0, 0), DEFINE_LED( 1, 1, 3, 0, LF(THRUST_RING), 0, 0), }; #else static const ledConfig_t defaultLedStripConfig[] = { DEFINE_LED(15, 15, 0, LD(SOUTH) | LD(EAST), LF(ARM_STATE), LO(INDICATOR), 0),