/***************************
 * Signal_BAL - 30/11/2016 *
 * *************************
 * Ce programme simule le fonctionnement d un signal lumineux a trois
 * feux d un B.A.L Block Automatique Lumineux. Il n assure pas
 * l espacement des trains. Lorsque la loco declenche le premier ILS,
 * le signal se met au rouge. Lorsque la loco declenche le deuxieme
 * ILS, le signal se met a l orange pour une duree egale a celle du
 * rouge, puis repasse au vert.
 */

 /*  VARIABLES
  *  --------------------------------------------------------------
  *  debRouge : temps de debut du feu rouge
  *  finRouge : temps de fin du feu rouge
  *  dureeRouge ; duree du feu rouge
  *  debOrange : temps de debut du feu orange
  *  flagOrange : booleen 0 si feu orange eteint, 1 si allume
  */

  /* BRANCHEMENTS
   * --------------------------------------------------------------
   * ILS E (entree) sur 2
   * ILS S (sortie) sur 3
   * feu vert sur 4
   * feu rouge sur 5
   * feu orange sur 6
   */

const byte ILS_entree = 2;
const byte ILS_sortie = 3;
const byte feu_vert = 4;
const byte feu_rouge = 5;
const byte feu_orange = 6;
unsigned long debRouge = 0;
unsigned long finRouge = 0;
unsigned long debOrange = 0;
unsigned long dureeRouge;
boolean flagOrange = 0;

void setup() {
  pinMode(ILS_entree, INPUT_PULLUP);
  pinMode(ILS_sortie, INPUT_PULLUP);
  pinMode(feu_vert, OUTPUT);
  pinMode(feu_rouge, OUTPUT);
  pinMode(feu_orange, OUTPUT);
  // Initialisation du signal a anode commune, allume par LOW
  digitalWrite(feu_vert, LOW);
  digitalWrite(feu_rouge, HIGH);
  digitalWrite(feu_orange, HIGH);
  }

void loop() {
  // Surveillance de l ILS d entree
  while (digitalRead(ILS_entree) == HIGH)
  {
    // ILS E non declenche
    if (flagOrange)
    {
      if ((millis() - debOrange) > dureeRouge)
      {
        digitalWrite(feu_orange, HIGH);
        flagOrange = 0;
        digitalWrite(feu_vert, LOW);
      }
    }
   }
  // ILS E declenche
  digitalWrite(feu_vert, HIGH);
  digitalWrite(feu_orange, HIGH);
  flagOrange = 0;
  digitalWrite(feu_rouge, LOW);
  debRouge = millis();
  // Surveillance de l ILS de sortie
  while (digitalRead(ILS_sortie) == HIGH)
  {
    // ILS S non declenche, ne rien faire
  }
  // ILS S declenche
  finRouge = millis();
  dureeRouge = finRouge - debRouge;
  digitalWrite(feu_rouge, HIGH);
  digitalWrite(feu_orange, LOW);
  flagOrange = 1;
  debOrange = millis();

}