can't push chnages :(

Fork of FBRDash by Michael Allan

Revision:
1:b3907b8d9f65
Child:
2:825f572902c6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Menu.cpp	Mon Jun 25 21:01:02 2012 +0000
@@ -0,0 +1,131 @@
+#include "Menu.h"
+#include "mbed.h"
+#include <string>
+
+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()
+{
+    char labelLeft = (!edit & position > 0)?leftArrow:' ';
+    char labelRight = (!edit & position < entryCount)?rightArrow:' ';
+    char editIndic = (entries[position]->editable)?'*':' ';
+
+    screen->locate(0, 0);
+    
+    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);
+    }
+    else
+    {
+        screen->printf("%cReturn                         ", leftArrow);
+    }
+}
+
+void Menu::enter()
+{
+    if(!display && !ignoreNextEnter)
+    {   
+        display = true;
+        edit = false;
+    }
+    else
+    {
+        if(position <= entryCount - 1)
+        {
+            if(entries[position]->editable)
+                edit = !edit;
+        }
+        else
+        {
+            position = 0;
+            done();
+        }
+    }
+    
+    ignoreNextEnter = false;
+}
+
+void Menu::done()
+{
+    display = false;
+    ignoreNextEnter = true;
+}
+
+void Menu::left()
+{
+    if(!edit && display && position > 0)
+        position--;
+    else if(edit)
+        entries[position]->decrement();
+}
+
+void Menu::leftHeld()
+{
+    left();
+    leftHeldTimeout.attach(this, &Menu::leftHeld, holdRepeatTime);
+}
+
+void Menu::cancelLeftHeld()
+{
+    leftHeldTimeout.detach();
+}
+
+void Menu::right()
+{
+    if(!edit && display && position < entryCount)
+        position++;
+    else if(edit)
+        entries[position]->increment();
+}
+
+void Menu::rightHeld()
+{
+    right();
+    rightHeldTimeout.attach(this, &Menu::rightHeld, holdRepeatTime);
+}
+
+void Menu::cancelRightHeld()
+{
+    rightHeldTimeout.detach();
+}
\ No newline at end of file