/* INFP Klassenarbeit 2025-01-17
 * Aufgabe 1
 * Ablaufsteuerung mit Ampel-LEDs
 * Name: CWIKLA DANIEL
 */

const int LED_rot = 27, LED_gelb = 19, LED_gruen = 23;
enum Zustaende_t { off, stop, blink, go } Zustand;

const int Taster2 = 2, Taster4 = 4;
bool fTaster2, fTaster4, InTaster2, InTaster4, Merker2, Merker4;
bool rot, gelb, gruen;

void setup() {
  pinMode(Taster2, INPUT);
  pinMode(Taster4, INPUT);
  pinMode(LED_rot, OUTPUT);
  pinMode(LED_gelb, OUTPUT);
  pinMode(LED_gruen, OUTPUT);
  
  Serial.begin(115200);
  Serial.println("DANIEL CWIKLA");

  Zustand = off;
}

void loop() {
  Einlesen();
  Ablauf();
  Ausgeben();
}

void Einlesen() {
  InTaster2 = digitalRead(Taster2);
  InTaster4 = digitalRead(Taster4);

  fTaster2 = (InTaster2 == HIGH && Merker2 == LOW);
  fTaster4 = (InTaster4 == HIGH && Merker4 == LOW);

  Merker2 = InTaster2;
  Merker4 = InTaster4;
}

void Ablauf() {
  switch (Zustand) {
    case off:
      Serial.println("ZUSTAND: OFF");
      if (fTaster2) Zustand = stop;
      else if (fTaster4) Zustand = blink;
      rot = false; gelb = false; gruen = false;
      break;

    case stop:
      Serial.println("ZUSTAND: STOP");
      if (fTaster2) Zustand = go;
      rot = true; gelb = false; gruen = false;
      break;

    case go:
      Serial.println("ZUSTAND: GO");
      if (fTaster2) Zustand = stop;
      else if (fTaster4) Zustand = off;
      rot = false; gelb = false; gruen = true;
      break;

    case blink:
      Serial.println("ZUSTAND: BLINK");
      if (fTaster4) Zustand = off;
      rot = false; gelb = true; gruen = false;
      break;
  }
}

void Ausgeben() {
  digitalWrite(LED_rot, rot);
  digitalWrite(LED_gelb, gelb);
  digitalWrite(LED_gruen, gruen);
}
