diff -r a2efdd544abf -r b47902b73a93 datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/RequestHandler/BTGPSRequestManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/RequestHandler/BTGPSRequestManager.cpp Fri Jun 04 10:34:15 2010 +0100 @@ -0,0 +1,305 @@ +// Copyright (c) 2005-2009 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: +// + + + +// INCLUDE FILES +#include +#include "BTGPSRequestManager.h" +#include "BTGPSConnectManager.h" +#include "BTGPSConstantsManager.h" +#include "BTGPSRequestHandler.h" +#include "BTGPSFix.h" +#include "BTGPSNmeaBuffer.h" +#include "BTGPSNmeaParser.h" +#include "BTGPSLocationFixListener.h" +#include "BTGPSLogging.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS +//GSV wait time. If GSV sentence is not available, system +//wait wait this much time before the fix is delivered. +const TInt KBTGPSGsvWaitTime = 1000000; //1 second + +//NMEA sentence terminator +_LIT8(KBTGPSNmeaTerminator, "\x0d\x0a"); + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::NewL +// ----------------------------------------------------------------------------- +CBTGPSRequestManager* CBTGPSRequestManager::NewL( + CBTGPSConnectManager& aConnectManager, + CBTGPSConstantsManager& aConstantsManager) + { + CBTGPSRequestManager* self = new (ELeave) CBTGPSRequestManager( + aConnectManager, + aConstantsManager); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::~CBTGPSRequestManager +// ----------------------------------------------------------------------------- +CBTGPSRequestManager::~CBTGPSRequestManager() + { + if(iTimer!=NULL) + { + iTimer->Cancel(); + delete iTimer; + } + + delete iFix; + delete iLastFix; + iListenerArray.Close(); + delete iNmeaBuffer; + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::ConstructL +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::ConstructL() + { + iNmeaBuffer = CBTGPSNmeaBuffer::NewL( + iConstantsManager.iNmeaBufferSize); + + iFix = new (ELeave) CBTGPSFix(); + iFix->SetNmeaBuffer(iNmeaBuffer); + + iLastFix = new (ELeave) CBTGPSFix(); + iTimer = CPeriodic::NewL(CActive::EPriorityStandard); + + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::CBTGPSRequestManager +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +CBTGPSRequestManager::CBTGPSRequestManager( + CBTGPSConnectManager& aConnectManager, + CBTGPSConstantsManager& aConstantsManager) + : iConnectManager(aConnectManager), + iConstantsManager(aConstantsManager) + { + iPrevBottom = 0; + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::RetrieveFixL +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::RetrieveFixL() + { + if(!iReceivingMessage) + { + iConnectManager.AddMessageListenerL(*this); + iReceivingMessage = ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::StopRetrievingFix +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::StopRetrievingFix() + { + //For better performance, system handles received message + //when device is connected. + } + + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::HandleMessage +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::HandleMessage(const TBTGPSNmeaParser& aParser) + { + //Add the received message to buffer + iNmeaBuffer->AddSentences(aParser.NmeaSentence()); + //Add 0x0d 0x0a + iNmeaBuffer->AddSentences(KBTGPSNmeaTerminator); + + //Parse the message + CBTGPSFix::TParsingStatus err = iFix->ParseMessage(aParser); + + //Check if we have received a valid sentence + if(err == CBTGPSFix::EInfoUpdated) + { + if(iFix->IfFullNmeaPatternReceived()) + { + TTime gsvTime = iFix->GsvTime(); + TTime now; + now.UniversalTime(); + TRACESTRING2("CBTGPSRequestManager:: Now time = %d", now.Int64()) + TRACESTRING2("CBTGPSRequestManager:: GSV time = %d", gsvTime.Int64()) + if(gsvTime!=0 && now.MicroSecondsFrom(gsvTime)< + CBTGPSRequestHandler::ConstantsManager().iSatelliteInfoLifeTime) + { + //GSV information is still valid, set fix as valid + TRACESTRING("CBTGPSRequestManager:: GSV information is still valid") + iTimer->Cancel(); + InformListeners(); + } + else + { + if(!iTimer->IsActive()) + { + //GSV information is not valid, start timer + iTimer->Start( + KBTGPSGsvWaitTime, + KBTGPSGsvWaitTime, + TCallBack(TimerCallback, this)); + } + } + } + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::LastLocation +// ----------------------------------------------------------------------------- +TInt CBTGPSRequestManager::LastLocation( + const CBTGPSFix*& aFix, + const TTime& aMaxAge, + const TBool /*aAcceptPartial*/) + { + if(aMaxAge.Int64() == 0) + { + return KErrNotFound; + } + + if(iLastFix->IsFixValid()) + { + if(iLastFix->FixTime()>=aMaxAge) + { + aFix = iLastFix; + return KErrNone; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::SystemTimeChange +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::SystemTimeChange() + { + iLastFix->Reset(); + + //Reset GSV time + iFix->ResetGSVTime(); + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::AddListenerL +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::AddListenerL(MBTGPSLocationFixListener& aListener) + { + User::LeaveIfError(iListenerArray.Append(&aListener)); + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::RemoveListener +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::RemoveListener(MBTGPSLocationFixListener& aListener) + { + TInt index = iListenerArray.Find(&aListener); + if(index!=KErrNotFound) + { + iListenerArray.Remove(index); + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::InformListeners +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::InformListeners() + { + TRACESTRING("CBTGPSRequestManager::InformListeners start...") + + //Inform listeners + TInt count = iListenerArray.Count(); + for(TInt i=count-1; i>=0; i--) + { + iListenerArray[i]->HandleLocationFixUpdate(*iFix); + } + + //If fix is valid then save it to last fix + if(iFix->IsFixValid()) + { + *iLastFix = *iFix; + } + + //Reset fix after listeners are informed. + iFix->ResetFix(); + + //Set previous bottom of NMEA buffer + iPrevBottom = iNmeaBuffer->CurrentIndex(); + + TRACESTRING("CBTGPSRequestManager::InformListeners end") + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::GetPreviousNmeaBufferBottom +// ----------------------------------------------------------------------------- +TInt CBTGPSRequestManager::GetPreviousNmeaBufferBottom() const + { + return iPrevBottom; + } + + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::TimerTick +// ----------------------------------------------------------------------------- +void CBTGPSRequestManager::TimerTick() + { + //Deliver fix even the satellite information is not valid + TRACESTRING("CBTGPSRequestManager::TimerTick GSV information not valid") + + InformListeners(); + iTimer->Cancel(); + } + +// ----------------------------------------------------------------------------- +// CBTGPSRequestManager::TimerCallback +// ----------------------------------------------------------------------------- +TInt CBTGPSRequestManager::TimerCallback(TAny* aAny) + { + reinterpret_cast(aAny)->TimerTick(); + return KErrNone; //Stop periodic timer + } + +// End of File + + +