can't push chnages :(

Fork of FBRDash by Michael Allan

Committer:
tomontoast
Date:
Sun Oct 14 21:09:49 2012 +0000
Revision:
5:177520d43c87
Parent:
2:825f572902c6
14/10/12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
intrinseca 1:b3907b8d9f65 1 #include "Menu.h"
intrinseca 1:b3907b8d9f65 2 #include "mbed.h"
intrinseca 1:b3907b8d9f65 3 #include <string>
intrinseca 1:b3907b8d9f65 4
intrinseca 2:825f572902c6 5 //Drive the menu system
intrinseca 2:825f572902c6 6
intrinseca 2:825f572902c6 7 //Initialise and attach button handlers
intrinseca 1:b3907b8d9f65 8 Menu::Menu(TextLCD* _screen, PinName ok, PinName left, PinName right)
intrinseca 1:b3907b8d9f65 9 {
intrinseca 1:b3907b8d9f65 10 screen = _screen;
intrinseca 1:b3907b8d9f65 11
intrinseca 1:b3907b8d9f65 12 entryCount = 0;
intrinseca 1:b3907b8d9f65 13
intrinseca 1:b3907b8d9f65 14 position = 0;
intrinseca 1:b3907b8d9f65 15
intrinseca 1:b3907b8d9f65 16 btnOK = new PinDetect(ok, PullUp);
intrinseca 1:b3907b8d9f65 17 btnLeft = new PinDetect(left, PullUp);
intrinseca 1:b3907b8d9f65 18 btnRight = new PinDetect(right, PullUp);
intrinseca 1:b3907b8d9f65 19
intrinseca 1:b3907b8d9f65 20 btnOK->attach_deasserted(this, &Menu::enter);
intrinseca 1:b3907b8d9f65 21 btnOK->attach_asserted_held(this, &Menu::done);
intrinseca 1:b3907b8d9f65 22
intrinseca 1:b3907b8d9f65 23 btnLeft->attach_asserted(this, &Menu::left);
intrinseca 1:b3907b8d9f65 24 btnLeft->attach_asserted_held(this, &Menu::leftHeld);
intrinseca 1:b3907b8d9f65 25 btnLeft->attach_deasserted(this, &Menu::cancelLeftHeld);
intrinseca 1:b3907b8d9f65 26
intrinseca 1:b3907b8d9f65 27 btnRight->attach_asserted(this, &Menu::right);
intrinseca 1:b3907b8d9f65 28 btnRight->attach_asserted_held(this, &Menu::rightHeld);
intrinseca 1:b3907b8d9f65 29 btnRight->attach_deasserted(this, &Menu::cancelRightHeld);
intrinseca 1:b3907b8d9f65 30
intrinseca 1:b3907b8d9f65 31 btnOK->setAssertValue(0);
intrinseca 1:b3907b8d9f65 32 btnLeft->setAssertValue(0);
intrinseca 1:b3907b8d9f65 33 btnRight->setAssertValue(0);
intrinseca 1:b3907b8d9f65 34
intrinseca 1:b3907b8d9f65 35 btnOK->setSampleFrequency();
intrinseca 1:b3907b8d9f65 36 btnLeft->setSampleFrequency();
intrinseca 1:b3907b8d9f65 37 btnRight->setSampleFrequency();
intrinseca 1:b3907b8d9f65 38
intrinseca 1:b3907b8d9f65 39 ignoreNextEnter = false;
intrinseca 1:b3907b8d9f65 40 }
intrinseca 1:b3907b8d9f65 41
intrinseca 1:b3907b8d9f65 42 void Menu::refresh()
intrinseca 1:b3907b8d9f65 43 {
intrinseca 2:825f572902c6 44 //Create chars (if needed) for left and right arrows and editable indicator
intrinseca 1:b3907b8d9f65 45 char labelLeft = (!edit & position > 0)?leftArrow:' ';
intrinseca 1:b3907b8d9f65 46 char labelRight = (!edit & position < entryCount)?rightArrow:' ';
intrinseca 1:b3907b8d9f65 47 char editIndic = (entries[position]->editable)?'*':' ';
intrinseca 1:b3907b8d9f65 48
intrinseca 1:b3907b8d9f65 49 screen->locate(0, 0);
intrinseca 1:b3907b8d9f65 50
intrinseca 2:825f572902c6 51 //If position is on an entry, display it
intrinseca 1:b3907b8d9f65 52 if(position <= entryCount - 1)
intrinseca 1:b3907b8d9f65 53 {
intrinseca 1:b3907b8d9f65 54 screen->printf("%c%-14s%c", labelLeft, (entries[position])->label.c_str(), labelRight);
intrinseca 1:b3907b8d9f65 55
intrinseca 1:b3907b8d9f65 56 char editLeft = (edit)?'-':editIndic;
intrinseca 1:b3907b8d9f65 57 char editRight = (edit)?'+':' ';
intrinseca 1:b3907b8d9f65 58
intrinseca 1:b3907b8d9f65 59 screen->putc(editLeft);
intrinseca 1:b3907b8d9f65 60 screen->printf(entries[position]->getFormatted().c_str());
intrinseca 1:b3907b8d9f65 61 screen->locate(15, 1);
intrinseca 1:b3907b8d9f65 62 screen->putc(editRight);
intrinseca 1:b3907b8d9f65 63 }
intrinseca 2:825f572902c6 64 //Otherwise show the return command
intrinseca 1:b3907b8d9f65 65 else
intrinseca 2:825f572902c6 66 {
intrinseca 1:b3907b8d9f65 67 screen->printf("%cReturn ", leftArrow);
intrinseca 1:b3907b8d9f65 68 }
intrinseca 1:b3907b8d9f65 69 }
intrinseca 1:b3907b8d9f65 70
intrinseca 2:825f572902c6 71 //Handler for enter button
intrinseca 1:b3907b8d9f65 72 void Menu::enter()
intrinseca 1:b3907b8d9f65 73 {
intrinseca 2:825f572902c6 74 //Menu not on screen, display it
intrinseca 1:b3907b8d9f65 75 if(!display && !ignoreNextEnter)
intrinseca 1:b3907b8d9f65 76 {
intrinseca 1:b3907b8d9f65 77 display = true;
intrinseca 1:b3907b8d9f65 78 edit = false;
intrinseca 1:b3907b8d9f65 79 }
intrinseca 2:825f572902c6 80 //Menu on screen
intrinseca 1:b3907b8d9f65 81 else
intrinseca 1:b3907b8d9f65 82 {
intrinseca 2:825f572902c6 83 //On an entry
intrinseca 1:b3907b8d9f65 84 if(position <= entryCount - 1)
intrinseca 1:b3907b8d9f65 85 {
intrinseca 2:825f572902c6 86 //If its editable, toggle edit status
intrinseca 1:b3907b8d9f65 87 if(entries[position]->editable)
intrinseca 1:b3907b8d9f65 88 edit = !edit;
intrinseca 1:b3907b8d9f65 89 }
intrinseca 2:825f572902c6 90 //On return
intrinseca 1:b3907b8d9f65 91 else
intrinseca 1:b3907b8d9f65 92 {
intrinseca 2:825f572902c6 93 //Return, resetting position first
intrinseca 1:b3907b8d9f65 94 position = 0;
intrinseca 1:b3907b8d9f65 95 done();
intrinseca 1:b3907b8d9f65 96 }
intrinseca 1:b3907b8d9f65 97 }
intrinseca 1:b3907b8d9f65 98
intrinseca 1:b3907b8d9f65 99 ignoreNextEnter = false;
intrinseca 1:b3907b8d9f65 100 }
intrinseca 1:b3907b8d9f65 101
intrinseca 2:825f572902c6 102 //Handler for enter held, clear the menu retaining position
intrinseca 1:b3907b8d9f65 103 void Menu::done()
intrinseca 1:b3907b8d9f65 104 {
intrinseca 2:825f572902c6 105 //Hide the menu
intrinseca 1:b3907b8d9f65 106 display = false;
intrinseca 2:825f572902c6 107 //TODO: Can't remember why I needed this
intrinseca 1:b3907b8d9f65 108 ignoreNextEnter = true;
intrinseca 1:b3907b8d9f65 109 }
intrinseca 1:b3907b8d9f65 110
intrinseca 2:825f572902c6 111 //Handler for left button
intrinseca 1:b3907b8d9f65 112 void Menu::left()
intrinseca 1:b3907b8d9f65 113 {
intrinseca 2:825f572902c6 114 //If not editing, scroll
intrinseca 1:b3907b8d9f65 115 if(!edit && display && position > 0)
intrinseca 1:b3907b8d9f65 116 position--;
intrinseca 2:825f572902c6 117 //If editing, edit
intrinseca 1:b3907b8d9f65 118 else if(edit)
intrinseca 1:b3907b8d9f65 119 entries[position]->decrement();
intrinseca 1:b3907b8d9f65 120 }
intrinseca 1:b3907b8d9f65 121
intrinseca 2:825f572902c6 122 //Handler for left button held, start scrolling through menu.
intrinseca 1:b3907b8d9f65 123 void Menu::leftHeld()
intrinseca 1:b3907b8d9f65 124 {
intrinseca 1:b3907b8d9f65 125 left();
intrinseca 1:b3907b8d9f65 126 leftHeldTimeout.attach(this, &Menu::leftHeld, holdRepeatTime);
intrinseca 1:b3907b8d9f65 127 }
intrinseca 1:b3907b8d9f65 128
intrinseca 2:825f572902c6 129 //Handler for left button release, stop scrolling
intrinseca 1:b3907b8d9f65 130 void Menu::cancelLeftHeld()
intrinseca 1:b3907b8d9f65 131 {
intrinseca 1:b3907b8d9f65 132 leftHeldTimeout.detach();
intrinseca 1:b3907b8d9f65 133 }
intrinseca 1:b3907b8d9f65 134
intrinseca 2:825f572902c6 135 //Same as left
intrinseca 1:b3907b8d9f65 136 void Menu::right()
intrinseca 1:b3907b8d9f65 137 {
intrinseca 1:b3907b8d9f65 138 if(!edit && display && position < entryCount)
intrinseca 1:b3907b8d9f65 139 position++;
intrinseca 1:b3907b8d9f65 140 else if(edit)
intrinseca 1:b3907b8d9f65 141 entries[position]->increment();
intrinseca 1:b3907b8d9f65 142 }
intrinseca 1:b3907b8d9f65 143
intrinseca 2:825f572902c6 144 //Same as left
intrinseca 1:b3907b8d9f65 145 void Menu::rightHeld()
intrinseca 1:b3907b8d9f65 146 {
intrinseca 1:b3907b8d9f65 147 right();
intrinseca 1:b3907b8d9f65 148 rightHeldTimeout.attach(this, &Menu::rightHeld, holdRepeatTime);
intrinseca 1:b3907b8d9f65 149 }
intrinseca 1:b3907b8d9f65 150
intrinseca 2:825f572902c6 151 //Same as left
intrinseca 1:b3907b8d9f65 152 void Menu::cancelRightHeld()
intrinseca 1:b3907b8d9f65 153 {
intrinseca 1:b3907b8d9f65 154 rightHeldTimeout.detach();
intrinseca 1:b3907b8d9f65 155 }