Release 1.01
Diff: Menu.cpp
- Revision:
- 4:7226c43320b5
- Parent:
- 3:8395f7ab6d3e
- Child:
- 5:9f4d4f8ffc00
diff -r 8395f7ab6d3e -r 7226c43320b5 Menu.cpp --- a/Menu.cpp Thu Jul 25 00:42:49 2019 +0000 +++ b/Menu.cpp Thu Sep 12 11:27:50 2019 +0000 @@ -1,147 +1,234 @@ #include "mbed.h" #include "Menu.h" -#include "Selection.h" +#include "ESCMControlApp.h" + +Menu* Menu::currentMenu = NULL; + + +Menu * Menu::getCurrentMenu () +{ + return currentMenu; +} + +Menu * Menu::setCurrentMenu (Menu * value) +{ + + printf("\n Goto Menu :%s ", value->getText() ); + currentMenu = value; + currentMenu->init(); + return currentMenu; +} + Menu::Menu(char *id) : menuID(id), parent(NULL),update_needed(1) { - selections.clear(); + children.clear(); + + selectedMenu = 0; // default menu + update_needed = 1; } -Menu::Menu(string id) : menuID(id), parent(NULL),update_needed(1) +void Menu::add(Menu *submenu) { - selections.clear(); + submenu->parent = this; + children.push_back(submenu); } -void Menu::add(const Selection &toAdd) + +void Menu::init() { - selections.push_back(toAdd); + update_needed=1; +} + +void Menu::select(void) +{ + Menu::setCurrentMenu ( children[selectedMenu]) ; } -void Menu::select(void) +void Menu::back() +{ + if (parent != NULL ) + { + Menu::setCurrentMenu (parent); + } + else + { + printf("ERROR: missing parent "); + } +} +void Menu::DrawDisplay(LCD * lcd) { + this->lcd = lcd; + + static unsigned long time_max = 0 ; + unsigned long time_delta = 0; + unsigned long time_ms1 = us_ticker_read() / 1000L; + + + lock(); + display(lcd); + unlock(); + + unsigned long time_ms2 = us_ticker_read() / 1000L; + + time_delta = time_ms2-time_ms1; + if (time_max < time_delta ) + { + time_max = time_delta; + printf("Tmax=%d\n\r", time_max); + } + } void Menu::display(LCD * lcd) -{ - lcd->writeLine(0,"Default Menu"); -#if 0 - for ( int i=0; i< lcd->rows();i++) - { - if ( i < selections.size()) - { - //if (i==cursorLine) { - // lcd->character(i,0,'>'); - //} - fprintf(stdout, "(%d) i = %s\n\r", selections[i].getText()); - lcd->writeLine(i,selections[i].getText()); +{ + static int top = 1; + static int bottom = 3; + static int size = children.size(); + + // paging + if (selectedMenu < top ) + { + top = selectedMenu ; + bottom = selectedMenu + 2; + update_needed=1; + } + else if (selectedMenu > bottom) + { + top = selectedMenu - 2; + bottom = selectedMenu; + update_needed=1; + } + else + { + + } + + if (update_needed) { + + lcd->cls(); + lcd->locate(0,0); +#if 1 + lcd->printf("ESCM Controller"); +#else + + lcd->printf("(%d,%d,%d)", top,selectedMenu,size); +#endif + displayVersion(lcd); + + for ( int i=0; i< 3;i++) + { + int index = top + i; + int line = (1+i); + int selected = (selectedMenu == index); + + lcd->locate(line,0); + + if (selected) + lcd->printf(">%s",children[index]->getText()); + else + lcd->printf(" %s",children[index]->getText()); + } + + update_needed = 0; } -#endif + + displayCurrentTime(lcd); + } void Menu::moveUp() { + cursorLine--; - if (cursorLine < 0 ) { - cursorLine = lcd->rows() -1 ; - //if (top > 0 ) top -=4; // page menu if needed - } - - - if(cursorPos > 0) + selectedMenu--; + + if(selectedMenu < 0) { - cursorPos--; - } + selectedMenu = children.size()-1; + } - printCursor(); - //printMenu(); - - - printf ("UP:%d %d ", cursorLine , cursorPos ); + if (cursorLine < 1 ) + cursorLine = 1; + + + update_needed = 1; } void Menu::moveDown() { + cursorLine++; + selectedMenu++; - cursorLine++; - if (cursorLine >= lcd->rows() ) { - cursorLine = 0; - //if (top < activeMenu->selections.size() ) top +=4; // page menu if needed - } - - if(cursorPos < selections.size()){ - cursorPos++; + if(selectedMenu >= children.size()) + { + selectedMenu=0; } - printCursor(); - //printMenu(); + if (cursorLine > 3 ) + cursorLine = 3; + + update_needed = 1; - printf ("DOWN:%d %d ", - cursorLine , cursorPos ); } void Menu::pressMode() { - + select(); } void Menu::pressSet() { - + select(); } void Menu::pressUp() { - + moveUp(); } void Menu::pressDown() { - + moveDown(); } - void Menu::pressClear() { - + back(); } - -void Menu::printMenu() -{ - for (int i=0;i<lcd->rows();i++) - { - if ((i) < selections.size()) - { - lcd->writeLine(i,selections[i].selText); - } - else - { - lcd->writeLine(i,""); - } - } +void Menu::displayVersion (LCD * lcd) +{ - lcd->dump(NULL); + + lcd->locate(3,35); + lcd->printf("v0.01"); } - -void Menu::printCursor() -{ - - for(int i=0;i<lcd->rows();i++) - { - lcd->locate(i,0); - - if (i==cursorLine) { - lcd->character(i,0,'>'); - } - else - { - lcd->character(i,0,' '); - } - } +void Menu::displayCurrentTime (LCD * lcd) +{ + + time_t rawtime; + struct tm * timeinfo; + + int cur_hours,cur_mins,cur_secs,cur_year,cur_month,cur_day; + + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); timeinfo = localtime (&rawtime); - lcd->dump(NULL); + cur_hours = timeinfo->tm_hour; + cur_mins = timeinfo->tm_min; + cur_secs = timeinfo->tm_sec; + cur_year = timeinfo->tm_year+1900; + cur_month = timeinfo->tm_mon + 1; + cur_day = timeinfo->tm_mday; + + lcd->locate(0,20); + lcd->printf(" %02d:%02d:%02d %02d/%02d/%04d", cur_hours, cur_mins, cur_secs, cur_month, cur_day, cur_year); + + lcd->locate(1,33); + lcd->printf("Addr=%02d",escmController.cur_address); }