www.pudn.com > HPMapx.rar > GpsData.HPP


// GpsData.h 
 
#ifndef __GPS_DATA_H__ 
#define __GPS_DATA_H__ 
 
#pragma once 
 
typedef void  B_EXIST; 
typedef bool  B_PASED; 
 
#define GOOD_DATA true; 
#define BAD_DATA  false; 
 
// Art by brent  TH Corp(R).2005. 
// Format the Whole Code .  
// please Set the metaprogram 'Tab' size to '8' 
// End Coding . 05/04/28 
 
// For Debug. Example Data. 
/* 
$GPGGA,073600.469,3607.1656,N,12020.9376,E,1,05,1.6,67.6,M,,,,0000*3F 
$GPGSA,A,3,06,26,21,10,09,,,,,,,,3.3,1.6,2.9*37 
$GPRMC,073600.469,A,3607.1656,N,12020.9376,E,0.00,,240405,,,A*72 
$GPVTG,,T,,M,0.00,N,0.0,K,A*13 
$GPGSV,3,1,10,26,72,007,21,29,57,033,15,21,50,305,33,09,30,177,36*7C 
$GPGSV,3,2,10,10,29,087,18,18,23,296,,06,16,230,34,15,11,318,*79 
$GPGSV,3,3,10,08,06,035,,02,05,148,32*7B 
*/ 
 
enum GPS_TYPE 
{ 
	UNKNOWN = 0, 
	GPGGA = 1, 
	GPGSA = 2, 
	GPGSV = 3, 
	GPRMC = 4, 
	GPVTG = 5 
}; 
 
// GGA数据需求标识 
const __int32  GET_UTC_TIME = 0x0001;	// UTC时间 
const __int32  GET_GPS_LALO = 0x0002;	// 纬度,经度 
const __int32  GET_GPS_LALOF= 0x0004;	// 南北纬标识 和东西经标识 
const __int32  GET_GPS_CODE = 0x0008;	// 定位代码 
const __int32  GET_GPS_NUMB = 0x0010;	// 卫星数 
const __int32  GET_GPS_FDI  = 0x0020;	// 稀释度 00.5 ~ 99.9 
const __int32  GET_GPS_FAL  = 0x0040;	// 海拔高度 
const __int32  GET_GPS_chFD = 0x0080;	// 海拔高度单位 
const __int32  GET_GPS_FAV  = 0x0100;	// 地表平均高度 
const __int32  GET_GPS_chFAV= 0x0200;	// 地表平均高度单位 
const __int32  GET_GPS_MTIME= 0x0400;	// 偏差修正使用时间 
const __int32  GET_GPS_MCODE= 0x0800;	// 偏差修正,基地台代码 
const __int32  GET_GPS_MSUM = 0x1000;	// 校验码 *16 
const __int32  GET_GPS_SPEED= 0x2000;	// WGA84对地速度 
const __int32  GET_GPS_DIREC= 0x4000;	// WGA84对地方向 
const __int32  GET_GGA_ALL  = 0x8000;	// 全部GGA数据 
const __int32  GET_GSA_ALL  = 0x8000;	// 全部GSA数据 
const __int32  GET_GSV_ALL  = 0x8000;	// 全部GSV数据 
const __int32  GET_RMC_ALL  = 0x8000;	// 全部RMC数据 
const __int32  GET_VTG_ALL  = 0x8000;	// 全部VTG数据 
 
const double MILE_TOKM = 0.6213699; 
 
struct MyData 
{ 
	 
public: 
	double  GetHHMMSS_SSS()		{ return atof(UTC_TIME);	} 
	double  GetLatitude()		{ return atof(Latitude);	} 
	double  GetLongitude()		{ return atof(Longitude);	} 
	bool	IsParsed()		{ return chIsParsed!= 0x00;	} 
 
protected: 
 
	__int32	 ASK_VALUE; 
	GPS_TYPE chType; 
	char	Head[6]; 
	 
	char	UTC_TIME[10];		// 标准定位时间 
	char	Latitude[9];		// 纬度 
	char	Longitude[10];		// 经度 
	char	DirectLAT;		// 南北纬标识 
	char	DirectLOT;		// 东西经标识 
	char	chIsParsed;		// 是否有效数据 
 
	const char* pData; 
	 
	MyData(GPS_TYPE mType,__int32 nASK):ASK_VALUE(nASK) 
	{ 
		chIsParsed = 0x00; 
		switch(chType=mType) 
		{ 
		case GPGGA: strcpy(Head, "$GPGGA" ); break; 
		case GPGSA: strcpy(Head, "$GPGSA" ); break; 
		case GPGSV: strcpy(Head, "$GPGSV" ); break; 
		case GPRMC: strcpy(Head, "$GPRMC" ); break; 
		case GPVTG: strcpy(Head, "$GPVTG" ); break; 
		default:break; 
		} 
	} 
	 
protected: 
 
	// 时间 
	B_EXIST SetTime() 
	{ 
		for(char i = 0; i < sizeof(UTC_TIME); i++) 
		UTC_TIME[i] = *(pData+i); 
		pData += (sizeof(UTC_TIME)+1) ; 
	} 
 
	// 纬度 
	B_PASED SetLatitude() 
	{ 
		if( *pData != ',' ) 
		{ 
			for(char i = 0; i < sizeof(Latitude); i++) 
			Latitude[i] = *(pData+i); 
 
			pData += ( sizeof(Latitude)+ 1); 
			chIsParsed = 0x01; 
		} 
		else  
		{ 
			chIsParsed = 0x00; 
			pData += 1; 
			return BAD_DATA; 
		} 
		return GOOD_DATA; 
	} 
 
	// 南北纬度标识 
	B_EXIST SetLatitudeFlag() 
	{ 
		if( *pData != ',' ) 
		{ 
			DirectLAT = *pData; 
			pData += 1; 
		} 
		pData += 1; 
	} 
 
	// 经度 
	B_PASED SetLongitude() 
	{ 
		if( *pData != ',' ) 
		{ 
			for(char i = 0; i < sizeof(Longitude); i++) 
			Longitude[i] = *(pData+i); 
 
			pData += ( sizeof(Longitude)+ 1); 
			chIsParsed = 0x01; 
		} 
		else  
		{ 
			chIsParsed = 0x00; 
			pData += 1; 
			return BAD_DATA; 
		} 
		return true; 
	} 
 
	// 东西经标识 
	B_EXIST SetLongitudeFlag() 
	{ 
		if( *pData != ',' ) 
		{ 
			DirectLOT = *pData; 
			pData += 1; 
		} 
		pData += 1; 
	} 
 
}; 
 
typedef struct WGA84__GPSRMC_Data : public MyData 
{ 
 
public: 
	bool    GetRMCStatus()	{ return chIsParsed != 0x00;} 
	double	GetKMSpeed()	{ return fSpeed/MILE_TOKM;} 
	double	GetNormalSpeed(){ return fSpeed;} 
	float	GetDirection()	{ return fDirection;} 
 
	// TODO : GPSRMC_Data 结构 
	WGA84__GPSRMC_Data(const char* pSrc,__int32 nASK=GET_RMC_ALL): MyData(GPRMC,nASK) 
	{ 
		bool bAskAll = (ASK_VALUE & GET_RMC_ALL) != 0; 
		pData = pSrc+7; 
 
		if(  bAskAll || (ASK_VALUE & GET_UTC_TIME ) ) 	SetTime(); 
		 
		if( !SetRMCStatus() ) return; 
 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALO ) )	{if ( !SetLatitude() ) return;} 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALOF) )	SetLatitudeFlag(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALO ) )	{if ( !SetLongitude() )	return;} 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALOF) )	SetLongitudeFlag(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_SPEED) )	SetSpeed(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_DIREC) )	SetDirection(); 
		if(  bAskAll )					SetDate(); 
	} 
 
private: 
 
	char	chStatus;		// 数据是否有效 
	double	fSpeed;			// 对地速度 
	float	fDirection;		// 对地方向 
	char	chDate[6];		// 日期时间,日日月月年年 
	/* 
	其他省略不处理 
	*/ 
private: 
 
	// RMC 数据状态 
	B_PASED SetRMCStatus() 
	{ 
		chIsParsed = ( chStatus = *pData) != 'A' ? 0x00:0x01; 
		pData += 2; 
		return chIsParsed != 0x00; 
	} 
 
	// RMC WGA84 对地速度 
	B_EXIST SetSpeed() 
	{ 
		char szNumber[5]; 
		for(char i=0; *(pData+i) !=','; i++) 
		szNumber[i] = *(pData+i); 
		szNumber[i] = '\0'; 
		 
		fSpeed = (float)atof(szNumber); 
		pData += ++i; 
	} 
	 
	// RMC WGA84 对地方向 
	B_EXIST SetDirection() 
	{ 
		char szNumber[5]; 
		for(char i=0; *(pData+i) !=','; i++) 
		szNumber[i] = *(pData+i); 
		szNumber[i] = '\0'; 
		 
		fDirection = (float)atof(szNumber); 
		pData += ++i; 
	} 
 
	// RMC 日期 
	B_EXIST SetDate() 
	{ 
		strncpy(chDate,pData,sizeof(chDate)); 
		pData += sizeof(chDate)+1; 
	} 
	 
}GPSRMCData,*PGPSRMC_DATA; 
 
typedef struct _GPSGGA_Data : public MyData 
{ 
public:	 
	int	GetStarNumber()		{ return (int)chNumber; } 
	float	GetAltitude()		{ return fAltitude;} 
 
	_GPSGGA_Data(const char* pSrc,__int32 nASK=GET_GGA_ALL): MyData(GPGGA,nASK) 
	{ 
		DirectLAT = 'N'; 
		DirectLOT = 'E'; 
		chMTime	= 0; 
		Latitude[0] = Longitude[0]='\0'; 
		chMCode[0] = chSum[0] = '\0'; 
		fAvgHigh = fAltitude = 0.0; 
		chFA = chFD = 'M'; 
 
		bool bAskAll = (ASK_VALUE & GET_GGA_ALL) != 0; 
		 
		pData = pSrc+7; 
		 
		if(  bAskAll || (ASK_VALUE & GET_UTC_TIME ) ) 	SetTime(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALO ) )	{if ( !SetLatitude() ) return;} 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALOF) )	SetLatitudeFlag(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALO ) )	{if ( !SetLongitude() )	return;} 
		if(  bAskAll || (ASK_VALUE & GET_GPS_LALOF) )	SetLongitudeFlag(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_CODE ) )	SetCode(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_NUMB ) )	SetStarNumber(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_FDI  ) )	SetDilution(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_FAL  ) )	SetAltitude(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_chFD ) )	SetchFD(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_FAV  ) )	SetAverageHigh(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_chFAV) )	SetchFA(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_MTIME) )	SetchMTime(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_MCODE) )	SetchMCode(); 
		if(  bAskAll || (ASK_VALUE & GET_GPS_MSUM ) )	SetSum(); 
	} 
 
private: 
 
	char	chCode;			// 定位代码 
	char	chNumber;		// 卫星数 
	float	fDilution;		// 稀释度 00.5 ~ 99.9 
	float	fAltitude;		// 海拔高度 
	char	chFD;			// 海拔高度单位 
	float	fAvgHigh;		// 地表平均高度 
	char	chFA;			// 地表平均高度单位 
	UCHAR	chMTime;		// 偏差修正使用时间 
	char	chMCode[4];		// 偏差修正,基地台代码 
	char	chSum[3];		// 校验码 *16 
 
private: 
	 
	B_EXIST SetCode();		// 定位代码 
	B_EXIST	SetStarNumber();	// 卫星数量 
	B_EXIST SetDilution();		// 水平稀释精度 
	B_EXIST SetAltitude();		// 海拔高度 
	B_EXIST SetchFD();		// 海拔高度单位 
	B_EXIST SetAverageHigh();	// 地表平均高度 
	B_EXIST	SetchFA();		// 地表平均高度单位 
	B_EXIST SetchMTime();		// 偏差修正使用时间 
	B_EXIST SetchMCode();		// 偏差修正,基地台代码 
	B_EXIST SetSum();		// 综合检查码 
	 
}GPSGGAData,*LPGPSGGA_DATA; 
 
#endif