He estado buscando algun ejemplo echo o libreria sencilla de usar para hacer y gestionar menus. En realidad pretendo que sea un menu a traves de un lcd y pulsadores (concretamente la LCD kaypad shield de dfrobot), pero vamos, que para enterarme o entender como hacerlo, que es lo que quiero, me vale cualquiera.
He conseguido hacer una de solo un nivel, el problema viene cuando intento que una opcion tenga a su vez submenus, distintas opciones.
Lo mas parecido que he conseguido encontrar es esto:
Para estar empezando te has metido en un proyecto algo complejo, espero que no te desanimes.
Yo tengo que hacer uno para un aparato y aun no me he metido de lleno en ello, pero documentándome encontré un ejemplo muy esclarecedor ¡OJO! NO ES CODIGO es una especie de algoritmo escrito en inglés.
enum States
{
State_MainMenu,
State_SubMenu1,
State_SubMenu2
};
int state = State_MainMenu;
void loop()
{
switch (state)
{
case State_MainMenu:
Mainmenu();
break;
case State_SubMenu1:
submenu1();
break;
case State_SubMenu2:
submenu2();
break;
}
}
void Mainmenu()
{
read input
if (user selected option 1?)
state = State_SubMenu1;
else if (user selected option 2)
state = State_SubMenu2;
draw main menu
}
void submenu1()
{
read input
if (user selected back option?)
state = State_MainMenu;
else if (something else?)
state = some other state;
draw submenu1
}
etc.
Como verás es prácticamente definir unos estados que cambiarán según unas lecturas, dentro del loop() una estructura switch se encarga de que el menú haga una cosa u otra.
Hay varias formas de enfocar el tema de menus, las que se me ocurren:
La que casi todos empezamos, un switch grande. Tienes una variable que indica el menu en el que estas, cada vez que bajas a un submenu le sumas 10, 100, 1000 etc. Por ejemplo, tienes que la capa superior son 6 menus, entonces cuando vas dando a +/- para ir cambiando menu, pues sumas/restas +1. Si le das a aceptar, intro o como quieras llamar a la tecla que te baja al siguiente submenu, le sumas +10 . Si quieres bajar un nivel mas, +1000..... No se si me he explicado bien.
Es decir, si estoy en el Menu principal 5, y le doy INTRO, le sumo +10. Entonces mi variable menu ahora vale 50.
leo_entradas()
si tecla_up -> menu+1
si tecla_down -> menu -1
si tecla_acc -> si menu <10 entonces menu +10
si tecla_esc -> si menu>10 entonces menu-10
funcion_mirar_menu_dentro_limites();
switch (menu)
case 1:
bla,bla,bla
break;
case 2:
bla,bla,bla
break;
....
case 50:
bla,bla
break;
Es una manera facil de entender, pero termina siendo un lio de codigo si tu menu es grande.
Estoy probando usando variables. Una me indica el nivel en el que estoy, y otra la opcion de esa nivel en la que me encuentro... a ver si saco algo en claro...