Besoin de conseil pour un code propre

Bonjour à tous,

Tout d’abord je me présente…, je suis tout nouveau débutant en programmation ( 3 mois), j’apprends le C " et partiellement ++" afin de pouvoir développer un petit projet sur “Arduino”.

Matériel utiliser pour le projet :

Arduino UNO : base AT

LCD KEYPAD : librairie LiquidCrystal.h

RTC I2C : librairie wire.h

Capteur température : onewire.h

Bon ma question, ne portera pas sur la gestion matériel, mais plutôt sur l’organisation de mon code, je préfère cependant vous donner un maximum d’information pour que le décor soit planté :slight_smile:

Mon projet est de réaliser un menu de choix avec sous menu et action à effectuer.

Code repris de : [Arduino & lcd] Faire un menu sous forme de liste | Skyduino - Le DIY à la française

J’ai développé un panel d’action à réaliser par l’Arduino en fonction des choix sélectionnés.

Ainsi qu’une réaction clavier différente en fonction du sous menu ou l’on ce trouve. ( par exemple un BP_DOWN dans le menu principal : affiche le choix suivant, et un BP_DOWN dans une action de réglage décrémentera la valeur en cours).

Extrait du code gestion clavier :

// Fonction anti rebond logiciel et qui met le programme en attente d'une réaction utilisateur.
    while(readPushButton() != BP_NONE); /* Attend le relâchement du bouton */

 

/* Attend l'appui sur un bouton et attribut la valeur de readpushButton à buttonPressed*/   
while((buttonPressed = readPushButton()) == BP_NONE); 
 
    /* Anti rebond pour le bouton */
    delay(30);
 
    /* Attend le relâchement du bouton */
    while(readPushButton() != BP_NONE);
 
    /* Gére l'appui sur le bouton */
 
    switch(buttonPressed) {     // no comment..
     case BP_UP: // Bouton haut = choix précédent  // cas du bouton UP pour le menu principal
 
      /* S'il existe un choix précédent */      
      if(selectedMenuItem > 0) {
 
        /* Passe au choix précédent */
        selectedMenuItem--;
      }
      break;
 
    case BP_DOWN: // Bouton bas = choix suivant, exemple pour le menu principal.
 
      /* S'il existe un choix suivant */
      if(selectedMenuItem < (menu.nbItems - 1)) {
 
        /* Passe au choix suivant */
        selectedMenuItem++;
      }
      break;

 Réaction du BP_DOWN pour une fonction différente

case BP_DOWN: // Bouton bas = choix suivant                              
          if (*retour <= *vmin) {      // Vérifie que *retour ne soit pas en dessous de la plage prédéfini par Vmin
            *retour = *vmax;            // s'il descend en dessous, on lui attribut la valeur VMAX 
// Par ex:  si on est à 0, et on cherche à décrémenté alors * retour prend la valeur définit par VMAX. C'est un choix, je ne veut pas stopper sur la valeur min

          }
          else {
            (*retour)--; // Sinon tant que l'on peut décrémenter on le fait..
          }
          break;

Ma question (enfin…) :

J’ai systématiquement recopié cette fonction complète :

Fonction anti rebond + fonction SwitchButton + modification des fonctions de réaction… donc beaucoups de lignes de codes en sur-copie pour rien. Et qui à mon avis constituent un code “crade” et compliqués…

Je pensai séparé ma fonction anti rebond et SwitchButton, puis faire appel à celle ci et appliquer mes différentes fonctions de réaction ??

comme ceci :

Ex:

void fonction X (){

appel fonction anti rebond // ceci est une représentation pas une ligne de code ;)

appel fonction switch // la aussi, par la fonction exemple ci dessous

 


void switchButton (byte buttonPresseds, int currentMenu) {


   switch (buttonPresseds) {
       
     case BP_UP:
    
   (*fonctionbpup)(currentMenu); // pointeur d'appel d'une fonction en fonction du menu selectionner .... est ce bon?
   
          break;

        case BP_DOWN: // Bouton bas = choix suivant                               // Bouton bas = choix suivant
 (*fonctionbpdown)(currentMenu);
          break;

Est ce que cette solution est bonne?, j’ai l’impression de faire double emploi des arguments et que cette méthode risque en fonction des applications de bloquer quelque part…

Plus simplement, je cherche à faire une fonction standard, qui en fonction du bouton appuyé et du menu sélectionné, appellera une ou plusieurs fonction d’action…

Pourriez vous m’orienter vers une solution “propre”…

Bon… j’espère que les lecteurs ne perdrons pas trop de cheveux en lisant ce post…Désolé

C’est en faisant que l’on apprend :).

Merci d’avance pour vos conseils.