ahmed ahmed
/
Nadia_ComGPS_1
Decod Msg GPS
Fork of ComGPS by
GPS_Decod_Function/DecMsgGPGGA.h@2:4cf92185ed38, 2015-04-08 (annotated)
- Committer:
- pfe
- Date:
- Wed Apr 08 08:32:31 2015 +0000
- Revision:
- 2:4cf92185ed38
- Parent:
- 1:821bd360ec5b
sss
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pfe | 1:821bd360ec5b | 1 | unsigned short DecodageGPGGA(unsigned short *P_MsgGPS,unsigned short Ldata) //------------------------------------------------------- |
pfe | 1:821bd360ec5b | 2 | { |
pfe | 1:821bd360ec5b | 3 | unsigned short CommaNbr; |
pfe | 1:821bd360ec5b | 4 | unsigned short ii,jj; |
pfe | 1:821bd360ec5b | 5 | MSG_GPGGA_Valid = 0; |
pfe | 1:821bd360ec5b | 6 | P0_Msg=P_MsgGPS; |
pfe | 1:821bd360ec5b | 7 | P_Msg =P0_Msg; |
pfe | 1:821bd360ec5b | 8 | ii = 0; |
pfe | 1:821bd360ec5b | 9 | if(*P_Msg!='G')goto LabFin; |
pfe | 1:821bd360ec5b | 10 | P_Msg++; |
pfe | 1:821bd360ec5b | 11 | if(*P_Msg!='P')goto LabFin; |
pfe | 1:821bd360ec5b | 12 | P_Msg++; |
pfe | 1:821bd360ec5b | 13 | if(*P_Msg!='G')goto LabFin; |
pfe | 1:821bd360ec5b | 14 | P_Msg++; |
pfe | 1:821bd360ec5b | 15 | if(*P_Msg!='G')goto LabFin; |
pfe | 1:821bd360ec5b | 16 | P_Msg++; |
pfe | 1:821bd360ec5b | 17 | if(*P_Msg!='A')goto LabFin; |
pfe | 1:821bd360ec5b | 18 | |
pfe | 1:821bd360ec5b | 19 | P_Msg = P0_Msg; |
pfe | 1:821bd360ec5b | 20 | |
pfe | 1:821bd360ec5b | 21 | CommaNbr = 0; |
pfe | 1:821bd360ec5b | 22 | for(ii=0;ii<Ldata;ii++) |
pfe | 1:821bd360ec5b | 23 | { |
pfe | 1:821bd360ec5b | 24 | if(*P_Msg==',') |
pfe | 1:821bd360ec5b | 25 | { |
pfe | 1:821bd360ec5b | 26 | PosV[CommaNbr] = ii; |
pfe | 1:821bd360ec5b | 27 | CommaNbr++; |
pfe | 1:821bd360ec5b | 28 | } |
pfe | 1:821bd360ec5b | 29 | P_Msg++; |
pfe | 1:821bd360ec5b | 30 | } |
pfe | 1:821bd360ec5b | 31 | if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA |
pfe | 1:821bd360ec5b | 32 | //par le nombre des vergules |
pfe | 1:821bd360ec5b | 33 | //UTC of position |
pfe | 1:821bd360ec5b | 34 | //extraction du temps UTC |
pfe | 1:821bd360ec5b | 35 | jj=0;//Identification de la position de la première virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 36 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 37 | if(DL!=9) goto LabFin;//Vérification de la longueur du message de temps |
pfe | 1:821bd360ec5b | 38 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 39 | Validation_StrToFloat(DL); |
pfe | 1:821bd360ec5b | 40 | if(Npt !=1) goto LabFin; |
pfe | 1:821bd360ec5b | 41 | if(Pospt!=6) goto LabFin; |
pfe | 1:821bd360ec5b | 42 | //Vérification de Time "hhmmss" |
pfe | 1:821bd360ec5b | 43 | hh=10*(Data[0]-48)+(Data[1]-48);//Extraction de l'heur |
pfe | 1:821bd360ec5b | 44 | mm=10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes |
pfe | 1:821bd360ec5b | 45 | ss=10*(Data[4]-48)+(Data[5]-48);//Extraction des secondes |
pfe | 1:821bd360ec5b | 46 | if((hh>24)||(mm>59)||(ss>59))goto LabFin; |
pfe | 1:821bd360ec5b | 47 | |
pfe | 1:821bd360ec5b | 48 | // 03 byte |
pfe | 1:821bd360ec5b | 49 | //Latitude of position |
pfe | 1:821bd360ec5b | 50 | //extraction du Lattitude |
pfe | 1:821bd360ec5b | 51 | jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 52 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 53 | if(DL!=10) goto LabFin;//Vérification de la longueur du message de lattitude |
pfe | 1:821bd360ec5b | 54 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 55 | Validation_StrToFloat(DL); |
pfe | 1:821bd360ec5b | 56 | if(Npt !=1) goto LabFin; |
pfe | 1:821bd360ec5b | 57 | if(Pospt!=4) goto LabFin; |
pfe | 1:821bd360ec5b | 58 | |
pfe | 1:821bd360ec5b | 59 | //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2" |
pfe | 1:821bd360ec5b | 60 | LatDeg =10*(Data[0]-48)+(Data[1]-48);//Extraction des degrés du lattitude |
pfe | 1:821bd360ec5b | 61 | LatMin =10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes du lattitude |
pfe | 1:821bd360ec5b | 62 | LatMin1=10*(Data[5]-48)+(Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude |
pfe | 1:821bd360ec5b | 63 | LatMin2=10*(Data[7]-48)+(Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude |
pfe | 1:821bd360ec5b | 64 | if((LatDeg>90)||(LatMin>59)||(LatMin1>99)||(LatMin2>99))goto LabFin; |
pfe | 1:821bd360ec5b | 65 | |
pfe | 1:821bd360ec5b | 66 | // 04 byte |
pfe | 1:821bd360ec5b | 67 | //Vérification de la direction du Lattitude LatDir(N ou S) |
pfe | 1:821bd360ec5b | 68 | jj=2;//Identification de la position de la troisième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 69 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 70 | if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude |
pfe | 1:821bd360ec5b | 71 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 72 | LatDir=Data[0];//Extraction de le direction du latitude |
pfe | 1:821bd360ec5b | 73 | if((LatDir!='N')&&(LatDir!='S'))goto LabFin; |
pfe | 1:821bd360ec5b | 74 | |
pfe | 1:821bd360ec5b | 75 | // 01 byte |
pfe | 1:821bd360ec5b | 76 | //Longitude of position |
pfe | 1:821bd360ec5b | 77 | //extraction de la Longitude |
pfe | 1:821bd360ec5b | 78 | jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 79 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 80 | if(DL!=11) goto LabFin;//Vérification de la longueur du message de la longitude |
pfe | 1:821bd360ec5b | 81 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 82 | Validation_StrToFloat(DL); |
pfe | 1:821bd360ec5b | 83 | if(Npt !=1) goto LabFin; |
pfe | 1:821bd360ec5b | 84 | if(Pospt!=5) goto LabFin; |
pfe | 1:821bd360ec5b | 85 | |
pfe | 1:821bd360ec5b | 86 | //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2" |
pfe | 1:821bd360ec5b | 87 | LongDeg =100*(Data[0]-48)+10*(Data[1]-48)+(Data[2]-48);//Extraction des degrés de la longitude |
pfe | 1:821bd360ec5b | 88 | LongMin =10*(Data[3]-48)+(Data[4]-48);//Extraction des minutes de la longitude |
pfe | 1:821bd360ec5b | 89 | LongMin1=10*(Data[6]-48)+(Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude |
pfe | 1:821bd360ec5b | 90 | LongMin2=10*(Data[8]-48)+(Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude |
pfe | 1:821bd360ec5b | 91 | if((LongDeg>180)||(LongMin>59)||(LongMin1>99)||(LongMin2>99))goto LabFin; |
pfe | 1:821bd360ec5b | 92 | |
pfe | 1:821bd360ec5b | 93 | // 04 byte |
pfe | 1:821bd360ec5b | 94 | //Vérification de la direction du Longitude LonDir(E ou W) |
pfe | 1:821bd360ec5b | 95 | jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 96 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 97 | if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude |
pfe | 1:821bd360ec5b | 98 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 99 | LongDir=Data[0];//Extraction de le direction de la longitude |
pfe | 1:821bd360ec5b | 100 | if((LongDir!='E')&&(LongDir!='W'))goto LabFin; |
pfe | 1:821bd360ec5b | 101 | |
pfe | 1:821bd360ec5b | 102 | // 01 byte |
pfe | 1:821bd360ec5b | 103 | //GPS Quality indicator |
pfe | 1:821bd360ec5b | 104 | jj=5;//Identification de la position de la sixième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 105 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 106 | if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS |
pfe | 1:821bd360ec5b | 107 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 108 | Validation_StrToFloat(DL); |
pfe | 1:821bd360ec5b | 109 | if(Npt !=0) goto LabFin; |
pfe | 1:821bd360ec5b | 110 | if(Pospt!=0) goto LabFin; |
pfe | 1:821bd360ec5b | 111 | Qual=Data[0]-48;//Extraction de l'information de la qualité du MsgGPs |
pfe | 1:821bd360ec5b | 112 | if((Qual<1)||(Qual>2))goto LabFin; |
pfe | 1:821bd360ec5b | 113 | |
pfe | 1:821bd360ec5b | 114 | // 01 byte |
pfe | 1:821bd360ec5b | 115 | //Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2" . |
pfe | 1:821bd360ec5b | 116 | jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 117 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 118 | if(DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude |
pfe | 1:821bd360ec5b | 119 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 120 | SignHMSL='+'; |
pfe | 1:821bd360ec5b | 121 | if(Data[0]=='-') |
pfe | 1:821bd360ec5b | 122 | { |
pfe | 1:821bd360ec5b | 123 | DL=DL-1; |
pfe | 1:821bd360ec5b | 124 | SignHMSL='-'; |
pfe | 1:821bd360ec5b | 125 | for(ii=0;ii<DL;ii++) Data[ii]=Data[ii+1]; |
pfe | 1:821bd360ec5b | 126 | } |
pfe | 1:821bd360ec5b | 127 | Validation_StrToFloat(DL); |
pfe | 1:821bd360ec5b | 128 | if(Npt !=1) goto LabFin; |
pfe | 1:821bd360ec5b | 129 | if(Pospt ==0) goto LabFin; |
pfe | 1:821bd360ec5b | 130 | |
pfe | 1:821bd360ec5b | 131 | switch (Pospt) |
pfe | 1:821bd360ec5b | 132 | { |
pfe | 1:821bd360ec5b | 133 | case 1: {HMSL_L = (Data[0]-48) ; HMSL_H = 0; break;} |
pfe | 1:821bd360ec5b | 134 | case 2: {HMSL_L = (Data[1]-48)+10*(Data[0]-48); HMSL_H = 0; break;} |
pfe | 1:821bd360ec5b | 135 | case 3: {HMSL_L = (Data[2]-48)+10*(Data[1]-48); HMSL_H = (Data[0]-48); break;} |
pfe | 1:821bd360ec5b | 136 | case 4: {HMSL_L = (Data[3]-48)+10*(Data[2]-48); HMSL_H = (Data[1]-48)+10*(Data[0]-48); break;} |
pfe | 1:821bd360ec5b | 137 | default : break; |
pfe | 1:821bd360ec5b | 138 | } |
pfe | 1:821bd360ec5b | 139 | DL=DL-Pospt-1; //La longure de chiffre après la virgule |
pfe | 1:821bd360ec5b | 140 | switch (DL) |
pfe | 1:821bd360ec5b | 141 | { |
pfe | 1:821bd360ec5b | 142 | case 1: {HMSL_1 = (Data[Pospt+1]-48) ; HMSL_2 = 0; break;} |
pfe | 1:821bd360ec5b | 143 | case 2: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 0; break;} |
pfe | 1:821bd360ec5b | 144 | case 3: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = Data[Pospt+3]-48; break;} |
pfe | 1:821bd360ec5b | 145 | 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;} |
pfe | 1:821bd360ec5b | 146 | default : break; |
pfe | 1:821bd360ec5b | 147 | } |
pfe | 1:821bd360ec5b | 148 | // 05 byte |
pfe | 1:821bd360ec5b | 149 | //Antenna height unit |
pfe | 1:821bd360ec5b | 150 | jj=9;//Identification de la position de la dixième virgule dans le MsgGPS |
pfe | 1:821bd360ec5b | 151 | DL=Get_Length(jj); |
pfe | 1:821bd360ec5b | 152 | if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur |
pfe | 1:821bd360ec5b | 153 | Set_Data(jj); |
pfe | 1:821bd360ec5b | 154 | HUnite=Data[0];//Extraction de l'unité de la hauteur |
pfe | 1:821bd360ec5b | 155 | if((HMSL_H>35)||(HUnite!='M'))goto LabFin; |
pfe | 1:821bd360ec5b | 156 | MSG_GPGGA_Valid=1; |
pfe | 1:821bd360ec5b | 157 | LabFin: |
pfe | 1:821bd360ec5b | 158 | return MSG_GPGGA_Valid; |
pfe | 1:821bd360ec5b | 159 | } |