/*arduino voies Kato V2
   25/11/2024
   Dominique Hudry
   commande d'aiguillages Kato pour sélectionner une voie parmis trois.
   option: sélection de la voie1 dès la mise sous tension
   lien: https://wokwi.com/projects/415540187950607361

     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 OptionSelectVoie1 = 9;
const byte dureeImpulsion = 20;

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

// 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);
  eteindreToutesLesLeds();  // Éteindre les LEDs après l'initialisation
  pinMode(OptionSelectVoie1, INPUT_PULLUP);
  if (digitalRead(OptionSelectVoie1) == 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 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; 
  }
}

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);
}
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
sw1:1
sw1:2
sw1:3