Professional Documents
Culture Documents
h>
#include "LcdKeypad.h"
#include "MenuData.h"
#include <TimerOne.h>
enum AppModeValues
{
APP_NORMAL_MODE,
APP_MENU_MODE,
APP_PROCESS_MENU_CMD
};
void setup()
{
//Serial.begin(9600);
backLightOn();
// set up the LCD's number of columns and rows:
lcd.begin(LCD_COLS, LCD_ROWS);
// Use soft PWM for backlight, as hardware PWM must be avoided for some LCD shields.
Timer1.initialize();
Timer1.attachInterrupt(lcdBacklightISR, 500);
setBacklightBrightness(1);
}
void loop()
{
btn = getButton();
switch (appMode)
{
case APP_NORMAL_MODE :
if (btn == BUTTON_UP_LONG_PRESSED)
{
appMode = APP_MENU_MODE;
refreshMenuDisplay(REFRESH_DESCEND);
}
break;
case APP_MENU_MODE :
{
byte menuMode = Menu1.handleNavigation(getNavAction, refreshMenuDisplay);
if (menuMode == MENU_EXIT)
{
lcd.clear();
lcd.print("Hold UP for menu");
appMode = APP_NORMAL_MODE;
}
else if (menuMode == MENU_INVOKE_ITEM)
{
appMode = APP_PROCESS_MENU_CMD;
if (processingComplete)
{
appMode = APP_MENU_MODE;
// clear forward arrow
lcd.setCursor(0, 1);
strbuf[0] = ' '; // clear forward arrow
strbuf[1] = 0;
lcd.print(strbuf);
}
break;
}
}
}
//----------------------------------------------------------------------
// Addition or removal of menu items in MenuData.h will require this method
// to be modified accordingly.
byte processMenuCommand(byte cmdId)
{
byte complete = false; // set to true when menu command processing complete.
if (btn == BUTTON_SELECT_PRESSED)
{
complete = true;
}
switch (cmdId)
{
// TODO Process menu commands here:
default:
break;
}
return complete;
}
//----------------------------------------------------------------------
// Callback to convert button press to navigation action.
byte getNavAction()
{
byte navAction = 0;
byte currentItemHasChildren = Menu1.currentItemHasChildren();
//----------------------------------------------------------------------
const char EmptyStr[] = "";
// Callback to refresh display during menu navigation, using parameter of type enum DisplayRefreshMode.
void refreshMenuDisplay (byte refreshMode)
{
char nameBuf[LCD_COLS+1];
/*
if (refreshMode == REFRESH_DESCEND || refreshMode == REFRESH_ASCEND)
{
byte menuCount = Menu1.getMenuItemCount();
if (Menu1.itemHasChildren(i))
{
Serial.println("->");
}
else
{
Serial.println();
}
}
}
*/
lcd.setCursor(0, 0);
if (Menu1.currentItemHasChildren())
{
rpad(strbuf, Menu1.getCurrentItemName(nameBuf));
strbuf[LCD_COLS-1] = 0b01111110; // Display forward arrow if this menu item has children.
lcd.print(strbuf);
lcd.setCursor(0, 1);
lcd.print(rpad(strbuf, EmptyStr));// Clear config value in display
}
else
{
byte cmdId;
rpad(strbuf, Menu1.getCurrentItemName(nameBuf));
if ((cmdId = Menu1.getCurrentItemCmdId()) == 0)
{
strbuf[LCD_COLS-1] = 0b01111111; // Display back arrow if this menu item ascends to parent.
lcd.print(strbuf);
lcd.setCursor(0, 1);
lcd.print(rpad(strbuf, EmptyStr)); // Clear config value in display.
}
else
{
lcd.print(strbuf);
lcd.setCursor(0, 1);
lcd.print(" ");