Aide Arduino Menu LCD MenuBackend

Bonjours,

J'ai fait acquisition d'un kit arduino avec écran LCD I2C et je voudrais faire un Menu,
J'ai trouvé se
>site<
pour faire un menu, j'ai donc téléchargé le fichier MenuBackend, j'ai pris le code partagé sur le site mais lorsque je vérifie le code j'ai ses messages d'erreurs

Arduino : 1.6.7 (Windows 10), Carte : "Arduino Nano, ATmega328"

sketch_feb01b:31: error: 'menuUsed' was not declared in this scope

 MenuBackend menu = MenuBackend(menuUsed,menuChanged);

                                ^

sketch_feb01b:31: error: 'menuChanged' was not declared in this scope

 MenuBackend menu = MenuBackend(menuUsed,menuChanged);

                                         ^

d:\Users\Documents\Documents\Arduino\sketch_feb01b\sketch_feb01b.ino: In function 'void setup()':

sketch_feb01b:57: error: 'class MenuBackend' has no member named 'toRoot'

   menu.toRoot();

        ^

d:\Users\Documents\Documents\Arduino\sketch_feb01b\sketch_feb01b.ino: In function 'void menuUsed(MenuUseEvent)':

sketch_feb01b:108: error: 'class MenuBackend' has no member named 'toRoot'

   menu.toRoot();  //back to Main

        ^

d:\Users\Documents\Documents\Arduino\sketch_feb01b\sketch_feb01b.ino: In function 'void navigateMenus()':

sketch_feb01b:252: error: 'class MenuBackend' has no member named 'toRoot'

       menu.toRoot();  //back to main

            ^

Plusieurs bibliothèque trouvées pour "LiquidCrystal.h"
Utilisé : C:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Non utilisé : d:\Users\Documents\Documents\Arduino\libraries\NewliquidCrystal
exit status 1
'menuUsed' was not declared in this scope

  Ce rapport contiendrait plus d'informations si l'option
  "Montrer les informations de sortie pendant la compilation"
  était activée dans Fichier > Préférences.

J'ai besoin d'aide Merci d'avance !

bonjour,
la réponse est dans les réponses plus bas.
ouvrir dans la lib MenuBackend.h
et rajouter

void use()
{
//current->use();
if (cb_menuUse)
{
MenuUseEvent mue = { *current };
(*cb_menuUse)(mue);
}
}
void toRoot() {
setCurrent(&getRoot() );
}
private:
void setCurrent( MenuItem *next )

et là plus d'erreur

Merci pour cet réponse rapide !
effectivement certaines erreurs ont disparu mais ils restes

Arduino : 1.6.7 (Windows 10), Carte : "Arduino Nano, ATmega328"

In file included from d:\Users\Documents\Documents\Arduino\sketch_jan31m\sketch_jan31m.ino:25:0:

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h: In function 'void use()':

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h:266:11: error: 'cb_menuUse' was not declared in this scope

       if (cb_menuUse) 

           ^

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h:268:32: error: 'current' was not declared in this scope

          MenuUseEvent mue = { *current };

                                ^

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h: In function 'void toRoot()':

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h:273:21: error: 'getRoot' was not declared in this scope

 setCurrent(&getRoot() );

                     ^

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h:273:23: error: 'setCurrent' was not declared in this scope

 setCurrent(&getRoot() );

                       ^

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h: At global scope:

d:\Users\Documents\Documents\Arduino\libraries\MenuBackend/MenuBackend.h:275:1: error: expected unqualified-id before 'private'

 private:

 ^

sketch_jan31m:52: error: 'LiquidCrystal' does not name a type

 LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

 ^

sketch_jan31m:55: error: 'menuUsed' was not declared in this scope

 MenuBackend menu = MenuBackend(menuUsed,menuChanged);

                                ^

sketch_jan31m:55: error: 'menuChanged' was not declared in this scope

 MenuBackend menu = MenuBackend(menuUsed,menuChanged);

                                         ^

d:\Users\Documents\Documents\Arduino\sketch_jan31m\sketch_jan31m.ino: In function 'void setup()':

sketch_jan31m:74: error: 'lcd' was not declared in this scope

   lcd.begin(16, 2);

   ^

sketch_jan31m:81: error: 'class MenuBackend' has no member named 'toRoot'

   menu.toRoot();

        ^

d:\Users\Documents\Documents\Arduino\sketch_jan31m\sketch_jan31m.ino: In function 'void menuChanged(MenuChangeEvent)':

sketch_jan31m:101: error: 'lcd' was not declared in this scope

   lcd.setCursor(0,1); //set the start position for lcd printing to the second row

   ^

d:\Users\Documents\Documents\Arduino\sketch_jan31m\sketch_jan31m.ino: In function 'void menuUsed(MenuUseEvent)':

sketch_jan31m:125: error: 'lcd' was not declared in this scope

   lcd.setCursor(0,0);  

   ^

sketch_jan31m:132: error: 'class MenuBackend' has no member named 'toRoot'

   menu.toRoot();  //back to Main

        ^

d:\Users\Documents\Documents\Arduino\sketch_jan31m\sketch_jan31m.ino: In function 'void navigateMenus()':

sketch_jan31m:276: error: 'class MenuBackend' has no member named 'toRoot'

       menu.toRoot();  //back to main

            ^

Plusieurs bibliothèque trouvées pour "LiquidCrystal.h"
Utilisé : C:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Non utilisé : d:\Users\Documents\Documents\Arduino\libraries\NewliquidCrystal
exit status 1
'LiquidCrystal' does not name a type

  Ce rapport contiendrait plus d'informations si l'option
  "Montrer les informations de sortie pendant la compilation"
  était activée dans Fichier > Préférences.

Merci !

aucune erreur pour moi de mon coté.
tu as peut être changé des trucs en passant.
quelle version ide?

EDIT
tu as pas recopié tout ce que j'ai mis, mais juste inséré

void toRoot() {
setCurrent(&getRoot() );
}

J'ai ajouté

void use()
   {
      //current->use();
      if (cb_menuUse) 
      {
         MenuUseEvent mue = { *current };
         (*cb_menuUse)(mue);
      }
   }
void toRoot() {
setCurrent(&getRoot() );
}
private:
   void setCurrent( MenuItem *next )

au MenuBackend.h

et la version du ide 1.6.7

Merci

évidemment si tu mets sans faire la différence entre le gras et le normal en lettre, ca passe pas :wink:
remplaces dans ce cas, TOUT ce qui est dans le fichier concerné par ceci

/*
||
|| @file MenuBackend.h
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Provide an easy way of making menus
|| #
||
|| @license
|| | This library is free software; you can redistribute it and/or
|| | modify it under the terms of the GNU Lesser General Public
|| | License as published by the Free Software Foundation; version
|| | 2.1 of the License.
|| |
|| | This library is distributed in the hope that it will be useful,
|| | but WITHOUT ANY WARRANTY; without even the implied warranty of
|| | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
|| | Lesser General Public License for more details.
|| |
|| | You should have received a copy of the GNU Lesser General Public
|| | License along with this library; if not, write to the Free Software
|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
|| #
||
*/

#ifndef MenuBackend_h
#define MenuBackend_h

class MenuBackend;
class MenuItem
{
	friend class MenuBackend; //provide acces to private 
public:

	MenuItem(const char* itemName, const char itemShortkey = 0) : name(itemName), shortkey(itemShortkey)
	{
		before = 0;
		right = 0;
		after = 0;
		left = 0;
		back = 0;
	}

	//void use(){} //update some internal data / statistics

	const char* getName() const { return name; }
	bool hasShortkey() const { return (shortkey!=0); }
	const char getShortkey() const { return shortkey; }

	MenuItem *moveBack() { return back; }

	MenuItem *moveUp() { 
		if (before)
		{	
			before->back = this;
		}
		return before; 
	}

	MenuItem *moveDown() { 
		if (after)
		{ 
			after->back = this;
		}
		return after; 
	}

	MenuItem *moveLeft() { 
		if (left)
		{
			left->back = this;
		}
		return left; 
	}

	MenuItem *moveRight() { 
		if (right)
		{	
			right->back = this;
		}
		return right; 
	}
	//default vertical menu
	MenuItem &add(MenuItem &mi) { return addAfter(mi); }

	MenuItem &addBefore(MenuItem &mi)
	{
		mi.set(this,AFTER);
		set(&mi,BEFORE);
		return mi;
	}
	MenuItem &addRight(MenuItem &mi)
	{
		mi.set(this,LEFT);
		set(&mi,RIGHT);
		return mi;
	}
	MenuItem &addAfter(MenuItem &mi)
	{
		mi.set(this,BEFORE);
		set(&mi,AFTER);
		return mi;
	}
	MenuItem &addLeft(MenuItem &mi)
	{
		mi.set(this,RIGHT);
		set(&mi,LEFT);
		return mi;
	}
protected:
	typedef const unsigned char insert_t;
	static insert_t BEFORE = 0; 
	static insert_t RIGHT = 1; 
	static insert_t AFTER = 2; 
	static insert_t LEFT = 3; 
	void set(MenuItem *mi, insert_t at)
	{
		switch (at)
		{
		case BEFORE: before = mi; break;
		case RIGHT: right = mi; break;
		case AFTER: after = mi; break;
		case LEFT: left = mi; break;
		}
	}
	
	const char* name;
	const char shortkey;

	MenuItem *before;
	MenuItem *right;
	MenuItem *after;
	MenuItem *left;
	MenuItem *back;
};


//no dependant inclusion of string or cstring
bool menuTestStrings(const char *a, const char *b)
{
	while (*a) { if (*a != *b) { return false; } b++; a++; }
	return true;
}
bool operator==(MenuItem &lhs, char* test)
{
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(const MenuItem &lhs, char* test)
{
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(MenuItem &lhs, MenuItem &rhs)
{
	return menuTestStrings(lhs.getName(),rhs.getName());
}
bool operator==(const MenuItem &lhs, MenuItem &rhs)
{
	return menuTestStrings(lhs.getName(),rhs.getName());
}

struct MenuChangeEvent
{
	const MenuItem &from;
	const MenuItem &to;
};

struct MenuUseEvent
{
	const MenuItem &item;
};

typedef void (*cb_change)(MenuChangeEvent);
typedef void (*cb_use)(MenuUseEvent);

class MenuBackend
{
public:
	MenuBackend(cb_use menuUse, cb_change menuChange = 0) : root("MenuRoot")
	{
		current = &root;
		cb_menuChange = menuChange;
		cb_menuUse = menuUse;
	}


	MenuItem &getRoot()
	{
		return root;
	}
	MenuItem &getCurrent()
	{
		return *current;
	}

	void moveBack()
	{
		setCurrent(current->moveBack());
	}

	void moveUp()
	{
		setCurrent(current->moveUp());
	}

	void moveDown()
	{
		setCurrent(current->moveDown());
	}

	void moveLeft()
	{
		setCurrent(current->moveLeft());
	}

	void moveRight()
	{
		setCurrent(current->moveRight());
	}

	void use(char shortkey)
	{
		recursiveSearch(shortkey,&root);
		use();
	}

	void use()
	{
		//current->use();
		if (cb_menuUse) 
		{
			MenuUseEvent mue = { *current };
			(*cb_menuUse)(mue);
		}
	}
void toRoot() {
setCurrent(&getRoot() );
}
private:
	void setCurrent( MenuItem *next )
	{
		if (next)
		{
			MenuChangeEvent mce = { *current, *next };
			current = next;
			if (cb_menuChange) 
			{
				(*cb_menuChange)(mce);
			}
		}
	}
	void foundShortkeyItem(MenuItem *mi)
	{
		mi->back = current;
		current = mi;
	}
	bool canSearch(const char shortkey, MenuItem *m)
	{
		if (m==0) { return false; }
		else 
		{
			if (m->getShortkey()==shortkey)
			{
				foundShortkeyItem(m);
			}
			return true;
		}
	}
	void recursiveSearchAfter(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
		}
	}
	void recursiveSearchRight(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearchLeft(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearchBefore(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearch(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	MenuItem root;
	MenuItem *current;
	cb_change cb_menuChange;
	cb_use cb_menuUse;
};

#endif

Sa me fait la meme erreur qu'au début

Arduino : 1.6.7 (Windows 10), Carte : "Arduino Nano, ATmega328"

sketch_jan31m:55: error: 'menuUsed' was not declared in this scope

MenuBackend menu = MenuBackend(menuUsed,menuChanged);

^

sketch_jan31m:55: error: 'menuChanged' was not declared in this scope

MenuBackend menu = MenuBackend(menuUsed,menuChanged);

^

Plusieurs bibliothèque trouvées pour "LiquidCrystal.h"
Utilisé : C:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Non utilisé : d:\Users\Documents\Documents\Arduino\libraries\NewliquidCrystal
exit status 1
'menuUsed' was not declared in this scope

Ce rapport contiendrait plus d'informations si l'option
"Montrer les informations de sortie pendant la compilation"
était activée dans Fichier > Préférences.

tu as bien relancé l'ide après modification?

en plus si tu as plusieurs lib identiques, ca va mettre le bronx

J'ai tout relancé,... je suis bloqué :confused:

si tout est fait comme il faut, ca donne ca

Le croquis utilise 4 852 octets (1%) de l'espace de stockage de programmes. Le maximum est de 253 952 octets.
Les variables globales utilisent 442 octets (5%) de mémoire dynamique, ce qui laisse 7 750 octets pour les variables locales. Le maximum est de 8 192 octets.

mets ton fichier .h ici entre balise code </>

/*
||
|| @file MenuBackend.h
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Provide an easy way of making menus
|| #
||
|| @license
|| | This library is free software; you can redistribute it and/or
|| | modify it under the terms of the GNU Lesser General Public
|| | License as published by the Free Software Foundation; version
|| | 2.1 of the License.
|| |
|| | This library is distributed in the hope that it will be useful,
|| | but WITHOUT ANY WARRANTY; without even the implied warranty of
|| | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
|| | Lesser General Public License for more details.
|| |
|| | You should have received a copy of the GNU Lesser General Public
|| | License along with this library; if not, write to the Free Software
|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
|| #
||
*/

#ifndef MenuBackend_h
#define MenuBackend_h

class MenuBackend;
class MenuItem
{
	friend class MenuBackend; //provide acces to private 
public:

	MenuItem(const char* itemName, const char itemShortkey = 0) : name(itemName), shortkey(itemShortkey)
	{
		before = 0;
		right = 0;
		after = 0;
		left = 0;
		back = 0;
	}

	//void use(){} //update some internal data / statistics

	const char* getName() const { return name; }
	bool hasShortkey() const { return (shortkey!=0); }
	const char getShortkey() const { return shortkey; }

	MenuItem *moveBack() { return back; }

	MenuItem *moveUp() { 
		if (before)
		{	
			before->back = this;
		}
		return before; 
	}

	MenuItem *moveDown() { 
		if (after)
		{ 
			after->back = this;
		}
		return after; 
	}

	MenuItem *moveLeft() { 
		if (left)
		{
			left->back = this;
		}
		return left; 
	}

	MenuItem *moveRight() { 
		if (right)
		{	
			right->back = this;
		}
		return right; 
	}
	//default vertical menu
	MenuItem &add(MenuItem &mi) { return addAfter(mi); }

	MenuItem &addBefore(MenuItem &mi)
	{
		mi.set(this,AFTER);
		set(&mi,BEFORE);
		return mi;
	}
	MenuItem &addRight(MenuItem &mi)
	{
		mi.set(this,LEFT);
		set(&mi,RIGHT);
		return mi;
	}
	MenuItem &addAfter(MenuItem &mi)
	{
		mi.set(this,BEFORE);
		set(&mi,AFTER);
		return mi;
	}
	MenuItem &addLeft(MenuItem &mi)
	{
		mi.set(this,RIGHT);
		set(&mi,LEFT);
		return mi;
	}
protected:
	typedef const unsigned char insert_t;
	static insert_t BEFORE = 0; 
	static insert_t RIGHT = 1; 
	static insert_t AFTER = 2; 
	static insert_t LEFT = 3; 
	void set(MenuItem *mi, insert_t at)
	{
		switch (at)
		{
		case BEFORE: before = mi; break;
		case RIGHT: right = mi; break;
		case AFTER: after = mi; break;
		case LEFT: left = mi; break;
		}
	}
	
	const char* name;
	const char shortkey;

	MenuItem *before;
	MenuItem *right;
	MenuItem *after;
	MenuItem *left;
	MenuItem *back;
};


//no dependant inclusion of string or cstring
bool menuTestStrings(const char *a, const char *b)
{
	while (*a) { if (*a != *b) { return false; } b++; a++; }
	return true;
}
bool operator==(MenuItem &lhs, char* test)
{
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(const MenuItem &lhs, char* test)
{
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(MenuItem &lhs, MenuItem &rhs)
{
	return menuTestStrings(lhs.getName(),rhs.getName());
}
bool operator==(const MenuItem &lhs, MenuItem &rhs)
{
	return menuTestStrings(lhs.getName(),rhs.getName());
}

struct MenuChangeEvent
{
	const MenuItem &from;
	const MenuItem &to;
};

struct MenuUseEvent
{
	const MenuItem &item;
};

typedef void (*cb_change)(MenuChangeEvent);
typedef void (*cb_use)(MenuUseEvent);

class MenuBackend
{
public:
	MenuBackend(cb_use menuUse, cb_change menuChange = 0) : root("MenuRoot")
	{
		current = &root;
		cb_menuChange = menuChange;
		cb_menuUse = menuUse;
	}


	MenuItem &getRoot()
	{
		return root;
	}
	
	MenuItem &getCurrent()
	{
		return *current;
	}

	void moveBack()
	{
		setCurrent(current->moveBack());
	}

	void moveUp()
	{
		setCurrent(current->moveUp());
	}

	void moveDown()
	{
		setCurrent(current->moveDown());
	}

	void moveLeft()
	{
		setCurrent(current->moveLeft());
	}

	void moveRight()
	{
		setCurrent(current->moveRight());
	}

	void use(char shortkey)
	{
		recursiveSearch(shortkey,&root);
		use();
	}

	void use()
	{
		//current->use();
		if (cb_menuUse) 
		{
			MenuUseEvent mue = { *current };
			(*cb_menuUse)(mue);
		}
	}
void toRoot() {
setCurrent(&getRoot() );
}
private:
	void setCurrent( MenuItem *next )
	{
		if (next)
		{
			MenuChangeEvent mce = { *current, *next };
			current = next;
			if (cb_menuChange) 
			{
				(*cb_menuChange)(mce);
			}
		}
	}
	void foundShortkeyItem(MenuItem *mi)
	{
		mi->back = current;
		current = mi;
	}
	bool canSearch(const char shortkey, MenuItem *m)
	{
		if (m==0) { return false; }
		else 
		{
			if (m->getShortkey()==shortkey)
			{
				foundShortkeyItem(m);
			}
			return true;
		}
	}
	void recursiveSearchAfter(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
		}
	}
	void recursiveSearchRight(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearchLeft(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearchBefore(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	void recursiveSearch(const char shortkey, MenuItem *m)
	{
		if (canSearch(shortkey,m))
		{
			recursiveSearchAfter(shortkey, m->after);
			recursiveSearchRight(shortkey, m->right);
			recursiveSearchLeft(shortkey, m->left);
			recursiveSearchBefore(shortkey, m->before);
		}
	}
	MenuItem root;
	MenuItem *current;
	cb_change cb_menuChange;
	cb_use cb_menuUse;
};
void use()
   {
      //current->use();
      if (cb_menuUse) 
      {
         MenuUseEvent mue = { *current };
         (*cb_menuUse)(mue);
      }
   }
void toRoot() {
setCurrent(&getRoot() );
}
private:
void setCurrent( MenuItem *next )
   
#endif

résultat avec ton fichier, t'as pas copié ce que j'avais mis, d'où les erreurs et comme il fallait

In file included from sketch_feb02a.ino:25:0:
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h: In function 'void use()':
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h:327:11: error: 'cb_menuUse' was not declared in this scope
if (cb_menuUse)
^
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h:329:32: error: 'current' was not declared in this scope
MenuUseEvent mue = { *current };
^
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h: In function 'void toRoot()':
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h:334:21: error: 'getRoot' was not declared in this scope
setCurrent(&getRoot() );
^
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h:334:23: error: 'setCurrent' was not declared in this scope
setCurrent(&getRoot() );
^
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h: At global scope:
/home/loic/sketchbook/arduino-1.7.0-linux64/libraries/MenuBackend/MenuBackend.h:336:1: error: expected unqualified-id before 'private'
private:
^
In file included from /home/loic/sketchbook/arduino-1.7.0-linux64/hardware/tools/avr/lib/gcc/avr/4.8.1/include/stdint.h:9:0,
from /home/loic/sketchbook/arduino-1.7.0-linux64/hardware/tools/avr/avr/include/inttypes.h:37,
from /home/loic/sketchbook/arduino-1.7.0-linux64/libraries/LiquidCrystal/src/LiquidCrystal.h:4,
from sketch_feb02a.ino:26:
/home/loic/sketchbook/arduino-1.7.0-linux64/hardware/tools/avr/avr/include/stdint.h:159:9: error: 'int8_t' does not name a type
typedef int8_t int_least8_t;
^
/home/loic/sketchbook/arduino-1.7.0-linux64/hardware/tools/avr/avr/include/stdint.h:213:9: error: 'int8_t' does not name a type
typedef int8_t int_fast8_t;
^
Erreur lors de la compilation.

pourquoi avoir collé à la ligne 324

void use()
   {
      //current->use();
      if (cb_menuUse)
      {
         MenuUseEvent mue = { *current };
         (*cb_menuUse)(mue);
      }
   }
void toRoot() {
setCurrent(&getRoot() );
}
private:
void setCurrent( MenuItem *next )

ca risque pas de marcher, donc copie comme il faut le fichier et remplace tout dans le tiens

fichier correct en dessous

MenuBackend.h (6.36 KB)

j'ai pris ton fichier corrigé "MenuBackend.h" pour le remplacer et toujours le même problème

EDIT: j'avais actuellement dans ma libraries la version 1 et non la version 1.4 de "MenuBackend.h"

adonis17:
j'ai pris ton fichier corrigé "MenuBackend.h" pour le replacer et toujours le même problème

tu as fait quoi exactement?
faut virer ton .h dans la lib, prendre celui que j'ai mis et ca doit rouler après avoir redémarré l'ide.

que je teste avec la 0.23 la 1.7 aucune erreur de compile chez moi

je viens d'installer la 1.6.7 et erreur, donc bug de cette version
je vais essayer de trouver pourquoi

en attendant installe une version avant

J'avais la mauvaise version (v1) du MenuBackend.h

La version 1.4 :

/*
||
|| @file 	MenuBackend.h
|| @version 1.4
|| @author 	Alexander Brevig
|| @contact alexanderbrevig@gmail.com
|| @contribution Adrian Brzezinski adrb@wp.pl, http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?action=viewprofile;username=vzhang
||
|| @description
|| | Provide an easy way of making menus
|| #
||
|| @license
|| | This library is free software; you can redistribute it and/or
|| | modify it under the terms of the GNU Lesser General Public
|| | License as published by the Free Software Foundation; version
|| | 2.1 of the License.
|| |
|| | This library is distributed in the hope that it will be useful,
|| | but WITHOUT ANY WARRANTY; without even the implied warranty of
|| | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
|| | Lesser General Public License for more details.
|| |
|| | You should have received a copy of the GNU Lesser General Public
|| | License along with this library; if not, write to the Free Software
|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
|| #
||
*/

#ifndef MenuBackend_h
#define MenuBackend_h

/*
	A menu item will be a container for an item that is a part of a menu
	Each such item has a logical position in the hierarchy as well as a text and maybe a mnemonic shortkey
*/
class MenuItem {
public:
	MenuItem(const char* itemName, char shortKey='\0' ) : name(itemName), shortkey(shortKey) {
		before = right = after = left = 0;
	}

	//void use(){} //update some internal data / statistics
	inline const char* getName() const { return name; }
	inline const char getShortkey() const { return shortkey; }
	inline const bool hasShortkey() const { return (shortkey!='\0'); }
	inline void setBack(MenuItem *b) { back = b; }
	inline MenuItem* getBack() const { return back; }
	inline MenuItem* getBefore() const { return before; }
	inline MenuItem* getRight() const { return right; }
	inline MenuItem* getAfter() const { return after; }
	inline MenuItem* getLeft() const { return left; }

	MenuItem *moveBack() { return back; }

	MenuItem *moveUp() { 
		if (before) { before->back = this; }
		return before; 
	}

	MenuItem *moveDown() { 
		if (after) { after->back = this; }
		return after; 
	}

	MenuItem *moveLeft() { 
		if (left) { left->back = this; }
		return left; 
	}

	MenuItem *moveRight() { 
		if (right) { right->back = this; }
		return right; 
	}

	//default vertical menu
	MenuItem &add(MenuItem &mi) { return addAfter(mi); }

	MenuItem &addBefore(MenuItem &mi) {
		mi.after = this;
		before = &mi;
		if ( !mi.back ) mi.back = back;
		return mi;
	}
	MenuItem &addRight(MenuItem &mi) {
		mi.left = this;
		right = &mi;
		if ( !mi.back ) mi.back = back;
		return mi;
	}
	MenuItem &addAfter(MenuItem &mi) {
		mi.before = this;
		after = &mi;
		if ( !mi.back ) mi.back = back;
		return mi;
	}
	MenuItem &addLeft(MenuItem &mi) {
		mi.right = this;
		left = &mi;
		if ( !mi.back ) mi.back = back;
		return mi;
	}
protected:

	const char* name;
	const char shortkey;

	MenuItem *before;
	MenuItem *right;
	MenuItem *after;
	MenuItem *left;
	MenuItem *back;
};

//no dependant inclusion of string or cstring
bool menuTestStrings(const char *a, const char *b) {
	while (*a) { if (*a != *b) { return false; } b++; a++; }
	return true;
}
bool operator==(MenuItem &lhs, char* test) {
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(const MenuItem &lhs, char* test) {
	return menuTestStrings(lhs.getName(),test);
}
bool operator==(MenuItem &lhs, MenuItem &rhs) {
	return menuTestStrings(lhs.getName(),rhs.getName());
}
bool operator==(const MenuItem &lhs, MenuItem &rhs) {
	return menuTestStrings(lhs.getName(),rhs.getName());
}

struct MenuChangeEvent {
	const MenuItem &from;
	const MenuItem &to;
};

struct MenuUseEvent {
	const MenuItem &item;
};

typedef void (*cb_change)(MenuChangeEvent);
typedef void (*cb_use)(MenuUseEvent);

class MenuBackend {
public:

	MenuBackend(cb_use menuUse, cb_change menuChange = 0) : root("MenuRoot") {
		current = &root;
		cb_menuChange = menuChange;
		cb_menuUse = menuUse;
	}

	MenuItem &getRoot() {
		return root;
	}
	MenuItem &getCurrent() {
		return *current;
	}

	void moveBack() {
		setCurrent(current->getBack());
	}

	void moveUp() {
		setCurrent(current->moveUp());
	}

	void moveDown() {
		setCurrent(current->moveDown());
	}

	void moveLeft() {
		setCurrent(current->moveLeft());
	}

	void moveRight() {
		setCurrent(current->moveRight());
	}

	void use(char shortkey)
	{
		recursiveSearch(shortkey,&root);
		use();
	}
	
	void use() {
		//current->use();
		if (cb_menuUse) {
			MenuUseEvent mue = { *current };
			cb_menuUse(mue);
		}
	}

private:
	void setCurrent( MenuItem *next ) {
		if (next) {
			if (cb_menuChange) {
				MenuChangeEvent mce = { *current, *next };
				(*cb_menuChange)(mce);
			}
			current = next;
		}
	}
	void foundShortkeyItem(MenuItem *mi) {
		mi->setBack(current);
		current = mi;
	}
	char canSearch(const char shortkey, MenuItem *m) {
		if (m==0) { return 0; }
		else  {
			if (m->getShortkey()==shortkey) {
				foundShortkeyItem(m);
				return 1;
			}
			return -1;
		}
	}
	void rSAfter(const char shortkey, MenuItem *m) {
		if (canSearch(shortkey,m)!=1) {
			rSAfter(shortkey, m->getAfter());
			rSRight(shortkey, m->getRight());
			rSLeft(shortkey, m->getLeft());
		}
	}
	void rSRight(const char shortkey, MenuItem *m) {
		if (canSearch(shortkey,m)!=1) {
			rSAfter(shortkey, m->getAfter());
			rSRight(shortkey, m->getRight());
			rSBefore(shortkey, m->getBefore());
		}
	}
	void rSLeft(const char shortkey, MenuItem *m) {
		if (canSearch(shortkey,m)!=1) {
			rSAfter(shortkey, m->getAfter());
			rSLeft(shortkey, m->getLeft());
			rSBefore(shortkey, m->getBefore());
		}
	}
	void rSBefore(const char shortkey, MenuItem *m) {
		if (canSearch(shortkey,m)!=1) {
			rSRight(shortkey, m->getRight());
			rSLeft(shortkey, m->getLeft());
			rSBefore(shortkey, m->getBefore());
		}
	}
	void recursiveSearch(const char shortkey, MenuItem *m) {
		if (canSearch(shortkey,m)!=1) {
			rSAfter(shortkey, m->getAfter());
			rSRight(shortkey, m->getRight());
			rSLeft(shortkey, m->getLeft());
			rSBefore(shortkey, m->getBefore());
		}
	}
	
	MenuItem root;
	MenuItem *current;

	cb_change cb_menuChange;
	cb_use cb_menuUse;
};

#endif

Je vais test avec la version 1.7 du ide

Merci tout fonctionne! :slight_smile:

j'ai juste une dernière question, mon écran lcd est un écran lcd I2C, le schéma de branchement des boutons est adapter pour un lcd normal, je sais pas comment adapter :confused:

le schéma de branchement des boutons :
http://zupimages.net/viewer.php?id=16/05/lc6p.png