www.pudn.com > GPSViewer.rar > GpsInfo.cpp


// GpsInfo.cpp: implementation of the CGpsInfo class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
//#include "gpsdemo.h" 
#include "GpsInfo.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CGpsInfo::CGpsInfo() 
{ 
	m_strGpsInfo = _T(""); 
	m_strGpsOutput = _T(""); 
 
	m_dUtcTime = 0; 
	m_dUtcDate = 0; 
	m_dLatitude = 0; 
	m_dLongitude = 0; 
	m_dAltitude = 0; 
	m_dGeoidSeparation = 0; 
	m_dSpeedGnd = 0; 
	m_dCourseGnd = 0; 
	m_iNumSatUsed = 0; 
	m_bPositionFix = FALSE; 
	m_iInfoMask = 0; 
	 
	for (int i=0; i FieldArray; 
	GetGpsFields(FieldArray, strInfo); 
//	TRACE("Got %s fields %d\n", FieldArray[0], FieldArray.GetSize()); 
	 
	if (FieldArray.GetSize() <= 0) 
		return; 
 
	switch (NmeaTypeId(FieldArray[0]))  
	{ 
	case GPS_NMEA_TYPE_GPGGA: 
		if (FieldArray.GetSize() != 15) 
		{ 
			TRACE("Wrong GGA sentence\n"); 
			return; 
		} 
 
		if (FieldArray[6].IsEmpty() || FieldArray[6] == "0")	// position not fixed 
		{ 
			if (m_bPositionFix) 
			{ 
				m_bPositionFix = FALSE; 
				m_iInfoMask |= GPS_INFOMASK_SATELLITE_VALID;	// enable display 
			} 
			return; 
		} 
 
		if (!m_bPositionFix) 
		{ 
			m_bPositionFix = TRUE; 
			m_iInfoMask |= GPS_INFOMASK_SATELLITE_VALID; 
		} 
 
		m_dUtcTime = (double)atof(FieldArray[1]); 
		m_dLatitude = (double)atof(FieldArray[2]); 
		if (FieldArray[3] == "S") 
			m_dLatitude = -m_dLatitude; 
		m_dLongitude  = (double)atof(FieldArray[4]); 
		if (FieldArray[5] == "W") 
			m_dLongitude = -m_dLongitude; 
		m_iNumSatUsed = atoi(FieldArray[7]); 
		m_dAltitude = (double)atof(FieldArray[9]); 
		m_dGeoidSeparation = (double)atof(FieldArray[11]); 
		m_iInfoMask |= GPS_INFOMASK_POSITION_VALID; 
 
		break; 
 
	case GPS_NMEA_TYPE_GPGLL: 
		if (FieldArray.GetSize() < 7) 
		{ 
			TRACE("Wrong GLL sentence\n"); 
			return; 
		} 
 
		if (FieldArray[6].IsEmpty() || FieldArray[6] == "V")	// position invalid 
			return; 
 
		m_dLatitude = (double)atof(FieldArray[1]); 
		if (FieldArray[2] == "S") 
			m_dLatitude = -m_dLatitude; 
		m_dLongitude  = (double)atof(FieldArray[3]); 
		if (FieldArray[4] == "W") 
			m_dLongitude = -m_dLongitude; 
		m_dUtcTime = (double)atof(FieldArray[5]); 
 
		m_iInfoMask |= GPS_INFOMASK_POSITION_VALID; 
 
		break; 
 
	case GPS_NMEA_TYPE_GPGSA: 
		if (FieldArray.GetSize() != 18) 
		{ 
			TRACE("Wrong SA sentence\n"); 
			return; 
		} 
// bypass GPGSA at the moment, I don't understand the use of it 
		 
//		TRACE("GPGSA sentence bypassed\n"); 
/* 
		bChannelChanged = FALSE; 
 
		for (i=0; i= GPS_TOTAL_CHANNEL_NUM) 
				break; 
 
			int iSatId = atoi(FieldArray[i*4+4]); 
			if (iSatId == 0) 
				continue; 
 
			 
			m_ChannelInfo[m_iCountSatsGot].iSatId = iSatId; 
			m_ChannelInfo[m_iCountSatsGot].iElevation = atoi(FieldArray[i*4+5]); 
			m_ChannelInfo[m_iCountSatsGot].iAzimuth = atoi(FieldArray[i*4+6]); 
			m_ChannelInfo[m_iCountSatsGot].iSNR = atoi(FieldArray[i*4+7]); 
			m_iCountSatsGot++; 
 
/* 
			for (j=0; j &FieldsArr, CString strInfo) 
{ 
 
	CString strField; 
	int iPos = 0; 
 
	FieldsArr.RemoveAll(); 
 
	while((iPos = strInfo.Find(",")) >= 0) 
	{ 
		strField = strInfo.Left(iPos); 
		strField.TrimLeft(); 
		strField.TrimRight(); 
		FieldsArr.Add(strField); 
		strInfo = strInfo.Mid(iPos+1); 
		if (strInfo.IsEmpty()) 
			break; 
	} 
	 
	if (!strInfo.IsEmpty()) 
	{ 
		iPos = strInfo.Find("*"); 
		if (iPos == 0) 
			strInfo.Empty(); 
		else if (iPos > 0) 
			strInfo = strInfo.Left(iPos); 
 
		strInfo.TrimLeft(); 
		strInfo.TrimRight(); 
 
		FieldsArr.Add(strInfo); 
	} 
 
} 
 
int CGpsInfo::NmeaTypeId(CString strNmeaId) 
{ 
//	TRACE ("Got NMEA type %s\n", strNmeaId); 
 
	if (strNmeaId == _T("$GPGGA")) 
		return GPS_NMEA_TYPE_GPGGA; 
	else if (strNmeaId == _T("$GPGLL")) 
		return GPS_NMEA_TYPE_GPGLL; 
	else if (strNmeaId == _T("$GPGSA")) 
		return GPS_NMEA_TYPE_GPGSA; 
	else if (strNmeaId == _T("$GPGSV")) 
		return GPS_NMEA_TYPE_GPGSV; 
	else if (strNmeaId == _T("$GPRMC")) 
		return GPS_NMEA_TYPE_GPRMC; 
	else 
		return GPS_NMEA_TYPE_OTHERS; 
}