I’ve made a way to create menues.
This is handy for all those LCD application that needs some kind of menu system, although, this library is not resticted to LCD menus.
Example:
/*
||
|| @author Alexander Brevig
|| @version 1.0
||
|| @description
|| | This is a simple menu system, that uses input from the serial to change and use menuitems.
|| #
||
|| @license
|| | This code is subject to my AlphaLicence.txt
|| | www.alphabeta.alexanderbrevig.com/AlphaLicense.txt
|| #
||
*/#include <SubMenuItem.h>
#include <SubMenu.h>
#include <MenuItem.h>
#include <Menu.h>
//initialize menu
Menu menu = Menu(menuUsed,menuChanged);
//initialize menuitems
MenuItem menuItem1 = MenuItem();
MenuItem menuItemWithSubmenu = MenuItem();
SubMenu subMenu = SubMenu(menuChanged);
SubMenuItem subMenuItem1 = SubMenuItem();
SubMenuItem subMenuItem2 = SubMenuItem();
SubMenuItem subMenuItem3 = SubMenuItem();
MenuItem menuItem3 = MenuItem();void setup(){
Serial.begin(9600);//configure menu
menu.addMenuItem(menuItem1);
menu.addMenuItem(menuItemWithSubmenu);
menuItemWithSubmenu.addSubMenu(subMenu);
subMenu.addSubMenuItem(subMenuItem1);
subMenu.addSubMenuItem(subMenuItem2);
subMenu.addSubMenuItem(subMenuItem3);
menu.addMenuItem(menuItem3);menu.select(0);
subMenu.select(0);
}
void loop(){
if (Serial.available()){
switch (Serial.read()){
case ‘w’:
if (menu.isCurrentSubMenu()){
subMenu.down(); //set index closer to 0
}
break;
case ‘s’:
if (menu.isCurrentSubMenu()){
subMenu.up(); //set index closer to maximum
}
break;
case ‘a’:
menu.down();
break;
case ‘d’:
menu.up();
break;
case ’ ':
menu.use();
break;
case ‘0’:
menu.select(0);
break;
case ‘1’:
menu.select(1);
break;
case ‘2’:
menu.select(2);
break;
}
}
}void menuChanged(ItemChangeEvent event){
Serial.println(“menuChanged”);
if( event == &menuItem1 ){
Serial.println("\tmenuItem1 selected"); //user feedback
}else if( event == &menuItemWithSubmenu ){
Serial.println("\tmenuItemWithSubmenu selected"); //user feedback
}else if( event == &subMenuItem1 ){
Serial.println("\tsubMenuItem1 selected"); //user feedback
}else if( event == &subMenuItem2 ){
Serial.println("\tsubMenuItem2 selected"); //user feedback
}else if( event == &subMenuItem3 ){
Serial.println("\tsubMenuItem3 selected"); //user feedback
}else if( event == &menuItem3 ){
Serial.println("\tmenuItem3 selected"); //user feedback
}
}void menuUsed(ItemUseEvent event){
Serial.println(“menuUsed”);
if( event == &menuItem1 ){
Serial.println("\tmenuItem1 used"); //user feedback
}else if( event == &subMenuItem1 ){
Serial.println("\tsubMenuItem1 used"); //user feedback
}else if( event == &subMenuItem2 ){
Serial.println("\tsubMenuItem2 used"); //user feedback
}else if( event == &subMenuItem3 ){
Serial.println("\tsubMenuItem3 used"); //user feedback
}else if( event == &menuItem3 ){
Serial.println("\tmenuItem3 used"); //user feedback
}
}
Resulting menu ‘structure’:
[ menuItem1 ][ menuItemWithSubmenu ][ menuItem3 ]
[ -subMenuItem1 ]
[ -subMenuItem2 ]
[ -subMenuItem3 ]
You control this example by [w,a,s,d,space,0,1,2]
w = move 'up' in submenus
a = move left in the menu
s = move 'down' in submenus
d = move right in the menu
space = select/use current menu item
0 = select menuItem1
1 = select menuItemWithSubmenu
2 = select MenuItem3
Result from try:
menuChanged //menu.select(0);
menuItem1 selectedmenuChanged //subMenu.select(0);
subMenuItem1 selectedmenuChanged // <> d [moved ‘right’ from menuItem1 to menuItemWithSubmenu->subMenuItem1
subMenuItem1 selectedmenuChanged // <> s [moved down in the submenu]
subMenuItem2 selectedmenuChanged // <> s [moved down in the submenu]
subMenuItem3 selectedmenuUsed // <> space [used the current item]
subMenuItem3 usedmenuChanged // <> d [moved right in the menu]
menuItem3 selectedmenuUsed // <> space [used the current item]
menuItem3 usedmenuChanged // <> a [moved left in the menu]
subMenuItem3 selectedmenuChanged // <> a [moved left in the menu]
menuItem1 selected