#include<Bounce2.h>
//fc1 13, pa 11, pc 10, fc2 8, led 5
int pinLed = 5; 
int pinFC1 = 13;
int pinFC2 = 8;
int pinPa = 11;
int pinPc = 10;
int pinAllarm = 7;
int MotoreOnOff;
int MotoreVerso = LOW;
//dichiaro i pulsanti virtuali e le fotocellule
Bounce2::Button Pa = Bounce2::Button();
Bounce2::Button Pc = Bounce2::Button();
Bounce2::Button FC1 = Bounce2::Button();
Bounce2::Button FC2 = Bounce2::Button();
Bounce2::Button Allarm = Bounce2::Button();
//DICHIARO LE UNITà DI TEMPO
int t0=millis();
int t=millis();
typedef enum {
  Chiuso, Chiusura, Aperto, Apertura, Emergenza, Blocco
}Staticancello;
//dichiaro la variabile stato a valori finiti
Staticancello stato = Chiuso;
void setup() {
// collego i pulsanti virtuali
Pa.attach(pinPa,INPUT_PULLUP);
Pc.attach(pinPc,INPUT_PULLUP);
FC1.attach(pinFC1,INPUT_PULLUP);
FC2.attach(pinFC2,INPUT_PULLUP);
Allarm.attach(pinAllarm,INPUT_PULLUP);
//collego il led
pinMode(pinLed, OUTPUT);
//apro comunicazione seriale
Serial.begin(9600);
Serial.println("Il cancello è chiuso.");
}
void loop() {
  // put your main code here, to run repeatedly:
Pa.update();
Pc.update();
FC1.update();
FC2.update();
Allarm.update();
switch (stato){
  case  Chiuso:
        MotoreOnOff = LOW;
        MotoreVerso = LOW;
        digitalWrite(pinLed, LOW);
        if(Pa.fell()){
          stato = Apertura;
        Serial.println("Il cancello si sta aprendo...");
        }
        break;
  case  Apertura:
        MotoreOnOff = HIGH;
        MotoreVerso = HIGH;
        digitalWrite(pinLed, HIGH);
        if(Pa.fell()){
          stato = Blocco;
          Serial.println("Il cancello è in blocco");
        }else if(Allarm.fell()){
              stato = Emergenza;
              Serial.println("Emergenza");
              }else if(FC2.fell()){
                    stato = Aperto;
                    Serial.println("Il cancello è aperto.");
                    t0=millis();
                    }
        break;
  case  Aperto:
        t=millis();
        MotoreOnOff = LOW;
        MotoreVerso = LOW;
        digitalWrite(pinLed, LOW);
        if(Pc.fell()){
          stato = Chiusura;
          Serial.println("Il cancello si sta chiudendo...");
        }else if((t-t0)>=5000){
              stato = Chiusura;
              Serial.println("Il cancello si sta chiudendo...");
              }
        break;
  case  Chiusura:
        MotoreOnOff = HIGH;
        MotoreVerso = LOW;
        digitalWrite(pinLed, HIGH);
        if(Pc.fell()){
          stato = Blocco;
        Serial.println("Il cancello è in blocco");
        }else if(Allarm.fell()){
              stato = Emergenza;
              Serial.println("Emergenza");
              }else if(FC1.fell()){
                    stato = Chiuso;
                    Serial.println("Il cancello è chiuso.");
                    }
        break;
  case  Emergenza:
        MotoreOnOff = LOW;
        MotoreVerso = LOW;
        digitalWrite(pinLed, HIGH);
        if(Pc.fell()){
          stato = Chiusura;
        Serial.println("Il cancello si sta chiudendo...");
        }else if(Pa.fell()){
              stato = Apertura;
              Serial.println("Il cancello si sta aprendo...");
              }
        break;
  case  Blocco:
        MotoreOnOff = LOW;
        MotoreVerso = LOW;
        digitalWrite(pinLed, HIGH);
        if(Pc.fell()){
          stato = Chiusura;
        Serial.println("Il cancello si sta chiudendo...");
        }else if(Pa.fell()){
              stato = Apertura;
              Serial.println("Il cancello si sta aprendo...");
              }
        break;
}
}