gpsdata.hpp

来自「一个mapxmobile+gps的小程序,需要先安装mapx mobile」· HPP 代码 · 共 321 行

HPP
321
字号
// 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 <x.brent@gmail.com> 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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?