Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: PinDetect TextLCD mbed
Fork of FBRDash by
src/Menu.cpp
- Committer:
- intrinseca
- Date:
- 2012-06-25
- Revision:
- 2:825f572902c6
- Parent:
- 1:b3907b8d9f65
File content as of revision 2:825f572902c6:
#include "Menu.h"
#include "mbed.h"
#include <string>
//Drive the menu system
//Initialise and attach button handlers
Menu::Menu(TextLCD* _screen, PinName ok, PinName left, PinName right)
{
screen = _screen;
entryCount = 0;
position = 0;
btnOK = new PinDetect(ok, PullUp);
btnLeft = new PinDetect(left, PullUp);
btnRight = new PinDetect(right, PullUp);
btnOK->attach_deasserted(this, &Menu::enter);
btnOK->attach_asserted_held(this, &Menu::done);
btnLeft->attach_asserted(this, &Menu::left);
btnLeft->attach_asserted_held(this, &Menu::leftHeld);
btnLeft->attach_deasserted(this, &Menu::cancelLeftHeld);
btnRight->attach_asserted(this, &Menu::right);
btnRight->attach_asserted_held(this, &Menu::rightHeld);
btnRight->attach_deasserted(this, &Menu::cancelRightHeld);
btnOK->setAssertValue(0);
btnLeft->setAssertValue(0);
btnRight->setAssertValue(0);
btnOK->setSampleFrequency();
btnLeft->setSampleFrequency();
btnRight->setSampleFrequency();
ignoreNextEnter = false;
}
void Menu::refresh()
{
//Create chars (if needed) for left and right arrows and editable indicator
char labelLeft = (!edit & position > 0)?leftArrow:' ';
char labelRight = (!edit & position < entryCount)?rightArrow:' ';
char editIndic = (entries[position]->editable)?'*':' ';
screen->locate(0, 0);
//If position is on an entry, display it
if(position <= entryCount - 1)
{
screen->printf("%c%-14s%c", labelLeft, (entries[position])->label.c_str(), labelRight);
char editLeft = (edit)?'-':editIndic;
char editRight = (edit)?'+':' ';
screen->putc(editLeft);
screen->printf(entries[position]->getFormatted().c_str());
screen->locate(15, 1);
screen->putc(editRight);
}
//Otherwise show the return command
else
{
screen->printf("%cReturn ", leftArrow);
}
}
//Handler for enter button
void Menu::enter()
{
//Menu not on screen, display it
if(!display && !ignoreNextEnter)
{
display = true;
edit = false;
}
//Menu on screen
else
{
//On an entry
if(position <= entryCount - 1)
{
//If its editable, toggle edit status
if(entries[position]->editable)
edit = !edit;
}
//On return
else
{
//Return, resetting position first
position = 0;
done();
}
}
ignoreNextEnter = false;
}
//Handler for enter held, clear the menu retaining position
void Menu::done()
{
//Hide the menu
display = false;
//TODO: Can't remember why I needed this
ignoreNextEnter = true;
}
//Handler for left button
void Menu::left()
{
//If not editing, scroll
if(!edit && display && position > 0)
position--;
//If editing, edit
else if(edit)
entries[position]->decrement();
}
//Handler for left button held, start scrolling through menu.
void Menu::leftHeld()
{
left();
leftHeldTimeout.attach(this, &Menu::leftHeld, holdRepeatTime);
}
//Handler for left button release, stop scrolling
void Menu::cancelLeftHeld()
{
leftHeldTimeout.detach();
}
//Same as left
void Menu::right()
{
if(!edit && display && position < entryCount)
position++;
else if(edit)
entries[position]->increment();
}
//Same as left
void Menu::rightHeld()
{
right();
rightHeldTimeout.attach(this, &Menu::rightHeld, holdRepeatTime);
}
//Same as left
void Menu::cancelRightHeld()
{
rightHeldTimeout.detach();
}
