본문 바로가기

Windows/MFC

NMEA Parser

[code]
//
// DATE        : April 03, 2006
// CODER    : aucd29 (aucd29@gmail.com)
//
// ------------------------------------------------------
// NOTE
// ------------------------------------------------------
// * NMEA 파셔
//
// -----------------------------------------------------------
// FIX : June 14, 2007 18:4:0
// -----------------------------------------------------------
// * <list>를 <vector>로 교체
//


#include "StdAfx.h"
#include "NMEAParser.h"

CNMEAParser::CNMEAParser(void)
//: m_bIndex(true)
{
        
}

CNMEAParser::~CNMEAParser(void)
{
}

void CNMEAParser::Parsing(CString szFullText)
{
    /*
    -------------------------------------------------------------------------------------------
    +GPSTRACKD: 77, "$GPGGA,084816.000,3728.6289,N,12652.8449,E,1,09,0.9,89.4,M,19.3,M,,0000*69
    "

    +GPSTRACKD: 52, "$GPGLL,3728.6289,N,12652.8449,E,084816.000,A,A*52
    "

    +GPSTRACKD: 58, "$GPGSA,A,3,09,21,18,26,22,12,05,24,29,,,,1.8,0.9,1.5*3A
    "

    +GPSTRACKD: 71, "$GPGSV,3,1,12,09,81,154,45,18,56,317,46,21,45,233,45,26,33,059,44*7D
    "

    +GPSTRACKD: 71, "$GPGSV,3,2,12,24,26,189,42,29,24,066,40,22,23,310,44,12,13,155,41*70
    "

    +GPSTRACKD: 71, "$GPGSV,3,3,12,05,11,166,38,10,04,126,36,14,02,266,34,28,02,032,35*7D
    "

    +GPSTRACKD: 73, "$GPRMC,084816.000,A,3728.6289,N,12652.8449,E,0.12,139.66,030407,,,A*6D
    "

    +GPSTRACKD: 39, "$GPVTG,139.66,T,,M,0.12,N,0.2,K,A*07
    "

    +GPSTRACKD: 36, "$GPZDA,084816.000,03,04,2007,,*57
    "
    -------------------------------------------------------------------------------------------
    */

    m_szFullText = szFullText;
    SetDefineType();
    Divide();
    NMEATrace();
}

void CNMEAParser::SetDefineType(void)
{
    m_Type.push_back(L"$GPGGA");
    m_Type.push_back(L"$GPGLL");
    m_Type.push_back(L"$GPGSA");
    m_Type.push_back(L"$GPGSV");
    m_Type.push_back(L"$GPRMC");
    m_Type.push_back(L"$GPVTG");
    m_Type.push_back(L"$GPZDA");
}

void CNMEAParser::Divide(void)
{
    //it = m_Type.begin();
    int i = 0;
    int nLength = static_cast<int>(m_Type.size());
    //CString szField;

    //while (nLength--)
    for (i=0; i<nLength; ++i)
    {
        //szField = *it++;
        m_Divide[m_Type[i]] = GetDivideString(m_Type[i]);
    }

    TraceDivide();

    ParsingGGA();
    ParsingGLL();
    ParsingGSA();
    ParsingGSV();
    ParsingRMC();
    ParsingVTG();
    ParsingZDA();
}

CString CNMEAParser::GetDivideString(CString szString)
{
    CString szReturnData;
    int nPosition = 0;
    int nEndPoint = 0;

    nPosition = m_szFullText.Find(szString);
    if (nPosition == -1)
    {
        return L"";
    }

    // GSV는 여려개가 들어올 수 있다.
    if (szString == L"$GPGSV")
    {
        // GSV 는 여려개 출력될 수 있다.
        nEndPoint     = m_szFullText.Find(L"\"", nPosition);
        szReturnData = m_szFullText.Mid(nPosition, nEndPoint - nPosition);
        m_GSV.push_back(szReturnData.Trim());

        while (true)
        {
            nPosition = m_szFullText.Find(szString, nEndPoint);
            if (nPosition == -1)
            {
                break;
            }

            nEndPoint    = m_szFullText.Find(L"\"", nPosition);
            szReturnData = m_szFullText.Mid(nPosition, nEndPoint - nPosition);
            m_GSV.push_back(szReturnData.Trim());
        }
    }
    else
    {
        // GSV 는 여려개 출력될 수 있다.
        nEndPoint     = m_szFullText.Find(L"\"", nPosition);
        szReturnData = m_szFullText.Mid(nPosition, nEndPoint - nPosition);
        szReturnData = szReturnData.Trim();
    }

    return szReturnData;
}

void CNMEAParser::TraceDivide(void)
{
    /*

    TRACE DATA

    [$GPGGA] $GPGGA,084816.000,3728.6289,N,12652.8449,E,1,09,0.9,89.4,M,19.3,M,,0000*69
    [$GPGLL] $GPGLL,3728.6289,N,12652.8449,E,084816.000,A,A*52
    [$GPGSA] $GPGSA,A,3,09,21,18,26,22,12,05,24,29,,,,1.8,0.9,1.5*3A    
    [$GPVTG] $GPVTG,139.66,T,,M,0.12,N,0.2,K,A*07    
    [$GPRMC] $GPRMC,084816.000,A,3728.6289,N,12652.8449,E,0.12,139.66,030407,,,A*6D
    [$GPGSV] $GPGSV,3,1,12,09,81,154,45,18,56,317,46,21,45,233,45,26,33,059,44*7D
    [$GPGSV] $GPGSV,3,2,12,24,26,189,42,29,24,066,40,22,23,310,44,12,13,155,41*70
    [$GPGSV] $GPGSV,3,3,12,05,11,166,38,10,04,126,36,14,02,266,34,28,02,032,35*7D
    */

    //it = m_Type.begin();
    int i;
    int nLength = static_cast<int>(m_Type.size());

    TRACE(L"---------------------------------------------------\n");
    TRACE(L"| NMEA                                            |\n");
    TRACE(L"---------------------------------------------------\n");
    //while (nLength--)
    for (i=0; i<nLength; ++i)
    {
        TRACE(L"[%s]", m_Type[i]);
        TRACE(L" %s\n", m_Divide[m_Type[i]]);
        //TRACE(L"[%s]", *it);
        //TRACE(L" %s\n", m_Divide[*it]);

        // *it++;
    }

    nLength = static_cast<int>(m_GSV.size());
    for(i=0; i<nLength; ++i)
    {
        TRACE(L"[$GPGSV] %s\n", m_GSV[i]);
    }
    TRACE(L"---------------------------------------------------\n");
}


void CNMEAParser::ParsingGGA(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPGGA        GGA        protocol header
    UTC Time                161229.487            hhmmss.sss
    Latitude                3723.2475            ddmm.mmmm
    N/S Indicator            N                    N=north or S=south
    Longitude                12158.3416            dddmm.mmmm
    E/W Indicator            W                    E=east or W=west
    Position Fix Indicator    1                    See Table 1-4
    Satellites Used            07                    Range 0 to 12
    HDOP                    1.0                    Horizontal Dilution of Precision
    MSL Altitude            9.0            meters    
    Units                    M            meters    
    Geoid Separation                    meters    
    Units                    M            meters    
    Age of Diff. Corr                    second    Null fields when DGPS is not used
    Diff. Ref. Station ID    0000        
    Checksum                *18        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    [$GPGGA] $GPGGA,084816.000,3728.6289,N,12652.8449,E,1,09,0.9,89.4,M,19.3,M,,0000*69
    -----------------------------------------------------------------------------
    */
    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPGGA"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPGGA"].Find(L",", nPos);
        szGp = m_Divide[L"$GPGGA"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GGA index:%d : %s\n", index, szGp);
        
        switch(index)
        {
        case 1:
            //m_nmeaData[m_bIndex].SetUTCTime(szGp);
            m_nmeaData.SetUTCTime(szGp);
            break;
        case 2:
            //m_nmeaData[m_bIndex].SetLatitude(szGp);
            m_nmeaData.SetLatitude(szGp);
            break;
        case 3:
            //m_nmeaData[m_bIndex].SetNS(szGp);
            m_nmeaData.SetNS(szGp);
            break;
        case 4:
            //m_nmeaData[m_bIndex].SetLongitude(szGp);
            m_nmeaData.SetLongitude(szGp);
            break;
        case 5:
            //m_nmeaData[m_bIndex].SetEW(szGp);
            m_nmeaData.SetEW(szGp);
            break;
        case 6:
            //m_nmeaData[m_bIndex].SetPositionFix(szGp);
            m_nmeaData.SetPositionFix(szGp);
            break;
        case 7:
            //m_nmeaData[m_bIndex].SetSatelliteUsed(szGp);
            m_nmeaData.SetSatelliteUsed(szGp);
            break;
        case 9:
            //m_nmeaData[m_bIndex].SetAltitude(szGp);
            m_nmeaData.SetAltitude(szGp);
            break;
        default:
            break;
        }

        index++;

        if (nPos2 == -1)
        {
            break;
        }
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::ParsingGLL(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPGLL        GLL     protocol header
    Latitude                3723.2475            ddmm.mmmm
    N/S Indicator            N                    N=north or S=south
    Longitude                12158.3416            dddmm.mmmm
    E/W Indicator            W                    E=east or W=west
    UTC Time            
    Status                    A                    A=data valid or V=data not valid
    Mode                    A                    A=Autonomous, D=DGPS, E=DR (Only present in NMEA version 3.0)
    Checksum                *41        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    [$GPGLL] $GPGLL,3728.6289,N,12652.8449,E,084816.000,A,A*52
    -----------------------------------------------------------------------------
    */
    
    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPGLL"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPGLL"].Find(L",", nPos);
        szGp = m_Divide[L"$GPGLL"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GPGLL index:%d : %s\n", index, szGp);

        switch(index)
        {
        case 7:
            //m_nmeaData[m_bIndex].SetStatus(szGp);
            m_nmeaData.SetStatus(szGp);
            return;
            break;
        }

        index++;
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::ParsingGSA(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPGSA                GSA protocol header
    Mode1                    A                    See Table 1-7
    Mode2                    3                    See Table 1-8
    Satellite Used1            07                    Sv on Channel 1
    Satellite Used1            02                    Sv on Channel 2
    ….            ….
    Satellite Used1                                Sv on Channel 12
    PDOP                    1.8        
    HDOP                    1.0        
    VDOP                    1.5        
    Checksum                *33        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    [$GPGSA] $GPGSA,A,3,09,21,18,26,22,12,05,24,29,,,,1.8,0.9,1.5*3A
    -----------------------------------------------------------------------------
    */

    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPGSA"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPGSA"].Find(L",", nPos);
        szGp = m_Divide[L"$GPGSA"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GPGSA index:%d : %s\n", index, szGp);

        switch(index)
        {
        case 0: break;
        case 1:
            //m_nmeaData[m_bIndex].SetMode1(szGp);
            m_nmeaData.SetMode1(szGp);
            break;
        case 2:
            //m_nmeaData[m_bIndex].SetMode2(szGp);
            m_nmeaData.SetMode2(szGp);
            break;
        default:

            if (index == 15)
            {
                return;
            }

            // 내용이 존재할 때만 insert
            if (szGp.GetLength())
            {
                //m_nmeaData[m_bIndex].PutSatelliteUsed(szGp);
                m_nmeaData.PutSatelliteUsed(szGp);
            }
            
            break;
        }

        index++;
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::ParsingGSV(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPGSA                GSA protocol header
    Number of Message1        2                    Range 1 to 3
    Message Number1            1                    Range 1 to 3
    Satellite in View        07            
    Satellite ID            07                    Channel 1 (Range 1 to 32)
    Elevation                79            degrees    Channel 1 (Maximum 90)
    Azimuth                    048            degrees    Channel 1 (True, Range 0 to 359)
    SNR (C/No)                42            dBHz    Range 0 to 99, null when not tracking
    ….            ….
    Satellite ID            27            Channel 4 (Range 1 to 32)
    Elevation                27            degrees    Channel 4 (Maximum 90)
    Azimuth                    138            degrees    Channel 4 (True, Range 0 to 359)
    SNR (C/No)                42            dBHz    Range 0 to 99, null when not tracking
    Checksum                *71        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    [$GPGSV] $GPGSV,3,1,12,09,81,154,45,18,56,317,46,21,45,233,45,26,33,059,44*7D
             $GPGSV,3,2,12,24,26,189,42,29,24,066,40,22,23,310,44,12,13,155,41*70
             $GPGSV,3,3,12,05,11,166,38,10,04,126,36,14,02,266,34,28,02,032,35*7D
    -----------------------------------------------------------------------------
                        SAT1         SAT2         SAT3         SAT4
    -----------------------------------------------------------------------------
    $GPGSV,3,1,12, 09,81,154,45, 18,56,317,46, 21,45,233,45, 26,33,059,44 *7D
    $GPGSV,3,2,12, 24,26,189,42, 29,24,066,40, 22,23,310,44, 12,13,155,41 *70
    $GPGSV,3,3,12, 05,11,166,38, 10,04,126,36, 14,02,266,34, 28,02,032,35 *7D
    -----------------------------------------------------------------------------
    CONVERT
    -----------------------------------------------------------------------------
    [szHeader] $GPGSV,3,1,12,
    [$GPGSV] 09,81,154,45, 18,56,317,46, 21,45,233,45, 26,33,059,44
             24,26,189,42, 29,24,066,40, 22,23,310,44, 12,13,155,41
             05,11,166,38, 10,04,126,36, 14,02,266,34, 28,02,032,35
    -----------------------------------------------------------------------------
    */

    int nSize = static_cast<int>(m_GSV.size());
    //m_nmeaData[m_bIndex].SetSatelliteView(m_GSV[0].Mid(11, 2));
    m_nmeaData.SetSatelliteView(m_GSV[0].Mid(11, 2));
    //it         = m_GSV.begin();
    //m_nmeaData[m_bIndex].SetSatelliteView(it->Mid(11, 2));

    //
    // Convert
    //
    CGSV gsvData;
    int i = 0;
    int nPos = 0;
    int nPos2 = 0;
    //while (nSize--)
    for (i=0; i<nSize; ++i)
    {
        m_GSV[i] = m_GSV[i].Mid(14, m_GSV[i].GetLength() - 17);
        // *it = it->Mid(14, it->GetLength() - 17);

        TRACE(L"--------------------------------------------------------------\n");
        //TRACE(L"| $GPGSV : %s\n", *it);
        TRACE(L"| $GPGSV : %s\n", m_GSV[i]);
        TRACE(L"--------------------------------------------------------------\n");        

        //
        // 이런 데이터를 쪼갠다.
        // 09,81,154,45, 18,56,317,46, 21,45,233,45, 26,33,059,44
        //
        nPos2 = m_GSV[i].Find(L",", nPos);
        while (true)
        {
            //
            // id
            //
            gsvData.SetID(m_GSV[i].Mid(nPos, nPos2 - nPos));

            //
            // Elevation
            //
            nPos = nPos2 + 1;
            nPos2 = m_GSV[i].Find(L",", nPos);
            gsvData.SetElevation(m_GSV[i].Mid(nPos, nPos2 - nPos));

            //
            // Azimuth
            //
            nPos = nPos2 + 1;
            nPos2 = m_GSV[i].Find(L",", nPos);
            gsvData.SetAzimuth(m_GSV[i].Mid(nPos, nPos2 - nPos));

            //
            // SNR
            //
            nPos = nPos2 + 1;
            nPos2 = m_GSV[i].Find(L",", nPos);
            
            if (nPos2 == -1)
            {
                gsvData.SetSNR(m_GSV[i].Mid(nPos, 2));
            }
            else
            {
                gsvData.SetSNR(m_GSV[i].Mid(nPos, nPos2 - nPos));
            }

            gsvData.Trace();
            //m_nmeaData[m_bIndex].PutSatelliteView(gsvData);
            m_nmeaData.PutSatelliteView(gsvData);

            if (nPos2 == -1)
            {
                break;
            }
            
            nPos = nPos2 + 1;
            nPos2 = m_GSV[i].Find(L",", nPos);
        }

        //
        // init variant
        //
        nPos = 0;
        
        //it++;
    }
}

void CNMEAParser::ParsingRMC(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPGSA                RMC protocol header
    UTC Time                161229.487            hhmmss.sss
    Status    A                                    A=data valid or V=data not valid
    Latitude                3723.2475            ddmm.mmmm
    N/S Indicator            N                    N=north, S=south
    Longitude                12158.3416            ddd mm.mmmm
    E/W Indicator            W                    E=east or W=west
    Speed Over Ground        0.13        knots    
    Course Over Ground        309.62        degrees    true
    Date                    120598                ddmmyy
    Magnetic Variation                    degrees    E=east or W=west
    Mode                    A                    A=Autonomous, D=DGPS, E=DR
    Checksum    *10        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    */

    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPRMC"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPRMC"].Find(L",", nPos);
        szGp = m_Divide[L"$GPRMC"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GPRMC index:%d : %s\n", index, szGp);

        switch(index)
        {
        case 8:
            //m_nmeaData[m_bIndex].SetCourseOverGround(szGp);
            m_nmeaData.SetCourseOverGround(szGp);
            return;
            break;
        }

        index++;
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::ParsingVTG(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPVTG        VTG        protocol header
    Course                    309.62        degrees    Measured heading
    Reference                T            true
    Course                                degrees    Measured heading
    Reference                M                    Magnetic
    Speed                    0.13        knots    Measured horizontal speed
    Units                    N            Knots
    Speed                    0.2            km/hr    Measured horizontal speed
    Units                    K                    Kilometers per hour
    Mode                    A                    A=Autonomous, D=DPGS, E=DR
    Checksum                *23        
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    */

    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPVTG"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPVTG"].Find(L",", nPos);
        szGp = m_Divide[L"$GPVTG"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GPVTG index:%d : %s\n", index, szGp);

        switch(index)
        {
        case 1:
            //m_nmeaData[m_bIndex].SetTrueCourse(szGp);
            m_nmeaData.SetTrueCourse(szGp);
            break;
        case 3:
            //m_nmeaData[m_bIndex].SetCompaseCourse(szGp);
            m_nmeaData.SetCompaseCourse(szGp);
            break;
        case 5:
            //m_nmeaData[m_bIndex].SetKont(szGp);
            m_nmeaData.SetKont(szGp);
            break;
        case 7:
            //m_nmeaData[m_bIndex].SetKm(szGp);
            m_nmeaData.SetKm(szGp);
            return;
            break;
        }

        index++;
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::ParsingZDA(void)
{
    /*
    -----------------------------------------------------------------------------
    Name                    Example        Unit    Description
    -----------------------------------------------------------------------------
    Message ID                $GPVTG                VTG protocol header
    UTC time                181813                Either using valid IONO/UTC or estimated from default leap seconds
    Day                        14                    01 to 31
    Month                    10                    01 to 12
    Year                    2003                1980 to 2079
    Local zone hour            00            knots    offset from UTC (set to 00)
    Local zone minutes        00                    offset from UTC (set to 00)
    Checksum            
    <CR><LF>                                    End of message termination
    -----------------------------------------------------------------------------
    */

    TRACE(L"--------------------------------------------------------------\n");
    TRACE(L"| %s\n", m_Divide[L"$GPZDA"]);
    TRACE(L"--------------------------------------------------------------\n");

    int nPos = 0, nPos2 = 0, index = 0;
    CString szGp;
    while (true)
    {
        nPos2 = m_Divide[L"$GPZDA"].Find(L",", nPos);
        szGp = m_Divide[L"$GPZDA"].Mid(nPos, nPos2 - nPos);
        TRACE(L"| GPZDA index:%d : %s\n", index, szGp);

        switch(index)
        {
        case 2:
            m_nmeaData.SetDay(szGp);
            //m_nmeaData[m_bIndex].SetDay(szGp);
            break;
        case 3:
            m_nmeaData.SetMonth(szGp);
            //m_nmeaData[m_bIndex].SetMonth(szGp);
            break;
        case 4:
            m_nmeaData.SetYear(szGp);
            //m_nmeaData[m_bIndex].SetYear(szGp);
            break;
        case 5:
            //m_nmeaData[m_bIndex].SetHour(szGp);
            m_nmeaData.SetHour(szGp);
            break;
        case 6:
            //m_nmeaData[m_bIndex].SetMinutes(szGp);
            m_nmeaData.SetMinutes(szGp);
            return;
            break;
        }

        index++;
        nPos = nPos2 + 1;
    }
}

void CNMEAParser::NMEATrace(void)
{
    //m_nmeaData[m_bIndex].Trace();
    m_nmeaData.Trace();
}
[/code]

[code]
#pragma once

#include <vector>
#include <list>
#include <map>
using namespace std;

class CGSV
{
protected:
    int m_nSatelliteID;
    int m_nElevation;
    int m_nAzimuth;
    int m_nSNR;

public:
    CGSV(void)
        : m_nSatelliteID(0)
        , m_nElevation(0)
        , m_nAzimuth(0)
        , m_nSNR(0)
    {

    }

    void SetID(CString szID)
    {
        m_nSatelliteID = _wtoi(szID);
    }

    void SetElevation(CString szElevation)
    {
        m_nElevation = _wtoi(szElevation);
    }

    void SetAzimuth(CString szAzimuth)
    {
        m_nAzimuth = _wtoi(szAzimuth);
    }

    void SetSNR(CString szSNR)
    {
        m_nSNR = _wtoi(szSNR);
    }

    int GetID(void)
    {
        return m_nSatelliteID;
    }

    int GetElevation(void)
    {
        return m_nElevation;
    }

    int GetAzimuth(void)
    {
        return m_nAzimuth;
    }

    int GetSNR(void)
    {
        return m_nSNR;
    }

    void Trace(void)
    {
        TRACE(L"|    SatelliteID : %d\n", m_nSatelliteID);
        TRACE(L"|    Elevation    : %d\n", m_nElevation);
        TRACE(L"|    Azimuth        : %d\n", m_nAzimuth);
        TRACE(L"|    SNR            : %d\n", m_nSNR);
        TRACE(L"|\n");
    }
};
[/code]
[code]
class CNMEAData
{
protected:
    //
    // GGA
    // $GPGGA,084816.000,3728.6289,N,12652.8449,E,1,09,0.9,89.4,M,19.3,M,,0000*69
    //
    int m_nPositionFix;
    int m_nSatelliteUsed;
    double m_dUTCTime;
    double m_dLatitude;
    double m_dLongitude;
    double m_dAltitude;
    CString m_szNS;
    CString m_szEW;

    //
    // GLL
    //
    CString m_szStatus;

    //
    // GSA
    // $GPGSA,A,3,09,21,18,26,22,12,05,24,29,,,,1.8,0.9,1.5*3A
    //
    int m_nMode2;            // 1(Fix not available), 2(2D), 3(3D)
    //list<int> m_listSatelliteUsed;
    vector<int> m_listSatelliteUsed;
    CString m_szMode1;        // M(Manual), A(Automatic)

    //
    // GSV
    //
    /*
    -------------------------------------------------------------------------
                     SAT1         SAT2         SAT3         SAT4
    -------------------------------------------------------------------------
    $GPGSV,3,1,12, 09,81,154,45, 18,56,317,46, 21,45,233,45, 26,33,059,44 *7D
    $GPGSV,3,2,12, 24,26,189,42, 29,24,066,40, 22,23,310,44, 12,13,155,41 *70
    $GPGSV,3,3,12, 05,11,166,38, 10,04,126,36, 14,02,266,34, 28,02,032,35 *7D
    */
    int m_nSatelliteView;
    //list<CGSV> m_listSatelliteView;
    vector<CGSV> m_listSatelliteView;

    //
    // RMC
    // $GPRMC,084816.000,A,3728.6289,N,12652.8449,E,0.12,139.66,030407,,,A*6D
    //
    double m_fCourseOverGround;
    
    //
    // VTG
    // $GPVTG,139.66,T,,M,0.12,N,0.2,K,A*07
    //
    double m_fTrueCourse;        // 진침로
    double m_fCompaseCourse;    // 나침로
    double m_fKont;
    double m_fKm;

    //
    // ZDA
    //
    int m_nDay;
    int m_nMonth;
    int m_nYear;
    int m_nHour;
    int m_nMinutes;
    
public:
    CNMEAData(void)
        : m_dUTCTime(0.0f)
        , m_dLatitude(0.0f)
        , m_szNS(L"")
        , m_dLongitude(0.0f)
        , m_szEW(L"")
        , m_nPositionFix(0)
        , m_nSatelliteUsed(0)
        , m_nSatelliteView(0)
        , m_dAltitude(0.0)
        , m_szStatus(L"")
        , m_szMode1(L"")
        , m_nMode2(0)
        , m_fCourseOverGround(0.0f)
        , m_fTrueCourse(0.0f)
        , m_fCompaseCourse(0.0f)
        , m_fKont(0.0f)
        , m_fKm(0.0f)
        , m_nDay(0)
        , m_nMonth(0)
        , m_nYear(0)
        , m_nHour(0)
        , m_nMinutes(0)
    {

    }

    void SetUTCTime(CString szUTC)
    {
        m_dUTCTime = _wtof(szUTC);
    }

    void SetLatitude(CString szLatitude)
    {
        m_dLatitude = _wtof(szLatitude);
    }

    void SetNS(CString szNS)
    {
        m_szNS = szNS;
    }

    void SetLongitude(CString szLongitude)
    {
        m_dLongitude = _wtof(szLongitude);
    }

    void SetEW(CString szEW)
    {
        m_szEW = szEW;
    }

    void SetPositionFix(CString szPositionFix)
    {
        m_nPositionFix = _wtoi(szPositionFix);
    }

    void SetSatelliteUsed(CString nSatelliteUsed)
    {
        m_nSatelliteUsed = _wtoi(nSatelliteUsed);
    }

    void SetAltitude(CString szAltitude)
    {
        m_dAltitude = _wtof(szAltitude);
    }

    void SetStatus(CString szStatus)
    {
        m_szStatus = szStatus;
    }

    bool GetStatus(void)
    {
        // A=data valid or V=data not valid
        return m_szStatus == L"A" ? true : false;
    }

    void SetMode1(CString szMode1)
    {
        m_szMode1 = szMode1;
    }

    void SetMode2(CString szMode2)
    {
        m_nMode2 = _wtoi(szMode2);
    }

    void PutSatelliteUsed(CString szSatelliteUsed)
    {
        m_listSatelliteUsed.push_back(_wtoi(szSatelliteUsed));
    }

    void SetSatelliteView(CString nSatelliteView)
    {
        m_nSatelliteView = _wtoi(nSatelliteView);
    }

    void PutSatelliteView(CGSV clsSatelliteView)
    {
        m_listSatelliteView.push_back(clsSatelliteView);
    }

    void SetCourseOverGround(CString szCourseOverGround)
    {
        m_fCourseOverGround = _wtof(szCourseOverGround);
    }

    void SetTrueCourse(CString szTrueCourse)
    {
        m_fTrueCourse = _wtof(szTrueCourse);
    }

    void SetCompaseCourse(CString szCompaseCourse)
    {
        m_fCompaseCourse = _wtof(szCompaseCourse);
    }

    void SetKont(CString szKont)
    {
        m_fKont = _wtof(szKont);
    }

    void SetKm(CString szKm)
    {
        m_fKm = _wtof(szKm);
    }

    void SetDay(CString szDay)
    {
        m_nDay = _wtoi(szDay);
    }

    void SetMonth(CString szMonth)
    {
        m_nMonth = _wtoi(szMonth);
    }

    void SetYear(CString szYear)
    {
        m_nYear = _wtoi(szYear);
    }

    void SetHour(CString szHour)
    {
        m_nHour = _wtoi(szHour);
    }

    void SetMinutes(CString szMinutes)
    {
        m_nMinutes = _wtoi(szMinutes);
    }

    void Trace(void)
    {
        TRACE(L"-----------------------------------------------------\n");
        TRACE(L"| GPS DATA                                         |\n");
        TRACE(L"-----------------------------------------------------\n");
        TRACE(L"| SetUTCTime        : %f\n", m_dUTCTime);
        TRACE(L"| SetLatitude        : %f\n", m_dLatitude);
        TRACE(L"| SetNS                : %s\n", m_szNS);
        TRACE(L"| SetLongitude        : %f\n", m_dLongitude);
        TRACE(L"| SetEW                : %s\n", m_szEW);
        TRACE(L"| SetPositionFix    : %d\n", m_nPositionFix);
        TRACE(L"| PutSatelliteUsed : \n");
        TRACE(L"-----------------------------------------------------\n");        
        
        //size_t nSize = m_listSatelliteUsed.size();
        int i;
        int nSize = static_cast<int>(m_listSatelliteUsed.size());
        //list<int>::iterator it = m_listSatelliteUsed.begin();
        //while (nSize--)
        for (i=0; i<nSize; ++i)
        {
            //TRACE(L"|    SatelliteID : %d\n", *it++);
            TRACE(L"|    SatelliteID : %d\n", m_listSatelliteUsed[i]);
        }

        TRACE(L"-----------------------------------------------------\n");
        TRACE(L"| SatelliteView        : %d\n", m_nSatelliteView);
        TRACE(L"-----------------------------------------------------\n");
        
        nSize = static_cast<int>(m_listSatelliteView.size());
        //list<CGSV>::iterator itCGSV = m_listSatelliteView.begin();
        //while (nSize--)
        for (i=0; i<nSize; ++i)
        {
            m_listSatelliteView[i].Trace();
            //itCGSV->Trace();
            //itCGSV++;
        }

        TRACE(L"-----------------------------------------------------\n");
        TRACE(L"| CourseOverGround    : %f\n", m_fCourseOverGround);
        TRACE(L"| TrueCourse        : %f\n", m_fTrueCourse);
        TRACE(L"| CompaseCourse        : %f\n", m_fCompaseCourse);
        TRACE(L"| Kont                : %f\n", m_fKont);
        TRACE(L"| Km                : %f\n", m_fKm);
        TRACE(L"| Day                : %d\n", m_nDay);
        TRACE(L"| Month                : %d\n", m_nMonth);
        TRACE(L"| Year                : %d\n", m_nYear);
        TRACE(L"| Hour                : %d\n", m_nHour);
        TRACE(L"| Minutes            : %d\n", m_nMinutes);
        TRACE(L"-----------------------------------------------------\n");
    }
};
[/code]

[code]
class CGPSFix
{
public:
    CGPSFix(void)
    {

    }

    bool GetGPSStatus(CString szData)
    {
        //
        // GPS 가 FIX되어 있는지 검사를 해보자.
        //
        if (szData.Find(L"+GPSFIXREQ: 1") != -1)
        {
            return true;
        }

        return false;
    }

};
[/code]

[code]
class CNMEAParser
{
public:
    CNMEAParser(void);
    ~CNMEAParser(void);

protected:
    CString m_szFullText;
    //bool m_bIndex;
    //list<CString> m_Type;
    vector<CString> m_Type;
    
    // serial로 받은 데이터 각 label로 분리시킨
    // 변수들
    map<CString, CString> m_Divide;
    vector<CString> m_GSV;
    //list<CString> m_GSV;
    //list<CString>::iterator it;
    void ParsingGGA(void);
    void ParsingGLL(void);
    void ParsingGSA(void);
    void ParsingGSV(void);
    void ParsingRMC(void);
    void ParsingVTG(void);
    void ParsingZDA(void);

public:
    CNMEAData m_nmeaData;

public:
    virtual void SetDefineType(void);
    //void SetFullText(CString szFullText);
    void Parsing(CString szFullText);
    virtual void Divide(void);
    void TraceDivide(void);
    //void SetQueue(int nSize);
    void NMEATrace(void);
    CString GetDivideString(CString szString);
    bool IsGpsData(void);
};
[/code]

[code]
class CLocationTrackingParser : public CNMEAParser
{
public:
    CLocationTrackingParser(void);
    ~CLocationTrackingParser(void);

protected:
    vector<CNMEAData> m_nmeaData;
};
[/code]

'Windows > MFC' 카테고리의 다른 글

XmlLite  (0) 2013.10.02
WS_EX_APPWINDOW 윈도우를 작업표시줄(taskbar) 에 나타나지 않게 하기  (0) 2013.10.02
String cut 시 ... 붙이기  (0) 2013.10.02
Get System Font  (0) 2013.10.02
CListCtrlHeaderControl, CListCtrlHeaderData  (0) 2013.10.02