datasourcemodules/simulationpositioningmodule/src/EPos_CPosDataSimulationController.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/simulationpositioningmodule/src/EPos_CPosDataSimulationController.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -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