Projet Bar a Cocktail fonctionnel mais ....

eden99:
-qu'entendez vous exactement par "anti-rebond" au niveau de la gestion matériel ?

Vos limit switch ne sont que des boutons. les boutons ça "rebondit" (bounce) et comme votre programme peut tourner vite il se peut que cela génère des incohérences pendant quelques millisecondes (le programme voit le verre au bon endroit puis ne le voit plus). A priori tel que c'est codé ce n'est pas un soucis mais si vous vouliez faire de l'analyse plus fine du déplacement ça pourrait l'être. (impression d'avoir quitté un des switch en se déplaçant à gauche par exemple puis dans le tour d'après voir qu'on y est encore).

eden99:

  • Dans le programme, il est question de livrer le verre servi vers le REPOS_DROITE, pourtant, lors de l envoi d ordre (case 1.2 ...) on part toujours du switch REPOS_GAUCHE,
    est ce a dire qu il faudra toujours faire repartir le mobile sur REPOS_GAUCHE une fois la précédente livraison effectuée avant d envoyer un nouvel ordre ?
    auquel cas, ne serait il pas plus simple de faire la livraison directement sur REPOS_GAUCHE ?

Oui c'est un choix que j'ai fait (histoire de vous laisser un peu de boulot et de compréhension du code :slight_smile: ) en me disant que s'il y a un barman d'un côté qui met le verre et de l'autre le client qui le prend ça permet de différencier les 2 bouts.

cf l'explication que j'avais donné plus haut:
- comme il n'y a pas de détecteur pour savoir si le verre a été pris, il faudra renvoyer à la main la commande 'G' pour retourner à Gauche en attente d'une autre commande. (on pourrait aussi modifier le code pour qu'une fois à droite la commande parte vers la gauche pour aller servir un coca ou un jus, je vous laisse le faire)


Sinon j'ai jeté un coup d'oeil au code

  • je vous ai donné le squelette du code, faudrait maintenant nettoyer. vous voyez qu'il y a beaucoup de code qui se ressemble dans chacune des fonctions appellées lors d'un click sur un des switch, tout cela pourrait donc être fait dans une seule fonction qui prendrait en paramètre le switch activé et comparerait cela avec l'état à atteindre.

  • pour faire des mélanges ça ne va pas fonctionner. Vous faites cela dans le "si j'ai reçu une commande"

        case '3':
          if (etatCourant == REPOS_GAUCHE) { // On ne peut commander que quand le système est au repos
            // on se met alors en mouvement et on attend le switch Rhum
            etatCourant = Vers_Rhum;
            allerVersLaDroite();
            // on se remet alors en mouvement et on attend le switch Curacao
            etatCourant = Vers_Curacao;
            allerVersLaDroite();
            // on se remet alors en mouvement et on attend le switch Lait de Coco
            etatCourant = Vers_LaitdeCoco;
            allerVersLaDroite();
            // on se remet alors en mouvement et on attend le switch Jus Ananas             
            etatCourant = Vers_Ananas;
            allerVersLaDroite();
          }
          break;

ce qu'il va se passer c'est que vous allez enchainer toutes le actions les unes après les autres si vous êtiez sur le repos Gauche -> passer à l'état Vers_Rhum, déclencher le moteur vers la droite, puis tout de suite changer l'état Courant à Vers_Curacao, continuer à aller à droite, changer encore l'état Courant à Vers_LaitdeCoco, continuer à droite et changer enfin encore l'état Courant à Vers_Ananas et continuer à droite. Là vous sortez du if et la machine à état se lance et ne va attendre que le dernier état choisis, Vers_Ananas

si vous voulez plusieurs boisson il faut complexifier un peu votre machine a état. Si vous commandez un "Blue Hawaiian" (Rhum, Curacao, Lait Coco, Ananas) vous devez mémoriser dans une variable globale que vous avez commandé un cocktail.

vous déclenchez d'abord Vers_Rhum et sortez du if. la machine a état va se mettre à tourner et attendant d'arriver sous le Rhum. là vous mettez une dose de Rhum et ensuite il faut tester la commande de cocktail pour décider quoi faire ensuite. si le cocktail est "Blue Hawaiian" alors seulement à partir de ce moment là le prochain état sera Vers_Curacao. Une fois le Curacao, là encore il faut tester quel cocktail a été choisi et passer l'état à Vers_LaitdeCoco etc...

--> tout cela va être un peu laborieux, et donc si vous voulez servir des cocktails il faudra changer à mon avis la structure du programme et fabriquer un tableau de struct qui contiennent pour chaque cocktail

  • le No de commande
  • un tableau de limitSwitch (ou de structure si chaque dosage doit être précis, par exemple éventuellement une durée et nombre de dose de versement de liquide).

le code ensuite se simplifiera grandement, pour définir un cocktail il suffit de rajouter une struct dans le tableau des commandes en donnant (dans l'ordre sinon faudra complexifier les tests de déplacement) la liste des arrêts sous les bouteilles jusqu'à la livraison --> toutes les commandes seront traitées de la même façon en cherchant dans le tableau quelles sont les instructions à suivre