ahmed ahmed
/
Nadia_ComGPS_1
Decod Msg GPS
Fork of ComGPS by
Diff: GPS_Decod_Function/DecMsgGPGGA.h
- 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