/*arduino voies Kato V4
   25/11/2024
   Dominique Hudry
   commande d'aiguillages Kato pour sélectionner une voie parmis trois.
   option: sélection voie3 dès la mise sous tension
   lien:
        aig1
   ---o---------------voie3
       \   aig2
        \---o---------voie2
             \
              \-------voie1

                       L293D
       +5V--Enable1 =|1  U 16|= +5V
  CdeInput1--Input1 =|2    15|= Input4
            Output1 =|3    14|= Output4
                GND =|4    13|= GND
                GND =|5    12|= GND
            Output2 =|6    11|= Output3
  CdeInput2--Input2 =|7    10|= Input3
   +V aiguilles--VS =|8     9|= Enable2--+5V

   voie  aig1   aig2  CdeInput1  CdeInput2   CdeInput3   CdeInput4  led allumée
    1   dévié  droit     LOw     pulse HIGH  pulse HIGH     LOW       LedVoie1
    2   dévié  dévié     LOw     pulse HIGH     LOw      pulse HIGH   LedVoie2
    3   droit    X   pulse HIGH     LOW         LOW         LOW       LedVoie3
*/
#include "simpleBouton.h"

// Définition des broches
const byte BPvoie[3] = {11, 12, 13};
const byte LedVoie[3] = {2, 3, 4};
const byte CdeInput[4] = {5, 6, 7, 8};
const byte OptionSelectVoie3 = 9;
const byte dureeImpulsion = 20;

// Initialisation des boutons
simpleBouton bouton[3] = {simpleBouton(BPvoie[0]), simpleBouton(BPvoie[1]), simpleBouton(BPvoie[2])};

void setup() {
  // Configuration des broches en sortie pour les commandes et les LEDs
  for (byte i = 0; i < 4; i++) {
    pinMode(CdeInput[i], OUTPUT);
    digitalWrite(CdeInput[i], LOW);  // Initialisation des broches en LOW
  }
  for (byte i = 0; i < 3; i++) {
    pinMode(LedVoie[i], OUTPUT);
    digitalWrite(LedVoie[i], HIGH);  // Allumage des LEDs pour 500ms lors de l'initialisation
  }
  delay(500);
  for (int i = 0; i < 3; i++) {
    digitalWrite(LedVoie[i], LOW);  // Éteindre les LEDs après l'initialisation
  }
  pinMode(OptionSelectVoie3, INPUT_PULLUP);
  if (digitalRead(OptionSelectVoie3) == LOW ) {
    selectionnerVoie(3); // La voie3 est sélectionnée
  }
}

void loop() {
  for (byte i = 0; i < 3; i++) {
    bouton[i].actualiser();
  }

  if (bouton[0].vientDEtreEnfonce()) {
    selectionnerVoie(1);
  } else if (bouton[1].vientDEtreEnfonce()) {
    selectionnerVoie(2);
  } else if (bouton[2].vientDEtreEnfonce()) {
    selectionnerVoie(3);
  }
}

void selectionnerVoie(byte voie) {
  eteindreToutesLesLeds();
  resetInputs();

  switch (voie) {
    case 1:
      envoyerImpulsion(CdeInput[1]);
      envoyerImpulsion(CdeInput[2]);
      digitalWrite(LedVoie[0], HIGH);
      break;
    case 2:
      envoyerImpulsion(CdeInput[1]);
      envoyerImpulsion(CdeInput[3]);
      digitalWrite(LedVoie[1], HIGH);
      break;
    case 3:
      envoyerImpulsion(CdeInput[0]);
      digitalWrite(LedVoie[2], HIGH);
      break;
    default:
      break;
  }
}

void eteindreToutesLesLeds() {
  for (byte i = 0; i < 3; i++) {
    digitalWrite(LedVoie[i], LOW);
  }
}

void resetInputs() {
  for (byte i = 0; i < 4; i++) {
    digitalWrite(CdeInput[i], LOW);
  }
}

void envoyerImpulsion(byte pin) {
  digitalWrite(pin, HIGH);
  delay(dureeImpulsion);
  digitalWrite(pin, LOW);
}