so, finally, here is the example with submenu:
#include <LiquidCrystal.h>
#include "M2tk.h"
#include "m2ghlc.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
uint8_t uiKeySelectPin = 10;
uint8_t uiKeyNextPin = 9;
uint8_t girl_color = 0;
uint8_t boy_color = 0;
uint8_t man_color = 0;
M2_EXTERN_GRIDLIST(el_main_menu);
M2tk m2(&el_main_menu, m2_es_arduino, m2_eh_4bs, m2_gh_lc);
void fn_ok(m2_el_fnarg_p fnarg) {
/* color changed, do something */
/* then jump back to the main menu */
m2.setRoot(&el_main_menu);
}
const char *fn_idx_to_color(uint8_t idx)
{
switch(idx)
{
case 0: return "brown";
case 1: return "blonde";
case 2: return "red";
}
return "";
}
/* boy submenu */
M2_LABEL(el_label1, NULL, "Boy:");
M2_COMBO(el_combo1, NULL, &boy_color, 3, fn_idx_to_color);
M2_BUTTON(el_ok1, NULL, " ok ", fn_ok);
M2_LIST(list1) = {
&el_label1, &el_combo1,
&el_ok1
};
M2_GRIDLIST(el_grid1, "c2",list1);
/* girl submenu */
M2_LABEL(el_label2, NULL, "Girl:");
M2_COMBO(el_combo2, NULL, &girl_color, 3, fn_idx_to_color);
M2_BUTTON(el_ok2, NULL, " ok ", fn_ok);
M2_LIST(list2) = {
&el_label2, &el_combo2,
&el_ok2
};
M2_GRIDLIST(el_grid2, "c2",list2);
/* man submenu */
M2_LABEL(el_label3, NULL, "Man:");
M2_COMBO(el_combo3, NULL, &man_color, 3, fn_idx_to_color);
M2_BUTTON(el_ok3, NULL, " ok ", fn_ok);
M2_LIST(list3) = {
&el_label3, &el_combo3,
&el_ok3
};
M2_GRIDLIST(el_grid3, "c2",list3);
/* main menu */
M2_ROOT(el_boy_button, NULL, "Boy", &el_grid1);
M2_ROOT(el_girl_button, NULL, "Girl", &el_grid2);
M2_ROOT(el_man_button, NULL, "Man", &el_grid3);
M2_LIST(list_main_menu) = {
&el_boy_button,
&el_girl_button,
&el_man_button,
};
M2_GRIDLIST(el_main_menu, "c1",list_main_menu);
void setup() {
m2_SetLiquidCrystal(&lcd, 16, 4);
m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
m2.setPin(M2_KEY_NEXT, uiKeyNextPin);
}
void loop() {
m2.checkKey();
if ( m2.handleKey() )
m2.draw();
m2.checkKey();
}
This example defines four different menus (or dialog boxes). You can switch between these dialog boxes by using the M2_ROOT button or the m2.setRoot procedure. Calling a sub menu is nothing else than assigning a new dialog box with M2_ROOT. For the jump back to the main menu, the callback procedure of the ok button uses "m2.setRoot()".
hope this helps... again, let me know if you need more examples.
Oliver