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

📄 gpsreceiverbase.cpp

📁 SYMBIAN GPS NMEA协议实现
💻 CPP
字号:
/************************************************************************/
/* Bluteooth Test           The.Berlin.Factor                 Juni 2003 */
/************************************************************************/

#include "gps/GpsListener.h"

#include "gps/impl/GpsReceiverBase.h"



CGpsReceiverBase::CGpsReceiverBase( ) {

}



CGpsReceiverBase::~CGpsReceiverBase( ) {

	iListeners.Reset( );

}



void CGpsReceiverBase::AddListenerL( MGpsListener * aListener ) {

	for ( TInt idx = 0; idx < iListeners.Count( ); idx++ ) {

		MGpsListener * registeredListener = iListeners[ idx ];
		if ( registeredListener == aListener )
			User::Leave( KErrAlreadyExists );
	}

	iListeners.Append( aListener );

}



void CGpsReceiverBase::RemoveListenerL( MGpsListener * aListener ) {

	TInt idx = iListeners.Find( aListener );

	if ( idx == KErrNotFound )
		User::Leave( KErrNotFound );

	iListeners.Remove( idx );

}



void CGpsReceiverBase::SendUpdate( const TGpsPosition & aNewPosition ) {

	for ( TInt idx = 0; idx < iListeners.Count( ); idx++ ) {

		MGpsListener * aListener = iListeners[ idx ];
		aListener->GpsUpdate( aNewPosition );
	}

}



void CGpsReceiverBase::ProcessMessageL( TDesC8 & aCommand ) {

	TBuf8< 32 > temp;

	_LIT( KGlobalPositioning, "$GPGGA" );
	temp.Copy( KGlobalPositioning );

	TInt foundGPGGA = aCommand.Find( temp );
	if ( foundGPGGA == 0 )
		ProcessGPGGAMsgL( aCommand );

	_LIT( KGeographicPosition, "$GPGLL" );
	temp.Copy( KGeographicPosition );

	TInt foundGPGLL = aCommand.Find( temp );
	if ( foundGPGLL == 0 )
		ProcessGPGLLMsgL( aCommand );

	_LIT( KCourseData, "$GPVTG" );
	temp.Copy( KCourseData );

	TInt foundGPVTG = aCommand.Find( temp );
	if ( foundGPVTG == 0 )
		ProcessGPVTGMsgL( aCommand );

}



void CGpsReceiverBase::ProcessGPGGAMsgL( TDesC8 & aCommand ) {

	iNmeaParser.SetData( aCommand );
	iNmeaParser.SkipNextTokenL( );	// skip message id

	TReal utcTime = iNmeaParser.GetNextTokenAsRealL( );

	TReal latitude = iNmeaParser.GetNextTokensAsLatitudeL( );
	TReal longitude = iNmeaParser.GetNextTokensAsLongitudeL( );

	TInt fixValid = iNmeaParser.GetNextTokenAsIntL( );
	TInt satellites = iNmeaParser.GetNextTokenAsIntL( );

	TReal hdop = iNmeaParser.GetNextTokenAsRealL( );

	iNmeaParser.ClearData( );

	iLastPosition.Reset( );
	iLastPosition.Set( longitude, latitude );
	iLastPosition.SetExtendedInfo( fixValid == 1, satellites, hdop );
	iLastPosition.SetTimeInfo( utcTime, User::TickCount( ) );

	SendUpdate( iLastPosition );

}



void CGpsReceiverBase::ProcessGPGLLMsgL( TDesC8 & aCommand ) {

	iNmeaParser.SetData( aCommand );
	iNmeaParser.SkipNextTokenL( );	// skip message id

	TReal latitude = iNmeaParser.GetNextTokensAsLatitudeL( );
	TReal longitude = iNmeaParser.GetNextTokensAsLongitudeL( );

	iNmeaParser.ClearData( );

	iLastPosition.Reset( );
	iLastPosition.Set( longitude, latitude );

	SendUpdate( iLastPosition );

}



void CGpsReceiverBase::ProcessGPVTGMsgL( TDesC8 & aCommand ) {

	iNmeaParser.SetData( aCommand );
	iNmeaParser.SkipNextTokenL( );	// skip message id

	TReal heading = iNmeaParser.GetNextTokenAsRealL( );
	iNmeaParser.SkipNextTokenL( );	// skip heading unit
	iNmeaParser.SkipNextTokenL( );	// skip magnetic heading
	iNmeaParser.SkipNextTokenL( );	// skip magnetic heading unit

	TReal speedInKnots = iNmeaParser.GetNextTokenAsRealL( );
	iNmeaParser.SkipNextTokenL( );	// skip speed unit
	iNmeaParser.SkipNextTokenL( );	// skip speed in km/h
	iNmeaParser.SkipNextTokenL( );	// skip speed unit

	iNmeaParser.ClearData( );

	iLastPosition.SetCourseData( heading, speedInKnots, ETrue );

	SendUpdate( iLastPosition );

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -