/** * @file LEDIndicator.cpp * @brief Implementation of LED status indicators */ #include "LEDIndicator.h" /** * @brief Constructor - initialize with default state */ LEDIndicator::LEDIndicator() : powerOn(false), dccMode(false), brightness(128), lastUpdate(0), pulsePhase(0) { } void LEDIndicator::begin() { FastLED.addLeds(leds, NUM_LEDS); FastLED.setBrightness(brightness); // Initialize both LEDs to off leds[LED_POWER] = COLOR_OFF; leds[LED_MODE] = COLOR_OFF; FastLED.show(); Serial.println("LED Indicator initialized"); Serial.printf("LED Data Pin: %d, Num LEDs: %d\n", LED_DATA_PIN, NUM_LEDS); } void LEDIndicator::update() { unsigned long now = millis(); // Update power LED if (powerOn) { leds[LED_POWER] = COLOR_POWER_ON; } else { leds[LED_POWER] = COLOR_POWER_OFF; } // Update mode LED with subtle pulsing effect if (now - lastUpdate > 20) { lastUpdate = now; pulsePhase++; // Create gentle pulse effect uint8_t pulseBrightness = 128 + (sin8(pulsePhase * 2) / 4); CRGB baseColor = dccMode ? COLOR_DCC : COLOR_ANALOG; leds[LED_MODE] = baseColor; leds[LED_MODE].fadeToBlackBy(255 - pulseBrightness); } FastLED.show(); } void LEDIndicator::setPowerOn(bool on) { if (powerOn != on) { powerOn = on; if (on) { powerOnSequence(); } } } void LEDIndicator::setMode(bool isDCC) { if (dccMode != isDCC) { dccMode = isDCC; modeChangeEffect(); } } void LEDIndicator::setBrightness(uint8_t newBrightness) { brightness = newBrightness; FastLED.setBrightness(brightness); } void LEDIndicator::powerOnSequence() { // Quick flash sequence on power on for (int i = 0; i < 3; i++) { leds[LED_POWER] = COLOR_POWER_ON; FastLED.show(); delay(100); leds[LED_POWER] = COLOR_OFF; FastLED.show(); delay(100); } leds[LED_POWER] = COLOR_POWER_ON; FastLED.show(); Serial.println("LED: Power ON sequence"); } void LEDIndicator::modeChangeEffect() { // Smooth transition effect when changing modes CRGB targetColor = dccMode ? COLOR_DCC : COLOR_ANALOG; // Fade out for (int i = 255; i >= 0; i -= 15) { leds[LED_MODE].fadeToBlackBy(15); FastLED.show(); delay(10); } // Fade in new color for (int i = 0; i <= 255; i += 15) { leds[LED_MODE] = targetColor; leds[LED_MODE].fadeToBlackBy(255 - i); FastLED.show(); delay(10); } Serial.printf("LED: Mode changed to %s\n", dccMode ? "DCC (Blue)" : "Analog (Yellow)"); }