Decod Msg GPS

Dependencies:   C12832 mbed

Fork of ComGPS by SAADI Nadia

Revision:
1:821bd360ec5b
Child:
2:4cf92185ed38
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_Decod_Function/DecMsgGPGGA.h	Tue Mar 03 13:35:34 2015 +0000
@@ -0,0 +1,187 @@
+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;
+ /*   UserWR_buffer[0]++;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[1] = hh;
+    UserWR_buffer[2] = mm;
+    UserWR_buffer[3] = ss;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[4] = LatDeg;
+    UserWR_buffer[5] = LatMin;
+    UserWR_buffer[6] = LatMin1;
+    UserWR_buffer[7] = LatMin2;
+    UserWR_buffer[8] = LatDir;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[9]  = LongDeg;
+    UserWR_buffer[10] = LongMin;
+    UserWR_buffer[11] = LongMin1;
+    UserWR_buffer[12] = LongMin2;
+    UserWR_buffer[13] = LongDir;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[14] = Qual;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[15] = HMSL_H;
+    UserWR_buffer[16] = HMSL_L;
+    UserWR_buffer[17] = HMSL_1;
+    UserWR_buffer[18] = HMSL_2;
+    UserWR_buffer[19] = SignHMSL;
+    UserWR_buffer[20] = HUnite;
+// -----------------------------------------------------------------------------
+*/
+LabFin:
+return MSG_GPGGA_Valid;
+}
\ No newline at end of file