kerneltest/e32test/resourceman/resourceman_psl/rescontrol_psl.cpp
changeset 0 a41df078684a
child 4 56f325a607ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/resourceman/resourceman_psl/rescontrol_psl.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,947 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// e32test\resourceman\resourceman_psl\rescontrol_psl.cpp
+// 
+//
+
+#include "rescontrol_psl.h"
+TInt KSimulatedRCThreadPriority = 28;
+#ifdef RESOURCE_MANAGER_SIMULATED_PSL
+static DSimulatedPowerResourceController TheController;
+#endif
+
+//Resource controller creation
+#ifdef RESOURCE_MANAGER_SIMULATED_PSL
+DECLARE_STANDARD_PDD()
+	{
+	TInt r = DPowerResourceController::InitController();							
+	if(r == KErrNone)
+		return new DResConPddFactory;
+	return NULL;																
+	}
+#endif
+
+/** ISR function invoked when the specified amount of time expires. This is used for event driven resources. */
+void DSimulatedPowerResourceController::TimerIsrFunc(TAny *ptr)
+	{
+	DSimulatedPowerResourceController *pC = (DSimulatedPowerResourceController *)ptr;
+	//Queues a Dfc to signal fast semaphore.
+	pC->iEventDfc.Add();
+	}
+
+/** DFC function to signal the fast semaphore. For event driven resources, the PIL is blocked until specified time (just 
+	to simulate hardware event). */  
+void DSimulatedPowerResourceController::EventDfcFunc(TAny *ptr)
+	{
+	DSimulatedPowerResourceController *pC = (DSimulatedPowerResourceController *)ptr;
+	NKern::FSSignal((NFastSemaphore*)&pC->iEventFastSem);
+	}
+
+/** Constructor for simulated resource controller. */
+DSimulatedPowerResourceController::DSimulatedPowerResourceController():DPowerResourceController(),iStaticResourceCount(0), iEventDfc(EventDfcFunc, this)
+	{
+	Kern::Printf(">DSimulatedPowerResourceController");
+	}
+
+/** Destructor for simulated resource controller. */
+DSimulatedPowerResourceController::~DSimulatedPowerResourceController()
+	{
+	Kern::Printf("DSimulatedPowerResourceController::~DSimulatedPowerResourceController()\n");
+	((TDynamicDfcQue*)iDfcQ)->Destroy();
+	DStaticPowerResource *pR;
+	TUint c;
+	for(c = 0; c < iStaticResourceCount; c++)
+		{
+		pR = iResources[c];
+		delete pR;
+		}
+	delete []iResources;
+#ifdef PRM_ENABLE_EXTENDED_VERSION
+	DStaticPowerResourceD* pDR;
+	
+	delete []iNodeArray; //Delete dependency nodes
+	for(c = 0; c < iStaticResDependencyCount; c++) 
+		{
+		pDR = iDependencyResources[c];
+		delete pDR;
+		}
+	delete []iDependencyResources;
+#endif
+	}
+
+#ifdef PRM_ENABLE_EXTENDED_VERSION
+//Function to return the controller pointer to use in extended psl file
+DSimulatedPowerResourceController* GetControllerPtr()
+	{
+	return &TheController;
+	}
+#endif
+
+/** This function is called from PIL, during resource controller creation phase.
+	It creates a DFC queue and then invokes setDfcQ function to PIL to set the queue.
+	It calls InitPools function of PIL to create the specified sizes of clients, 
+	client levels and requests pools.
+	*/
+TInt DSimulatedPowerResourceController::DoInitController()
+	{
+	TInt r = KErrNone;
+	Kern::Printf(">DSimulatedPowerResourceController::DoInitController()");
+	//Create a DFC queue
+	r = Kern::DynamicDfcQCreate((TDynamicDfcQue*&)iDfcQ, KSimulatedRCThreadPriority, KResmanName);
+	if(r != KErrNone)
+		{
+		Kern::Printf("DFC Queue creation failed");
+		return r;
+		}
+	//Call the resource controller to set the DFCQ
+	SetDfcQ(iDfcQ);
+	
+#ifdef PRM_ENABLE_EXTENDED_VERSION
+	//Create a DFC Dependency Queue
+	r = Kern::DynamicDfcQCreate((TDynamicDfcQue*&)iDfcQDependency, KSimulatedRCThreadPriority, 
+									KResmanName);
+	if(r != KErrNone)
+		{
+		Kern::Printf("DFC Dependency Queue creation failed");
+		return r;
+		}
+	//Call the resource controller to set the DFCQDependency
+	SetDfcQDependency(iDfcQDependency);
+#endif
+	//Init pools
+	r = InitPools(KERNEL_CLIENTS, USER_CLIENTS, CLIENT_LEVELS, REQUESTS);
+	return r;
+	}
+
+/** This function is used only for testing purpose to test the RegisterResorcesForIdle API
+	ideally will be used by Power controller to obtain the state of the resources will be interested
+	for idle power management.
+	*/
+EXPORT_C TInt DSimulatedPowerResourceController::CaptureIdleResourcesInfo(TUint aControllerId, TUint aNumResources, TPtr* aPtr)
+	{
+	Kern::Printf("DSimulatedPowerResourceController::CaptureIdleResourcesInfo\n");
+	TInt r = TheController.RegisterResourcesForIdle(aControllerId, aNumResources, aPtr);
+	return r;
+	}
+
+/** This function is used only for testing purpose. This is complete the initialization of resource controller.
+	This is used to test the Postbootlevel and registration of static resource API's. 
+	*/
+EXPORT_C TInt DSimulatedPowerResourceController::CompleteResourceControllerInitialisation()
+	{
+	Kern::Printf("DSimulatedPowerResourceController::CompleteResourceControllerInitialisation()\n");
+	return(TheController.InitResources());
+	}
+
+/** This function changes the state of the resource to appropriate value */
+TInt DSimulatedPowerResourceController::ChangeResource(TPowerRequest& req, TInt& aCurrentLevel, TInt aMaxLevel, TInt aMinLevel)
+	{
+	DStaticPowerResource* pR = req.Resource();
+	if(pR->Sense() == DStaticPowerResource::ECustom) //Custom sense set it to specified level
+		{
+		req.Level() = aCurrentLevel;
+		}
+	else if(pR->Sense() == DStaticPowerResource::EPositive) 
+		{
+		//Set it to value specified if valid, otherwise minimum or maximum based on the value.
+		if(req.Level() > aMaxLevel)
+			req.Level() = aMaxLevel;
+		else if(req.Level() < aMinLevel)
+			req.Level() = aMinLevel;
+		aCurrentLevel = req.Level();
+		}
+	else
+		{
+		//Set it to value specified if valid, otherwise minimum or maximum based on the value.
+		if( req.Level() < aMaxLevel)
+			req.Level() = aMaxLevel;
+		else if(req.Level() > aMinLevel)
+			req.Level() = aMinLevel;
+		aCurrentLevel = req.Level();
+		}
+	return KErrNone;
+	}
+
+/** This function processes all instantaneous resource types. Instantaneous resources should returned immediately, so 
+	this function returns immediately after updating the value. */
+TInt DSimulatedPowerResourceController::ProcessInstantaneousResources(TPowerRequest& req, TInt& aCurrentLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel)
+	{
+	if(req.ReqType() == TPowerRequest::EGet)
+		{
+		req.Level() = aCurrentLevel;
+		}
+	else if(req.ReqType() == TPowerRequest::EChange)
+		{
+		return ChangeResource(req, aCurrentLevel, aMaxLevel, aMinLevel);
+		}
+	else if(req.ReqType() == TPowerRequest::ESetDefaultLevel)
+		{
+		req.Level() = aDefaultLevel;
+		aCurrentLevel = aDefaultLevel;
+		}
+	else
+		return KErrNotSupported;
+	return KErrNone;
+	}
+
+/** Function used for polling resources. */
+TBool PollingFunction(TAny* ptr)
+	{
+	static TInt count = 0;
+	if(++count == (TInt)ptr)
+		{
+		count = 0;
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/** This function processes polled resources. It waits for specified time and then performs requested operation
+	if the specified operation is long latency operation.
+	*/
+TInt DSimulatedPowerResourceController::ProcessPolledResources(TPowerRequest& req, TInt&aCurrentLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel, TInt aBlockTime)
+	{
+	DStaticPowerResource* pR = req.Resource();
+	if(req.ReqType() == TPowerRequest::EGet)
+		{
+		if(!pR->LatencyGet())
+			return ProcessInstantaneousResources(req, aCurrentLevel, aMaxLevel, aMinLevel, aDefaultLevel);
+		Kern::PollingWait(PollingFunction, (TAny*)aBlockTime, 3, aBlockTime);
+		req.Level() = aCurrentLevel;
+		}
+	else if(req.ReqType() == TPowerRequest::EChange)
+		{
+		if(!pR->LatencySet())
+			return ProcessInstantaneousResources(req, aCurrentLevel, aMaxLevel, aMinLevel, aDefaultLevel);
+		Kern::PollingWait(PollingFunction, (TAny*)aBlockTime, 3, aBlockTime);
+		return ChangeResource(req, aCurrentLevel, aMaxLevel, aMinLevel);
+		}
+	else if(req.ReqType() == TPowerRequest::ESetDefaultLevel)
+		{
+		if(!pR->LatencySet())
+			return ProcessInstantaneousResources(req, aCurrentLevel, aMaxLevel, aMinLevel, aDefaultLevel);
+		Kern::PollingWait(PollingFunction, (TAny*)aBlockTime, 3, aBlockTime);
+		req.Level() = aDefaultLevel;
+		aCurrentLevel = aDefaultLevel;
+		}
+	else
+		return KErrNotSupported;
+	return KErrNone;
+	}
+
+/** This function processes event driven resources. It makes the calling function (PIL) to block on fast semaphore
+	and starts the timer.The PIL is blocked until the timer expires. 
+	*/
+TInt DSimulatedPowerResourceController::ProcessEventResources(TPowerRequest& req, TInt& aCurrentLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel, TInt aBlockTime)
+	{
+	DStaticPowerResource* pR = req.Resource();
+	if(((req.ReqType() == TPowerRequest::EGet) && (!pR->LatencyGet())) || ((req.ReqType() == TPowerRequest::EChange) && (!pR->LatencySet())) || ((req.ReqType() == TPowerRequest::ESetDefaultLevel) && (!pR->LatencySet())))
+		return ProcessInstantaneousResources(req, aCurrentLevel, aMaxLevel, aMinLevel, aDefaultLevel);	
+	iEventFastSem.iOwningThread = (NThreadBase*)NKern::CurrentThread();
+	iEventFastSem.iCount = 0;
+	TInt timeout = NKern::TimerTicks(aBlockTime);
+	NTimer iEventTimer(TimerIsrFunc, this);
+	iEventTimer.OneShot(timeout);
+	NKern::FSWait(&iEventFastSem);
+	if(req.ReqType() == TPowerRequest::EGet)
+		req.Level() = aCurrentLevel;
+	else if(req.ReqType() == TPowerRequest::EChange)
+		return ChangeResource(req, aCurrentLevel, aMaxLevel, aMinLevel);
+	else if(req.ReqType() == TPowerRequest::ESetDefaultLevel)
+		{
+		req.Level() = aDefaultLevel;
+		aCurrentLevel = aDefaultLevel;
+		}
+	else
+		return KErrNotSupported;
+	return KErrNone;
+	}
+
+//This registers all static resource with resource controller. This function is called by PIL
+TInt DSimulatedPowerResourceController::DoRegisterStaticResources(DStaticPowerResource**& aStaticResourceArray, TUint16& aStaticResourceCount)
+	{
+	Kern::Printf(">DSimulatedPowerResourceController::DoRegisterStaticResources");
+	aStaticResourceArray = (DStaticPowerResource**)new(DStaticPowerResource*[MAX_RESOURCE_COUNT]);
+	if(!aStaticResourceArray)
+		return KErrNoMemory;
+	DStaticPowerResource* pR = NULL;
+
+	//Create Binary Single Instantaneous Positive Resource
+	pR = new DBSIGISPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel Single Instantaneous Positive Resource
+	pR = new DMLSIGISPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary Single Instantaneous Negative Resource
+	pR = new DBSIGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel Single Instantaneous Negative Resource
+	pR = new DMLSIGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary Single Longlatency Positive Resource
+	pR = new DBSLGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel Single Longlatency  Positive Resource
+	pR = new DMLSLGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary Single Longlatency Get & Instantaneous Set Negative Resource
+	pR = new DBSLGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel Single Longlatency Get & Instantaneous Set Negative Resource
+	pR = new DMLSLGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary Single Instantaneous Get & Longlatency Set Positive Resource
+	pR = new DBSIGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel Single Instantaneous Get & Longlatency Set Positive Resource
+	pR = new DMLSIGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary SHared Instantaneous Positive Resource
+	pR = new DBSHIGISPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel SHared Instantaneous Positive Resource
+	pR = new DMLSHIGISPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary SHared Instantaneous Negative Resource
+	pR = new DBSHIGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel SHared Instantaneous Negative Resource
+	pR = new DMLSHIGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary SHared Longlatency Positive Resource
+	pR = new DBSHLGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel SHared Longlatency  Positive Resource
+	pR = new DMLSHLGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Binary SHared Longlatency Get & Instantaneous Set Negative Resource
+	pR = new DBSHLGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel SHared Longlatency Get & Instantaneous Set Negative Resource
+	pR = new DMLSHLGISNResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create holes in resource array
+	aStaticResourceArray[iStaticResourceCount++] = NULL;
+	aStaticResourceArray[iStaticResourceCount++] = NULL;
+	//Create Binary SHared Instantaneous Get & Longlatency Set Positive Resource
+	pR = new DBSHIGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	//Create Multilevel SHared Instantaneous Get & Longlatency Set Positive Resource
+	pR = new DMLSHIGLSPResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+	 
+	//Create Binary shared Longlatency get and set Custom Resource
+	pR = new DBSHLGLSCResource();
+	if(!pR)
+		CLEAN_AND_RETURN(iStaticResourceCount, aStaticResourceArray, KErrNoMemory)
+	aStaticResourceArray[iStaticResourceCount++] = pR;
+
+	iResources = aStaticResourceArray;
+
+	aStaticResourceCount = iStaticResourceCount;
+	return KErrNone;
+	}
+
+//Constructors of all resources
+_LIT(KDBSIGISPResource, "SymbianSimulResource");
+DBSIGISPResource::DBSIGISPResource() : DStaticPowerResource(KDBSIGISPResource, E_OFF), iMinLevel(0), iMaxLevel(1), iCurrentLevel(0)
+	{
+	iFlags = KBinary;
+	}
+
+_LIT(KDMLSIGISPResource, "DMLSIGISPResource");
+DMLSIGISPResource::DMLSIGISPResource() : DStaticPowerResource(KDMLSIGISPResource, 12), iMinLevel(10), iMaxLevel(75), iCurrentLevel(12)
+	{
+	iFlags = KMultiLevel;
+	}
+
+_LIT(KDBSIGISNResource, "DBSIGISNResource");
+DBSIGISNResource::DBSIGISNResource() : DStaticPowerResource(KDBSIGISNResource, E_ON), iMinLevel(E_ON), iMaxLevel(E_OFF), iCurrentLevel(E_ON)
+	{
+	iFlags = KBinary | KSenseNegative;
+	}
+
+_LIT(KDMLSIGISNResource, "DMLSIGISNResource");
+DMLSIGISNResource::DMLSIGISNResource() : DStaticPowerResource(KDMLSIGISNResource, 75), iMinLevel(75), iMaxLevel(10), iCurrentLevel(75)
+	{
+	iFlags = KMultiLevel | KSenseNegative;
+	}
+
+_LIT(KDBSLGLSPResource, "DBSLGLSPResource");
+// change this state to OFF
+DBSLGLSPResource::DBSLGLSPResource() : DStaticPowerResource(KDBSLGLSPResource, E_ON), iMinLevel(E_OFF), iMaxLevel(E_ON), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KLongLatencyGet | KLongLatencySet;
+	NKern::LockSystem();
+	iBlockTime = 5; 
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSLGLSPResource, "DMLSLGLSPResource");
+DMLSLGLSPResource::DMLSLGLSPResource() : DStaticPowerResource(KDMLSLGLSPResource, 75), iMinLevel(10), iMaxLevel(75), iCurrentLevel(75), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KLongLatencySet | KLongLatencyGet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSLGISNResource, "DBSLGISNResource");
+DBSLGISNResource::DBSLGISNResource() : DStaticPowerResource(KDBSLGISNResource, E_ON), iMinLevel(E_ON), iMaxLevel(E_OFF), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KLongLatencyGet | KSenseNegative;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSLGISNResource, "DMLSLGISNResource");
+DMLSLGISNResource::DMLSLGISNResource() : DStaticPowerResource(KDMLSLGISNResource, 75), iMinLevel(75), iMaxLevel(10), iCurrentLevel(75), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KLongLatencyGet | KSenseNegative;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSIGLSPResource, "DBSIGLSPResource");
+DBSIGLSPResource::DBSIGLSPResource() : DStaticPowerResource(KDBSIGLSPResource, E_ON), iMinLevel(E_OFF), iMaxLevel(E_ON), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KBinary | KLongLatencySet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSIGLSPResource, "DMLSIGLSPResource");
+DMLSIGLSPResource::DMLSIGLSPResource() : DStaticPowerResource(KDMLSIGLSPResource, 75), iMinLevel(10), iMaxLevel(100), iCurrentLevel(75), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KLongLatencySet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSHIGISPResource, "DBSHIGISPResource");
+DBSHIGISPResource::DBSHIGISPResource() : DStaticPowerResource(KDBSHIGISPResource, E_OFF), iMinLevel(0), iMaxLevel(1), iCurrentLevel(0)
+	{
+	iFlags = KBinary | KShared;
+	}
+
+_LIT(KDMLSHIGISPResource, "DMLSHIGISPResource");
+DMLSHIGISPResource::DMLSHIGISPResource() : DStaticPowerResource(KDMLSHIGISPResource, 12), iMinLevel(10), iMaxLevel(75), iCurrentLevel(12)
+	{
+	iFlags = KMultiLevel | KShared;
+	}
+
+_LIT(KDBSHIGISNResource, "DBSHIGISNResource");
+DBSHIGISNResource::DBSHIGISNResource() : DStaticPowerResource(KDBSHIGISNResource, E_ON), iMinLevel(E_ON), iMaxLevel(E_OFF), iCurrentLevel(E_ON)
+	{
+	iFlags = KBinary | KShared | KSenseNegative;
+	}
+
+_LIT(KDMLSHIGISNResource, "DMLSHIGISNResource");
+DMLSHIGISNResource::DMLSHIGISNResource() : DStaticPowerResource(KDMLSHIGISNResource, 75), iMinLevel(75), iMaxLevel(10), iCurrentLevel(75)
+	{
+	iFlags = KMultiLevel | KShared | KSenseNegative;
+	}
+
+_LIT(KDBSHLGLSPResource, "DBSHLGLSPResource");
+DBSHLGLSPResource::DBSHLGLSPResource() : DStaticPowerResource(KDBSHLGLSPResource, E_ON), iMinLevel(E_OFF), iMaxLevel(E_ON), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KBinary | KShared | KLongLatencySet | KLongLatencyGet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSHLGLSPResource, "DMLSHLGLSPResource");
+DMLSHLGLSPResource::DMLSHLGLSPResource() : DStaticPowerResource(KDMLSHLGLSPResource, 70), iMinLevel(5), iMaxLevel(70), iCurrentLevel(70), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KShared | KLongLatencySet | KLongLatencyGet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSHLGISNResource, "DBSHLGISNResource");
+DBSHLGISNResource::DBSHLGISNResource() : DStaticPowerResource(KDBSHLGISNResource, E_ON), iMinLevel(E_ON), iMaxLevel(E_OFF), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KBinary | KShared | KLongLatencyGet | KSenseNegative;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSHLGISNResource, "DMLSHLGISNResource");
+DMLSHLGISNResource::DMLSHLGISNResource() : DStaticPowerResource(KDMLSHLGISNResource, 75), iMinLevel(75), iMaxLevel(10), iCurrentLevel(75), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KShared | KLongLatencySet | KSenseNegative;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSHIGLSPResource, "DBSHIGLSPResource");
+DBSHIGLSPResource::DBSHIGLSPResource() : DStaticPowerResource(KDBSHIGLSPResource, E_ON), iMinLevel(E_OFF), iMaxLevel(E_ON), iCurrentLevel(E_ON), iPolled(ETrue)
+	{
+	iFlags = KBinary | KShared | KLongLatencySet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDMLSHIGLSPResource, "DMLSHIGLSPResource");
+DMLSHIGLSPResource::DMLSHIGLSPResource() : DStaticPowerResource(KDMLSHIGLSPResource, 75), iMinLevel(10), iMaxLevel(75), iCurrentLevel(75), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KShared | KLongLatencySet;
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+_LIT(KDBSHLGLSCResource, "KDBSHLGLSCResource");
+DBSHLGLSCResource::DBSHLGLSCResource() : DStaticPowerResource(KDBSHLGLSCResource, E_ON), iMinLevel(E_OFF), iMaxLevel(E_ON), iCurrentLevel(E_ON), iPolled(EFalse)
+	{
+	iFlags = KMultiLevel | KShared | KLongLatencySet | KSenseCustom;
+	SetCustomFunction(CustomFunction);
+	NKern::LockSystem();
+	iBlockTime = MIN_BLOCK_TIME + Kern::Random() % MAX_BLOCK_TIME;
+	NKern::UnlockSystem();
+	}
+
+//DoRequest implementation of all functions
+TInt DBSIGISPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DMLSIGISPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DBSIGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DMLSIGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DBSLGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSLGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSLGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSLGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSIGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSIGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSHIGISPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DMLSHIGISPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DBSHIGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DMLSHIGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessInstantaneousResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel);
+	}
+
+TInt DBSHLGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSHLGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSHLGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSHLGISNResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSHIGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessPolledResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DMLSHIGLSPResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+TInt DBSHLGLSCResource::DoRequest(TPowerRequest& req)
+	{
+	return TheController.ProcessEventResources(req, iCurrentLevel, iMaxLevel, iMinLevel, iDefaultLevel, iBlockTime);
+	}
+
+/** Custom function implemetation*/
+TBool DBSHLGLSCResource::CustomFunction(TInt &aClientId, const TDesC8& aClientName,
+                                        TUint /*aResourceId*/,
+                                        TCustomOperation aCustomOperation, TInt &aLevel,
+                                        TAny* aLevelList, TAny* /*aReserved*/)
+	{
+	static TInt ClientId = -1;
+
+	Kern::Printf("CustomFunction Passed Clientname = %S\n", &aClientName);
+
+	//Allow first client to change the resource state
+	if(aCustomOperation == EClientRequestLevel  &&  ClientId == -1)
+		{
+		ClientId = aClientId;
+		return ETrue;
+		}
+
+	//If client deregisters then ask to set the value to next client level if present, else to default level.
+    if(aCustomOperation == EClientRelinquishLevel)
+		{	
+		TInt count = 0;
+		SPowerResourceClientLevel* pL = NULL;
+		SDblQue* pS = (SDblQue*)aLevelList;
+		for(SDblQueLink* pCL=pS->First();pCL!=&pS->iA;pCL=pCL->iNext)
+			{
+			count++;
+			pL=(SPowerResourceClientLevel*)pCL;
+			if((pL->iClientId != (TUint)aClientId))
+				{
+				aClientId = pL->iClientId;
+				aLevel = pL->iLevel;
+				ClientId = aClientId;
+				return ETrue;
+				}
+			}
+		if((pL == NULL) || (count == 1))
+			{
+		  aClientId = -1;
+		  aLevel = E_OFF;
+		  ClientId = aClientId;
+		  return ETrue;
+			}
+		}
+
+    	/*Allow if the current client is asking to state change to E_ON. 
+	  Also change is allowed if current client asks for E_OFF and no other
+	  client is holding requirement for E_ON
+	  */
+	if(aClientId == ClientId)
+		{
+		if(aLevel == E_ON)
+			return ETrue;
+		SPowerResourceClientLevel* pL = NULL;
+		SDblQue* pS = (SDblQue*)aLevelList;
+		for(SDblQueLink* pCL=pS->First();pCL!=&pS->iA;pCL=pCL->iNext)
+			{
+			pL=(SPowerResourceClientLevel*)pCL;
+			if(pL->iLevel == E_ON)
+				{
+				aClientId = pL->iClientId;
+				ClientId = pL->iClientId;
+				aLevel = E_ON;
+				return EFalse;
+				}
+			}
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+//Get info implementation of all resources.
+TInt DBSIGISPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSIGISPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSIGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSIGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSLGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSLGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSLGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSLGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSIGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSIGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHIGISPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSHIGISPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHIGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSHIGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHLGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSHLGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHLGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSHLGISNResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHIGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DMLSHIGLSPResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}
+
+TInt DBSHLGLSCResource::GetInfo(TDes8* info) const
+	{
+	DStaticPowerResource::GetInfo((TDes8*)info);
+	TPowerResourceInfoV01 *buf1 = (TPowerResourceInfoV01*)info;
+	buf1->iMinLevel = iMinLevel;
+	buf1->iMaxLevel = iMaxLevel;
+	return KErrNone;
+	}