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 brentTH 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