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
- Committer:
- pfe
- Date:
- 2015-03-03
- Revision:
- 1:821bd360ec5b
- Child:
- 2:4cf92185ed38
File content as of revision 1:821bd360ec5b:
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;
/* UserWR_buffer[0]++;
//-----------------------------------------------------------------------------
UserWR_buffer[1] = hh;
UserWR_buffer[2] = mm;
UserWR_buffer[3] = ss;
//-----------------------------------------------------------------------------
UserWR_buffer[4] = LatDeg;
UserWR_buffer[5] = LatMin;
UserWR_buffer[6] = LatMin1;
UserWR_buffer[7] = LatMin2;
UserWR_buffer[8] = LatDir;
//-----------------------------------------------------------------------------
UserWR_buffer[9] = LongDeg;
UserWR_buffer[10] = LongMin;
UserWR_buffer[11] = LongMin1;
UserWR_buffer[12] = LongMin2;
UserWR_buffer[13] = LongDir;
//-----------------------------------------------------------------------------
UserWR_buffer[14] = Qual;
//-----------------------------------------------------------------------------
UserWR_buffer[15] = HMSL_H;
UserWR_buffer[16] = HMSL_L;
UserWR_buffer[17] = HMSL_1;
UserWR_buffer[18] = HMSL_2;
UserWR_buffer[19] = SignHMSL;
UserWR_buffer[20] = HUnite;
// -----------------------------------------------------------------------------
*/
LabFin:
return MSG_GPGGA_Valid;
}
