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 + -
显示快捷键?