📄 parse.cpp
字号:
// Parse.cpp: implementation of the CParse class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GPSSim.h"
#include "Parse.h"
#include <assert.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CParse::CParse()
{
}
CParse::~CParse()
{
}
int CParse::Open(const char *filename)
{
if (m_stream.is_open())
m_stream.close();
m_stream.open(filename);
if (!m_stream.is_open()) return -1;
return 0;
}
void CParse::Close()
{
m_stream.close();
}
void CParse::Split(const char *buff, ...)
{
va_list marker;
va_start(marker, buff);
int begin = 0;
char *var = va_arg(marker, char*);
for (int i = 0; i <= strlen(buff); i++)
{
if (var == 0) break;
if (buff[i] == ',' || buff[i] == 0)
{
memcpy(var, &buff[begin], i-begin);
var[i-begin] = 0;
var = va_arg(marker, char*);
begin = i+1;
}
}
va_end(marker);
}
int CParse::ParseGGA(const char *buff, GPGGA &gga)
{
memset(&gga, 0, sizeof(gga));
char rsv[16];
Split(
buff,
rsv, // "$GPGGA"
gga.time,
gga.latitude,
gga.ns,
gga.longitude,
gga.ew,
gga.state,
gga.satellite,
gga.hdop,
gga.heighta,
rsv,
gga.heightg,
0);
return 0;
}
int CParse::ParseGSA(const char *buff, GPGSA &gsa)
{
memset(&gsa, 0, sizeof(gsa));
char rsv[16];
Split(
buff,
rsv, // "$GPGSA"
gsa.mode,
gsa.type,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.prn,
gsa.pdop,
gsa.hdop,
gsa.vdop,
0);
return 0;
}
int CParse::ParseGSV(const char *buff, GPGSV &gsv)
{
memset(&gsv, 0, sizeof(gsv));
char rsv[16];
Split(
buff,
rsv, // "$GPGSV"
gsv.gsv,
gsv.index,
gsv.count,
gsv.prn1,
gsv.elev1,
gsv.azim1,
gsv.snr1,
gsv.prn2,
gsv.elev2,
gsv.azim2,
gsv.snr2,
gsv.prn3,
gsv.elev3,
gsv.azim3,
gsv.snr3,
gsv.prn4,
gsv.elev4,
gsv.azim4,
gsv.snr4,
0);
return 0;
}
int CParse::ParseRMC(const char *buff, GPRMC &rmc)
{
memset(&rmc, 0, sizeof(rmc));
char rsv[16];
Split(
buff,
rsv, // "$GPRMC"
rmc.time,
rmc.state,
rmc.latitude,
rmc.ns,
rmc.longitude,
rmc.ew,
rmc.speed,
rmc.crs,
rmc.date,
rmc.mag,
rmc.dir,
0);
return 0;
}
int CParse::ParseVTG(const char *buff, GPVTG &vtg)
{
memset(&vtg, 0, sizeof(vtg));
char rsv[16];
Split(
buff,
rsv, // "$GPVTG"
vtg.crsn,
rsv, // "T"
vtg.crsm,
rsv, // "M"
vtg.kts,
rsv, // "N"
vtg.speed,
0);
return 0;
}
//------------------------------------------------------------------------
void CParse::Reset()
{
m_stream.clear();
m_stream.seekg(0, ios_base::beg);
}
// 成功返回0 否则-1
int CParse::NextLine(char *buff, int len)
{
assert(buff != NULL);
if (m_stream.eof()) return -1;
buff[0]= 0;
m_stream.getline(buff, len);
int size = strlen(buff);
if (size == 0) return -1;
if (size+3 < len)
{
buff[size] = '\r';
buff[size+1] = '\n';
buff[size+2] = 0;
}
return 0;
}
// 成功返回0 否则-1
int CParse::NextGGA(char *buff, int len)
{
assert(buff != NULL);
while (NextLine(buff, len) == 0)
{
if (buff[3] == 'G' && buff[4] == 'G' && buff[5] == 'A')
// if (buff[3] == 'R' && buff[4] == 'M' && buff[5] == 'C')
{
return 0;
}
}
return -1;
}
bool CParse::Validate()
{
return m_stream.is_open();
}
void CParse::Seek(int off, ios_base::seekdir way)
{
m_stream.seekg(off, way);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -