⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.cpp

📁 GPS信号模拟器源代码
💻 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 + -