// Nos librairies
#include <SoftwareSerial.h>
#include <DFPlayerMini_Fast.h>

// Port série logiciel permettant de dialoguer avec le lecteur MP3 (pins RX et TX)
SoftwareSerial audioSerie(10, 11);

// Objet de contrôle de notre lecteur MP3
DFPlayerMini_Fast audio;

// Pin sur lequel recevoir nos impulsions de cadran
int pinImpulsionCadran = 13;

// Pin sur lequel savoir si l'utilisateur est train de composer un chiffre ou non
int pinEtatCadran = 7;

// Fonction exécutée au démarrage de l'arduino
void setup() 
{
  
  // On passe les pin de notre cadran en mode entrée
  pinMode(pinImpulsionCadran, INPUT);
  pinMode(pinEtatCadran, INPUT);

  // On active la communication série sur USB (à 9600 bauds)
  Serial.begin(9600);

  // On active la communication série sur notre port logiciel 
  audioSerie.begin(9600);

  // On initialise la connexion entre l'arduino et le lecteur mp3 
  audio.begin(audioSerie);

  // On défini le volume de sortie (entre 0 et 20)
  audio.volume(15);
  
}

// Variables d'état
int numeroCompose = 0;
int nombreImpulsionsSuccessives = 0;

// Boucle d'exécution : s'exécute indéfiniement
void loop() 
{

  // On lit nos valeurs au niveau du cadran  
  int valeurPinImpulsionCadran = digitalRead(pinImpulsionCadran);
  int valeurPinEtatCadran      = digitalRead(pinEtatCadran);

  // Pas de composition
  if(valeurPinImpulsionCadran == 1 && valeurPinEtatCadran == 1) {

    // Un numéro était-il en cours de composition ?
    if(numeroCompose > 0) {
      
      Serial.print("Appel du numéro ");
      Serial.println(numeroCompose);

      // On lit le bon fichier
      audio.play(numeroCompose);
      
    }
    
    // On remet à zéro nos valeurs
    numeroCompose = 0;
    nombreImpulsionsSuccessives = 0;    
    
  }

  // Composition et impulsion en cours
  else if(valeurPinImpulsionCadran == 1 && valeurPinEtatCadran == 0) {

    // On incrémente le nombre d'impulsions
    nombreImpulsionsSuccessives++;
    
  }

  // Composition en cours, mais pas d'impulsion
  else if(valeurPinImpulsionCadran == 0 && valeurPinEtatCadran == 0) {
    
    // Si une impulsion a été détectée et qu'elle est inférieure à 150 (au dessus, on considère que c'est du parasitage
    // Alors, on incrémente le numéro
    if(nombreImpulsionsSuccessives > 0 && nombreImpulsionsSuccessives < 150) {
      numeroCompose++;
    }

    // On remet à zéro le compteur d'impulsions
    nombreImpulsionsSuccessives = 0;
    
  }

  // On suspend l'exécution pour 1 millisecondes
  delay(1);
  
}
