dd

Dependencies:   C12832 LM75B mbed

_GPS/DecMsgGPGGA.h

Committer:
pfe
Date:
2015-04-21
Revision:
0:05a20e3e3179

File content as of revision 0:05a20e3e3179:

void DecodageGPGGA(unsigned char Ldata)  //-------------------------------------------------------
{
    static unsigned short CommaNbr;
    static unsigned short ii,jj;
    GpsData.GGA_Valid  = 0;
    CommaNbr = 0;
    for(ii=0;ii<Ldata;ii++)
    {
     if(_MsgGPSRx[ii]==',')
      {
        _PosV[CommaNbr] = ii;
        CommaNbr++;
      }
    }
    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)||(_DL>10)) 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;
//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<9)||(_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;
    //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<10)||(_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;
    //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;
//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;
//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;
    }    
    //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;
    
          GpsData.GGA_Valid = 1;
          GpsData.hh = _hh;
          GpsData.mm = _mm;
          GpsData.ss = _ss;
         //----------------------------------------------------------------------------
          GpsData.LatDeg   = _LatDeg;
          GpsData.LatMin   = _LatMin;
          GpsData.Latmmmm  = _LatMin1*100+_LatMin2;
          GpsData.LatDir   = _LatDir;
         //-----------------------------------------------------------------------------
          GpsData.LongDeg  = _LongDeg;
          GpsData.LongMin  = _LongMin;
          GpsData.Longmmmm = _LongMin1*100+_LongMin2;
          GpsData.LongDir  = _LongDir;
         //-----------------------------------------------------------------------------
          GpsData.Qual     = _Qual;
         //-----------------------------------------------------------------------------
          GpsData.HMSL     = _HMSL_H*100+_HMSL_L;
          GpsData.SignHMSL = _SignHMSL;
          GpsData.HUnite   = _HUnite;
LabFin:
asm{NOP}
}