enum class STATUS {OFF, ON};
//
// Blink Klasse für Zeitintervalle
//
class Blink {
private:
STATUS _status;
uint32_t _flashingTime;
uint32_t _oldTime {0};
public:
Blink();
void switchBlinkOn();
void switchBlinkOff();
virtual void setStatus(STATUS);
STATUS getStatus(void);
void setFlashingTime(uint32_t);
void tick(void);
};
Blink::Blink() : _status {STATUS::OFF} {}
void Blink::switchBlinkOn() {
setStatus(STATUS::ON);
}
void Blink::switchBlinkOff() {
setStatus(STATUS::OFF);
}
void Blink::setStatus(STATUS status) {
_status = status;
}
STATUS Blink::getStatus() {
return _status;
}
void Blink::setFlashingTime(uint32_t time) {
_flashingTime = time;
}
void Blink::tick() {
if (millis() - _oldTime >= _flashingTime) {
_oldTime = millis();
if (_status == STATUS::OFF) {
switchBlinkOn();
} else {
switchBlinkOff();
}
}
}
//
// LED Klasse für physische LEDs
//
class Led : public Blink {
private:
uint8_t _pin;
static uint8_t _numOfLeds;
void init(void);
public:
Led(void);
Led(uint8_t);
~Led(void);
void setStatus(STATUS status);
static int getNumOfLeds(void);
};
uint8_t Led::_numOfLeds {0};
Led::Led(void) : Blink() {
_pin = LED_BUILTIN;
init();
}
Led::Led(uint8_t pin) : Blink() {
_pin = pin;
init();
}
Led::~Led() {
_numOfLeds--;
}
void Led::init() {
pinMode(_pin,OUTPUT);
_numOfLeds++;
}
void Led::setStatus(STATUS status) {
Blink::setStatus(status);
switch (getStatus()) {
case STATUS::ON: digitalWrite(_pin,HIGH);
break;
case STATUS::OFF: digitalWrite(_pin,LOW);
break;
}
}
int Led::getNumOfLeds() {
return _numOfLeds;
}
//
// Main Prgramm
//
Led led1;
Led led2(2);
Led led3(4);
Led led4(6);
Led led5(8);
void setup() {
Serial.begin(115200);
Serial.println(Led::getNumOfLeds());
led1.setFlashingTime(250);
led2.setFlashingTime(1000);
led3.setFlashingTime(500);
led4.setFlashingTime(150);
led5.setFlashingTime(3000);
}
void loop() {
led1.tick();
led2.tick();
led3.tick();
led4.tick();
led5.tick();
}