Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ComGPS by
GPS_Decod_Function/DecMsgGPGGA.h@1:821bd360ec5b, 2015-03-03 (annotated)
- Committer:
- pfe
- Date:
- Tue Mar 03 13:35:34 2015 +0000
- Revision:
- 1:821bd360ec5b
- Child:
- 2:4cf92185ed38
Decod Msg GPS
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 | /* UserWR_buffer[0]++; |
| pfe | 1:821bd360ec5b | 158 | //----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 159 | UserWR_buffer[1] = hh; |
| pfe | 1:821bd360ec5b | 160 | UserWR_buffer[2] = mm; |
| pfe | 1:821bd360ec5b | 161 | UserWR_buffer[3] = ss; |
| pfe | 1:821bd360ec5b | 162 | //----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 163 | UserWR_buffer[4] = LatDeg; |
| pfe | 1:821bd360ec5b | 164 | UserWR_buffer[5] = LatMin; |
| pfe | 1:821bd360ec5b | 165 | UserWR_buffer[6] = LatMin1; |
| pfe | 1:821bd360ec5b | 166 | UserWR_buffer[7] = LatMin2; |
| pfe | 1:821bd360ec5b | 167 | UserWR_buffer[8] = LatDir; |
| pfe | 1:821bd360ec5b | 168 | //----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 169 | UserWR_buffer[9] = LongDeg; |
| pfe | 1:821bd360ec5b | 170 | UserWR_buffer[10] = LongMin; |
| pfe | 1:821bd360ec5b | 171 | UserWR_buffer[11] = LongMin1; |
| pfe | 1:821bd360ec5b | 172 | UserWR_buffer[12] = LongMin2; |
| pfe | 1:821bd360ec5b | 173 | UserWR_buffer[13] = LongDir; |
| pfe | 1:821bd360ec5b | 174 | //----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 175 | UserWR_buffer[14] = Qual; |
| pfe | 1:821bd360ec5b | 176 | //----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 177 | UserWR_buffer[15] = HMSL_H; |
| pfe | 1:821bd360ec5b | 178 | UserWR_buffer[16] = HMSL_L; |
| pfe | 1:821bd360ec5b | 179 | UserWR_buffer[17] = HMSL_1; |
| pfe | 1:821bd360ec5b | 180 | UserWR_buffer[18] = HMSL_2; |
| pfe | 1:821bd360ec5b | 181 | UserWR_buffer[19] = SignHMSL; |
| pfe | 1:821bd360ec5b | 182 | UserWR_buffer[20] = HUnite; |
| pfe | 1:821bd360ec5b | 183 | // ----------------------------------------------------------------------------- |
| pfe | 1:821bd360ec5b | 184 | */ |
| pfe | 1:821bd360ec5b | 185 | LabFin: |
| pfe | 1:821bd360ec5b | 186 | return MSG_GPGGA_Valid; |
| pfe | 1:821bd360ec5b | 187 | } |
