亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nmea.cpp

?? 這是從賽迪網共享出來的可以直接使用的 GBS lib
?? CPP
字號:
#include "stdafx.h"
#include "nmea.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif


NMEA_BOOLEAN CNmeaSentence::Boolean(int nField) const
{
  CString sField(Field(nField));

  if (sField == _T("A"))
    return True;
  else if (sField == _T("V"))
    return False;
  else
    return Unknown;
}


int CNmeaSentence::HexDigitToInt(char c)
{
  int rVal = 0;
  if ((c >= 'a') && (c <= 'f'))
    rVal =  c - 'a' + 10;
  else if ((c >= 'A') && (c <= 'F'))
    rVal =  c - 'A' + 10;
  else if ((c >= '0') && (c <= '9'))
    rVal = c - '0';

  return rVal;
}

DWORD CNmeaSentence::HexValue(const CString& sHexString)
{
  int nLen = sHexString.GetLength();
  DWORD rVal = 0;
  int nMultiplier = 1;
  for (int i=nLen-1; i>=0; i--)
  {
    TCHAR c = sHexString.GetAt(i);
    rVal += (HexDigitToInt((char)c) * nMultiplier);
    nMultiplier *= 16;
  }

  return rVal;
}

BYTE CNmeaSentence::ComputeChecksum() const
{
  BYTE checksum = 0;

  int nLength = m_Sentence.GetLength();
  int i = 1; // Skip over the $ at the begining of the CNmeaSentence

  while (i < nLength && 
         m_Sentence[i] != _T('*') && 
         m_Sentence[i] != _T('\r') && 
         m_Sentence[i] != _T('\n') )
  {
    checksum ^= (BYTE) m_Sentence[i];
    i++;
  }

  return checksum;
}

double CNmeaSentence::Double(int nField) const
{
  CString sField(Field(nField));

  double rVal = 0.0;

  #ifdef _UNICODE
    int nLength = sField.GetLength();
    int nSize = (nLength + 1)/sizeof(TCHAR);
    char* pszFieldAscii = new char[nSize];

    WideCharToMultiByte(CP_ACP, 0, sField, -1, pszFieldAscii, nSize, NULL, NULL);
    rVal = ::atof(pszFieldAscii);

    delete [] pszFieldAscii;
  #else
    rVal = ::atof(sField);
  #endif

  return rVal;
}

NMEA_EASTWEST CNmeaSentence::EastOrWest(int nField) const
{
  CString sField(Field(nField));

  if (sField == _T("E"))
    return East;
  else if (sField == _T("W"))
    return West;
  else
    return EW_Unknown;
}

NMEA_LONGITUDE CNmeaSentence::Longitude(int nPositionFieldNumber, int nEastingFieldNumber) const
{
  NMEA_LONGITUDE rVal;
  rVal.Value = Angle(nPositionFieldNumber);
  rVal.Easting = EastOrWest(nEastingFieldNumber);
  return rVal;
}

NMEA_LATITUDE CNmeaSentence::Latitude(int nPositionFieldNumber, int nNorthingFieldNumber) const
{
  NMEA_LATITUDE rVal;
  rVal.Value = Angle(nPositionFieldNumber);
  rVal.Northing = NorthOrSouth(nNorthingFieldNumber);
  return rVal;
}

CString CNmeaSentence::Field(int nDesiredField) const
{
  CString rVal;

  int i = 1;
  int nCurrentField = 0;

  int nLen = m_Sentence.GetLength();

  while (nCurrentField < nDesiredField && i < nLen)
  {
    if (m_Sentence[i] == _T(',') || m_Sentence[i] == _T('*'))
      nCurrentField++;
    i++;
  }

  if (nCurrentField == nDesiredField)
  {
    while (i < nLen &&
           m_Sentence[i] != _T(',') &&
           m_Sentence[i] != _T('*') &&
           m_Sentence[i] != _T('\n') &&
           m_Sentence[i] != _T('\r') &&
           m_Sentence[i] != 0x00 )
    {
      rVal += m_Sentence[i];
      i++;
    }
  }

  return rVal;
}

int CNmeaSentence::Integer(int nField) const
{
  CString sInteger(Field(nField));
  return ::_ttoi(sInteger);
}

NMEA_BOOLEAN CNmeaSentence::IsChecksumBad(int nField) const
{
  // Checksums are optional, return TRUE if an existing checksum is known to be bad
  CString sChecksum(Field(nField));

  if (sChecksum.IsEmpty())
    return Unknown;

  BYTE CalculatedCheckSum = ComputeChecksum();
  DWORD ReceivedCheckSum = HexValue(sChecksum);

  if (CalculatedCheckSum != ReceivedCheckSum)
    return True;
  else
    return False;
}

NMEA_NORTHSOUTH CNmeaSentence::NorthOrSouth(int nField) const
{
  CString sField(Field(nField));

  if (sField == _T("N"))
    return North;
  else if (sField == _T("S"))
    return South;
  else
    return NS_Unknown;
}

NMEA_TIME CNmeaSentence::Time(int nField) const
{
  NMEA_TIME rVal;
  ZeroMemory(&rVal, sizeof(NMEA_TIME));
  CString sTemp(Field(nField));
  if (sTemp.GetLength() >= 6)
  {
    TCHAR sNumber[3];

    sNumber[0] = sTemp[0];
    sNumber[1] = sTemp[1];
    sNumber[2] = 0x00;
    rVal.wHour = (WORD) ::_ttoi(sNumber);

    sNumber[0] = sTemp[2];
    sNumber[1] = sTemp[3];
    rVal.wMinute = (WORD) ::_ttoi(sNumber);

    sNumber[0] = sTemp[4];
    sNumber[1] = sTemp[5];
    rVal.wSecond = (WORD) ::_ttoi(sNumber);
  }

  return rVal;
}

NMEA_DATE CNmeaSentence::Date(int nField) const
{
  NMEA_DATE rVal;
  ZeroMemory(&rVal, sizeof(NMEA_DATE));
  CString sTemp(Field(nField));
  if (sTemp.GetLength() >= 6)
  {
    TCHAR sNumber[3];

    sNumber[0] = sTemp[0];
    sNumber[1] = sTemp[1];
    sNumber[2] = 0x00;
    rVal.wDay = (WORD) ::_ttoi(sNumber);

    sNumber[0] = sTemp[2];
    sNumber[1] = sTemp[3];
    rVal.wMonth = (WORD) ::_ttoi(sNumber);

    sNumber[0] = sTemp[4];
    sNumber[1] = sTemp[5];
    rVal.wYear = (WORD) ::_ttoi(sNumber);

    //intelligently adjust the year
    if (rVal.wYear < 80)
      rVal.wYear += 2000;
    else if (rVal.wYear >= 75)
      rVal.wYear += 1900;
  }

  return rVal;
}

NMEA_ANGLE CNmeaSentence::Angle(int nField) const
{
  NMEA_ANGLE rVal;
  ZeroMemory(&rVal, sizeof(NMEA_ANGLE));

  CString sTemp(Field(nField));

  int nPointIndex = sTemp.Find(_T('.'));
  if (nPointIndex != -1)
  {
    CString sUnits(sTemp.Left(nPointIndex));
    int nValue = ::_ttoi(sUnits);
    rVal.Degrees = (WORD) (nValue/100);
    rVal.Minutes = (WORD) (nValue - rVal.Degrees*100);

    CString sFraction(sTemp.Right(sTemp.GetLength() - nPointIndex));
    double fValue = 0.0;
    #ifdef _UNICODE
      int nLength = sFraction.GetLength();
      int nSize = (nLength + 1)/sizeof(TCHAR);
      char* pszFieldAscii = new char[nSize];

      WideCharToMultiByte(CP_ACP, 0, sFraction, -1, pszFieldAscii, nSize, NULL, NULL);
      fValue = ::atof(pszFieldAscii);

      delete [] pszFieldAscii;
    #else
      fValue = ::atof(sFraction);
    #endif

    rVal.Seconds = (WORD) (fValue*60);
    rVal.CentiSeconds = (WORD) ((fValue*60 - rVal.Seconds)*100.0);
  }

  return rVal;
}

DWORD CNmeaSentence::NmeaAngleToHundrethsOfSeconds(const NMEA_ANGLE& angle)
{
  DWORD rVal = angle.Degrees*360000 + 
               angle.Minutes*6000 +
               angle.Seconds*100 +
               angle.CentiSeconds;
  return rVal;
}

DWORD CNmeaSentence::NmeaBearingToHundrethsOfDegrees(const double& value)
{
  int nDigits = (int) value;
  int nHundreths = (int) ((value - nDigits)*100);
  return nDigits*100 + nHundreths;
}


CRMCResponse::CRMCResponse()
{
  Empty();
}

CRMCResponse::~CRMCResponse()
{
  Empty();
}

void CRMCResponse::Empty()
{
  ZeroMemory(&m_Time, sizeof(NMEA_TIME));
  ZeroMemory(&m_Date, sizeof(NMEA_DATE));
  m_IsDataValid              = Unknown;
  ZeroMemory(&m_Latitude, sizeof(NMEA_LATITUDE));
  ZeroMemory(&m_Longitude, sizeof(NMEA_LONGITUDE));
  m_SpeedOverGroundKnots       = 0.0;
}

BOOL CRMCResponse::Parse(const CNmeaSentence& sentence)
{
  // First we check the checksum
  NMEA_BOOLEAN check = sentence.IsChecksumBad(12);
  if (check == True)
  {
    TRACE(_T("CRMCResponse::Parse detected an Invalid checksum\n"));
    return FALSE;
  }
  else if (check == Unknown)
  {
    TRACE(_T("CRMCResponse::Parse detected a missing checksum\n"));
    return FALSE;
  } 

  //then the data
  m_Time                 = sentence.Time(1);
  m_Date                 = sentence.Date(9);
  m_IsDataValid          = sentence.Boolean(2);
  m_Latitude             = sentence.Latitude(3, 4);
  m_Longitude            = sentence.Longitude(5, 6);
  m_SpeedOverGroundKnots = sentence.Double(7);
  m_Bearing              = sentence.Double(8);

  return TRUE;
}




CGGAResponse::CGGAResponse()
{
  Empty();
}

CGGAResponse::~CGGAResponse()
{
  Empty();
}

void CGGAResponse::Empty()
{
  m_GPSQuality            = 0;
  m_nSatellites           = 0;
  m_AntennaAltitudeMeters = 0.0;
}

BOOL CGGAResponse::Parse(const CNmeaSentence& sentence)
{
  // First we check the checksum...
  if (sentence.IsChecksumBad(15) == True)
  {
    TRACE(_T("CGGAResponse::Parse detected an Invalid Checksum"));
    return FALSE;
  } 

  m_GPSQuality            = sentence.Integer(6);
  m_nSatellites           = sentence.Integer(7);
  m_AntennaAltitudeMeters = sentence.Double(9);

  return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本欧美一区二区三区乱码| 欧美综合一区二区三区| 91麻豆.com| 久久先锋影音av| 亚洲成国产人片在线观看| 国产成人免费视频一区| 在线电影一区二区三区| 夜夜精品浪潮av一区二区三区| 国产高清不卡一区二区| 欧美二区在线观看| 亚洲一级在线观看| 色999日韩国产欧美一区二区| 久久久综合视频| 久久国产麻豆精品| 欧美一区二区三区影视| 亚洲国产精品久久艾草纯爱| 在线影院国内精品| 亚洲精品欧美在线| 99re66热这里只有精品3直播| 国产亚洲欧美日韩在线一区| 麻豆91精品视频| 日韩一区二区三区观看| 天堂成人国产精品一区| 欧美性极品少妇| 亚洲一区二区av电影| 欧美性一二三区| 一区二区三区四区激情 | 亚洲免费在线视频| 成人免费av资源| 欧美国产日韩亚洲一区| 国产a区久久久| 国产精品久久久久久久久免费桃花 | 国产福利精品一区| 久久久久久久久久久久久女国产乱 | 欧美电视剧在线观看完整版| 蜜桃一区二区三区四区| 欧美大白屁股肥臀xxxxxx| 秋霞午夜av一区二区三区| 日韩一本二本av| 加勒比av一区二区| 精品黑人一区二区三区久久| 国产又黄又大久久| 国产精品美女视频| 日本韩国欧美三级| 日韩精品成人一区二区三区| 日韩一级二级三级| 高清成人在线观看| 亚洲情趣在线观看| 欧美喷水一区二区| 国产一区二三区| 中文字幕一区二区三区色视频 | 97se亚洲国产综合自在线| 亚洲精品视频免费看| 777亚洲妇女| 国产一区二区三区美女| 亚洲欧洲一区二区三区| 欧美日韩国产一二三| 日韩av电影免费观看高清完整版| 久久午夜老司机| 在线观看亚洲专区| 极品瑜伽女神91| 亚洲猫色日本管| 欧美大白屁股肥臀xxxxxx| av电影一区二区| 免费在线观看视频一区| 欧美韩国日本一区| 91麻豆精品国产无毒不卡在线观看| 精品午夜一区二区三区在线观看| 亚洲人精品午夜| 欧美一二三在线| 国产成人在线视频网址| 夜夜嗨av一区二区三区网页| 久久在线免费观看| 欧美色区777第一页| 粉嫩高潮美女一区二区三区| 亚洲丶国产丶欧美一区二区三区| 2021国产精品久久精品| 欧美视频在线观看一区二区| 国产一区二区三区免费看| 午夜精品在线看| 最新久久zyz资源站| 欧美成人a在线| 在线观看亚洲精品| 不卡电影一区二区三区| 美女看a上一区| 亚洲一区二区欧美激情| 亚洲欧美在线高清| 久久看人人爽人人| 欧美α欧美αv大片| 欧美性三三影院| 一本到一区二区三区| 丁香婷婷综合五月| 国内成+人亚洲+欧美+综合在线| 婷婷成人激情在线网| 一区二区三区蜜桃网| 亚洲视频1区2区| 国产精品免费视频网站| 久久久亚洲精品一区二区三区 | 在线亚洲高清视频| av网站免费线看精品| 成人一区二区三区在线观看| 精品一区二区免费| 狠狠色狠狠色综合系列| 久久疯狂做爰流白浆xx| 日本麻豆一区二区三区视频| 午夜激情综合网| 日韩二区三区四区| 日韩福利电影在线| 免费人成在线不卡| 免费成人av资源网| 久久精品久久精品| 国产一区二区三区香蕉| 国产精品影视在线观看| 国产高清在线观看免费不卡| 国产成人午夜片在线观看高清观看 | 不卡电影一区二区三区| 播五月开心婷婷综合| 99精品视频在线观看| 色婷婷久久99综合精品jk白丝| 99精品热视频| 色久优优欧美色久优优| 日本精品裸体写真集在线观看 | 日本视频一区二区| 久久99精品久久久久婷婷| 国产精选一区二区三区| av不卡在线播放| 欧美亚洲一区三区| 日韩欧美中文一区| 国产精品无遮挡| 亚洲视频在线一区二区| 一级精品视频在线观看宜春院| 午夜精品久久久久| 九色综合狠狠综合久久| 9色porny自拍视频一区二区| 色婷婷激情综合| 4438成人网| 国产精品久久综合| 亚洲综合免费观看高清完整版| 亚洲成人中文在线| 国产中文字幕精品| 一本久久综合亚洲鲁鲁五月天| 欧美群妇大交群的观看方式| 精品国产一区二区三区av性色| 1024成人网色www| 久久精品国产精品青草| av一区二区久久| 日韩欧美一级二级三级久久久| 国产精品久久看| 视频在线观看一区| 成人午夜大片免费观看| 欧美精品在线一区二区| 久久精品水蜜桃av综合天堂| 亚洲自拍另类综合| 国产传媒日韩欧美成人| 欧美绝品在线观看成人午夜影视 | 精品国产99国产精品| 中文字幕亚洲欧美在线不卡| 日韩精品成人一区二区三区| 成人激情开心网| 欧美大片顶级少妇| 亚洲一区二区av在线| 成人高清视频在线观看| 日韩一区二区三区高清免费看看| 亚洲人成网站精品片在线观看| 男女视频一区二区| 欧美三级欧美一级| 中文字幕一区二区日韩精品绯色| 日韩电影在线一区二区三区| 一本一道波多野结衣一区二区| 久久久亚洲国产美女国产盗摄| 午夜a成v人精品| 91亚洲精品乱码久久久久久蜜桃| 欧美成人精品福利| 五月天激情综合网| 91久久精品一区二区三| 国产精品入口麻豆原神| 国产伦精品一区二区三区视频青涩 | 九一久久久久久| 欧美美女一区二区三区| 亚洲日韩欧美一区二区在线| 国产一区二区不卡| 精品久久五月天| 日韩电影在线一区二区三区| 色哟哟亚洲精品| 亚洲精品视频一区二区| 99视频国产精品| 综合久久久久综合| proumb性欧美在线观看| 日本一区二区动态图| 国产精品亚洲午夜一区二区三区| 欧美变态口味重另类| 久久国产成人午夜av影院| 欧美一区二区三区在| 免费人成精品欧美精品| 91精品国产色综合久久久蜜香臀| 亚洲成国产人片在线观看| 欧美日产国产精品| 日韩综合一区二区| 欧美一区二视频| 另类综合日韩欧美亚洲|