version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

menu.cpp

Committer:
Dannis_mbed
Date:
2015-06-26
Revision:
1:b4a0d63db637
Parent:
0:81b21910454e
Child:
2:f6d058931b17

File content as of revision 1:b4a0d63db637:

#include "menu.h"
#include "string.h"

#define DEVICE_ID   201

// Contructor
Menu::Menu() : 
           uiCounter(0),
           bMenu(1),
           bReadHeight(0),
           bError(0)           
        {
            init();
        };

Menu::~Menu()
{
};

extern Menu mLCDMenu; 
extern SystemVar svSoF;
extern Serial debug;
extern CAN CANbus;
//////////////////////////////////////////////////////////////////////////////////////
// init                                                                             //
////////////////////////////////////////////////////////////////////////////////////// 
void Menu::init(void)
{
    memset (cTextLine1,' ',16);
    memset (cTextLine2,' ',16);
}
//////////////////////////////////////////////////////////////////////////////////////
// set's                                                                            //
////////////////////////////////////////////////////////////////////////////////////// 

//////////////////////////////////////////////////////////////////////////////////////
// get's                                                                            //
////////////////////////////////////////////////////////////////////////////////////// 
char* Menu::getLine1(void)
{
     static char* pLine1;
     pLine1 = cTextLine1;
     return pLine1;
}

char* Menu::getLine2(void)
{
     static char* pLine2;
     pLine2 = cTextLine2;
     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;
    int length = strlen(cTextLine2);
    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::vShowScreen(SCREEN_t s)
{
    screen = s;
    uiCounter = rand()% 100 + 1;
    switch(screen)
    {
        case _INIT:             strcpy(cTextLine1," Solar on Foils ");
                                strcpy(cTextLine2,"   Initialize   "); 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," Solar on Foils ");
                                strcpy(cTextLine2," system ACTIVE  "); 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," Solar on Foils ");
                                strcpy(cTextLine2," CAN INITIALIZE "); break;
                            
        case _CANOK:            strcpy(cTextLine2,"   System OK    "); break;
         
        case _CANID101OK:       strcpy(cTextLine1,"    PORT FOIL   "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID102OK:       strcpy(cTextLine1,"   STARB FOIL   "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID201OK:       strcpy(cTextLine1,"   PORT HEIGHT  "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID202OK:       strcpy(cTextLine1,"  STARB HEIGHT  "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID205OK:       strcpy(cTextLine1,"    GYRO/GPS    "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID1001OK:      strcpy(cTextLine1,"    EXTERN UI   "); 
                                strcpy(cTextLine2,"     CAN OK     "); break;
        case _CANID101FAIL:     strcpy(cTextLine1,"    PORT FOIL   "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
        case _CANID102FAIL:     strcpy(cTextLine1,"   STARB FOIL   "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
        case _CANID201FAIL:     strcpy(cTextLine1,"   PORT HEIGHT  "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
        case _CANID202FAIL:     strcpy(cTextLine1,"  STARB HEIGHT  "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
        case _CANID205FAIL:     strcpy(cTextLine1,"    GYRO/GPS    "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
        case _CANID1001FAIL:    strcpy(cTextLine1,"    EXTERN UI   "); 
                                strcpy(cTextLine2,"    CAN FAIL    "); break;
                            
        case _CANFAIL:          strcpy(cTextLine2,"   System FAIL  "); break;
                            
        case _CANNORESPONSE:    strcpy(cTextLine2," No CAN responce"); break;
        
        case _PULSE_IS:         strcpy(cTextLine1,"Pulse is:       ");
//                                char *intStr = itoa(uiCounter);
                                //string str = string(intStr); 
//                                strcpy(cTextLine2, intStr);  // about to test
        break;
        case _IMUREADY:         strcpy(cTextLine1,"MPU9150 is ready"); break; 
        
        case _IMUFAIL:          strcpy(cTextLine1,"MPU9150init fail"); break;  
        
        case _ROLLTEST:         svSoF.cShowValue(_ROLL);
                                strcpy(cTextLine1," Confirm to end ");
                                strcpy(cTextLine2,"Roll: ");
                                if(svSoF.iGetRollPolarity()!= 0) strcat(cTextLine2,"+");
                                else strcat(cTextLine2,"-");
                                strcat(cTextLine2, svSoF.getValue());
                                strcat(cTextLine2,"\xDF"); 
                                vFillString2(); break;  
                                
        case _PITCHTEST:        svSoF.cShowValue(_PITCH);
                                strcpy(cTextLine1," Confirm to end ");
                                strcpy(cTextLine2,"Pitch:");
                                if(svSoF.iGetPitchPolarity()!= 0) strcat(cTextLine2,"+");
                                else strcat(cTextLine2,"-");
                                strcat(cTextLine2, svSoF.getValue());
                                strcat(cTextLine2,"\xDF"); 
                                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
}