diff -r 000000000000 -r 522cd55cc3d7 basiclocationinfodisplay/blid/engine/src/CBlidLocation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/basiclocationinfodisplay/blid/engine/src/CBlidLocation.cpp Tue Feb 02 00:16:03 2010 +0200 @@ -0,0 +1,1485 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implemenation of CBlidLocation class which provides access to blid location and satellite information +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include + +#include "CBlidLocation.h" +#include "MBlidEngObserver.h" +#include "blidengconsts.h" +#include "blidcommonconsts.h" +#include "Blid.hrh" +#include "cblidmoduleinfoobserver.h" + +#ifdef _DEBUG +#include "Debug.h" +#endif + +// FORWARD DECLARATION +TInt TimerCallBackFunctionL(TAny* aPtr); +TInt SortCriteria(const TSatelliteData& aCurrent, const TSatelliteData& aNext); + +// ============================ MEMBER FUNCTIONS ============================== +// ---------------------------------------------------------------------------- +// CBlidLocation::CBlidLocation +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CBlidLocation::CBlidLocation(RPositionServer& aServer, CBlidEng& aEngine ) + : CActive(EPriorityStandard) + ,iServer( aServer ), iRequesting( EFalse ), + iOnlineMode( EFalse ),iIsDistance(ETrue), + iDistanceTravelled(0),iIsTripStart(EFalse), + iIsTripNotStart(ETrue),iIsTripClear(EFalse), + iIsTripReset(EFalse),iEngine(aEngine) + + { + CActiveScheduler::Add( this ); + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ConstructL( ) + { + iSatelliteCapability = IsSatelliteCapabilityL(); + //User::LeaveIfError(iPositioner.Open( iServer )); + // get the number of modules + GetModuleInfoNotificationL(); + // and registered for notification + iModuleInfoObserv = CBlidModuleinfoObserver::NewL( iServer, *this ); + iModuleInfoObserv->StartNotification(); + + //initialize iSpeedAverage + TRealX temp; + temp.SetNaN(); + iSpeedAverage = temp; + iHeading = 0; + iGPSDataAvailable = EFalse; + iTripAverageSpeed = 0.0; + iTripMaxSpeed = 0.0; + iIsPreviousPositionUpdated = EFalse; + iWaitingGpsData = ETrue; + iIsDistanceTravelled = ETrue; + iRegisteredViewId = EBlidMainView; + iUpdateReceived = EFalse; + iDeviceStatus = EDeviceUnderConnection; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CBlidLocation* CBlidLocation::NewL( RPositionServer& aServer, CBlidEng& aEngine ) + { + CBlidLocation* self = new( ELeave ) CBlidLocation(aServer, aEngine); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); //self + return self; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::~CBlidLocation +// ---------------------------------------------------------------------------- +// +CBlidLocation::~CBlidLocation() + { + Cancel(); + iPositioner.Close(); + iSpeedArray.Close(); + if(iTimer) + { + delete iTimer; + iTimer = NULL; + } + iModuleInfoArray.Reset(); + delete iModuleInfoObserv; + iSortedSatData.Reset(); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetObserver +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetObserver(MBlidEngObserver& aObserver, TInt aViewId) + { + iObserver = &aObserver; + iRegisteredViewId = aViewId; + // added to fix TSW error + iLastGoodFixTime.UniversalTime(); + + if(iUpdateReceived) + { + SetUpdateOptions(); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::RemoveModelObserver +// ---------------------------------------------------------------------------- +// +void CBlidLocation::RemoveModelObserver() + { + iObserver = NULL; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::InitialLocationRequestL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::InitialLocationRequestL( const TDesC& aSrvName ) + { + User::LeaveIfError(iPositioner.Open( iServer )); + + User::LeaveIfError(iPositioner.SetRequestor( + CRequestor::ERequestorService, + CRequestor::EFormatApplication, + aSrvName )); + SetUpdateOptions(); + iRequesting = ETrue; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CurrentPosition +// ---------------------------------------------------------------------------- +// +TPosition& CBlidLocation::GetCurrentPosition() + { + return iPosition; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsSatelliteCapability +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsSatelliteCapabilityL() + { + TUint count = 0; + User::LeaveIfError( iServer.GetNumModules(count) ); + TPositionModuleInfo moduleInfo; + + for( TUint i = 0; i < count; i++ ) + { + User::LeaveIfError( iServer.GetModuleInfoByIndex( i, moduleInfo ) ); + if ( moduleInfo.Capabilities() & + TPositionModuleInfo::ECapabilitySatellite ) + { + return ETrue; + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetCourseInfo +// ---------------------------------------------------------------------------- +// +TCourse& CBlidLocation::GetCourse() + { + return iCourse; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CancelRequest +// ---------------------------------------------------------------------------- +// +void CBlidLocation::CancelRequest() + { + Cancel(); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::StopRequesting +// ---------------------------------------------------------------------------- +// +void CBlidLocation::StopRequesting() + { + iOnlineMode = EFalse; + iRequesting = EFalse; + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::StartRequesting +// ---------------------------------------------------------------------------- +// +void CBlidLocation::StartRequesting() + { + if ( !IsActive() ) + { + SetUpdateOptions(); + } + iRequesting = ETrue; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsOnline +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsOnline() + { + return iOnlineMode; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SatelliteCapability +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::SatelliteCapability() + { + return iSatelliteCapability; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SpeedAverage +// ---------------------------------------------------------------------------- +// +TReal CBlidLocation::SpeedAverage() + { + return iSpeedAverage; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::MaxSpeed +// ---------------------------------------------------------------------------- +// +TReal CBlidLocation::MaxSpeed() + { + return iMaxSpeed; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::WaitingGPSData +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::WaitingGPSData() + { + return iWaitingGpsData; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsGPSDeviceConnected +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsGPSDeviceConnected() + { + return (iDeviceStatus == EDeviceConnected); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::RunL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::RunL() + { + iPosStatus = iStatus; + + iDeviceStatus = EDeviceConnected; + + /// Check if we have satellite data + if(!(iStatus.Int() == KErrNone || + iStatus.Int() == KPositionPartialUpdate) ) + { + iPositionInfo.ClearSatellitesInView(); + } + SortSatelliteDataL(); + + switch ( iStatus.Int() ) + { + //case KPositionPartialUpdate: + case KErrNone: // Success + { + iOnlineMode = ETrue; + iUpdateReceived = ETrue; + iGPSDataAvailable = ETrue; + iPositionInfo.GetPosition( iPosition ); + iPositionInfo.GetCourse( iCourse ); + iLastGoodFixTime.UniversalTime(); + + CalculateCourse(); + + if(iIsTripStart) + { + if(!iIsPreviousPositionUpdated) + { + iIsPreviousPositionUpdated = ETrue; + iPrevPosition = GetCurrentPosition(); + } + UpdateTripData(); + } + + //SortSatelliteDataL(); + + if(iObserver) + { + iObserver->NotifyL( iOnlineMode ); + } + if ( iRequesting ) + { + //DEBUG("KErrNone : NotifyPositionUpdate"); + iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + SetActive(); + } + break; + } + case KErrAccessDenied: + /* + Happens if we don't specify requestor information. + This condition should not be encountered. + */ + { + iRequesting = EFalse; + User::Leave( KErrAccessDenied ); + break; + } + case KErrCancel: // Postion update request cancelled + { + // We canceled the request so do nothing + break; + } + case KPositionPartialUpdate: // Incomplete position information + { + if ( iRequesting ) + { + //DEBUG("KPositionPartialUpdate : NotifyPositionUpdate"); + iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + SetActive(); + } + break; + } + case KErrTimedOut: // Position update timed out + case KPositionQualityLoss: //GPS not connected + { + iUpdateReceived = ETrue; + iGPSDataAvailable = EFalse; + if(iIsTripStart && !iIsTripClear) + { + iTripGPSDataLost = ETrue; + } + // Leaving break is intentional + } + //-fallthrough + case KErrNotFound: // No PSY selected. + case KErrUnknown: // This will be returned by MLFW + case KErrArgument: + /* + PSY does not support the information type specified + by BLID. + */ + default: + { + if(iStatus.Int() != KPositionPartialUpdate ) + { + iDeviceStatus = EDeviceNotFound; + iPositionInfo.ClearSatellitesInView(); + iWaitingGpsData = EFalse; + } + // added for TSW error. + if(iStatus.Int() == KPositionPartialUpdate ) + { + //SortSatelliteDataL(); + TTime now; + now.UniversalTime(); + TTimeIntervalSeconds secondsSinceLastGoodFix; + now.SecondsFrom( iLastGoodFixTime , secondsSinceLastGoodFix ); + if ( secondsSinceLastGoodFix.Int() > 15 ) + { + iLastGoodFixTime.UniversalTime(); + if(iObserver) + { + iObserver->NotifyErrorL( KErrTimedOut ); + } + } + } + else + { + iLastGoodFixTime.UniversalTime(); + } + // end of addition for TSW error + + iGPSDataAvailable = EFalse; + iUpdateReceived = ETrue; + + // All cases are errors and hence go to offline mode + iOnlineMode = EFalse; + if(iObserver) + { + iObserver->NotifyErrorL(iStatus.Int()); + } + if ( iRequesting ) + { + + iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + SetActive(); + } + break; + } + } + + /*if( iStatus.Int() != KErrCancel ) + { + //DEBUG("RUNL : SetUpdateOptions"); + SetUpdateOptions(); + }*/ + if(iStatus.Int() != KPositionPartialUpdate ) + { + iWaitingGpsData = CheckIfWaitingGPSData(); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetUpdateOptions +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetUpdateOptions() + { + if(IsActive()) + { + Cancel(); + } + // update interval + TInt intervalTime = KMidIntervalTime; + + if(iEngine.AppMode() == CBlidEng::EAppBackground) // If application is in background mode + { + TRAP_IGNORE(UpdateIntervalL( KMaxIntervalTime )); + if ( iRequesting ) + { + iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + SetActive(); + } + return; + } + + switch(iRegisteredViewId) + { + case EBlidNavigationView: + { + TReal32 distance; + TInt retVal; + retVal = iEngine.GetDistanceToDestination(distance); + if(retVal == KErrNone) + { + if(distance <= KBlidHundredMeters) + { + intervalTime = KShortIntervalTime; + } + else if(distance > KBlidHundredMeters && + distance < KBlidOneKilometer) + { + intervalTime = KMidIntervalTime; + } + else + { + intervalTime = KMaxIntervalTime; + } + } + else + { + intervalTime = KShortIntervalTime; + } + break; + } + case EBlidTripMeterView: + { + if(iDistanceTravelled < KBlidHundredMeters) + { + intervalTime = KShortIntervalTime; + } + else if(iDistanceTravelled > KBlidHundredMeters && + iDistanceTravelled < KBlidOneKilometer) + { + intervalTime = KMidIntervalTime; + } + else + { + intervalTime = KMaxIntervalTime; + } + break; + } + case EBlidMainView: + default: + { + intervalTime = KMidIntervalTime; + break; + } + } + TRAP_IGNORE(UpdateIntervalL( intervalTime )); + if ( iRequesting ) + { + iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::DoCancel +// ---------------------------------------------------------------------------- +// +void CBlidLocation::DoCancel() + { + iPositioner.CancelRequest( EPositionerNotifyPositionUpdate ); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::RunError +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::RunError(TInt aError) + { + if ( iObserver && aError != KBlidLeaveExit ) + { + TRAPD(error,iObserver->NotifyErrorL( aError )); + if(error != KErrNone) + { + return error; + } + } + return aError; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::UpdateIntervalL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::UpdateIntervalL( const TInt aIntervalTime ) + { + iCurrentUpdateInterval = aIntervalTime; + TPositionUpdateOptions updateOptions; + updateOptions.SetUpdateInterval(TTimeIntervalMicroSeconds(aIntervalTime)); + updateOptions.SetAcceptPartialUpdates( ETrue ); + if(iUpdateReceived) + { + updateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateIntervalTimeOut)); + } + else + { + updateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KStartUpdateIntervalTimeOut)); + } + User::LeaveIfError( iPositioner.SetUpdateOptions(updateOptions) ); + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetCurrentUpdateInterval +// ---------------------------------------------------------------------------- +// +void CBlidLocation:: GetCurrentUpdateInterval(TInt& aInterval) + { + aInterval = iCurrentUpdateInterval; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetPositionInfoStatus +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::GetPositionInfoStatus() + { + return iPosStatus.Int(); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CheckIfWaitingGPSData +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::CheckIfWaitingGPSData() + { + if(iDeviceStatus == EDeviceUnderConnection) + { + return ETrue; + } + + // If none of the above then check satellite status + TInt num = iPositionInfo.NumSatellitesInView(); + if(num > 0) + { + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetRegisteredViewId +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::GetRegisteredViewId() + { + return iRegisteredViewId; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetModuleInfoStatus +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetModuleInfoStatus(TPositionModuleStatusBase& aPosModuleStatus) + { + // This function scan through the all satellite and selected PSY + // and check the status of those PSY's if those are in Device err state. + // + TUint numberOfModules; + TPositionModuleInfo moduleInfo; + numberOfModules = iModuleInfoArray.Count(); + + if( numberOfModules > 0) + { + for( TInt i = 0; i < numberOfModules; i++ ) + { + moduleInfo = iModuleInfoArray[i]; + if ( (moduleInfo.Capabilities() & + TPositionModuleInfo::ECapabilitySatellite ) && + moduleInfo.IsAvailable()) + { + TPositionModuleId moduleId = moduleInfo.ModuleId(); + iServer.GetModuleStatus(aPosModuleStatus, moduleId); + + TPositionModuleStatus lPosModuleStatus; + iServer.GetModuleStatus(lPosModuleStatus, moduleId); + TInt resulterr = lPosModuleStatus.DeviceStatus(); + + if( (resulterr == TPositionModuleStatus::EDeviceError ) || + (resulterr == TPositionModuleStatus::EDeviceInactive ) || + (resulterr == TPositionModuleStatus::EDeviceStandBy ) ) + { + continue; + } + else + { + break; + } + } + } + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetNumOfSatellitesL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetNumOfSatellitesL(TInt& aNumSatellites) + { + TSatelliteData tempSatelliteData; + TPosition CurrentPosition; + TInt totalStrength = 0; + TInt noOfSatUsed = iPositionInfo.NumSatellitesUsed(); + TInt noOfSatInView = iPositionInfo.NumSatellitesInView(); + iPositionInfo.GetPosition( CurrentPosition ); + TBool isLat = Math::IsNaN( CurrentPosition.Latitude() ); + TBool isLong = Math::IsNaN( CurrentPosition.Longitude () ); + TBool isAlt = Math::IsNaN( CurrentPosition.Altitude () ); + + if( noOfSatUsed >= 4 && noOfSatInView > 4 ) + { + for(TInt i = 0;i < noOfSatUsed ;i++ ) + { + User::LeaveIfError(iPositionInfo.GetSatelliteData(i,tempSatelliteData)); + totalStrength += tempSatelliteData.SignalStrength(); + } + TInt avgStrength = totalStrength / noOfSatUsed; + if( avgStrength >= 40 && + !isLat && + !isLong && + !isAlt ) + { + aNumSatellites = 4; + } + else + { + aNumSatellites = 3; + } + } + else if ( noOfSatUsed < 4 && noOfSatInView >= 4 ) + { + aNumSatellites = 2; + } + else if ( noOfSatUsed < 4 && noOfSatInView < 4 ) + { + aNumSatellites = 1; + } + else + { + aNumSatellites = 0; + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetMaxSpeed +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ResetMaxSpeed() + { + iMaxSpeed = 0.0; + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetAvgSpeed +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ResetAvgSpeed() + { + iSpeedAverage= 0.0; + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::CalculateTripTimeL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::CalculateTripTimeL() + { + TTime curTime; + curTime.UniversalTime(); + curTime.SecondsFrom(iInitTripTime,iTripInterval); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CalculateTotalTimeL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::CalculateTotalTimeL() + { + TTime curTime; + curTime.UniversalTime(); + if( iIsTripStart ) + { + curTime.SecondsFrom(iInitViewTime,iTotalInterval); + } + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::UpdateTripData +// ---------------------------------------------------------------------------- +// +void CBlidLocation::UpdateTripData( ) + { + if( iIsTripStart ) + { + TReal32 distance; + TPosition& pos = GetCurrentPosition(); + TReal32 max = Max(pos.HorizontalAccuracy(), iPrevPosition.HorizontalAccuracy()); + + if(iPrevPosition.Distance(pos, distance) == KErrNone) + { + TBool fixConsidered = EFalse; + if( distance > max ) + { + iDistanceTravelled += distance; + iTotalDistanceTravelled += distance; + iPrevPosition = TPosition(pos); + fixConsidered = ETrue; + } + else + { + TReal32 speed = iCourse.Speed(); + if(speed > KBlidCutOffSpeed) + { + iDistanceTravelled += distance; + iTotalDistanceTravelled += distance; + iPrevPosition = TPosition(pos); + fixConsidered = ETrue; + } + } + if(fixConsidered) + { + // Evaluated Trip Speeds if fix considered + TReal32 currentSpeed = iCourse.Speed(); + if( currentSpeed > iTripMaxSpeed) + { + iTripMaxSpeed = currentSpeed; + } + + TInt time = iTripInterval.Int(); + iTripAverageSpeed = iDistanceTravelled / time; + + if(iTripAverageSpeed > iTripMaxSpeed) + { + iTripAverageSpeed = iTripMaxSpeed; + } + } + } + else + { + iDistanceTravelled = 0; + iTotalDistanceTravelled = 0; + } + + iIsDistanceTravelled = ETrue; + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTripTime +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetTripTime( TTimeIntervalSeconds& aTime ) + { + aTime = iTripInterval; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTripTime +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetTotalTime( TTimeIntervalSeconds& aTime ) + { + aTime = iTotalInterval; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsTripDistanceTravelled +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsTripDistanceTravelled( ) + { + return iIsDistanceTravelled; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTripDistance +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetTripDistance(TReal32& aDistance ) + { + aDistance = iDistanceTravelled; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTotalDistance +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetTotalDistance(TReal32& aDistance ) + { + aDistance = iTotalDistanceTravelled; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsTotalDistanceTravelled +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsTotalDistanceTravelled( ) + { + return iIsDistance; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetTripStartL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetTripStartL() + { + if( !iIsTripStart ) + { + iIsTripStart = ETrue; + iIsTripNotStart = EFalse; + iIsTripClear = EFalse; + iInitTripTime.UniversalTime(); + iInitViewTime.UniversalTime(); + iDistanceTravelled = 0.0; + if(iOnlineMode) + { + iPrevPosition = GetCurrentPosition(); + iIsPreviousPositionUpdated = ETrue; + } + else + { + iIsPreviousPositionUpdated = EFalse; + } + + if(iTimer) + { + delete iTimer; + iTimer = NULL; + } + + iTimer = CPeriodic::NewL(CActive::EPriorityHigh); + TCallBack callback(TimerCallBackFunctionL, this); + iTimer->Start( TTimeIntervalMicroSeconds32(1000000), + TTimeIntervalMicroSeconds32(1000000), + callback ); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::HasTripStarted +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::HasTripStarted() + { + return iIsTripStart; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetTripStop +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetTripStop() + { + iIsTripStart = EFalse; + //iIsTripNotStart = EFalse; + if(iOnlineMode) + { + iWasGPSDataAvailableOnTripStop = ETrue; + } + else + { + iWasGPSDataAvailableOnTripStop = EFalse; + } + iStoppedTime.UniversalTime(); + if(iTimer) + { + delete iTimer; + iTimer = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::HasTripStarted +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::HasTripNotStarted() + { + return iIsTripNotStart; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::HasTripStarted +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::WasGPSAvailableOnTripStop() + { + return iWasGPSDataAvailableOnTripStop; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetTrip +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ResetTrip() + { + if(iIsTripStart == EFalse) + { + iIsTripReset = ETrue; + } + else + { + iIsTripReset = EFalse; + } + + iDurationInSeconds = 0.0; + iDistanceTravelled = 0.0; + iTripTime = 0; + iTripInterval = 0; + iInitTripTime.UniversalTime(); + iTripAverageSpeed = 0.0; + iTripMaxSpeed = 0.0; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::Restart +// ---------------------------------------------------------------------------- +// +/*void CBlidLocation::Restart() + { + iDurationInSeconds = 0.0; + iDistanceTravelled = 0.0; + //iTotalDistanceTravelled = 0.0; + iTotalDurationInSeconds = 0.0; + iWasGPSDataAvailableOnTripStop = EFalse; + iTripTime = 0; + iTotalTime = 0; + iTripInterval = 0; + iTotalInterval = 0; + iInitViewTime.UniversalTime(); + iInitTripTime.UniversalTime(); + iIsTripNotStart = EFalse; + iTripAverageSpeed = 0.0; + iTripMaxSpeed = 0.0; + }*/ + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetTripResumeL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetTripResumeL() + { + iIsTripStart = ETrue; + iIsTripNotStart = EFalse; + iWasGPSDataAvailableOnTripStop = EFalse; + iTimer = CPeriodic::NewL(CActive::EPriorityHigh); + TCallBack callback(TimerCallBackFunctionL, this); + iTimer->Start( TTimeIntervalMicroSeconds32(1000000), + TTimeIntervalMicroSeconds32(1000000), + callback ); + TTime curTime; + curTime.UniversalTime(); + TTimeIntervalMicroSeconds interval; + interval = curTime.MicroSecondsFrom(iStoppedTime); + + if(iStoppedTime > iInitViewTime ) + { + iInitViewTime = iInitViewTime + interval; + } + + if(iIsTripReset) + { + iInitTripTime.UniversalTime(); + iIsTripReset = EFalse; + } + else if(iStoppedTime > iInitTripTime ) + { + iInitTripTime = iInitTripTime + interval; + } + + if(iIsTripStart) + { + CalculateTripTimeL(); + } + CalculateTotalTimeL(); + + if(iObserver) + { + if(iOnlineMode) + { + iObserver->NotifyL(iOnlineMode); + } + else + { + iObserver->NotifyErrorL(KErrUnknown); + } + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetTripClear +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetTripClear() + { + iIsTripClear = ETrue; + iIsTripStart = EFalse; + iIsTripReset = EFalse; + iIsDistance = ETrue; + iWasGPSDataAvailableOnTripStop = EFalse; + iTripAverageSpeed = 0.0; + iTripMaxSpeed = 0.0; + iTripGPSDataLost = EFalse; + iIsTripNotStart = ETrue; + + iDurationInSeconds = 0.0; + iDistanceTravelled = 0.0; + iTotalDurationInSeconds = 0.0; + iTripTime = 0; + iTotalTime = 0; + iTripInterval = 0; + iTotalInterval = 0; + iInitViewTime.UniversalTime(); + iInitTripTime.UniversalTime(); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsTripCleared +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsTripCleared() + { + return iIsTripClear; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetTripClear +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ResetTripClear() + { + iIsTripClear = EFalse; + iInitTripTime.UniversalTime(); + iInitViewTime.UniversalTime(); + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetTripClear +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsTripReset() + { + return iIsTripReset; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::TimerCallBackL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::TimerCallBackL() + { + if(iIsTripStart) + { + CalculateTripTimeL(); + } + CalculateTotalTimeL(); + + if(iObserver) + { + if(iOnlineMode) + { + iObserver->NotifyL(iOnlineMode); + } + else + { + iObserver->NotifyErrorL(KErrUnknown); + } + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetHeading +// ---------------------------------------------------------------------------- +// +TReal32 CBlidLocation::GetHeading() + { + return iHeading; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CalculateCourse +// ---------------------------------------------------------------------------- +// +void CBlidLocation::CalculateCourse() + { + TReal32 distance; + TPosition& pos = GetCurrentPosition(); + TReal32 max = Max(pos.HorizontalAccuracy(), iPrevPosition.HorizontalAccuracy()); + + if(iPrevCoursePosition.Distance(pos, distance) == KErrNone) + { + if( distance > 0.2 * max ) + { + iHeading = iCourse.Heading(); + iPrevCoursePosition = TPosition(pos); + } + } + else + { + iPrevCoursePosition = TPosition(pos); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::CheckGPSAvailability +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::CheckGPSAvailability() + { + TPositionModuleStatus lPosModuleStatus; + GetModuleInfoStatus(lPosModuleStatus); + TInt retVal = lPosModuleStatus.DeviceStatus(); + + + if ((retVal == TPositionModuleStatus::EDeviceError) || + (retVal == TPositionModuleStatus::EDeviceStandBy) || + (retVal == TPositionModuleStatus::EDeviceUnknown) ) + { + // GPS device unavailable + return 0; + } + else if( (retVal == TPositionModuleStatus::EDeviceReady) || + (retVal == TPositionModuleStatus::EDeviceActive) || + (retVal == TPositionModuleStatus::EDeviceInactive) ) + { + // GPS device is paired and available + return 1; + } + // GPS device connections is being established + return -1; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsGPSDataAvailable +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsGPSDataAvailable() + { + return iGPSDataAvailable; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::WasGPSDataLost +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::WasGPSDataLost() + { + return iTripGPSDataLost; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetGPSDataAvailability +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetGPSDataAvailability(TBool aAvailability) + { + iTripGPSDataLost = aAvailability; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTripAverageSpeed +// ---------------------------------------------------------------------------- +// +TReal32 CBlidLocation::GetTripAverageSpeed() + { + return iTripAverageSpeed; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetTripAverageSpeed +// ---------------------------------------------------------------------------- +// +TReal32 CBlidLocation::GetTripMaxSpeed() + { + TReal32 currentSpeed = iCourse.Speed(); + return currentSpeed; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetModuleInfoNotification +// ---------------------------------------------------------------------------- +// +void CBlidLocation::GetModuleInfoNotificationL() + { + iModuleInfoArray.Reset(); + User::LeaveIfError( iServer.GetNumModules(iModuleCount) ); + TPositionModuleInfo moduleInfo; + + for( TUint i = 0; i < iModuleCount; i++ ) + { + User::LeaveIfError( iServer.GetModuleInfoByIndex( i, moduleInfo ) ); + iModuleInfoArray.Append(moduleInfo); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SetNavigationStart +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SetNavigationStart( TBool aNavigationStart ) + { + if( !aNavigationStart ) + { + iIsTripStart = EFalse; + } + else + { + iIsTripStart = ETrue; + } + + if( !iIsTripStart ) + { + // delete the timer because the stop trip will not be get called + // or else it will leads to memory leak + if(iTimer) + { + delete iTimer; + iTimer = NULL; + } + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::ResetOdometerValue +// ---------------------------------------------------------------------------- +// +void CBlidLocation::ResetOdometerValue() + { + iTotalDistanceTravelled = 0.0; + } + + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsSatCapablePsyAvailable +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsSatCapablePsyAvailable() + { + TUint numberOfModules; + TPositionModuleInfo moduleInfo; + numberOfModules = iModuleInfoArray.Count(); + + if( numberOfModules > 0) + { + moduleInfo = iModuleInfoArray[ 1 ]; + if ( (moduleInfo.Capabilities() & + TPositionModuleInfo::ECapabilitySatellite ) && + !moduleInfo.IsAvailable() ) + { + return ETrue; + } + } + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::NumberOfSatellitesVisible +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::NumberOfSatellitesVisible() + { + return iPositionInfo.NumSatellitesInView(); + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::IsSatellitesUsed +// ---------------------------------------------------------------------------- +// +TBool CBlidLocation::IsSatellitesUsed( TInt aIndex ) + { + TBool lResult = EFalse; + TSatelliteData satData; + + if( GetSatelliteData( aIndex, satData ) != KErrNotFound) + { + lResult = satData.IsUsed(); + } + return lResult; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::SortSatelliteDataL +// ---------------------------------------------------------------------------- +// +void CBlidLocation::SortSatelliteDataL() + { + TSatelliteData tempSatelliteData; + TLinearOrder order(SortCriteria); + iSortedSatData.Reset(); + TInt satellitesInView = iPositionInfo.NumSatellitesInView(); + for(TInt i = 0;i < satellitesInView ;i++ ) + { + User::LeaveIfError(iPositionInfo.GetSatelliteData(i,tempSatelliteData)); + TInt signalsth = tempSatelliteData.SignalStrength(); + iSortedSatData.InsertInOrderAllowRepeats(tempSatelliteData, order); + } + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetSatelliteSignalStrength +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::GetSatelliteSignalStrength( TInt aIndex ) + { + TSatelliteData satData; + + if( GetSatelliteData( aIndex, satData ) != KErrNotFound ) + { + if( satData.SignalStrength() < KMinSatelliteSignalStrength ) + { + return 0; + } + else if( satData.SignalStrength() == KMinSatelliteSignalStrength ) + { + return 1; + } + else if( satData.SignalStrength() > KMinSatelliteSignalStrength && + satData.SignalStrength() < KMidSatelliteSignalStrength ) + { + return 2; + } + else if( satData.SignalStrength() > KMidSatelliteSignalStrength && + satData.SignalStrength() < KMaxSatelliteSignalStrength ) + { + return 3; + } + else if( satData.SignalStrength() > KMaxSatelliteSignalStrength ) + { + return 4; + } + } + return 0; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetSatelliteData +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::GetSatelliteData( TUint aIndex, + TSatelliteData& aSatelliteData) + { + if( aIndex >= iSortedSatData.Count() ) + { + return KErrNotFound; + } + aSatelliteData = iSortedSatData[aIndex]; + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CBlidLocation::GetSatelliteNo +// ---------------------------------------------------------------------------- +// +TInt CBlidLocation::GetSatelliteNo( TInt aIndex ) + { + TSatelliteData satData; + + if( GetSatelliteData( aIndex, satData ) != KErrNotFound) + { + return satData.SatelliteId(); + } + return 0; + } + +// ---------------------------------------------------------------------------- +// SortCriteria +// ---------------------------------------------------------------------------- +// +TInt SortCriteria(const TSatelliteData& aFirst, const TSatelliteData& aNext) + { + if(aFirst.SatelliteId() > aNext.SatelliteId()) + { + return 1; + } + else if(aFirst.SatelliteId() < aNext.SatelliteId()) + { + return -1; + } + return 0; + } + +// ---------------------------------------------------------------------------- +// TimerCallBackFunctionL +// ---------------------------------------------------------------------------- +// +TInt TimerCallBackFunctionL(TAny* aPtr) + { + CBlidLocation* ptr = static_cast(aPtr); + ptr->TimerCallBackL(); + return 1; + } + +// End of File +