Ahmed_PFE_Embarq_300415

Dependencies:   C12832 LM75B mbed

Fork of Ahmed_Embarq_Prog by ahmed ahmed

Revision:
1:197b9fed6092
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/_GPS/Dec_GPS.cpp	Thu Apr 30 12:24:33 2015 +0000
@@ -0,0 +1,195 @@
+#include "Dec_GPS.h"
+
+ unsigned char _DL,_Npt,_Pospt;
+ unsigned char _Data[16],_PosV[16];
+ unsigned char _MsgGPSRx[100];   
+
+//------------------------------------------------------------------------------
+//Calcul de la longueur des sous message
+unsigned char Get_Length(unsigned short index)
+ {
+    static unsigned char LongData;
+    LongData=_PosV[index+1]-_PosV[index]-1;
+    return LongData;
+ }
+//Décomposition du message en Sub message
+void Set_Data(unsigned char index){
+    static unsigned char ii,jj;
+    static unsigned char Start,End;
+    ii=0;
+    Start = _PosV[index]+1;    
+    End   = _PosV[index+1];  
+    
+    for(jj=Start;jj<End;jj++){
+       _Data[ii] = _MsgGPSRx[jj];      
+       ii++;
+    }
+ } 
+//Vérification des sub message
+void Validation_StrToFloat(unsigned char LongData)
+ {
+    unsigned char ii;
+    _Npt   = 0;
+    _Pospt = 0;
+    for(ii=0;ii<LongData;ii++){
+       if(_Data[ii]=='.')
+        {
+          _Npt++;
+          _Pospt=ii;
+        }
+        else if((_Data[ii]<48)||(_Data[ii]>57)) _Npt=_Npt+2;
+     }
+ }
+
+void DecodageGPGGA(unsigned char *_MsgGPS_Rx,unsigned char Ldata, StructGPS *GpsData)
+{
+    static unsigned char CommaNbr;
+    static unsigned char ii,jj;
+    StructGPS L_GpsData;
+    
+    unsigned char _hh,_mm,_ss;
+    unsigned char _LatDeg,_LatMin,_LatMin1,_LatMin2,_LatDir;
+    unsigned char _LonDeg,_LonMin,_LonMin1,_LonMin2,_LonDir;
+    unsigned char _Qual;
+    unsigned char _HMSL_L,_HMSL_H;
+    char          _SignHMSL,_HUnite;
+    float         _fLatGpsDD,_fLonGpsDD;
+     
+    ii=0;
+    while(ii<=Ldata){
+     _MsgGPSRx[ii]=*_MsgGPS_Rx;
+     _MsgGPS_Rx++;
+     ii++;
+    }
+    L_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"
+    _LonDeg =100*(_Data[0]-48)+10*(_Data[1]-48)+(_Data[2]-48);//Extraction des degrés de la longitude
+    _LonMin =10*(_Data[3]-48)+(_Data[4]-48);//Extraction des minutes de la longitude
+    _LonMin1=10*(_Data[6]-48)+(_Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    _LonMin2=10*(_Data[8]-48)+(_Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    if((_LonDeg>180)||(_LonMin>59)||(_LonMin1>99)||(_LonMin2>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);
+    _LonDir=_Data[0];//Extraction de le direction de la longitude
+    if((_LonDir!='E')&&(_LonDir!='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;
+    }
+    //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;
+
+          L_GpsData.hh = _hh;
+          L_GpsData.mm = _mm;
+          L_GpsData.ss = _ss;
+         //----------------------------------------------------------------------------
+          L_GpsData.LatDeg   = _LatDeg;
+         //-----------------------------------------------------------------------------
+          _fLatGpsDD = 1000000.0*_LatDeg+100000.0*_LatMin/6.0+10.0*(_LatMin1*100+_LatMin2)/6.0;
+          _fLonGpsDD = 1000000.0*_LonDeg+100000.0*_LonMin/6.0+10.0*(_LonMin1*100+_LonMin2)/6.0;
+          
+          L_GpsData.LatDeg = (_fLatGpsDD);//*0.99998537);
+          L_GpsData.LonDeg = (_fLonGpsDD);//*0.99981997);              
+         //-----------------------------------------------------------------------------
+          L_GpsData.Qual     = _Qual;
+         //-----------------------------------------------------------------------------
+          L_GpsData.HMSL     = _HMSL_H*100+_HMSL_L;
+          if (_SignHMSL=='-') L_GpsData.HMSL = -L_GpsData.HMSL;          
+          L_GpsData.GGA_Valid = 1;
+          *GpsData=L_GpsData;
+LabFin:
+asm{NOP}
+}
\ No newline at end of file