Go Down

Topic: Problema con código coagula (SOLUCIONADO) (Read 2241 times) previous topic - next topic

PascuaL

Oct 31, 2012, 02:17 pm Last Edit: Nov 05, 2012, 03:47 pm by PascuaL Reason: 1
Este código es de un menú en un LCD. Te lo bajas y dentro de la librería editas un archivo con 3 líneas y a funcionar. Pero no funciona, ¿alguna mano?.
Un saludo, gracias.

http://www.coagula.org/content/pages/tutorial-manage-menu-and-lcd-display-arduino

PascuaL

¿Nadie? Sólo es bajarla, modificar una línea del archivo .h y luego compilar el código.
Por favor, muchas gracias.

Heke

Pascual

Yo no he usado liberia de menus aun pero dejame a la tarde que lleque a casa y hago la prueba y te comento.

Un saludo.

PascuaL

Muy bien, muchas gracias Heke.
Como digo es muy sencillo:
1.Bajas librería
2.Editas menubackend.h (archivo dentro de librería)
3.Compilas
4.Debería de ir pero da un error. Alguien con más experiencia puede saber qué es.

De nuevo gracias y estoy a la espera.

Sergegsx


Heke

#5
Nov 02, 2012, 05:55 pm Last Edit: Nov 02, 2012, 06:05 pm by Heke Reason: 1
Hecho

Primero me da error al compilar porque dice que no conoce "toRoot"  pero le he añadido el texto que pone en la pagina, en la linea 195 y justo antes del comienzo del texto de private:
 
Code: [Select]
void toRoot() {?
   setCurrent( &getRoot() );
   }


Con la precaucion de que he copiado con el raton desde la web el texto y me ha añadido un caracter extraño (creo que es un retorno de carro) despues del parentesis, lo he borrado, y entonces he compilado y funcionando OK.

El fichero menubackend.h mio ha quedado asi:
Code: [Select]
/*
||
|| @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);
}
}


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

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


Todo esto es con el ide 022 de arduino, y con la placa atmega 1280 seleccionada, no he probado con otro.

Si no consigues solucionarlo dimelo y me bajo el ide nuevo por si fuera eso.

Un saludo

PD: Añado, me costaba mas pensarlo que hacerlo, con el ide 1.0.1 y con placa arduino 328, arduino uno y arduino leonardo no da error al compilar, y con el ide 022 y placa 328 o atmega 1280 tampoco.

PascuaL

Mira que sabía yo que lo sacabas. Muchas gracias Heke me has hecho un gran favor.
Lo pruebo y según vaya pongo solucionado.
+1 Un saludo!

PascuaL

#7
Nov 05, 2012, 03:49 pm Last Edit: Nov 05, 2012, 03:55 pm by PascuaL Reason: 1
Como efectivamente comentaba @Heke, el retorno de carro era el error en la librería.
Una vez más muchas gracias, un saludo!
Dato: comprobado en las versiones 0019 y 1.0.1 .

Go Up