Dashboard firmware for FBR2012
Dependencies: mbed TextLCD PinDetect
src/Menu.cpp@8:e59084742552, 2013-02-19 (annotated)
- Committer:
- intrinseca
- Date:
- Tue Feb 19 22:05:53 2013 +0000
- Revision:
- 8:e59084742552
- Parent:
- 2:825f572902c6
Update libraries
Who changed what in which revision?
User | Revision | Line number | New 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 | } |