76 lines
1.4 KiB
C++
76 lines
1.4 KiB
C++
#ifndef LED_cpp
|
|
#define LED_cpp
|
|
|
|
#include <Arduino.h>
|
|
#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
|