datasourcemodules/gpspositioningmodule/lbsagpspsy/src/requesthandler/cagpsrequesthandler.cpp
changeset 36 b47902b73a93
parent 0 9cfd9a3ee49c
equal deleted inserted replaced
35:a2efdd544abf 36:b47902b73a93
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @InternalComponent
       
    19 */
       
    20 
       
    21 #include "cagpsrequesthandler.h"
       
    22 #include "cpositionerq.h"
       
    23 #include "psylogging.h"
       
    24 #include "tagpsrequestparameters.h"
       
    25 #include "tpositionercall.h"
       
    26 #include "agpsrequestconstants.h"
       
    27 
       
    28 const TInt KMergeTableRows = 4;
       
    29 const TInt KMergeTableColumns = 4;
       
    30 
       
    31 const TInt KModeIndexNone = 0;
       
    32 const TInt KModeIndexA = 1;
       
    33 const TInt KModeIndexTB = 2;
       
    34 const TInt KModeIndexTA = 3;
       
    35 
       
    36 
       
    37 const TInt ModeMergeTable[KMergeTableColumns][KMergeTableRows] = 
       
    38 	{
       
    39 		//None			A,					TB,					TA
       
    40 		{KErrGeneral,	KAutonomousMode,	KTerminalBasedMode,	KTerminalAssistedMode}, // None
       
    41 		{KErrGeneral,	KAutonomousMode, 	KTerminalBasedMode,	KErrGeneral},			// A
       
    42 		{KErrGeneral,	KTerminalBasedMode,	KTerminalBasedMode,	KErrGeneral},			// TB
       
    43 		{KErrGeneral,	KErrGeneral,		KErrGeneral,		KTerminalAssistedMode}	// TA
       
    44 	};
       
    45 
       
    46 
       
    47 /**
       
    48  CRequestHandler::NewL
       
    49  Two-phased constructor.
       
    50 */
       
    51 CAgpsRequestHandler* CAgpsRequestHandler::NewL(CPositionerQ* aPositionerQ)
       
    52     {
       
    53     CAgpsRequestHandler* self = new( ELeave ) CAgpsRequestHandler(aPositionerQ);
       
    54     
       
    55     CleanupStack::PushL( self );
       
    56     self->ConstructL();
       
    57     CleanupStack::Pop();
       
    58 
       
    59     return self;
       
    60     }
       
    61 
       
    62 /*
       
    63 * CAgpsRequestHandler::~CAgpsRequestHandler
       
    64 * Destructor.
       
    65 */
       
    66 CAgpsRequestHandler::~CAgpsRequestHandler()
       
    67     {
       
    68     TRACESTRING("CAgpsRequestHandler::~CAgpsRequestHandler()")
       
    69 	// Send standby advice for first positioner
       
    70 	TTracking tracking;
       
    71 	IssueCancel(iPositionerQ->IterETrue(tracking), TLbsPositionUpdateRequestBase::EPowerAdviceOff);
       
    72 
       
    73 	delete iAGPSRequestBus;
       
    74     }
       
    75 
       
    76 /**
       
    77 @param aPositionerQ	the positioner q 
       
    78 */
       
    79 CAgpsRequestHandler::CAgpsRequestHandler(CPositionerQ* aPositionerQ) 
       
    80 	{
       
    81 	iPositionerQ = aPositionerQ;
       
    82 	}
       
    83 
       
    84 /**
       
    85 construct the request bus by channel identifier
       
    86 */
       
    87 void CAgpsRequestHandler::ConstructL()
       
    88 	{
       
    89 	CRequestHandler::ConstructL();
       
    90 	
       
    91 	iAGPSRequestBus = CAgpsRequestBus::NewL(KChannelArray[KAGpsManagerToLocServerChannelIndex]);
       
    92 
       
    93 	// Send standby advice for first positioner
       
    94 	TTracking tracking;
       
    95 	IssueStatus(iPositionerQ->IterETrue(tracking), TLbsPositionUpdateRequestBase::EPowerAdviceStandby);
       
    96 	
       
    97 	User::LeaveIfError(LbsModuleInfo::GetDeviceCapabilities(KLbsGpsLocManagerUid, iCapabilities));
       
    98 	}
       
    99 
       
   100 /**
       
   101 * Merges the positioning methods and checks that the requested method is
       
   102 * compatible with the hardware capabiliies. Some hardware can support multiple
       
   103 * modes which can be simultaneous. 
       
   104 *
       
   105 * @param aNewReq
       
   106 */
       
   107 TInt CAgpsRequestHandler::MergeMethod(TLbsNetPosRequestMethodInt& aNewReq)
       
   108 	{
       
   109 	TInt error = KErrNone;
       
   110 	TLbsNetPosMethodInt mergedMethod;
       
   111 	TLbsNetPosMethodInt newMethod;
       
   112 	
       
   113 	iMergedRequest.RequestMethod().GetPosMethod(0, mergedMethod);
       
   114 	aNewReq.GetPosMethod(0, newMethod);
       
   115 	
       
   116 	TInt mergedModeIndex = ModeToIndex(mergedMethod.PosMode());
       
   117 	TInt newModeIndex	= ModeToIndex(newMethod.PosMode());
       
   118 	TInt resultMode = ModeMergeTable[mergedModeIndex][newModeIndex];
       
   119 
       
   120 		
       
   121 	if(iCapabilities == TPositionModuleInfoExtended::EDeviceGpsModeSimultaneousTATB)
       
   122 		{
       
   123 		if(resultMode == KErrGeneral)
       
   124 			{
       
   125 			resultMode = KErrInUse;		
       
   126 			}
       
   127 		}
       
   128 	else if(iCapabilities == (TPositionModuleInfoExtended::EDeviceGpsModeTerminalBased 
       
   129 				| TPositionModuleInfoExtended::EDeviceGpsModeTerminalAssisted))
       
   130 		{
       
   131 		if(resultMode == KErrGeneral)
       
   132 			{
       
   133 			resultMode = KErrInUse;		
       
   134 			}
       
   135 		}
       
   136 	else if(iCapabilities == TPositionModuleInfoExtended::EDeviceGpsModeTerminalBased)
       
   137 		{
       
   138 		if((resultMode == KErrGeneral) || (newModeIndex == KModeIndexTA) 
       
   139 				|| (mergedModeIndex == KModeIndexTA))
       
   140 			{
       
   141 			resultMode = KErrCorrupt;		
       
   142 			}
       
   143 		}
       
   144 	else if(iCapabilities == TPositionModuleInfoExtended::EDeviceGpsModeTerminalAssisted)
       
   145 		{
       
   146 		if((resultMode == KErrGeneral) || (newModeIndex != KModeIndexTA) 
       
   147 				|| (mergedModeIndex == KModeIndexTB) || (mergedModeIndex == KModeIndexA))
       
   148 			{
       
   149 			resultMode = KErrCorrupt;		
       
   150 			}
       
   151 		}
       
   152 	else
       
   153 		{
       
   154 		resultMode = KErrCorrupt;
       
   155 		}
       
   156 	
       
   157 	
       
   158 	if((resultMode == KAutonomousMode) 
       
   159 		|| (resultMode == KTerminalBasedMode) 
       
   160 		|| (resultMode == KTerminalAssistedMode))
       
   161 		{
       
   162 		mergedMethod.SetPosMethod(KLbsPositioningMeansGps, resultMode);
       
   163 		iMergedRequest.RequestMethod().SetPosMethods(&mergedMethod, 1);
       
   164 		}
       
   165 	else
       
   166 		{
       
   167 		error = resultMode;
       
   168 		}
       
   169 		
       
   170 	return error;
       
   171 	}
       
   172 
       
   173 /**
       
   174 Merge the request with the local iMergedRequest
       
   175 
       
   176 @param aTime The target time of the request
       
   177 @param aTimeForFix The maximum fix time
       
   178 @param aQuality The requested position info quality
       
   179 @return KErr depending on the reason for the failure of the method merge
       
   180 @see CPositionerSubSession
       
   181 */
       
   182 TInt CAgpsRequestHandler::MergeRequest(const TRequestParameters* aRequestParameters, const TBool aTracking, 
       
   183 							TLbsPositionUpdateRequestBase::TPowerAdvice aPower)
       
   184 	{
       
   185 	TPositionQuality posQuality; 
       
   186 	TLbsPositionUpdateRequest newReq;
       
   187 	TLbsLocRequestQuality newRequestQuality;
       
   188 	const TAgpsRequestParameters* reqParams = static_cast<const TAgpsRequestParameters*>(aRequestParameters);
       
   189 
       
   190 	reqParams->iCriteria.GetRequiredQuality(posQuality);
       
   191 	
       
   192 	BuildUpdateRequest(newRequestQuality, reqParams->iTimeForFix, posQuality);
       
   193 	newReq.TargetTime() 	= reqParams->iTargetTime;
       
   194 	
       
   195 	newReq.RequestQuality().SetMaxFixTime(newRequestQuality.MaxFixTime());
       
   196 	newReq.RequestQuality().SetMinHorizontalAccuracy(newRequestQuality.MinHorizontalAccuracy());
       
   197 	newReq.RequestQuality().SetMinVerticalAccuracy(newRequestQuality.MinVerticalAccuracy());
       
   198 
       
   199 	newReq.NewClient() 		= reqParams->iNewClient;
       
   200 	newReq.Tracking() 		= aTracking;
       
   201 	newReq.SetPowerAdvice(aPower);
       
   202 	
       
   203 	TLbsNetPosMethodInt mArray[1];
       
   204 	mArray[0].SetPosMethod(KLbsPositioningMeansGps, reqParams->iAGPSMode);
       
   205 	newReq.RequestMethod().SetPosMethods(mArray, 1);
       
   206 
       
   207 	if(newReq.TargetTime() < iMergedRequest.TargetTime())
       
   208 		{
       
   209 		iMergedRequest.TargetTime() = newReq.TargetTime();
       
   210 		}
       
   211 		
       
   212 	if(newReq.RequestQuality().MinHorizontalAccuracy() < iMergedRequest.RequestQuality().MinHorizontalAccuracy())
       
   213 		{
       
   214 		iMergedRequest.RequestQuality().SetMinHorizontalAccuracy(newReq.RequestQuality().MinHorizontalAccuracy());
       
   215 		}
       
   216 		
       
   217 	if(newReq.RequestQuality().MinVerticalAccuracy() < iMergedRequest.RequestQuality().MinVerticalAccuracy())
       
   218 		{
       
   219 		iMergedRequest.RequestQuality().SetMinVerticalAccuracy(newReq.RequestQuality().MinVerticalAccuracy());
       
   220 		}
       
   221 
       
   222 	if(newReq.RequestQuality().MaxFixTime() < iMergedRequest.RequestQuality().MaxFixTime())
       
   223 		{
       
   224 		iMergedRequest.RequestQuality().SetMaxFixTime(newReq.RequestQuality().MaxFixTime());
       
   225 		}
       
   226 		
       
   227 	iMergedRequest.NewClient() = iMergedRequest.NewClient() || newReq.NewClient();
       
   228 	iMergedRequest.Tracking()  = iMergedRequest.Tracking()  || newReq.Tracking();
       
   229  
       
   230  	TLbsPositionUpdateRequest& reqNC = const_cast<TLbsPositionUpdateRequest&>(newReq);
       
   231  	iMergedRequest.SetPowerAdvice(reqNC.PowerAdvice());
       
   232  	
       
   233  	return MergeMethod(newReq.RequestMethod());
       
   234 	}
       
   235 
       
   236 /** Used before merging */
       
   237 void CAgpsRequestHandler::ResetMergedRequest()
       
   238 	{
       
   239 	iMergedRequest.NewClient()  = EFalse;
       
   240 	iMergedRequest.Tracking()   = EFalse;
       
   241 	iMergedRequest.TargetTime() = KMaxTInt64;
       
   242 	iMergedRequest.RequestQuality().SetMinHorizontalAccuracy(KMaxTReal32);
       
   243 	iMergedRequest.RequestQuality().SetMinVerticalAccuracy(KMaxTReal32);
       
   244 	iMergedRequest.RequestQuality().SetMaxFixTime(KMaxTInt64);
       
   245 	TLbsNetPosMethodInt mArray[1];
       
   246 	mArray[0].SetPosMethod(KLbsPositioningMeansGps, 0);
       
   247 	iMergedRequest.RequestMethod().SetPosMethods(mArray, 1);
       
   248 	}	
       
   249 
       
   250 /**
       
   251 Publish the request to the request bus
       
   252 */
       
   253 void CAgpsRequestHandler::IssueMergedRequestL()
       
   254 	{
       
   255     TRACESTRING("CAgpsRequestHandler::IssueMergedRequestL()")
       
   256 	iCurrentRequest = iMergedRequest;
       
   257 	TLbsPositionUpdateRequest request = iCurrentRequest;
       
   258 	
       
   259 	// If not tracking force the request target time to be 0,
       
   260 	// the AGPS integration module manager expects this behaviour
       
   261 	if (!request.Tracking())
       
   262 		{
       
   263 		request.TargetTime() = TTime(0);
       
   264 		}
       
   265 		
       
   266 	iAGPSRequestBus->PublishRequestL(request);
       
   267 	}
       
   268 	
       
   269 /**
       
   270 Publish the Cancel request to the request bus.
       
   271 Cancel always disables tracking (the tracking flag is EFalse by default)
       
   272 */
       
   273 void CAgpsRequestHandler::IssueCancel(TBool aTracking, TLbsPositionUpdateRequestBase::TPowerAdvice aPower)
       
   274 	{
       
   275 	TRACESTRING("CAgpsRequestHandler::IssueCancel()")
       
   276 	TLbsPositionUpdateRequestCancel cancel;
       
   277 
       
   278 	// note, here we choose to send EPowerAdviceStandby straight away
       
   279 	cancel.SetPowerAdvice(aPower);
       
   280 	cancel.Tracking() = aTracking;
       
   281 	
       
   282 	TRAP_IGNORE(iAGPSRequestBus->PublishRequestL(cancel));
       
   283 	}
       
   284 	
       
   285 /**
       
   286 Publish statutory information (e.g tracking) to the request bus.
       
   287 */
       
   288 void CAgpsRequestHandler::IssueStatus(TBool aTracking, TLbsPositionUpdateRequestBase::TPowerAdvice aPower)
       
   289    	{
       
   290    	TLbsPositionUpdateRequestStatus status;
       
   291    	status.Tracking() = aTracking;
       
   292  	status.SetPowerAdvice(aPower);
       
   293    	TRAP_IGNORE(iAGPSRequestBus->PublishRequestL(status));
       
   294    	}
       
   295 
       
   296 
       
   297 TInt CAgpsRequestHandler::ModeToIndex(TInt aMode)
       
   298 	{
       
   299 	if(aMode == (TPositionModuleInfo::ETechnologyNetwork | TPositionModuleInfo::ETechnologyAssisted))
       
   300 		{
       
   301 		return KModeIndexTA;
       
   302 		}
       
   303 	else if(aMode == (TPositionModuleInfo::ETechnologyTerminal | TPositionModuleInfo::ETechnologyAssisted))
       
   304 		{
       
   305 		return KModeIndexTB;
       
   306 		}
       
   307 	else if(aMode == TPositionModuleInfo::ETechnologyTerminal)
       
   308 		{
       
   309 		return KModeIndexA;
       
   310 		}
       
   311 	else
       
   312 		{
       
   313 		return KModeIndexNone;
       
   314 		}
       
   315 	}