Decod Msg GPS

Dependencies:   C12832 mbed

Fork of ComGPS by SAADI Nadia

GPS_Decod_Function/DecMsgGPGGA.h

Committer:
pfe
Date:
2015-04-08
Revision:
2:4cf92185ed38
Parent:
1:821bd360ec5b

File content as of revision 2:4cf92185ed38:

unsigned short DecodageGPGGA(unsigned short *P_MsgGPS,unsigned short Ldata)  //-------------------------------------------------------
{
    unsigned short CommaNbr;
    unsigned short ii,jj;
    MSG_GPGGA_Valid = 0;
    P0_Msg=P_MsgGPS;
    P_Msg =P0_Msg;
    ii = 0;
    if(*P_Msg!='G')goto LabFin;
    P_Msg++;
    if(*P_Msg!='P')goto LabFin;
    P_Msg++;
    if(*P_Msg!='G')goto LabFin;
    P_Msg++;
    if(*P_Msg!='G')goto LabFin;
    P_Msg++;
    if(*P_Msg!='A')goto LabFin;

    P_Msg      = P0_Msg;    
    
    CommaNbr = 0;
    for(ii=0;ii<Ldata;ii++)
    {
     if(*P_Msg==',')
      {
        PosV[CommaNbr] = ii;
        CommaNbr++;
      }
      P_Msg++;
    }
    if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA
                                //par le nombre des vergules
//UTC of position
    //extraction du temps UTC
    jj=0;//Identification de la position de la première virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=9) goto LabFin;//Vérification de la longueur du message de temps
    Set_Data(jj);
    Validation_StrToFloat(DL);
    if(Npt  !=1)    goto LabFin;
    if(Pospt!=6)    goto LabFin;
    //Vérification de Time "hhmmss"
    hh=10*(Data[0]-48)+(Data[1]-48);//Extraction de l'heur
    mm=10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes
    ss=10*(Data[4]-48)+(Data[5]-48);//Extraction des secondes
    if((hh>24)||(mm>59)||(ss>59))goto LabFin;

    // 03 byte
//Latitude of position
    //extraction du Lattitude
    jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=10) goto LabFin;//Vérification de la longueur du message de lattitude
    Set_Data(jj);
    Validation_StrToFloat(DL);
    if(Npt  !=1)    goto LabFin;
    if(Pospt!=4)    goto LabFin;
    
    //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2"
    LatDeg =10*(Data[0]-48)+(Data[1]-48);//Extraction des degrés du lattitude
    LatMin =10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes du lattitude
    LatMin1=10*(Data[5]-48)+(Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
    LatMin2=10*(Data[7]-48)+(Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
    if((LatDeg>90)||(LatMin>59)||(LatMin1>99)||(LatMin2>99))goto LabFin;
    
    // 04 byte
    //Vérification de la direction du Lattitude LatDir(N ou S)
    jj=2;//Identification de la position de la troisième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude
    Set_Data(jj);
    LatDir=Data[0];//Extraction de le direction du latitude
    if((LatDir!='N')&&(LatDir!='S'))goto LabFin;

    // 01 byte
//Longitude of position
    //extraction de la Longitude
    jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=11) goto LabFin;//Vérification de la longueur du message de la longitude
    Set_Data(jj);
    Validation_StrToFloat(DL);
    if(Npt  !=1)    goto LabFin;
    if(Pospt!=5)    goto LabFin;

    //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2"
    LongDeg =100*(Data[0]-48)+10*(Data[1]-48)+(Data[2]-48);//Extraction des degrés de la longitude
    LongMin =10*(Data[3]-48)+(Data[4]-48);//Extraction des minutes de la longitude
    LongMin1=10*(Data[6]-48)+(Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
    LongMin2=10*(Data[8]-48)+(Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
    if((LongDeg>180)||(LongMin>59)||(LongMin1>99)||(LongMin2>99))goto LabFin;

    // 04 byte
    //Vérification de la direction du Longitude LonDir(E ou W)
    jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude
    Set_Data(jj);
    LongDir=Data[0];//Extraction de le direction de la longitude
    if((LongDir!='E')&&(LongDir!='W'))goto LabFin;

    // 01 byte
//GPS Quality indicator
    jj=5;//Identification de la position de la sixième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS
    Set_Data(jj);
    Validation_StrToFloat(DL);
    if(Npt  !=0)    goto LabFin;
    if(Pospt!=0)    goto LabFin;
    Qual=Data[0]-48;//Extraction de l'information de la qualité du MsgGPs
    if((Qual<1)||(Qual>2))goto LabFin;

    // 01 byte
//Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2"  .
    jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude
    Set_Data(jj);
    SignHMSL='+';
    if(Data[0]=='-')
    {
      DL=DL-1;
      SignHMSL='-';
      for(ii=0;ii<DL;ii++) Data[ii]=Data[ii+1];
    }
    Validation_StrToFloat(DL);
    if(Npt   !=1)  goto LabFin;
    if(Pospt ==0)  goto LabFin;
    
    switch (Pospt)
     {
      case 1: {HMSL_L = (Data[0]-48)                ; HMSL_H = 0; break;}
      case 2: {HMSL_L = (Data[1]-48)+10*(Data[0]-48); HMSL_H = 0; break;}
      case 3: {HMSL_L = (Data[2]-48)+10*(Data[1]-48); HMSL_H = (Data[0]-48); break;}
      case 4: {HMSL_L = (Data[3]-48)+10*(Data[2]-48); HMSL_H = (Data[1]-48)+10*(Data[0]-48); break;}
      default : break;
     }
    DL=DL-Pospt-1; //La longure de chiffre après la virgule
    switch (DL)
     {
      case 1: {HMSL_1 = (Data[Pospt+1]-48)                      ; HMSL_2 = 0; break;}
      case 2: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 0; break;}
      case 3: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = Data[Pospt+3]-48; break;}
      case 4: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 10*(Data[Pospt+3]-48)+Data[Pospt+4]-48; break;}
      default : break;
     }
    // 05 byte
    //Antenna height unit
    jj=9;//Identification de la position de la dixième virgule dans le MsgGPS
    DL=Get_Length(jj);
    if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur
    Set_Data(jj);
    HUnite=Data[0];//Extraction de l'unité de la hauteur
    if((HMSL_H>35)||(HUnite!='M'))goto LabFin;
    MSG_GPGGA_Valid=1;
LabFin:
return MSG_GPGGA_Valid;
}