byte etage1 = 2;
byte etage2 = 2;
byte parken = 0;

void setup() {
  Serial.begin(9600);

  // Setze die DDR (Data Direction Register) für Ausgänge und Eingänge
  DDRD = 0b11111100; // Pins 2-7 als Ausgänge für LEDs
  DDRB = 0b00000000;  // Pins 0-7 als Eingänge für Sensoren
  DDRC = 0b000011;    // Pins 0 und 1 als Ausgänge für Parkstatus LEDs
  
  // Pin Change Interrupts aktivieren für die Gruppen
  PCMSK0 |= (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT4) | (1 << PCINT5); // Pins 8-13
  PCICR |= (1 << PCIE0); // Aktiviert Pin Change Interrupts für Gruppe 0

  // Interrupts für Einfahrt und Ausfahrt
  attachInterrupt(digitalPinToInterrupt(PB4), einfahrt, FALLING);
  attachInterrupt(digitalPinToInterrupt(PB5), ausfahrt, FALLING);
  
  // Initialisiere alle LEDs
  for (int i = 0; i <= 8; i++) {
    PORTD |= (1 << i);  // LEDs an allen Pins 0-7 einschalten
    PORTC |= (1 << i);  // LEDs an den Pins C0 und C1 einschalten
  }
  delay(1000);
  PORTC &= ~(1 << PC1); // Initialisiere eine spezifische LED auf C1
  Serial.println("Start");
  sei();  // Globale Interrupts aktivieren
}

void loop() {
  // Hier könnte die Anzeige auf einem OLED-Display oder eine andere Logik kommen
}

ISR(PCINT0_vect) {
  // Diese Funktion wird aufgerufen, wenn ein Pin in der Gruppe PCINT0 (Pins 8-13) geändert wird
  Serial.println("Pin Change Interrupt an Pins 8-13");
}



void einfahrt() {
  parken++;
  if (parken == 4) {  // Überprüft, ob noch Parkplätze verfügbar sind
    PORTC |= (1 << PC1);  // Setzt die LED auf C1, wenn der Parkplatz voll ist
  } else {
    PORTC &= ~(1 << PC0); // Setzt die LED auf C0
  }
  Serial.println("Einfahrt registriert");
}

void ausfahrt() {
  parken--;
  PORTC |= (1 << PC0);  // Setzt die LED auf C0
  PORTC &= ~(1 << PC1); // Setzt die LED auf C1 zurück
  Serial.println("Ausfahrt registriert");
}

void parkplatz1() {
  parkplatz(PB0, PD2, &etage1, PD6);
  Serial.println("Parkplatz 1");
}

void parkplatz2() {
  parkplatz(PB1, PD3, &etage1, PD6);
  Serial.println("Parkplatz 2");
}

void parkplatz3() {
  parkplatz(PB2, PD4, &etage2, PD7);
  Serial.println("Parkplatz 3");
}

void parkplatz4() {
  parkplatz(PB3, PD5, &etage2, PD7);
  Serial.println("Parkplatz 4");
}

void parkplatz(byte sensorPin, byte ledPin, byte *etage, byte Etage) {
  
  if (PINB & (1 << sensorPin)) {
    PORTD &= ~(1 << ledPin); 
    (*etage)--; 
  } else {
    PORTD |= (1 << ledPin);
    (*etage)++;
  }

  if (*etage == 0) {
    PORTD &= ~(1 << Etage);
  } else {
    PORTD |= (1 << Etage);  
  }
}