#include <avr/io.h>     // Definitionen laden 
#include <util/delay.h> // CPU Frequenz einstellen!

#include "checkKeys.h"   // checkKeys verwenden

//enum {STOPP,AUF,ZU} zustand=STOPP,richtung=ZU; // Aufzaehlungstyp
typedef enum {STOPP,AUF,ZU} ZustandTyp;  // Aufzaehlungstyp
ZustandTyp zustand;
ZustandTyp richtung;

unsigned char position; // Position der Schranke
unsigned char blinker;  // Zaehler fuer Blinken

void ausLed(unsigned char n){    // LED n ausschalten
  // Aufgabe 1
}
void toggleLed(unsigned char n){ // LED n umschalten
  // Aufgabe 2
}

void ausgebenPosition(){ // Leuchtband ausgeben
  unsigned char i,a=1;
  // Aufgabe 3
}

void fahren(){   // in Richtung fahren, dabei Blinken
  blinker++;
  toggleLed(7);
  _delay_ms(150);
  if(blinker%4==0){
    // Aufgabe 4
  }
}

void init(){  // Initialisierung der Variabeln hier, wegen Struktogramm fuer init
  PORTB = 0xff;       // alle LED aus 
  DDRB = 0xff;        // PB als Ausgang
  zustand  = STOPP;
  richtung = ZU;
  position = 0;
  blinker  = 0;
  ausgebenPosition();
}

int main(){         // Hauptprogramm 
  init();
  while(1){         // Endlosschleife 
    checkKeys(0b1111,0b1111); // Maske,NLogik PD3..PD0
    switch (zustand){         // in Abhaengigkeit des Zustands
      case STOPP:  // 0
        if(keyEnter==1 || (richtung==ZU && keyEnter==0b1000)){ //Transitionen pruefen
          richtung=AUF;
          zustand=AUF;
        }
        else if(keyEnter==0b100 || (richtung==AUF && keyEnter==0b1000)){
          richtung=ZU;
          zustand=ZU;
        }
        break;
      case AUF:  // 1
        if(position==0 || keyEnter > 0b1){  // Transitionen pruefen
          zustand=STOPP;
          ausLed(7);                        // exit Aktion
        }
        else{                               // do Aktionen
          fahren();
        }
        break;
      case ZU:  // 2
        // Aufgabe 5
      break;
    }
  } 
  return 0; 
}