Decod Msg GPS

Dependencies:   C12832 mbed

Fork of ComGPS by SAADI Nadia

Committer:
pfe
Date:
Wed Apr 08 08:32:31 2015 +0000
Revision:
2:4cf92185ed38
Parent:
1:821bd360ec5b
sss

Who changed what in which revision?

UserRevisionLine numberNew 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 }