#include <Socket.h>
#include <iostream.h>
#include <string.h>

int main() 
{         
  Socket barriere("172.20.3.73", 5588);
  bool enHaut, enBas, enEntree, enSortie;
  const int codeSecret = 7485;
  int code = 0;
  char chiffre[3], nombre[5];

  // descendre la barrière au départ si elle n'est pas en bas
  barriere.envoyer("Barriere:isInFDCL");
  enBas = strcmp(barriere.recevoir(), "bas") == 0;
  if (!enBas) {
    barriere.envoyer("Barriere:setCommandeSensDescente");
    barriere.recevoir();
  }  
  
  while (true) 
  {    
    // Message d'invite
    barriere.envoyer("Afficheur:clear");
    barriere.recevoir();
    barriere.envoyer("Afficheur:affiche:0:0:Bienvenue...");
    barriere.recevoir();
 
    // contrôler la présence d'un véhicule en entrée
    do {
      barriere.envoyer("Barriere:isBoucleAmont");
      enEntree = strcmp(barriere.recevoir(), "entree") == 0; 
    }
    while (!enEntree);
    
    // solliciter la saisie du code
    barriere.envoyer("Afficheur:clear");
    barriere.recevoir();
    barriere.envoyer("Afficheur:afficheMessages:Bonjour:Code ? ");
    barriere.recevoir();

    // récupérer le bon code secret
    do {
      // récupérer la saisie du code secret
      for (int i=0; i<4; i++) {
        // appui sur une touche quelconque du clavier ?
        barriere.envoyer("Clavier:toucheEnfoncee");
        strcpy(chiffre, barriere.recevoir());
        // récupérer le chiffre saisie
        nombre[i] = chiffre[0];  
        // avertir l'automobiliste de la saisie d'un chiffre
        barriere.envoyer("Afficheur:afficheCaractere:#");
        barriere.recevoir();      
      }
      code = atoi(nombre);
      // si le code est incorrect, avertir l'automobiliste
      if (code!=codeSecret) {
        barriere.envoyer("Afficheur:clear");
        barriere.recevoir();
        barriere.envoyer("Afficheur:afficheMessages:Code incorrect:Code ? ");
        barriere.recevoir();        
      }
    }
    while (code!=codeSecret);

    // afficher un message précisant la bonne valeur du code
    barriere.envoyer("Afficheur:clear");
    barriere.recevoir();
    barriere.envoyer("Afficheur:afficheMessages:Code bon:Entrez...");
    barriere.recevoir();    
    
    // lever la barrière pour permettre l'entrée du véhicule
    barriere.envoyer("Barriere:setCommandeSensMontee");
    barriere.recevoir();
    
    // attendre que le véhicule pénètre complètement dans le parking
    do {
      barriere.envoyer("Barriere:isBoucleAval");
      enSortie = strcmp(barriere.recevoir(), "sortie") == 0;      
      barriere.envoyer("Barriere:isBoucleAmont");
      enEntree = strcmp(barriere.recevoir(), "entree") == 0; 
    }
    while (!(enSortie && enEntree)); 
    
    do {     
      barriere.envoyer("Barriere:isBoucleAval");
      enSortie = strcmp(barriere.recevoir(), "sortie") == 0; 
    }
    while (enSortie);
    
    // descendre la barrière une fois que le véhicule est bien entré
    barriere.envoyer("Barriere:setCommandeSensDescente");
    barriere.recevoir();    
  }
 
  return 0;
}