Was nicht heissen soll, dass ich "einen solchen Doppelblinker" so schreiben würde...
Wie würdest du ihn schreiben?
Und ja, so wie deins sehen eigentlich alle meine hier je geposteten Blink Klassen aus.
Mit einer Ausnahme:
Den enum würde ich nicht global machen, weil er nicht global gebraucht wird.
Und vermutlich würde ich meine "neue" CombieLib für IO und Timer einsetzen.
Aber das Argument gilt noch nicht, weil die Lib noch nicht fertig ist.
Also die von mir "verbesserte" Version:
const byte taster = 2;
class Blinker
{
protected:
enum Zustand { Start, Hell, Dunkel,};
const byte ledPin;
const unsigned long hellPhase;
const unsigned long dunkelPhase;
unsigned long zeitMerker = 0;
Zustand aktuell = Start;
public:
Blinker(const byte ledPin, const unsigned long hellPhase, const unsigned long dunkelPhase)
: ledPin(ledPin), hellPhase(hellPhase), dunkelPhase(dunkelPhase) {}
void run(const bool blinkAnforderung) {
switch (aktuell) {
case Start:
if (!blinkAnforderung)
return;
digitalWrite(ledPin, HIGH);
aktuell = Hell;
zeitMerker = millis();
case Hell:
if (millis() - zeitMerker < hellPhase)
return;
digitalWrite(ledPin, LOW);
aktuell = Dunkel;
zeitMerker = millis();
case Dunkel:
if (millis() - zeitMerker >= dunkelPhase)
aktuell = Start;
}
}
void init() {
pinMode(ledPin, OUTPUT);
}
};
Blinker blinkGruppe[] = { // {pin,hellzeit,dunkelzeit}
{13, 100, 500},
{12, 500, 1000},
};
void setup() {
pinMode(taster, INPUT_PULLUP);
for (Blinker &blinker : blinkGruppe)
blinker.init();
}
void loop() {
bool blinkAnforderung = !digitalRead(taster);
for (Blinker &blinker : blinkGruppe)
blinker.run(blinkAnforderung);
}
Die Schachtelungstiefe ist allerdings um eins höher, als bei der Goto Version.
Auch werden zwei Sprachkonstrukte genutzt, statt nur eins.
Aber beides ist kein KO Kriterium, für diese Variante.
Ansonsten, wie schon gesagt:
Wie würdest du ihn schreiben?
Jetzt frei, ohne dich an meine Vorlage zu halten.
Nur, identische Funktion, also gleiche Aufgabe.
Denn:
Vielleicht kann ich ja von dir noch was lernen!