void setup() {
  // GPIOA und GPIOB Takt freischalten (STM32-spezifisch)
  RCC->AHBENR |= (1 << 0);  // Takt für GPIOA aktivieren
  RCC->AHBENR |= (1 << 1);  // Takt für GPIOB aktivieren

  // GPIOA-Pins PA0 bis PA7 als Ausgang konfigurieren
  GPIOA->MODER &= ~0x0000FFFF;  // Bits für PA0 bis PA7 löschen
  GPIOA->MODER |= 0x00005555;   // Bits für PA0 bis PA7 auf '01' setzen (Ausgangsmodus)

  // GPIOB-Pin PB0 als Eingang konfigurieren (für den Button)
  GPIOB->MODER &= ~(0x3 << (0 * 2));  // Pin PB0 als Eingang setzen
}

int speedDelay = 500;  // Startgeschwindigkeit (in Millisekunden)
int minSpeedDelay = 100;  // Minimale Geschwindigkeit
bool gameActive = true;  // Status des Spiels

void loop() {
  if (gameActive) {
    for (int i = 0; i < 8; i++) {
      GPIOA->ODR = (1 << i);  // Setzt den aktuellen Pin PA0 bis PA7 auf HIGH
      
      // Wenn die LED an PA7 (letzte LED) leuchtet
      if (i == 7) {
        if (GPIOB->IDR & (1 << 0)) {  // Wenn Button PB0 gedrückt wird
          increaseSpeed();  // Geschwindigkeit erhöhen
        }
      } else {
        // Wenn der Button zu einem falschen Zeitpunkt gedrückt wird
        if (GPIOB->IDR & (1 << 0)) {
          gameOver();  // Spiel beenden und LEDs blinken lassen
        }
      }

      delay(speedDelay);  // Wartezeit für die aktuelle Geschwindigkeit
    }
  }
}

void increaseSpeed() {
  speedDelay -= 100;  // Geschwindigkeit erhöhen (Delay verringern)
  if (speedDelay < minSpeedDelay) {
    speedDelay = minSpeedDelay;  // Begrenzung der Geschwindigkeit
  }
}

void gameOver() {
  // Alle LEDs aufleuchten lassen
  GPIOA->ODR = 0xFF;  // Setzt alle Pins PA0 bis PA7 auf HIGH
  delay(1000);        // 1 Sekunde warten
  GPIOA->ODR = 0x00;  // Setzt alle Pins PA0 bis PA7 auf LOW
  delay(3000);        // 3 Sekunden warten

  // Spiel zurücksetzen
  speedDelay = 500;  // Startgeschwindigkeit zurücksetzen
  gameActive = true;  // Spiel wieder aktivieren
}


/*
// Pin-Zuordnung für die LEDs
#define LED0 A0
#define LED1 A1
#define LED2 A2
#define LED3 A3
#define LED4 A4
#define LED5 A5
#define LED6 PC13
#define LED7 PC14

#define BUTTON_PIN PA14    // Pin für den Taster

int speedDelay = 500;   // Startgeschwindigkeit (in Millisekunden)
int minSpeedDelay = 100; // Minimale Geschwindigkeit
bool gameActive = true;  // Spielstatus
int ledPosition = 0;     // Aktuelle Position der leuchtenden LED

void setup() {
  // LEDs als Ausgänge definieren
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  
  // Taster als Eingang definieren
  pinMode(BUTTON_PIN, INPUT_PULLDOWN);
}

void loop() {
  if (gameActive) {
    // Schalte die LEDs in der Reihenfolge mit einem switch-case
    switch (ledPosition) {
      case 0:
        turnOnLED(LED0);
        checkButton(LED0);
        break;
      case 1:
        turnOnLED(LED1);
        checkButton(LED1);
        break;
      case 2:
        turnOnLED(LED2);
        checkButton(LED2);
        break;
      case 3:
        turnOnLED(LED3);
        checkButton(LED3);
        break;
      case 4:
        turnOnLED(LED4); // PC7, der richtige Zeitpunkt zum Drücken
        checkButton(LED4);
        break;
      case 5:
        turnOnLED(LED5);
        checkButton(LED5);
        break;
      case 6:
        turnOnLED(LED6);
        checkButton(LED6);
        break;
      case 7:
        turnOnLED(LED7);
        checkButton(LED7);
        break;
    }

    delay(speedDelay);

    // Erhöhe die LED-Position und beginne wieder bei 0, wenn sie das Ende erreicht
    ledPosition++;
    if (ledPosition > 7) {
      ledPosition = 0;
    }
  }
}

void turnOnLED(int ledPin) {
  // Alle LEDs ausschalten
  digitalWrite(LED0, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);

  // Gewählte LED einschalten
  digitalWrite(ledPin, HIGH);
}

void checkButton(int ledPin) {
  if (digitalRead(BUTTON_PIN) == HIGH) {
    if (ledPin == LED7) {  // Wenn die LED an PC14 leuchtet
      increaseSpeed();
    } else {
      gameOver();
    }
  }
}

void increaseSpeed() {
  // Geschwindigkeit erhöhen (Delay verkleinern)
  speedDelay -= 200;
  if (speedDelay < minSpeedDelay) {
    speedDelay = minSpeedDelay; // Begrenzung, damit es nicht zu schnell wird
  }
}

void gameOver() {
  // Alle LEDs blinken, um das Spielende zu signalisieren
  digitalWrite(LED0, HIGH);
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, HIGH);
  digitalWrite(LED5, HIGH);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, HIGH);
  
  delay(1000); // Spiel-Ende Verzögerung
  
  // Alle LEDs ausschalten
  turnOnLED(-1);
  
  gameActive = false; // Spiel stoppen
}
*/