Ahmed_PFE_Embarq_300415

Dependencies:   C12832 LM75B mbed

Fork of Ahmed_Embarq_Prog by ahmed ahmed

Revision:
0:05a20e3e3179
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/_GPS/DecMsgGPGGA.h	Tue Apr 21 10:16:20 2015 +0000
@@ -0,0 +1,149 @@
+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}
+}
\ No newline at end of file