#include <FVS.h>
//Memory_Shield
//LEDs und Taster müssen Invertiert werden, da gegen Masse geschaltet wird

#define BUTTON0 1
#define BUTTON1 5
#define BUTTON2 3
#define BUTTON3 4

#define MAXLEVEL 10

int buttons[] = { BUTTON0, BUTTON1, BUTTON2, BUTTON3 };
int state = 0;
int level = 0;

int musterVorgabe[MAXLEVEL] = {};
int musterEingabe[MAXLEVEL] = {};

void setup() {
  //alle LEDs löschen
  portMode(1, OUTPUT);
  portWrite(1, 0);
  //LEDs vom Shield ausschalten
  for (int i = 0; i < 4; i++) {
    digitalWrite(buttons[i], HIGH);
  }
  //Tft initialisieren
  Tft.begin();
  //Zufallszahl starten
  randomSeed(analogRead(39));
}

void loop() {
  switch (state) {
    case 0:  // neue Runde
    //Gruppe 1 start ===============================================================================

    

    //Gruppe 1 ende ================================================================================
      break;
    case 1:  // Ausgabe aktuelle Runde
    //Gruppe 2 start ===============================================================================
      portMode(1,2);
      for(int i=0;i<=level;i++){
        digitalWrite(buttons[mustervorgabe[i]], LOW);
        delay(250);
        digitalWrite(buttons[mustervorgabe[i]], HIGH);
        delay(250);
      }
    //Gruppe 2 ende ================================================================================
      break;
    case 2:  // Eingabe aktuelle Runde
    //Gruppe 3 start ===============================================================================
      pinMode(BUTTON0, INPUT);
      pinMode(BUTTON1, INPUT);
      pinMode(BUTTON2, INPUT);
      pinMode(BUTTON3, INPUT);

      Tft.setCursorCharacter(1,1);
      Tft.print("Eingabe    ");

      for(int i = 0, i <= level, i++)
      {
        while(musterEingabe[i] == -1)
        {
          for(int j = 0; j < 4, j++)
          {
            while(digitalRead(buttons[j]) == false)
            {
              musterEingabe[i] = j;
            }
          }
          delay(100);
        }
        Tft.print(".");
      }     

    //Gruppe 3 ende ================================================================================
      break;
    case 3:  // Vergleich Eingabe/Ausgabe
    //Gruppe 4 start ===============================================================================



    //Gruppe 4 ende ================================================================================
      break;
    case 4:  // geschafft, Runde hochzählen und auf Display ausgeben
    //Gruppe 5 start ===============================================================================

      Tft.setCursorCharacter(3, 1);
      Tft.print("Gewonnen!");
      level++;
      state = 1;

    //Gruppe 5 ende ================================================================================
      break;
    case 5:  // verloren
    //Gruppe 6 start ===============================================================================

    Tft.setCursorCharacter(1,1);
    Tft.print("Du hast verloren :(    "));
    Tft.setCursorCharacter(3,1);
    Tft.print(" Bis Level: " + String(level) + " erreicht.");

    delay(5000);
    state = 0;

    //Gruppe 6 ende ================================================================================
      break;
  }
}