📄 gpsreceiverbase.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 + -