ahmed ahmed
/
Nadia_ComGPS_1
Decod Msg GPS
Fork of ComGPS by
GPS_Decod_Function/DecMsgGPGGA.h
- Committer:
- pfe
- Date:
- 2015-04-08
- Revision:
- 2:4cf92185ed38
- Parent:
- 1:821bd360ec5b
File content as of revision 2:4cf92185ed38:
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; LabFin: return MSG_GPGGA_Valid; }