#pragma once #include "hardware.pb.h" #include /** * @class HardwareLed * @brief Manages an LED strip on ESP8266 using FastLED library. * Supports animations defined by hardware_LedConfig (static, pulse, fade, flicker). * Template parameter PIN specifies the GPIO pin at compile time. * * @tparam PIN The GPIO pin connected to the LED strip (e.g., 2 for D2 on ESP8266). */ template class HardwareLed { public: using AnimationCallback = void (*)(); /** * @brief Constructor for HardwareLed. * @param numPixels Number of pixels in the strip (default: 1). */ HardwareLed(uint8_t numPixels = 1); ~HardwareLed(); void begin(); void end(); void update(); void set(const hardware_LedConfig& config); void setAnimationCallback(AnimationCallback cb) { m_callback = cb; } float estimateCurrent_mA() const; private: void applyStatic(const hardware_StaticParams& params); void applyPulse(const hardware_PulseParams& params); void applyFade(const hardware_FadeParams& params); void applyFlicker(const hardware_FlickerParams& params); void setColor(uint32_t color, uint8_t brightness = 255); uint32_t lerpColor(uint32_t color1, uint32_t color2, float t) const; CRGB* m_leds; // Dynamic array for pixel data uint8_t m_numPixels; hardware_LedConfig m_currentConfig = hardware_LedConfig_init_default; bool m_isActive; unsigned long m_startTime; uint8_t m_pulseState; unsigned long m_lastPulseTime; uint8_t m_fadeIndex; unsigned long m_lastFadeTime; uint32_t m_fadeCurrentColor; uint32_t m_fadeTargetColor; float m_fadeProgress; unsigned long m_fadeStartTime; AnimationCallback m_callback = nullptr; };