savoir où on est dans un menu .

bonjour,
comment savoir dans un menu ( lib menubackend) si il y a un item avant ou un subitem aprés?

ex :
1-> 1.2-> 1.2.3
2-> 2.2
3 .......
si je suis en 1.2 comment je peux savoir si il existe le 1.2.3 ?

merci de votre lecture.
bonne journée.

Yep!

Tu ne nous donnes pas beaucoup d'élement et on ne connait pas tous cette librairie.

A priori, je pense que les menus doivent être déclarés/créés dans ton programme. Alors, Je fabriquerais un objet qui indiquerait si un élement existe dans la hierarchie inférieure. C'est un peu le principe du "suivant" ou "précedent" lors d'une navigation.

Un lien pour la librairie ???

@+

Zoroastre.

bonjour merci pour ta réponse.
je pensai qu''elle était plus utilisé que cela :*
voici un lien :Arduino Playground - Menu Library
bonne journée.

Yep!

J'ai regarder la librairie et je n'ai rien vu qui pouvait faciliter la visibilité sur les sous-menus. Il y a bien une déclaration des index mais quasiment tout est déclarer en private et difficilement manipulable (du moins à mon niveau :grin: )

Sur le forum, il s'agit de la version 1.0 qui a subit quelques améliorations et aussi quelques bugs, ici :

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1273349195

N'hesites pas à relire le file de la conversation en entier.

Une fonction hasChildren() a été développé entre la version 1.1 et 1.3, mais semble avoir disparue dans la dernière version 1.4

@+

Zoroastre.

bonjour
merci zoroastre pour ta réponse
j'avais parcouru le fil et comme toi je n'ai rien trouvé :stuck_out_tongue_closed_eyes:
comme toi vu mon niveau je ne puis m’aventurer plus dans la structure de la lib. :*
merci de ta lecture.
je crois que je vais laisser tomber :roll_eyes:
a+

Yep!

Il faudrait que nous donne plus de détails sur ton cahier des charges. Il n'est souvent pas réellement besoin d'une librairie, d'autant plus si elle ne s'adapte pas à ton utilisation.

Exposes nous tes besoins et peut-être que des propositions viendront !!!

Donc tu veux un menu à combien de "touche" ? arbre hiérarchique maximale ? Sur écran ou pas ?

@+

Zoroastre.

yep!!!!!!

mon menu est piloté par un keypad ( haut/bas/droite/gauche/valide)
sur un lcd 1602.
j'ai :
item1 item2 item3
item1.1 item2.1 item3.1
item1.2 item2.2 item3.2
item1.3 item2.3
item1.4

voilà à quoi ressemble mon menu,
si il y a besoin de plus d'info ne pas hésiter :grin:

Yep!

Si quelqu'un peut passer ici et me dire ce qui ne va pas.

En gros, je pensais créer un tableau de structure et ainsi pouvoir me promener tranquillement dans les index. Mais j'ai une erreur de type "simpleMenu don't name a type" sur la dernière fonction.

typedef struct
{
   char *menuName;
   int x;
   int y;
}simpleMenu;

simpleMenu tableau[10];

simpleMenu menu(char * s, int x, int y);

void setup()
{
  Serial.begin(19200);
  delay(1000);
  
  tableau[0] = menu("root", 0, 0);

}

void loop()
{
  
  if (Serial.read() > 0)
  {
    char value = Serial.read();
    
    switch(value)
    {
      case 'u' : break;
      case 'd' : break;
      case 'n' : break;
      case 'b' : break;
      default : break;
    }
  }  
}

simpleMenu menu(char * s, int x, int y)
{
  simpleMenu p;
  p.menuName = s;
  p.x = x;
  p.y = y;
  return p;
}

@+

Zoroastre.

Version C++ qui marche

class simpleMenu
{
  public:
  simpleMenu():
    menuName(""),
    x(0),
    y(0)
   {
   };
  simpleMenu( const char *_menuName, int _x, int _y ):
    menuName(_menuName),
    x(_x),
    y(_y)
   {
   };
   const char *menuName;
   int x;
   int y;
};

simpleMenu tableau[10];


void setup()
{
  Serial.begin(19200);
  delay(1000);
  
  tableau[0] = simpleMenu( "root", 0, 0 );
  
}

void loop()
{
  
  if (Serial.read() > 0)
  {
    char value = Serial.read();
    
    switch(value)
    {
      case 'u' : break;
      case 'd' : break;
      case 'n' : break;
      case 'b' : break;
      default : break;
    }
  }  
}

Par contre pour l'instant j'ai pas encore compris pourquoi ton typedef ne marche pas. Je cherche encore.

Bon je commence a cerner ton problème.
La raison est que ton code est du C alors que l'INO est compilé comme du C++.
Placé dans un fichier C ton code compile sans problème.
(Ce qui me surprend car il me semblait qu'en C une fonction ne pouvait retourner qu'un scalaire ou un pointeur mais pas une structure...)

Et alors diras-tu ?

Ben en C++ une structure est gérée comme une classe.
Il y a donc des différence de comportement.
Dans ton cas je pense qu'il manque la définition de l'opérateur copie ou du constructeur de copie.
Quelque chose comme cela.

Yep!

Merci Barbudor pour ta contribution :wink:

J'avais entrevue la possibilité de créer une classe, le problème est qu'il en faudrait une seconde afin de pouvoir se promener entre les menus. Cependant, chaque objet ainsi créer est indépendant les uns des autres et c'est actuellement le principale problème car il faut à un moment donner lier les deux classes et les faire intéragir.

J'avais pensé à un tableau de structure car les paramètres 2 et 3 (x, y), équivalent à un tableau à 2 dimensions me semblent plus facile à tester...peut-être que je me fourvoie en fait !!!

En tout cas, dans mon idée : un tableau de structure, une variable d'initialisation pour instancier l'index du tableau et quelques fonctions simples pour incrémenter soit x ou y en fonctions de la position actuelle dans le tableau (monter, descendre, droite, gauche).

##x##
--0-- --1-- --2-- --3-- --4--
| root | etc | var | tmp | exit | --> {x, 0}
| | | |
A Z E R --> {x, 1}
B Y F --> {x, 2}
C --> etc...
D

@+

Zoroastre.

EDIT : Petit croisement de post.

Ben en C++ une structure est gérée comme une classe.

Dans le cas que je propose, effectivement cela revient en définitive à faire une classe, mais en C. C'est un peu imbriqué, mais je pensais initialement que cela faciliterait la lecture... :grin:

Dans ton cas je pense qu'il manque la définition de l'opérateur copie ou du constructeur de copie.

Il me manque quelque chose c'est clair, je cherche...

http://arduino.cc/playground/Code/ResourceFriendlyStructs

XD

Yep!

Bon j'ai trouvé :wink:

En C++ on peut se passer d'indiquer struct sur les déclarations suivantes, le C est beaucoup plus contraint sur ce point.

Nouveau code fonctionnel :

typedef struct simpleMenu
{
   char *menuName;
   int x;
   int y;
};

simpleMenu tableau[10];

simpleMenu menu(char * s, int x, int y);

int currentMenu;

void setup()
{
  Serial.begin(19200);
  delay(1000);
  
  tableau[0] = menu("root", 0, 0);
  tableau[1] = menu("slide1", 0, 1);
  tableau[2] = menu("slide2", 0, 2);
  tableau[3] = menu("slide3", 0, 3);
  tableau[4] = menu("main", 1, 0);
  tableau[5] = menu("pict1", 1, 1);
  tableau[6] = menu("rand", 4, 7);
  
  int currentMenu = 0;
  
  Serial.println(tableau[6].x, DEC);
  Serial.println(tableau[6].y, DEC);
  Serial.println(tableau[6].menuName);
  
  delay(1000);
  Serial.println("setup complete\n");
}

void loop()
{
  
  if (Serial.available() > 0)
  {
    char value = Serial.read();
    
    switch(value)
    {
      case 'u' : break;
      case 'd' : break;
      case 'n' : 
      {
        currentMenu++;
        Serial.println("-->"); Serial.println();
        Serial.print(tableau[currentMenu].menuName);
        Serial.print(" : ");
        Serial.print(tableau[currentMenu].y, DEC);
        Serial.print("/");
        Serial.print(totalSubMenu(currentMenu), DEC);
        break;
      }
      case 'b' : Serial.println("BACK");Serial.println(tableau[currentMenu--].menuName);break;
      default : break;
    }
  }
}


struct simpleMenu menu(char * s, int x, int y)
{
  simpleMenu p;
  p.menuName = s;
  p.x = x;
  p.y = y;
  return p;
}

int totalSubMenu(int currentMenu)
{
  int compteur = 0;
  
  for (int i = 0; i < 10; i++)
  {
    if (tableau[i].x == tableau[currentMenu].x)
    {

          compteur = max(compteur, tableau[i].y);

    }
      
  }
  
  return compteur;
}

struct simpleMenu menu(char * s, int x, int y) { ... }

Il a quand même fallu que je trouve l'explication du pourquoi sur gamedev.net :grin:

Bon je continuerais demain. Y'a moyen de faire plus propre.

Ma console (en envoyant 'n') :

root : 0/3-->

slide1 : 1/3-->

slide2 : 2/3-->

slide3 : 3/3-->

main : 0/1-->

pict1 : 1/1-->

rand : 7/7

T'inquiètes lcd1602, c'est un bon exercice pour mes vieux méninges XD

@+

Zoroastre.

Salut,

barbudor:
La raison est que ton code est du C alors que l'INO est compilé comme du C++.
Placé dans un fichier C ton code compile sans problème.

Attention aussi a ne pas tomber dans le piége de l'ide arduino.

L'ide arduino ne sait pas reconnaitre les structures, typedef, class, etc.
Il ne sait extraire que les prototypes de fonctions et les placent en haut du fichier .cpp généré (juste aprés avoir ajouté les includes qui vont bien).
J'avais eu ce probléme par le passé, si la classe, structure, typedef, etc n'est pas défini dans un fichier .h l'ide placera les prototypes avant l'include et rien ne compilera.
De même une fonction retournant (ou prenant en argument) un type défini (typedef ou struct) ne compilera pas si la définition n'est pas déclaré dans un .h.

Sa fait parti des nombreux bug que la team arduino connait éperdument mais n'as pas envie de résoudre (2 expressions régulières à pondre c'est un travail de fou hein ...).
Essayez aussi d'ajouter un .hpp dans le dossier d'un sketch (fichier .h en c++) l'ide n'as aucune idée de ce que c'est et il ne l'ouvrira pas dans un onglet ...

Avec une structure tu peux créer des listes chainées. Cela te permet de te déplacer dans les menus sans connaitre leur taille à priori.

Yep!

Merci fdufnews :wink:

J'en ai vaguement entendu parler des "listes chainées" et effectivement, je vais devoir m'affranchir de la rigidité du tableau actuel.

Un petit exemple ou un lien serait super !

EDIT1 : Je regarde ceci pour l'instant : http://www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html

@+

Zoroastre.

fdufnews:
Avec une structure tu peux créer des listes chainées. Cela te permet de te déplacer dans les menus sans connaitre leur taille à priori.

Je tient quand même à rappeler que la mise en place de listes chainé requière l'utilisation d'allocations dynamique (avec malloc() et free()).

Sur un ordinateurs pas de probléme, sur un microcontrôleurs avec 2Ko de ram c'est se tirer une balle dans le pied !
Au mieux : manque de mémoire, bug répétitif (en apparence) inexpliqué (sauf en cas de gestion d'erreur sur malloc())
Au pire (et au plus probable) : fragmentation de la mémoire, bug aléatoire et inexplicable, reset intempestif.

Si on pouvait se permettre des new/delete, malloc()/free() à tour de bras ça ferait longtemps que la librairie STL serait disponible sur microcontrôleurs AVR :wink:

holala très intéressant mais cela me dépasse :zipper_mouth_face:
merci à tous pour votre participation,
je comprend mieux pourquoi je n’entrevoyai pas la solution :fearful: