/*arduino voies Kato V5
   05/03/2025
   Dominique Hudry
   commande d'aiguillages Kato pour sélectionner une voie parmis trois.
   lien: https://wokwi.com/projects/400791357235664897

     aig1
   ---o---------------voie1 vert
       \   aig2
        \---o---------voie2 bleu
             \
              \---.---voie3 jaune

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

  Output1 et Output2 sont branchées sur la bobine de l'aiguillage1
  Output3 et Output4 sont branchées sur la bobine de l'aiguillage2

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

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

// Constantes pour les voies
const byte Voie1 = 1;
const byte Voie2 = 2;
const byte Voie3 = 3;

#include "simpleBouton.h"


// 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 pdt 500ms pour test
  }
  delay(500);
  eteindreToutesLesLeds(); // Éteindre les LEDs après l'initialisation
  selectionnerVoie(Voie1); // La voie1 est sélectionnée
}

void loop() {
  for (byte i = 0; i < 3; i++) {
    bouton[i].actualiser();
    if (bouton[i].vientDEtreEnfonce()) {
      selectionnerVoie(i + 1); // i + 1 pour correspondre aux voies 1, 2, 3
    }
  }
}

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

  switch (voie) {
    case Voie1:
      envoyerImpulsion(CdeInput[0]);
      digitalWrite(LedVoie[0], HIGH);
      break;

    case Voie2:
      envoyerImpulsion(CdeInput[1]);
      envoyerImpulsion(CdeInput[3]);
      digitalWrite(LedVoie[1], HIGH);
      break;

    case Voie3:
      envoyerImpulsion(CdeInput[1]);
      envoyerImpulsion(CdeInput[2]);
      digitalWrite(LedVoie[2], HIGH);
      break;

    default:
      break;
  }
}

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

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

void envoyerImpulsion(byte pin) {
  digitalWrite(pin, HIGH);
  delay(DureeImpulsion);
  digitalWrite(pin, LOW);
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C