#include <avr/io.h>
#include <util/delay.h>

// Définition des constantes
#define bouton0 PD2 // Broche 2 pour le bouton 0
#define bouton2 PD3 // Broche 3 pour le bouton 2
#define bouton3 PD4 // Broche 4 pour le bouton 3
#define bouton5 PD5 // Broche 5 pour le bouton 5
#define led PD6 // Broche 6 pour la LED d'erreur
#define ledOK PD7 // Broche 7 pour la LED de porte ouverte

const int codeCorrect[] = {0, 2, 3, 5};

// État actuel du système
int etat = 0; // Démarrage dans l'état 0

// Fonction pour lire l'état des boutons
int lireBoutons() {
    if (PIND & (1 << bouton0)) {
        return 0; // Bouton 0 pressé
    }
    if (PIND & (1 << bouton2)) {
        return 2; // Bouton 2 pressé
    }
    if (PIND & (1 << bouton3)) {
        return 3; // Bouton 3 pressé
    }
    if (PIND & (1 << bouton5)) {
        return 5; // Bouton 5 pressé
    }
    return -1; // Aucun bouton pressé
}

// Fonction principale
int main() {
    // Initialiser les broches d'entrée et de sortie
    DDRD &= ~(1 << bouton0);
    DDRD &= ~(1 << bouton2);
    DDRD &= ~(1 << bouton3);
    DDRD &= ~(1 << bouton5);
    DDRD |= (1 << led); // Broches LED en sortie
    DDRD |= (1 << ledOK); // Broches LED en sortie

    // Éteindre les LEDs au départ
    PORTD &= ~(1 << led);
    PORTD &= ~(1 << ledOK);

    // Boucle principale
    while (1) {
        int bouton = lireBoutons(); // Lire l'état des boutons
        
        if (etat == 0) { // État initial
            if (bouton == codeCorrect[0]) {
                etat = 1; // Démarrer la saisie du code
            }
        } 
        else if (etat == 1) { // Saisie du premier chiffre
            if (bouton == codeCorrect[1]) {
                etat = 2;
            } else if (bouton != -1) {
                // etat = 0; // Code incorrect, reprise du processus
                PORTD |= (1 << led);
                _delay_ms(500);
                PORTD &= ~(1 << led);
            }
        } 
        else if (etat == 2) { // Saisie du deuxième chiffre
            if (bouton == codeCorrect[2]) {
                etat = 3;
            } else if (bouton != -1) {
                // etat = 0; // Code incorrect, reprise du processus
                PORTD |= (1 << led);
                _delay_ms(500);
                PORTD &= ~(1 << led);
            }
        } 
        else if (etat == 3) { // Saisie du troisième chiffre
            if (bouton == codeCorrect[3]) {
                etat = 4;
            } else if (bouton != -1) {
                // etat = 0; // Code incorrect, reprise du processus
                PORTD |= (1 << led);
                _delay_ms(500);
                PORTD &= ~(1 << led);
            }
        } 
        else if (etat == 4) { // Code correct
            PORTD |= (1 << ledOK); // Allumer la LED de confirmation
            _delay_ms(5000); // Simuler l'ouverture de la porte pendant 5 secondes
            PORTD &= ~(1 << ledOK); // Éteindre la LED
            //etat = 0; // Revenir à l'état initial
        }
        
        _delay_ms(1000); // Délai entre les lectures des boutons
    }
}