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

📄 nmeaparser.cpp

📁 symbian s60上的GPS
💻 CPP
字号:
//system include
#include <E32Math.h>

//use include
#include "NmeaParser.h"

void CNmeaParser::SetData( TDesC8 & aNmeaMessage ) 
{
	iMessage		= &aNmeaMessage;
	iParsePosition	= 0;
}

void CNmeaParser::GetNextTokenIntoL( TDes8 & aBuffer ) 
{
	if ( iMessage == NULL )
		User::Leave( KErrNotReady );

	if ( iParsePosition >= iMessage->Length( ) )
		User::Leave( KErrNotFound );

	while ( iParsePosition < iMessage->Length( ) ) 
	{
		TUint8 nextChar = ( *iMessage )[ iParsePosition++ ];

		if ( nextChar == ',' )
			break;

		aBuffer.Append( nextChar );
	}
}

void CNmeaParser::SkipNextTokenL( void ) 
{
	if ( iMessage == NULL )
		User::Leave( KErrNotReady );

	if ( iParsePosition >= iMessage->Length( ) )
		User::Leave( KErrNotFound );

	while ( iParsePosition < iMessage->Length( ) ) 
	{
		TUint8 nextChar = ( *iMessage )[ iParsePosition++ ];

		if ( nextChar == ',' )
			break;
	}
}

TReal CNmeaParser::GetNextTokensAsLatitudeL( void ) 
{
	TReal			angle;

	TBuf8< 15 >		angleString;
	GetNextTokenIntoL( angleString );

	TBuf8< 5 >		northSouth;
	GetNextTokenIntoL( northSouth );

	TLex8			latLexer( angleString );
	TInt error = latLexer.Val( angle, '.' );

	if ( error != KErrNone )
		User::Leave( error );

	TInt32			degrees;
	Math::Int( degrees, angle / 100.0 );

	TInt32			minutes;
	Math::Int( minutes, angle - degrees * 100 );

	TReal			decimal;
	Math::Frac( decimal, angle );

	TReal latitude = degrees + ( minutes + decimal ) / 60.0;

	if ( northSouth[ 0 ] == 'S' )
		latitude = -latitude;

	return( latitude );
}

TReal CNmeaParser::GetNextTokensAsLongitudeL( void ) 
{
	TReal angle;

	TBuf8< 15 > angleString;
	GetNextTokenIntoL( angleString );

	TBuf8< 5 > northSouth;
	GetNextTokenIntoL( northSouth );

	TLex8 latLexer( angleString );
	TInt error = latLexer.Val( angle, '.' );

	if ( error != KErrNone )
		User::Leave( error );

	TInt32 degrees;
	Math::Int( degrees, angle / 100.0 );

	TInt32 minutes;
	Math::Int( minutes, angle - degrees * 100 );

	TReal decimal;
	Math::Frac( decimal, angle );

	TReal longitude = degrees + ( minutes + decimal ) / 60.0;

	if ( northSouth[ 0 ] == 'W' )
		longitude = -longitude;

	return( longitude );
}

TInt CNmeaParser::GetNextTokenAsIntL( void ) 
{
	TInt result = 0;

	TBuf8< 10 > intString;
	GetNextTokenIntoL( intString );

	TLex8 lexer( intString );
	User::LeaveIfError( lexer.Val( result ) );

	return( result );
}

TReal CNmeaParser::GetNextTokenAsRealL( void ) 
{
	TReal result = 0;

	TBuf8< 10 > realString;
	GetNextTokenIntoL( realString );

	TLex8 lexer( realString );
	User::LeaveIfError( lexer.Val( result ) );

	return( result );
}

void CNmeaParser::ClearData( void ) 
{
	iMessage			= NULL;
	iParsePosition		= 0;
}

⌨️ 快捷键说明

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