//////////////////////////////////////////////////////////////////////////////
/// \author Kai R. ()
/// \brief Beispielprogramm für ein einfaches Reaktionstest Spiel
///
/// Sobald die LED aufleuchtet, muss so schnell wie möglich der Taster gedrückt werden.
/// Je schneller das gelingt, desto besser. Die kürzeste benötigte Zeit ist die Bestzeit
/// und wird in der vierten Zeile des LCD Displays dauerhaft angezeigt
///
/// \date 2026-05-14
/// \version 1.0
///
///
//////////////////////////////////////////////////////////////////////////////
#include <LiquidCrystal_I2C.h>
#include <Streaming.h> // Bibliothek für Streamausgabe (C++ cout)
#include "Reaktionstester.hpp"
//------------------------------------------------------------------
// Globale(s) Objekt(e)
//------------------------------------------------------------------
MyLcd Lcd(0x27, gkLcdSpalten, gkLcdZeilen);
Spielsteuerung Spiel {gkPinTaster, gkPinLed};
//
// Hauptprogrammroutinen
//
void setup() {
Serial.begin(115200);
pinMode(gkPinTaster, INPUT_PULLUP);
pinMode(gkPinLed, OUTPUT);
Lcd.init();
Lcd.backlight();
// Lcd.createChar(0, gkBackslash);
Spiel.begin();
randomSeed(analogRead(0));
}
void loop() {
switch (Spiel.status()) {
case SpielStatus::Start:
Spiel.start(gkMinWartezeit_ms, gkMaxWartezeit_ms);
ausgabe::start(Serial, Spiel.runde());
Lcd.setCursor(0, 0);
ausgabe::start(Lcd, Spiel.runde());
ausgabe::daten(Lcd, Spiel.anzeigdaten());
[[fallthrough]];
case SpielStatus::Warte: Spiel.warte(); break;
case SpielStatus::LedAn: Spiel.ledAn(); [[fallthrough]];
case SpielStatus::Eingabe: Spiel.eingabe(); break;
case SpielStatus::Abbruch:
Spiel.abbruch();
ausgabe::abbruch(Serial);
ausgabe::abbruch(Lcd);
while (!Spiel.taster()) { ; } // Endlosschleife bei dauergedrückter Taste
delay(gkDelay_ms);
break;
case SpielStatus::Ergebnis:
Spiel.ergebnis();
ausgabe::daten(Serial, Spiel.anzeigdaten());
ausgabe::daten(Lcd, Spiel.anzeigdaten());
delay(gkDelay_ms);
break;
}
}