version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

Revision:
2:f6d058931b17
Parent:
1:b4a0d63db637
--- a/menu.cpp	Fri Jun 26 09:21:33 2015 +0000
+++ b/menu.cpp	Tue Aug 11 08:38:55 2015 +0000
@@ -64,21 +64,38 @@
 ////////////////////////////////////////////////////////////////////////////////////// 
 void Menu::vRotaryUp(void)
 {
+    if((nextMenu != _BACKBACK)||(nextMenu != _BACKHOME)) backToFrom = nextMenu;     // remember previous menu exept back and home
     if(bMenu) vSelectMenu(nextMenu);
+    else if(!bMenu)
+    {
+        svSoF.vIncrease(valueToChange);   // to construct
+        vSelectMenu(nextMenu);
+    }
     vCheckReadHeight();
-    //debug.printf("rotary up %i\r\n", nextMenu);  
+    //debug.printf("backToFrom %i\r\n", backToFrom);  
 }
 
 void Menu::vRotaryDown(void)
 {
+    if((nextMenu != _BACKBACK)||(nextMenu != _BACKHOME)) backToFrom = nextMenu;     // remember previous menu exept back and home
     if(bMenu) vSelectMenu(prevMenu);
+    else if(!bMenu)
+    {
+        svSoF.vDecrease(valueToChange);   // to construct
+        vSelectMenu(nextMenu);
+    }
     vCheckReadHeight();
-    //debug.printf("rotary down %i\r\n", prevMenu); 
+    //debug.printf("backToFrom %i\r\n", backToFrom);
 }
 
 void Menu::vRotaryConfirm(void)
 {
     if(bMenu) vSelectMenu(confMenu);
+    else if (!bMenu) 
+    {
+        bMenu = true;
+        vSelectMenu(confMenu);
+    }
     //debug.printf("rotary confirm\r\n"); 
 }
 
@@ -96,7 +113,7 @@
     for (i=length; i < 16; i++) strcat(cTextLine2," ");
 }
 
-void Menu::vCheckReadHeight(void)
+void Menu::vCheckReadHeight(void)       // used for project demo only
 {
      if(bReadHeight)
      { 
@@ -106,7 +123,7 @@
      else 
      {
         cStatus = 0x00;
-        CANbus.write(CANMessage(DEVICE_ID, &cStatus, 1)); // send clearance false  to port height
+        CANbus.write(CANMessage(DEVICE_ID, &cStatus, 1)); // send clearance false to port height
      }
 }
  
@@ -119,23 +136,132 @@
     uiCounter = rand()% 100 + 1;
     switch(screen)
     {
+//////////////////////////////////////////////////////////////////////////////////////
+// base screens                                                                     //
+//////////////////////////////////////////////////////////////////////////////////////        
         case _INIT:             strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2,"   Initialize   "); break;
         
         case _STANDBY:          strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2," system STANDBY "); break;
-                                
+        
+        case _ACTIVE:           strcpy(cTextLine1," Solar on Foils ");
+                                strcpy(cTextLine2," system ACTIVE  "); break;                        
+//////////////////////////////////////////////////////////////////////////////////////
+// menulayer 0 settings                                                             //
+//////////////////////////////////////////////////////////////////////////////////////                                
         case _SETTINGS0:        strcpy(cTextLine1,">Settings       ");
                                 strcpy(cTextLine2," View settings  "); break;
                                 
-        case _SETTINGS1:        strcpy(cTextLine1," Settings       ");
-                                strcpy(cTextLine2,">View settings  "); break;
+        case _SETTINGS1:        strcpy(cTextLine1,">View settings  ");
+                                strcpy(cTextLine2," Diagnosis      "); break;
                                 
         case _SETTINGS2:        strcpy(cTextLine1," View settings  ");
                                 strcpy(cTextLine2,">Diagnosis      "); break;
+
+//////////////////////////////////////////////////////////////////////////////////////
+// menulayer 1 settings                                                             //
+//////////////////////////////////////////////////////////////////////////////////////                                
+        case _SYSTEMVAR0:       strcpy(cTextLine1,">Safety margins ");
+                                strcpy(cTextLine2," Take-off speed "); break; 
         
-        case _ACTIVE:           strcpy(cTextLine1," Solar on Foils ");
-                                strcpy(cTextLine2," system ACTIVE  "); break;
+        case _SYSTEMVAR1:       strcpy(cTextLine1,">Take-off speed ");
+                                strcpy(cTextLine2," Height F-borne "); break; 
+                                
+        case _SYSTEMVAR2:       strcpy(cTextLine1,">Height f-borne ");
+                                strcpy(cTextLine2," Height f-assist"); break; 
+                                
+        case _SYSTEMVAR3:       strcpy(cTextLine1,">Height f-assist");
+                                strcpy(cTextLine2," AOA f-assist   "); break; 
+                                
+        case _SYSTEMVAR4:       strcpy(cTextLine1,">AOA f-assist   ");
+                                strcpy(cTextLine2," Back           "); break;
+                                                                                                 
+//////////////////////////////////////////////////////////////////////////////////////
+// menulayer 2 settings                                                             //
+//////////////////////////////////////////////////////////////////////////////////////
+        case _SYSTEMVARSELECT0: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">Roll angle     "); break;
+                                
+        case _SYSTEMVARSELECT1: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">Pitch angle    "); break;
+                                
+        case _SYSTEMVARSELECT2: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">Take-off speed "); break;
+                                
+        case _SYSTEMVARSELECT3: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">Height f-borne "); break;
+                                
+        case _SYSTEMVARSELECT4: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">Height f-assist"); break;
+                                
+        case _SYSTEMVARSELECT5: strcpy(cTextLine1," Agree to change");
+                                strcpy(cTextLine2,">AOA f-assist   "); break;
+
+//////////////////////////////////////////////////////////////////////////////////////
+// menulayer 2 settings                                                             //
+//////////////////////////////////////////////////////////////////////////////////////                                
+        case _MUTATESYSTEMVAR0: svSoF.cShowValue(_MAXROLL);
+                                strcpy(cTextLine1," max roll angle ");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"\xDF"); 
+                                vFillString2(); break; 
+                                
+        case _MUTATESYSTEMVAR1: svSoF.cShowValue(_MINPITCH);
+                                strcpy(cTextLine1," min pitch angle");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"\xDF"); 
+                                vFillString2(); break; 
+                                
+        case _MUTATESYSTEMVAR2: svSoF.cShowValue(_MAXPITCH);
+                                strcpy(cTextLine1," max pitch angle ");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"\xDF"); 
+                                vFillString2(); break;
+                                
+        case _MUTATESYSTEMVAR3: svSoF.cShowValue(_TAKEOFFSPEED);
+                                strcpy(cTextLine1,"  max T-O speed  ");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"knots"); 
+                                vFillString2(); break; 
+                                
+        case _MUTATESYSTEMVAR4: svSoF.cShowValue(_HEIGHTFOILBORNE);
+                                strcpy(cTextLine1," foilborne height");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"cm."); 
+                                vFillString2(); break;
+                                
+        case _MUTATESYSTEMVAR5: svSoF.cShowValue(_HEIGHTFOILASSIST);
+                                strcpy(cTextLine1," f-assist height ");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"cm."); 
+                                vFillString2(); break;
+                                
+        case _MUTATESYSTEMVAR6: svSoF.cShowValue(_AOAFOILASSIST);
+                                strcpy(cTextLine1," AOA foil assist ");
+                                strcpy(cTextLine2,"     ");
+                                strcat(cTextLine2, svSoF.getValue());
+                                strcat(cTextLine2,"\xDF"); 
+                                vFillString2(); break;                                                                                                                                                                                                                                                                                                                                            
+                               
+//////////////////////////////////////////////////////////////////////////////////////
+// Multiple used screens                                                            //
+//////////////////////////////////////////////////////////////////////////////////////         
+        case _BACK:             strcpy(cTextLine1,">Back           ");
+                                strcpy(cTextLine2," Home           "); break;
+                                 
+        case _HOME:             strcpy(cTextLine1," Back           ");
+                                strcpy(cTextLine2,">Home           "); break; 
+                                                                              
+//////////////////////////////////////////////////////////////////////////////////////
+// CAN messages                                                                     //
+////////////////////////////////////////////////////////////////////////////////////// 
                         
         case _FOILBORNE:        strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2," FOILBORNE mode "); break;
@@ -144,11 +270,14 @@
                                 strcpy(cTextLine2," FOILASSIST mode"); break;
                                 
         case _HOMESCREEN:       strcpy(cTextLine1," Solar on Foils ");
-                                strcpy(cTextLine2,">HOME           "); break;                       
+                                strcpy(cTextLine2,">Home           "); break;                                              
                                 
         case _PROGRESS:         strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2,"work in progress"); break;                        
-                        
+
+//////////////////////////////////////////////////////////////////////////////////////
+// CAN messages                                                                     //
+//////////////////////////////////////////////////////////////////////////////////////                         
         case _CANINIT:          strcpy(cTextLine1," Solar on Foils ");
                                 strcpy(cTextLine2," CAN INITIALIZE "); break;
                             
@@ -188,10 +317,17 @@
                                 //string str = string(intStr); 
 //                                strcpy(cTextLine2, intStr);  // about to test
         break;
+        
+//////////////////////////////////////////////////////////////////////////////////////
+// IMU messages                                                                     //
+//////////////////////////////////////////////////////////////////////////////////////         
         case _IMUREADY:         strcpy(cTextLine1,"MPU9150 is ready"); break; 
         
-        case _IMUFAIL:          strcpy(cTextLine1,"MPU9150init fail"); break;  
-        
+        case _IMUFAIL:          strcpy(cTextLine1,"MPU9150init fail"); break;
+          
+//////////////////////////////////////////////////////////////////////////////////////
+// Test screens                                                                     //
+//////////////////////////////////////////////////////////////////////////////////////         
         case _ROLLTEST:         svSoF.cShowValue(_ROLL);
                                 strcpy(cTextLine1," Confirm to end ");
                                 strcpy(cTextLine2,"Roll: ");
@@ -216,21 +352,16 @@
                                 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 
+                                vFillString2(); break;     
+    }   // End switch case    
     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
 }
 
 //////////////////////////////////////////////////////////////////////////////////////
@@ -243,27 +374,65 @@
     {
         case _MENU0_0:              mLCDMenu.vShowScreen(_INIT); nextMenu = _MENU0_1; break;
         
-        case _MENU0_1:              mLCDMenu.vShowScreen(_STANDBY); nextMenu = _MENU0_2; break;
+        case _MENU0_1:              mLCDMenu.vShowScreen(_STANDBY); nextMenu =  prevMenu = confMenu = _MENU0_2; break;
         
-        case _MENU0_2:              mLCDMenu.vShowScreen(_SETTINGS0); nextMenu = _MENU0_3; prevMenu = _MENU0_4; confMenu = _MENU1_2; break;
+        case _MENU0_2:              mLCDMenu.vShowScreen(_SETTINGS0); nextMenu = _MENU0_3; prevMenu = _MENU0_4; confMenu = _MENU1_20; 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_20:             mLCDMenu.vShowScreen(_SYSTEMVAR0); nextMenu = _MENU1_21; prevMenu = _MENU1_20; confMenu = _MENU2_20; break;
+        
+        case _MENU1_21:             mLCDMenu.vShowScreen(_SYSTEMVAR1); nextMenu = _MENU1_22; prevMenu = _MENU1_20; confMenu = _MENU2_21; break;
+        
+        case _MENU1_22:             mLCDMenu.vShowScreen(_SYSTEMVAR2); nextMenu = _MENU1_23; prevMenu = _MENU1_21; confMenu = _MENU2_22; break;
+                     
+        case _MENU1_23:             mLCDMenu.vShowScreen(_SYSTEMVAR3); nextMenu = _MENU1_24; prevMenu = _MENU1_22; confMenu = _MENU2_23; break;
+        
+        case _MENU1_24:             mLCDMenu.vShowScreen(_SYSTEMVAR4); nextMenu = _BACKBACK; prevMenu = _MENU1_23; confMenu = _MENU2_24; break;
+        
+        case _MENU2_20:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT0); nextMenu = _MENU2_21; prevMenu = _MENU2_20; confMenu = _MENU3_20; valueToChange = _MAXROLL; break;
+        
+        case _MENU2_21:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT1); nextMenu = _MENU2_22; prevMenu = _MENU2_20; confMenu = _MENU3_21; valueToChange = _MINPITCH; break;
+        
+        case _MENU2_22:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT2); nextMenu = _MENU2_23; prevMenu = _MENU2_21; confMenu = _MENU3_23; valueToChange = _TAKEOFFSPEED; break;
+        
+        case _MENU2_23:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT3); nextMenu = _MENU2_24; prevMenu = _MENU2_22; confMenu = _MENU3_24; valueToChange = _HEIGHTFOILBORNE; break;
+        
+        case _MENU2_24:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT4); nextMenu = _MENU2_25; prevMenu = _MENU2_23; confMenu = _MENU3_25; valueToChange = _HEIGHTFOILASSIST; break;
         
-        case _MENU1_4:              mLCDMenu.vShowScreen(_PROGRESS); nextMenu = _MENU0_2; prevMenu = _MENU0_3; confMenu = _MENU1_2; break;
+        case _MENU2_25:             mLCDMenu.vShowScreen(_SYSTEMVARSELECT5); nextMenu = _BACKBACK; prevMenu = _MENU2_24; confMenu = _MENU3_26; valueToChange = _AOAFOILASSIST; break;
+        
+        // system variabele aanpassen
+        case _MENU3_20:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR0); confMenu = _MENU2_20; break;
+        
+        case _MENU3_21:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR1); confMenu = _MENU3_22; valueToChange = _MAXPITCH; break;
+        
+        case _MENU3_22:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR2); confMenu = _MENU2_21; break;
+        
+        case _MENU3_23:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR3); confMenu = _MENU2_22; break;
         
-        case _MENU1_31:             mLCDMenu.vShowScreen(_ROLLTEST); nextMenu = _MENU1_32; prevMenu = _HOME; confMenu = _MENU1_31; break;
+        case _MENU3_24:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR4); confMenu = _MENU2_23; break;
+        
+        case _MENU3_25:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR5); confMenu = _MENU2_24; break;
+        
+        case _MENU3_26:             bMenu = false; mLCDMenu.vShowScreen(_MUTATESYSTEMVAR6); confMenu = _MENU2_25; break;
+        
+        
+        case _MENU1_4:              mLCDMenu.vShowScreen(_PROGRESS); nextMenu = _MENU0_2; prevMenu = _MENU0_3; confMenu = _MENU1_20; break;
+        
+        case _MENU1_31:             mLCDMenu.vShowScreen(_ROLLTEST); nextMenu = _MENU1_32; prevMenu = _BACKHOME; 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 _MENU1_34:             mLCDMenu.vShowScreen(_HEIGHTTEST); bReadHeight = true; nextMenu = _BACKHOME; prevMenu = _MENU1_33; confMenu = _MENU1_34; break;
+        // Todo confMenu to previous menu layer
+        case _BACKBACK:             mLCDMenu.vShowScreen(_BACK); bReadHeight = false; nextMenu = _BACKHOME; prevMenu = backToFrom; confMenu = _MENU0_2; break;
         
-        case _HOME:                 mLCDMenu.vShowScreen(_HOMESCREEN); bReadHeight = false; nextMenu = _MENU1_31; prevMenu = _MENU1_34; confMenu = _MENU0_2; break;
+        case _BACKHOME:             mLCDMenu.vShowScreen(_HOME); bReadHeight = false; nextMenu = _BACKHOME; prevMenu = _BACKBACK; confMenu = _MENU0_2; break;
         
     }//end switch
 }