version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

Revision:
1:b4a0d63db637
Parent:
0:81b21910454e
Child:
2:f6d058931b17
--- a/menu.cpp	Tue Jun 23 13:55:28 2015 +0000
+++ b/menu.cpp	Fri Jun 26 09:21:33 2015 +0000
@@ -1,10 +1,13 @@
 #include "menu.h"
 #include "string.h"
 
+#define DEVICE_ID   201
 
 // Contructor
 Menu::Menu() : 
            uiCounter(0),
+           bMenu(1),
+           bReadHeight(0),
            bError(0)           
         {
             init();
@@ -14,8 +17,10 @@
 {
 };
 
+extern Menu mLCDMenu; 
 extern SystemVar svSoF;
 extern Serial debug;
+extern CAN CANbus;
 //////////////////////////////////////////////////////////////////////////////////////
 // init                                                                             //
 ////////////////////////////////////////////////////////////////////////////////////// 
@@ -45,9 +50,45 @@
      return pLine2;
 }
 
+SCREEN_t Menu::getScreen(void)
+{
+   return screen;    
+} 
+
+bool Menu::bGetReadHeight(void)
+{
+    return bReadHeight;
+}
 //////////////////////////////////////////////////////////////////////////////////////
 // other                                                                            //
 ////////////////////////////////////////////////////////////////////////////////////// 
+void Menu::vRotaryUp(void)
+{
+    if(bMenu) vSelectMenu(nextMenu);
+    vCheckReadHeight();
+    //debug.printf("rotary up %i\r\n", nextMenu);  
+}
+
+void Menu::vRotaryDown(void)
+{
+    if(bMenu) vSelectMenu(prevMenu);
+    vCheckReadHeight();
+    //debug.printf("rotary down %i\r\n", prevMenu); 
+}
+
+void Menu::vRotaryConfirm(void)
+{
+    if(bMenu) vSelectMenu(confMenu);
+    //debug.printf("rotary confirm\r\n"); 
+}
+
+void Menu::vFillString1(void)
+{
+    int i;
+    int length = strlen(cTextLine1);
+    for (i=length; i < 16; i++) strcat(cTextLine1," ");
+}
+
 void Menu::vFillString2(void)
 {
     int i;
@@ -55,11 +96,24 @@
     for (i=length; i < 16; i++) strcat(cTextLine2," ");
 }
 
+void Menu::vCheckReadHeight(void)
+{
+     if(bReadHeight)
+     { 
+        cStatus = 0xff;
+        CANbus.write(CANMessage(DEVICE_ID, &cStatus, 1)); // send clearance true to port height
+     }
+     else 
+     {
+        cStatus = 0x00;
+        CANbus.write(CANMessage(DEVICE_ID, &cStatus, 1)); // send clearance false  to port height
+     }
+}
+ 
 //////////////////////////////////////////////////////////////////////////////////////
 // show screens                                                                     //
 ////////////////////////////////////////////////////////////////////////////////////// 
-
-void Menu::cShowScreen(SCREEN_t s)
+void Menu::vShowScreen(SCREEN_t s)
 {
     screen = s;
     uiCounter = rand()% 100 + 1;
@@ -68,19 +122,37 @@
         case _INIT:             strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2,"   Initialize   "); break;
         
-        case _STANDBY:          strcpy(cTextLine1,"STANDBY");
-                                strcpy(cTextLine2," Solar on Foils "); break;
+        case _STANDBY:          strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," system STANDBY "); break;
+                                
+        case _SETTINGS0:        strcpy(cTextLine1,">Settings       ");
+                                strcpy(cTextLine2," View settings  "); break;
+                                
+        case _SETTINGS1:        strcpy(cTextLine1," Settings       ");
+                                strcpy(cTextLine2,">View settings  "); break;
+                                
+        case _SETTINGS2:        strcpy(cTextLine1," View settings  ");
+                                strcpy(cTextLine2,">Diagnosis      "); break;
         
-        case _ACTIVE:           strcpy(cTextLine1,"ACTIVE");
-                                strcpy(cTextLine2," Solar on Foils "); break;
+        case _ACTIVE:           strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," system ACTIVE  "); break;
                         
-        case _FOILBORNE:        strcpy(cTextLine1,"FOILBORNE");
-                                strcpy(cTextLine2," Solar on Foils "); break;
+        case _FOILBORNE:        strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," FOILBORNE mode "); break;
+                                
+        case _FOILASSIST:       strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," FOILASSIST mode"); break;
+                                
+        case _HOMESCREEN:       strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2,">HOME           "); break;                       
+                                
+        case _PROGRESS:         strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2,"work in progress"); break;                        
                         
-        case _CANINIT:          strcpy(cTextLine1,"CAN INITIALIZE");
-                                strcpy(cTextLine2," Solar on Foils "); break;
+        case _CANINIT:          strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," CAN INITIALIZE "); break;
                             
-        case _CANOK:            strcpy(cTextLine2,"System OK       "); break;
+        case _CANOK:            strcpy(cTextLine2,"   System OK    "); break;
          
         case _CANID101OK:       strcpy(cTextLine1,"    PORT FOIL   "); 
                                 strcpy(cTextLine2,"     CAN OK     "); break;
@@ -136,13 +208,63 @@
                                 else strcat(cTextLine2,"-");
                                 strcat(cTextLine2, svSoF.getValue());
                                 strcat(cTextLine2,"\xDF"); 
-                                vFillString2(); break;                                     
+                                vFillString2(); break;
+                                
+        case _HEIGHTTEST:       svSoF.cShowValue(_PHEIGHT);
+                                strcpy(cTextLine1," Confirm to end ");
+                                strcpy(cTextLine2,"Port:");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2," cm.");
+                                vFillString2(); break;
+                                
+                                
+        case _SHOWHEIGHTFB:     svSoF.cShowValue(_HEIGHTFOILBORNE);
+                                strcpy(cTextLine1," Confirm to end ");
+                                strcpy(cTextLine2,"Height:"); 
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2," cm."); 
+                                vFillString2(); break;                                   
         
     }   // End switch case
     //debug.printf("strlen %i\t", strlen(cTextLine2)); // debug stringlength 
     if(strlen(cTextLine1) > 18) strcpy(cTextLine1," Line overflow  ");
     if(strlen(cTextLine2) > 18) strcpy(cTextLine2," Line overflow  ");
                                 // \xDF for degree sign.
+                                // "\x18\x19\x1a\x1b" arrows
 }
 
+//////////////////////////////////////////////////////////////////////////////////////
+// select menu screens                                                              //
+//////////////////////////////////////////////////////////////////////////////////////
+void Menu::vSelectMenu(MENU_t m)
+{
+    menu = m;
+    switch(menu)
+    {
+        case _MENU0_0:              mLCDMenu.vShowScreen(_INIT); nextMenu = _MENU0_1; break;
+        
+        case _MENU0_1:              mLCDMenu.vShowScreen(_STANDBY); nextMenu = _MENU0_2; break;
+        
+        case _MENU0_2:              mLCDMenu.vShowScreen(_SETTINGS0); nextMenu = _MENU0_3; prevMenu = _MENU0_4; confMenu = _MENU1_2; break;
+        
+        case _MENU0_3:              mLCDMenu.vShowScreen(_SETTINGS1); nextMenu = _MENU0_4; prevMenu = _MENU0_2; confMenu = _MENU1_31; break;
+        
+        case _MENU0_4:              mLCDMenu.vShowScreen(_SETTINGS2); nextMenu = _MENU0_2; prevMenu = _MENU0_3; confMenu = _MENU1_4; break;
+        
+        case _MENU1_2:              mLCDMenu.vShowScreen(_PROGRESS); nextMenu = _MENU0_2; prevMenu = _MENU0_3; confMenu = _MENU1_2; break;
+        
+        case _MENU1_4:              mLCDMenu.vShowScreen(_PROGRESS); nextMenu = _MENU0_2; prevMenu = _MENU0_3; confMenu = _MENU1_2; break;
+        
+        case _MENU1_31:             mLCDMenu.vShowScreen(_ROLLTEST); nextMenu = _MENU1_32; prevMenu = _HOME; confMenu = _MENU1_31; break;
+        
+        case _MENU1_32:             mLCDMenu.vShowScreen(_PITCHTEST); nextMenu = _MENU1_33; prevMenu = _MENU1_31; confMenu = _MENU1_32; break;
+        
+        case _MENU1_33:             mLCDMenu.vShowScreen(_SHOWHEIGHTFB); bReadHeight = false; nextMenu = _MENU1_34; prevMenu = _MENU1_32; confMenu = _MENU1_33; break;
+        
+        case _MENU1_34:             mLCDMenu.vShowScreen(_HEIGHTTEST); bReadHeight = true; nextMenu = _HOME; prevMenu = _MENU1_33; confMenu = _MENU1_34; break;
+        
+        case _HOME:                 mLCDMenu.vShowScreen(_HOMESCREEN); bReadHeight = false; nextMenu = _MENU1_31; prevMenu = _MENU1_34; confMenu = _MENU0_2; break;
+        
+    }//end switch
+}