diff -r a2efdd544abf -r b47902b73a93 datasourcemodules/simulationpositioningmodule/src/EPos_CPosDataSimulationController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datasourcemodules/simulationpositioningmodule/src/EPos_CPosDataSimulationController.cpp Fri Jun 04 10:34:15 2010 +0100 @@ -0,0 +1,221 @@ +// 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 "EPos_CPosDataSimulationController.h" +#include "EPos_CPosFileHandler.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPosDataSimController::CPosDataSimController( + TBool aTimeRelativePlayback) : + CPosControllerBase(aTimeRelativePlayback), iSimulationState(EPosCheckIfFailRequest), iSimulationInProcess(EFalse) + { + CActiveScheduler::Add(this); + } + +// EPOC default constructor can leave. +void CPosDataSimController::ConstructL(const TDesC& aSimulationFile) + { + User::LeaveIfError(iTimer.CreateLocal()); + + iSimDataArray = new (ELeave) CDesC8ArrayFlat(KNoOfSimulatedDataItems); + + CPosFileHandler* fileHandler = CPosFileHandler::NewL(aSimulationFile); + CleanupStack::PushL(fileHandler); + fileHandler->ReadL(*iSimDataArray); + CleanupStack::PopAndDestroy(fileHandler); + + iDataSimulator.ParseAndCreatePosObjectL(iBasePosition, iSimDataArray); + iSimulatedPosition = iBasePosition; + } + +// Two-phased constructor. +CPosDataSimController* CPosDataSimController::NewL( + const TDesC& aSimulationFile, + TBool aTimeRelativePlayback) + { + CPosDataSimController* self = new (ELeave) CPosDataSimController(aTimeRelativePlayback); + CleanupStack::PushL(self); + self->ConstructL(aSimulationFile); + CleanupStack::Pop(self); + return self; + } + +// Destructor +CPosDataSimController::~CPosDataSimController() + { + Cancel(); + iTimer.Cancel(); + iTimer.Close(); + iRequestStatus = NULL; + delete iSimDataArray; + } + +// ---------------------------------------------------------------------------- +// CPosSimulationPositioner::NotifyPositionUpdate +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::NotifyPositionUpdate( + TPositionInfoBase& aPosInfo, + TRequestStatus& aStatus, + CPosSimulationPositioner& aSimPos) + { + NotifyPositionUpdateBase(aPosInfo, aStatus, aSimPos); + + iNumRequests++; + iRequestStartTime.UniversalTime(); + + if (iSimulationInProcess) + { + SetCompletionCodeAndWait(); + } + else if (!IsActive()) + { + //this section is done only once at powerup time + if(iTimeRelativePlayback) + { + //in TRP mode we are using this variable to + //determinate begin of the simulation + //in TRP mode this variable one setuped is never changed + iLastRequestTime.UniversalTime(); + } + iTimer.Cancel(); + iTimer.After(iStatus, + I64INT(iDataSimulator.PowerupTime().Int64())); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::CancelNotifyPositionUpdate +// +// (other items were combmented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::CancelNotifyPositionUpdate(const CPosSimulationPositioner& aSimPos) + { + CPosControllerBase::CancelNotifyPositionUpdate(aSimPos); + if(!iTimeRelativePlayback) + { + Cancel(); + } + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::CompleteRequest +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::CompleteRequest(TInt aErrorCode) + { + CompleteRequestBase(aErrorCode); + iSimulationState = EPosCheckIfFailRequest; + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::SetCompletionCodeAndWait +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::SetCompletionCodeAndWait() + { + if(!IsActive()) + { + iCompleteCode = iDataSimulator.FailThisRequest(iNumRequests); + + iSimulationState = EPosTransferAndComplete; + iTimer.Cancel(); + iTimer.After(iStatus, + I64INT(iDataSimulator.TimeToWait(iRequestStartTime).Int64())); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::RunL +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::RunL() + { + if (iSimulationState == EPosCheckIfFailRequest) + { + SetCompletionCodeAndWait(); + } + else + { + // Powerup has been done + if (!iSimulationInProcess) + { + iSimulationInProcess = ETrue; + } + else if (iCompleteCode == KErrNone) + { + if (iTimeRelativePlayback) + { + iSimulatedPosition = iBasePosition; + } + iDataSimulator.ComputeNewPositionL(iSimulatedPosition, + iRequestStartTime, iLastRequestTime); + } + if(!iTimeRelativePlayback) + { + iLastRequestTime = iRequestStartTime; + } + iSimulatedPosition.SetCurrentTime(); + iPosition.SetPosition(iSimulatedPosition); + CompleteRequest(iCompleteCode); + } + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::DoCancel +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosDataSimController::DoCancel() + { + // If request cancelled, then we have consumed Powerup Time + // and are in simulation mode + // + iSimulationInProcess = ETrue; + iTimer.Cancel(); + } + +// ---------------------------------------------------------------------------- +// CPosDataSimController::RunError +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +TInt CPosDataSimController::RunError(TInt aError) + { + CompleteRequest(aError); + return KErrNone; + } + +// End of File