/*attiny aig KATO ir
  07/01/2024
  Dominique Hudry
  lien: https://github.com/LuisMiCa/IRsmallDecoder
        https://wokwi.com/projects/386288346403032065

  commande d'un aiguillage KATO codé par une télécommande IR NEC
  -première touche: numéro de l'aiguillage. pour exemple aiguillage ayant comme code 0 ne réagira que pour l'appui de la touche 0 (48)
  -seconde touche: position aiguillage
      touche PREV: position DIRECT,
      touche NEXT: position DEVIE
  L'appui sur la touche Test allume toutes les leds durant une petite tempo.

     touche     code
    télécde    décimal
       0         104
       1         48
       2         24
       3         122
       4         16
     prev        224
     next        144
     test        34

                           Brochage ATtiny85
                               =|1  U  8|= VCC
                CdeInput1 <--3 =|2     7|= 2<-- Sortie capteur IR
                CdeInput2 <--4 =|3     6|= 1--> LedPosDirect
                           GND =|4     5|= 0--> LedPosDevie

                             Brochage L293D
                  +5V--Enable1 =|1  U 16|= VSS--+5V
             CdeInput1--Input1 =|2    15|= Input4
  bobine aiguillage R--Output1 =|3    14|= Output4
                           GND =|4    13|= GND
                           GND =|5    12|= GND
  bobine aiguillage N--Output2 =|6    11|= Output3
             CdeInput2--Input2 =|7    10|= Input3
               +V aiguille--VS =|8     9|= Enable2
*/

const byte NumeroAig = 104; // correspond à 0 sur la télécommande
const byte LedPosDirect = 0; // pour indiquer la position Direct
const byte LedPosDevie = 1; // pour indiquer la position Dévié
const byte CdeInput1 = 3; // à relier à Input1 du L293D
const byte CdeInput2 = 4; // à relier à Input2 du L293D
const byte DureeImpulsion = 20;  
bool selectAig = false; // valide la sélection correcte de l'aiguillage 
byte etatLedPosDirect = 0; // État de la LED 1 (0 pour éteinte, 1 pour allumée)
byte etatLedPosDevie = 0; // État de la LED 2 (0 pour éteinte, 1 pour allumée)

#define IR_SMALLD_NEC
#include <IRsmallDecoder.h>
IRsmallDecoder irDecoder(2);
irSmallD_t irData;

void setup() {
  pinMode(LedPosDirect, OUTPUT);
  pinMode(LedPosDevie, OUTPUT);
  pinMode(CdeInput1, OUTPUT);
  pinMode(CdeInput2, OUTPUT);
  digitalWrite(LedPosDirect, LOW);
  digitalWrite(LedPosDevie, LOW);
  digitalWrite(CdeInput1, LOW);
  digitalWrite(CdeInput2, LOW);
} // fin setup

void loop() {
  if (irDecoder.dataAvailable(irData)) {
    traitementCode();
  }
} // fin loop

void traitementCode() {
  switch (irData.cmd) {
    case NumeroAig: // Code décimal pour la première touche (sélection de l'aiguillage)
      selectAig = true; // valide la bonne sélection de l'aiguillage
      break;

    case 144: // Code décimal pour la seconde touche (position Direct)
      if (selectAig == true) {
        etatLedPosDirect = HIGH;  
        etatLedPosDevie = LOW;  
        digitalWrite(CdeInput1, HIGH); // impulsion envoyée sur Input1
        delay(DureeImpulsion);
        digitalWrite(CdeInput1, LOW);
        selectAig = false;
      }
      break;

    case 224: // Code décimal pour la seconde touche (position Déviée)
      if (selectAig == true) {
        etatLedPosDirect = LOW; 
        etatLedPosDevie = HIGH;  
        digitalWrite(CdeInput2, HIGH); // impulsion envoyée sur Input2
        delay(DureeImpulsion);
        digitalWrite(CdeInput2, LOW);
        selectAig = false;
      }
      break;

    case 34: // Code décimal pour test
      digitalWrite(LedPosDirect, HIGH);
      digitalWrite(LedPosDevie, HIGH);
      digitalWrite(CdeInput1, HIGH);
      digitalWrite(CdeInput2, HIGH);
      delay(1000);
      digitalWrite(LedPosDirect, LOW);
      digitalWrite(LedPosDevie, LOW);
      digitalWrite(CdeInput1, LOW);
      digitalWrite(CdeInput2, LOW);
      selectAig = false;
      break;

    default:
      // Si le code ne correspond à aucun bouton connu, ne rien faire
      break;
  } // fin switch case

  affichagePosition(); // Appliquer la commande aux leds
} // fin traitementCode

void affichagePosition() {
  digitalWrite(LedPosDirect, etatLedPosDirect);
  digitalWrite(LedPosDevie, etatLedPosDevie);
} // fin affichagePosition



ATTINY8520PU