dd
Dependencies: C12832 LM75B mbed
_GPS/DecMsgGPGGA.h@0:05a20e3e3179, 2015-04-21 (annotated)
- Committer:
- pfe
- Date:
- Tue Apr 21 10:16:20 2015 +0000
- Revision:
- 0:05a20e3e3179
dd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pfe | 0:05a20e3e3179 | 1 | void DecodageGPGGA(unsigned char Ldata) //------------------------------------------------------- |
pfe | 0:05a20e3e3179 | 2 | { |
pfe | 0:05a20e3e3179 | 3 | static unsigned short CommaNbr; |
pfe | 0:05a20e3e3179 | 4 | static unsigned short ii,jj; |
pfe | 0:05a20e3e3179 | 5 | GpsData.GGA_Valid = 0; |
pfe | 0:05a20e3e3179 | 6 | CommaNbr = 0; |
pfe | 0:05a20e3e3179 | 7 | for(ii=0;ii<Ldata;ii++) |
pfe | 0:05a20e3e3179 | 8 | { |
pfe | 0:05a20e3e3179 | 9 | if(_MsgGPSRx[ii]==',') |
pfe | 0:05a20e3e3179 | 10 | { |
pfe | 0:05a20e3e3179 | 11 | _PosV[CommaNbr] = ii; |
pfe | 0:05a20e3e3179 | 12 | CommaNbr++; |
pfe | 0:05a20e3e3179 | 13 | } |
pfe | 0:05a20e3e3179 | 14 | } |
pfe | 0:05a20e3e3179 | 15 | if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA |
pfe | 0:05a20e3e3179 | 16 | //par le nombre des vergules |
pfe | 0:05a20e3e3179 | 17 | //UTC of position |
pfe | 0:05a20e3e3179 | 18 | //extraction du temps UTC |
pfe | 0:05a20e3e3179 | 19 | jj=0;//Identification de la position de la première virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 20 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 21 | if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de temps |
pfe | 0:05a20e3e3179 | 22 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 23 | Validation_StrToFloat(_DL); |
pfe | 0:05a20e3e3179 | 24 | if(_Npt !=1) goto LabFin; |
pfe | 0:05a20e3e3179 | 25 | if(_Pospt!=6) goto LabFin; |
pfe | 0:05a20e3e3179 | 26 | //Vérification de Time "hhmmss" |
pfe | 0:05a20e3e3179 | 27 | _hh=10*(_Data[0]-48)+(_Data[1]-48);//Extraction de l'heur |
pfe | 0:05a20e3e3179 | 28 | _mm=10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes |
pfe | 0:05a20e3e3179 | 29 | _ss=10*(_Data[4]-48)+(_Data[5]-48);//Extraction des secondes |
pfe | 0:05a20e3e3179 | 30 | if((_hh>24)||(_mm>59)||(_ss>59))goto LabFin; |
pfe | 0:05a20e3e3179 | 31 | //Latitude of position |
pfe | 0:05a20e3e3179 | 32 | //extraction du Lattitude |
pfe | 0:05a20e3e3179 | 33 | jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 34 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 35 | if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de lattitude |
pfe | 0:05a20e3e3179 | 36 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 37 | Validation_StrToFloat(_DL); |
pfe | 0:05a20e3e3179 | 38 | if(_Npt !=1) goto LabFin; |
pfe | 0:05a20e3e3179 | 39 | if(_Pospt!=4) goto LabFin; |
pfe | 0:05a20e3e3179 | 40 | |
pfe | 0:05a20e3e3179 | 41 | //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2" |
pfe | 0:05a20e3e3179 | 42 | _LatDeg =10*(_Data[0]-48)+(_Data[1]-48);//Extraction des degrés du lattitude |
pfe | 0:05a20e3e3179 | 43 | _LatMin =10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes du lattitude |
pfe | 0:05a20e3e3179 | 44 | _LatMin1=10*(_Data[5]-48)+(_Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude |
pfe | 0:05a20e3e3179 | 45 | _LatMin2=10*(_Data[7]-48)+(_Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude |
pfe | 0:05a20e3e3179 | 46 | if((_LatDeg>90)||(_LatMin>59)||(_LatMin1>99)||(_LatMin2>99))goto LabFin; |
pfe | 0:05a20e3e3179 | 47 | //Vérification de la direction du Lattitude LatDir(N ou S) |
pfe | 0:05a20e3e3179 | 48 | jj=2;//Identification de la position de la troisième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 49 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 50 | if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude |
pfe | 0:05a20e3e3179 | 51 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 52 | _LatDir=_Data[0];//Extraction de le direction du latitude |
pfe | 0:05a20e3e3179 | 53 | if((_LatDir!='N')&&(_LatDir!='S'))goto LabFin; |
pfe | 0:05a20e3e3179 | 54 | // 01 byte |
pfe | 0:05a20e3e3179 | 55 | //Longitude of position |
pfe | 0:05a20e3e3179 | 56 | //extraction de la Longitude |
pfe | 0:05a20e3e3179 | 57 | jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 58 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 59 | if((_DL<10)||(_DL>11)) goto LabFin;//Vérification de la longueur du message de la longitude |
pfe | 0:05a20e3e3179 | 60 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 61 | Validation_StrToFloat(_DL); |
pfe | 0:05a20e3e3179 | 62 | if(_Npt !=1) goto LabFin; |
pfe | 0:05a20e3e3179 | 63 | if(_Pospt!=5) goto LabFin; |
pfe | 0:05a20e3e3179 | 64 | //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2" |
pfe | 0:05a20e3e3179 | 65 | _LongDeg =100*(_Data[0]-48)+10*(_Data[1]-48)+(_Data[2]-48);//Extraction des degrés de la longitude |
pfe | 0:05a20e3e3179 | 66 | _LongMin =10*(_Data[3]-48)+(_Data[4]-48);//Extraction des minutes de la longitude |
pfe | 0:05a20e3e3179 | 67 | _LongMin1=10*(_Data[6]-48)+(_Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude |
pfe | 0:05a20e3e3179 | 68 | _LongMin2=10*(_Data[8]-48)+(_Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude |
pfe | 0:05a20e3e3179 | 69 | if((_LongDeg>180)||(_LongMin>59)||(_LongMin1>99)||(_LongMin2>99))goto LabFin; |
pfe | 0:05a20e3e3179 | 70 | //Vérification de la direction du Longitude LonDir(E ou W) |
pfe | 0:05a20e3e3179 | 71 | jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 72 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 73 | if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude |
pfe | 0:05a20e3e3179 | 74 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 75 | _LongDir=_Data[0];//Extraction de le direction de la longitude |
pfe | 0:05a20e3e3179 | 76 | if((_LongDir!='E')&&(_LongDir!='W'))goto LabFin; |
pfe | 0:05a20e3e3179 | 77 | //GPS Quality indicator |
pfe | 0:05a20e3e3179 | 78 | jj=5;//Identification de la position de la sixième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 79 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 80 | if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS |
pfe | 0:05a20e3e3179 | 81 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 82 | Validation_StrToFloat(_DL); |
pfe | 0:05a20e3e3179 | 83 | if(_Npt !=0) goto LabFin; |
pfe | 0:05a20e3e3179 | 84 | if(_Pospt!=0) goto LabFin; |
pfe | 0:05a20e3e3179 | 85 | _Qual=_Data[0]-48;//Extraction de l'information de la qualité du MsgGPs |
pfe | 0:05a20e3e3179 | 86 | if((_Qual<1)||(_Qual>2))goto LabFin; |
pfe | 0:05a20e3e3179 | 87 | //Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2" . |
pfe | 0:05a20e3e3179 | 88 | jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 89 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 90 | if(_DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude |
pfe | 0:05a20e3e3179 | 91 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 92 | _SignHMSL='+'; |
pfe | 0:05a20e3e3179 | 93 | if(_Data[0]=='-') |
pfe | 0:05a20e3e3179 | 94 | { |
pfe | 0:05a20e3e3179 | 95 | _DL=_DL-1; |
pfe | 0:05a20e3e3179 | 96 | _SignHMSL='-'; |
pfe | 0:05a20e3e3179 | 97 | for(ii=0;ii<_DL;ii++) _Data[ii]=_Data[ii+1]; |
pfe | 0:05a20e3e3179 | 98 | } |
pfe | 0:05a20e3e3179 | 99 | Validation_StrToFloat(_DL); |
pfe | 0:05a20e3e3179 | 100 | if(_Npt !=1) goto LabFin; |
pfe | 0:05a20e3e3179 | 101 | if(_Pospt ==0) goto LabFin; |
pfe | 0:05a20e3e3179 | 102 | switch (_Pospt) |
pfe | 0:05a20e3e3179 | 103 | { |
pfe | 0:05a20e3e3179 | 104 | case 1: {_HMSL_L = (_Data[0]-48) ; _HMSL_H = 0; break;} |
pfe | 0:05a20e3e3179 | 105 | case 2: {_HMSL_L = (_Data[1]-48)+10*(_Data[0]-48); _HMSL_H = 0; break;} |
pfe | 0:05a20e3e3179 | 106 | case 3: {_HMSL_L = (_Data[2]-48)+10*(_Data[1]-48); _HMSL_H = (_Data[0]-48); break;} |
pfe | 0:05a20e3e3179 | 107 | case 4: {_HMSL_L = (_Data[3]-48)+10*(_Data[2]-48); _HMSL_H = (_Data[1]-48)+10*(_Data[0]-48); break;} |
pfe | 0:05a20e3e3179 | 108 | default : break; |
pfe | 0:05a20e3e3179 | 109 | } |
pfe | 0:05a20e3e3179 | 110 | _DL=_DL-_Pospt-1; //La longure de chiffre après la virgule |
pfe | 0:05a20e3e3179 | 111 | switch (_DL) |
pfe | 0:05a20e3e3179 | 112 | { |
pfe | 0:05a20e3e3179 | 113 | case 1: {_HMSL_1 = (_Data[_Pospt+1]-48) ; _HMSL_2 = 0; break;} |
pfe | 0:05a20e3e3179 | 114 | case 2: {_HMSL_1 = (_Data[_Pospt+2]-48)+10*(_Data[_Pospt+1]-48); _HMSL_2 = 0; break;} |
pfe | 0:05a20e3e3179 | 115 | case 3: {_HMSL_1 = (_Data[_Pospt+2]-48)+10*(_Data[_Pospt+1]-48); _HMSL_2 = _Data[_Pospt+3]-48; break;} |
pfe | 0:05a20e3e3179 | 116 | 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 | 0:05a20e3e3179 | 117 | default : break; |
pfe | 0:05a20e3e3179 | 118 | } |
pfe | 0:05a20e3e3179 | 119 | //Antenna height unit |
pfe | 0:05a20e3e3179 | 120 | jj=9;//Identification de la position de la dixième virgule dans le MsgGPS |
pfe | 0:05a20e3e3179 | 121 | _DL=Get_Length(jj); |
pfe | 0:05a20e3e3179 | 122 | if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur |
pfe | 0:05a20e3e3179 | 123 | Set_Data(jj); |
pfe | 0:05a20e3e3179 | 124 | _HUnite=_Data[0];//Extraction de l'unité de la hauteur |
pfe | 0:05a20e3e3179 | 125 | if((_HMSL_H>35)||(_HUnite!='M'))goto LabFin; |
pfe | 0:05a20e3e3179 | 126 | |
pfe | 0:05a20e3e3179 | 127 | GpsData.GGA_Valid = 1; |
pfe | 0:05a20e3e3179 | 128 | GpsData.hh = _hh; |
pfe | 0:05a20e3e3179 | 129 | GpsData.mm = _mm; |
pfe | 0:05a20e3e3179 | 130 | GpsData.ss = _ss; |
pfe | 0:05a20e3e3179 | 131 | //---------------------------------------------------------------------------- |
pfe | 0:05a20e3e3179 | 132 | GpsData.LatDeg = _LatDeg; |
pfe | 0:05a20e3e3179 | 133 | GpsData.LatMin = _LatMin; |
pfe | 0:05a20e3e3179 | 134 | GpsData.Latmmmm = _LatMin1*100+_LatMin2; |
pfe | 0:05a20e3e3179 | 135 | GpsData.LatDir = _LatDir; |
pfe | 0:05a20e3e3179 | 136 | //----------------------------------------------------------------------------- |
pfe | 0:05a20e3e3179 | 137 | GpsData.LongDeg = _LongDeg; |
pfe | 0:05a20e3e3179 | 138 | GpsData.LongMin = _LongMin; |
pfe | 0:05a20e3e3179 | 139 | GpsData.Longmmmm = _LongMin1*100+_LongMin2; |
pfe | 0:05a20e3e3179 | 140 | GpsData.LongDir = _LongDir; |
pfe | 0:05a20e3e3179 | 141 | //----------------------------------------------------------------------------- |
pfe | 0:05a20e3e3179 | 142 | GpsData.Qual = _Qual; |
pfe | 0:05a20e3e3179 | 143 | //----------------------------------------------------------------------------- |
pfe | 0:05a20e3e3179 | 144 | GpsData.HMSL = _HMSL_H*100+_HMSL_L; |
pfe | 0:05a20e3e3179 | 145 | GpsData.SignHMSL = _SignHMSL; |
pfe | 0:05a20e3e3179 | 146 | GpsData.HUnite = _HUnite; |
pfe | 0:05a20e3e3179 | 147 | LabFin: |
pfe | 0:05a20e3e3179 | 148 | asm{NOP} |
pfe | 0:05a20e3e3179 | 149 | } |