Release 1.01

Dependents:   mbed_escm2000

Revision:
4:7226c43320b5
Parent:
3:8395f7ab6d3e
Child:
5:9f4d4f8ffc00
--- 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);
     
 }