#ifndef LED_cpp #define LED_cpp #include #include "LEDOutput.cpp" class LED { std::string _name; LEDOutput* _output; bool _on; unsigned long _fadeDurationOn, _fadeDurationOff, _fadeStart, _fadeEnd; float _brightness; unsigned long getFadeDuration(){ return _on ? _fadeDurationOn : _fadeDurationOff; } unsigned long getRemainingFadeTime(){ unsigned long now = millis(); return _fadeEnd >= now ? constrain(_fadeEnd - now, 0, getFadeDuration()) : 0; } float getMultiplier() { float value = getRemainingFadeTime() / (float)getFadeDuration(); return _brightness - value; } float getOutputMultiplier(){ float value = getMultiplier(); return _on ? value : _brightness - value; } void reset(bool on){ if (on == _on) return; float oldMultiplier = getMultiplier(); _on = on; _fadeStart = millis(); _fadeEnd = _fadeStart + (getFadeDuration() * oldMultiplier); } public: LED(std::string name, LEDOutput* output, unsigned long fadeDurationOn, unsigned long fadeDurationOff) { _name = name; _output = output; _fadeDurationOn = fadeDurationOn; _fadeDurationOff = fadeDurationOff; _brightness = 1.0f; } std::string getName(){ return _name; } void on(){ reset(true); } void off(){ reset(false); } void toggle(){ reset(!_on); } void loop() { _output->writeFraction(getOutputMultiplier()); } void setBrightness(float brightness){ _brightness = brightness; } }; #endif