Files
Thomas Livernet a865850fc2 Initialisation
2014-01-17 15:44:37 +01:00

163 lines
4.3 KiB
Plaintext

/**
* HelloMenu
* by BREVIG http://alexanderbrevig.com
* modified kerinin@gmail.com
*
* This is the structure of the modelled menu
*
* Settings
* Pin
* Debug
* Options
* Delay (D)
* 100 ms
* 200 ms
* 300 ms
* 400 ms
*/
#include <MenuBackend.h>
//this controls the menu backend and the event generation
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
//beneath is list of menu items needed to build the menu
MenuItem settings = MenuItem(menu, "Settings", 1);
MenuItem pin = MenuItem(menu, "Pin", 2);
MenuItem debug = MenuItem(menu, "Debug", 2);
MenuItem options = MenuItem(menu, "Options", 1);
MenuItem setDelay = MenuItem(menu, "Delay",'D', 2);
MenuItem d100 = MenuItem(menu, "100 ms", 3);
MenuItem d200 = MenuItem(menu, "200 ms", 3);
MenuItem d300 = MenuItem(menu, "300 ms", 3);
MenuItem d400 = MenuItem(menu, "400 ms", 3);
//this function builds the menu and connects the correct items together
void menuSetup()
{
Serial.println("Setting up menu...");
//add the file menu to the menu root
menu.getRoot()
.onLeft(handleInvalidMove)
.onRight(handleInvalidMove)
.onUp(handleInvalidMove)
.add(settings);
//setup the settings menu item
settings.addAfter(options);
options.addAfter(settings);
settings.onLeft(handleInvalidMove).addRight(pin); //chain settings to pin on right
debug.addLeft(settings); //also go to settings left for debug
//we want looping both up and down
pin.addBefore(debug);
pin.addAfter(debug);
debug.addBefore(pin);
debug.addAfter(pin);
options.onLeft(handleInvalidMove).addRight(setDelay); //chain options to delay on right
setDelay.addRight(d100);
d100.addBefore(d100); //loop to d400
d100.onChangeTo(handleDelayChange).onRight(handleSetDelay).addAfter(d200);
d200.onChangeTo(handleDelayChange).onRight(handleSetDelay).addAfter(d300);
d300.onChangeTo(handleDelayChange).onRight(handleSetDelay).addAfter(d400);
d400.onChangeTo(handleDelayChange).onRight(handleSetDelay).addAfter(d100); //loop back to d100
//we want left to always be bak to delay
d100.addLeft(setDelay);
d200.addLeft(setDelay);
d300.addLeft(setDelay);
d400.addLeft(setDelay);
}
/*
This function is called when you try to go someone
you don't belong
*/
void handleInvalidMove(MenuMoveEvent menu)
{
Serial.println("You cannot go there. It is not a place");
}
/*
This function is called when we change to
a 'delay' menu item.
*/
void handleDelayChange(MenuChangeEvent changed)
{
Serial.print("Selected delay changed from ");
Serial.print(changed.from.getName());
Serial.print(" to ");
Serial.println(changed.to.getName());
}
/*
This function is called when moveRight() is called
with a delay menu item as the current menu.
You could use this to change the value or something
similar
*/
void handleSetDelay(MenuMoveEvent menu)
{
Serial.print("Change delay to ");
Serial.print(menu.item.getName());
Serial.println(" NOW!");
}
/*
This is an important function
Here all use events are handled
This is where you define a behaviour for a menu item
*/
void menuUseEvent(MenuUseEvent used)
{
Serial.print("Menu use ");
Serial.println(used.item.getName());
if (used.item.isEqual(setDelay)) //comparison agains a known item
{
Serial.println("menuUseEvent found Delay (D)");
}
}
/*
This is an important function
Here we get a notification whenever the user changes the menu
That is, when the menu is navigated
*/
void menuChangeEvent(MenuChangeEvent changed)
{
Serial.print("Menu change ");
Serial.print(changed.from.getName());
Serial.print(" ");
Serial.println(changed.to.getName());
}
void setup()
{
Serial.begin(9600);
menuSetup();
Serial.println("Starting navigation:\r\nUp: w Down: s Left: a Right: d Use: e");
//fire Delay : menu.use('D');
//bail back to Options by moving up one logical level after a D : menu.moveRelativeLevels(-1);
}
void loop()
{
if (Serial.available())
{
byte read = Serial.read();
switch (read)
{
case 'w': menu.moveUp(); break;
case 's': menu.moveDown(); break;
case 'd': menu.moveRight(); break;
case 'a': menu.moveLeft(); break;
case 'e': menu.use(); break;
}
}
}