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/main.cpp	Tue Jun 23 13:55:28 2015 +0000
+++ b/main.cpp	Fri Jun 26 09:21:33 2015 +0000
@@ -31,7 +31,7 @@
 #include "Servo.h"
 #include "mRotaryEncoder.h"
 #include "MainModule.h"
-#include "LCD_Menu.h"
+//#include "LCD_Menu.h"
 #include "menu.h"
 #include "systemVar.h"
 
@@ -43,12 +43,17 @@
 #define PROJECT "\033[1;10fSolar on Foils\n"
 #define VERSION "\033[2;10fVersion 1.0\n"
 
+#define EXT_UI_ID               20
 #define ACTUATOR_PORT_ID        101
 #define ACTUATOR_STARB_ID       102
+#define ACTUATOR_PORT_RUN       103
+#define ACTUATOR_STARB_RUN      104
 #define HEIGHT_PORT_ID          201
 #define HEIGHT_STARB_ID         202
+#define HEIGHT_PORT_DATA        203
+#define HEIGHT_STARB_DATA       204
 #define GYRO_GPS_ID             205
-#define EXT_UI_ID               20
+#define EXT_UI_HEIGHT           1020 
 #define MESSAGE_ALL             2000
 #define PORT_ACT_DIAGN          2001
 #define STARB_ACT_DIAGN         2002
@@ -123,6 +128,7 @@
 int thisGet;
 int iFilter;
 uint32_t uiFilterId;
+  
 
 bool enc_pressed = false;       // Button of rotaryencoder was pressed
 bool enc_rotated = false;       // rotary encoder was totaded left or right
@@ -132,6 +138,8 @@
 char cBuffer[200];
 char cMessage;
 char text[16];
+char cPTurns[2] ={0};
+char cSTurns[2] ={0};
 //char buffer[16];
 
 float   fRoll, fPitch, fEulerRoll;
@@ -192,7 +200,7 @@
     
     // put text on lcd
     
-    //mLCDMenu.cShowScreen(_FOILBORNE);
+    //mLCDMenu.vShowScreen(_FOILBORNE);
     //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine1(), 2, 1);
     
 //////////////////////////////////////////////////////////////////////////////////////
@@ -206,17 +214,47 @@
         // rotary switch confirm pressed?
         if (enc_pressed) vSwitchConfirmed();
         
-        // answer on id#1003
+        // answer CAN
+        if(CANbus.read(msg)){
+            if (msg.id == EXT_UI_HEIGHT) svSoF.vVarHeightFoilBorne((uint32_t) msg.data[0]);
+        }    
         if(CANbus.read(msg)){
-            if ((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) statusLed = ! statusLed;
+            debug.printf("ID: %i.\t", msg.id);
+            if ((msg.id == HEIGHT_PORT_DATA)&&(mLCDMenu.bGetReadHeight() == true))
+            { 
+                svSoF.vSetPHeight((uint32_t) msg.data[0]);
+                debug.printf("height received: %c cm\r\n", msg.data[0]);
+            }
+            //if ((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) statusLed = ! statusLed;
             //debug.printf("ID#102 received: %d answer.\r\n", msg.data[0]);
         }
         
-        if(timer.read_ms() > 500)
+        if(timer.read_ms() > 250)
         {
             timer.reset();
+            if(svSoF.uiGetRoll() >= 4)
+            {
+                if(svSoF.iGetRollPolarity() == 0)
+                {
+                   cPTurns[1] = 1;
+                   cSTurns[1] = 0;
+                }
+                else
+                {
+                   cPTurns[1] = 0;
+                   cSTurns[1] = 1;
+                } 
+                cPTurns[0] = 1;
+                cSTurns[0] = 1;
+            
+                CANbus.write(CANMessage(ACTUATOR_PORT_RUN, cPTurns, 2)); // send message to port actuator
+                wait(0.15);
+                CANbus.write(CANMessage(ACTUATOR_STARB_RUN, cSTurns, 2)); // send message to port actuator           
+                
+            }//end if
             svSoF.vSetPitch(q1);                                 // call function class SystemVar
-            mLCDMenu.cShowScreen(_PITCHTEST);
+            svSoF.vSetRoll(q1);
+            mLCDMenu.vShowScreen(mLCDMenu.getScreen());
             vLCD_update();
             
             //debug.printf("Roll: %c\t", svSoF.getValue());
@@ -465,7 +503,7 @@
     debug.baud(115200);
     // initialize LCD
     vLCD_init_I2C();
-    mLCDMenu.cShowScreen(_INIT);
+    mLCDMenu.vSelectMenu(_MENU0_0);
     vLCD_update();
       
     // led's out
@@ -497,8 +535,8 @@
 //////////////////////////////////////////////////////////////////////////////////////
 void vInitImu (void)
 {
-    if(imu.isReady()) mLCDMenu.cShowScreen(_IMUREADY);
-    else  mLCDMenu.cShowScreen(_IMUFAIL);
+    if(imu.isReady()) mLCDMenu.vShowScreen(_IMUREADY);
+    else  mLCDMenu.vShowScreen(_IMUFAIL);
     vLCD_update();
         
     imu.initialiseDMP();
@@ -543,24 +581,24 @@
                 debug.printf("can.read(msg) ID: %i\r\n", id);
                 debug.printf("can.msg id: %i, %i\r\n", msg.id, msg.data[0]);
                 switch(id){
-                    case PORT_ACT_DIAGN:        if((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID101OK); break;
-                    case STARB_ACT_DIAGN:       if((msg.id == ACTUATOR_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID102OK); break;
-                    case PORT_HGHT_DIAGN:       if((msg.id == HEIGHT_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID201OK); break;
-                    case STARB_HGHT_DIAGN:      if((msg.id == HEIGHT_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID202OK); break;
-                    case GYRO_GPS_DIAGN:        if((msg.id == GYRO_GPS_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID205OK); break;
-                    case EXT_UI_DIAGN:          if((msg.id == EXT_UI_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID1001OK); break;                                                                                      
+                    case PORT_ACT_DIAGN:        if((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID101OK); break;
+                    case STARB_ACT_DIAGN:       if((msg.id == ACTUATOR_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID102OK); break;
+                    case PORT_HGHT_DIAGN:       if((msg.id == HEIGHT_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID201OK); break;
+                    case STARB_HGHT_DIAGN:      if((msg.id == HEIGHT_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID202OK); break;
+                    case GYRO_GPS_DIAGN:        if((msg.id == GYRO_GPS_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID205OK); break;
+                    case EXT_UI_DIAGN:          if((msg.id == EXT_UI_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.vShowScreen(_CANID1001OK); break;                                                                                      
                 } //end switch
                 vLCD_update();
                 bReceived = true;
             } //end if
             else if(iTry == 1){
                 switch(id){
-                    case PORT_ACT_DIAGN:        mLCDMenu.cShowScreen(_CANID101FAIL); break;
-                    case STARB_ACT_DIAGN:       mLCDMenu.cShowScreen(_CANID102FAIL); break;
-                    case PORT_HGHT_DIAGN:       mLCDMenu.cShowScreen(_CANID201FAIL); break;
-                    case STARB_HGHT_DIAGN:      mLCDMenu.cShowScreen(_CANID202FAIL); break;
-                    case GYRO_GPS_DIAGN:        mLCDMenu.cShowScreen(_CANID205FAIL); break;
-                    case EXT_UI_DIAGN:          mLCDMenu.cShowScreen(_CANID1001FAIL); break;                                                                                      
+                    case PORT_ACT_DIAGN:        mLCDMenu.vShowScreen(_CANID101FAIL); break;
+                    case STARB_ACT_DIAGN:       mLCDMenu.vShowScreen(_CANID102FAIL); break;
+                    case PORT_HGHT_DIAGN:       mLCDMenu.vShowScreen(_CANID201FAIL); break;
+                    case STARB_HGHT_DIAGN:      mLCDMenu.vShowScreen(_CANID202FAIL); break;
+                    case GYRO_GPS_DIAGN:        mLCDMenu.vShowScreen(_CANID205FAIL); break;
+                    case EXT_UI_DIAGN:          mLCDMenu.vShowScreen(_CANID1001FAIL); break;                                                                                      
                 } //end switch
                 vLCD_update();
             } //end if
@@ -578,9 +616,13 @@
     // in case system fail
     if(bSystemFail){ 
         vCallEmergencyLed();
-        mLCDMenu.cShowScreen(_CANNORESPONSE);
-        vLCD_update();
-    } 
+        mLCDMenu.vShowScreen(_CANNORESPONSE);
+    }
+    cMessage = (char) svSoF.iGetHeightFoilBorne();
+    CANbus.write(CANMessage(EXT_UI_HEIGHT, &cMessage, 1));
+    
+    mLCDMenu.vSelectMenu(_MENU0_0);
+    vLCD_update();
     debug.printf("end can init");  
 }
 
@@ -718,17 +760,16 @@
 void vSwitchRotated (void)
 {
     enc_rotated = false;
+    
     // get value from rotary encoder
     thisGet = rSwitch.Get();
-    //if(rSwitch.Get()<0)
-    //debug.printf("negatief \r\n");
-    //else if(rSwitch.Get()>=0)
-    //debug.printf("positief \r\n");
-    // --- show for development ---
-    mLCDMenu.cShowScreen(_PULSE_IS);
+    
+    if(rSwitch.Get()<0) mLCDMenu.vRotaryDown();
+    else if(rSwitch.Get()>=0) mLCDMenu.vRotaryUp();
+    
+    // reset switch count
+    vResetSwitch();
     vLCD_update();
-    
-    //vLCD_printInt_I2C(thisGet, 1, 11);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////
@@ -736,20 +777,14 @@
 //////////////////////////////////////////////////////////////////////////////////////
 void vSwitchConfirmed (void)
 {
-    static char cTurns[2] ={0};                             //[value][direction]
     enc_pressed = false;
     
-    cTurns[0] = 10;//abs(rSwitch.Get());                         // send absolute value
-    if(rSwitch.Get()>=0) cTurns[1] = CW;                    // CW
-    else cTurns[1] = CCW;                                   // CCW
-    CANbus.write(CANMessage(ACTUATOR_STARB_ID, cTurns, 2)); // send message to port actuator
-    CANbus.write(CANMessage(ACTUATOR_PORT_ID, cTurns, 2)); // send message to port actuator
+    mLCDMenu.vRotaryConfirm();
+    
     // reset switch count
     vResetSwitch();
-    // get value from rotary encoder
-    thisGet = rSwitch.Get();
-    // --- show for development ---
-    //vLCD_printInt_I2C(thisGet, 1, 11);
+    
+    vLCD_update();
 }
 
 //////////////////////////////////////////////////////////////////////////////////////