// 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.h
//
//
#ifndef __RESCONTROL_PSL_H__
#define __RESCONTROL_PSL_H__
#include <drivers/resourcecontrol.h>
#include <kernel/kernel.h>
#include <kernel/kern_priv.h>
#define E_ON 0x1
#define E_OFF 0x0
//Specifies the number of pre-allocate the PIL data structures.
#define KERNEL_CLIENTS 0x32
#define USER_CLIENTS 0x10
#define CLIENT_LEVELS 0x32
#define REQUESTS 0x19
#define MAX_RESOURCE_COUNT 30
#define MAX_DEPENDENT_RESOURCE_COUNT 10
#define MAX_BLOCK_TIME 200 //Maximum block time
#define MIN_BLOCK_TIME 50 //Guaranteed minimum block
#define CLEAN_AND_RETURN(resCount, resArray, error) \
{ \
for(TUint count = 0; count < resCount; count++) \
delete resArray[count]; \
delete resArray; \
return error; \
}
const TUint KBinary = 0x0;
const TUint KMultiLevel = 0x1;
_LIT(KResmanName, "DSimulatedResMan");
/** Simulated resource controller class */
NONSHARABLE_CLASS(DSimulatedPowerResourceController): public DPowerResourceController
{
public:
DSimulatedPowerResourceController();
~DSimulatedPowerResourceController();
TInt DoInitController();
TInt DoInitResources();
TInt DoRegisterStaticResources(DStaticPowerResource**& aStaticResourceArray, TUint16& aStaticResourceCount);
// Function to process instantaneous resources
TInt ProcessInstantaneousResources(TPowerRequest& req, TInt& aClientLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel);
// Function to procces polled resources
TInt ProcessPolledResources(TPowerRequest& req, TInt& aClientLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel, TInt aBlockTime = 0);
// Function to change the state of the resource
TInt ChangeResource(TPowerRequest& req, TInt& aClientLevel, TInt aMaxLevel, TInt aMinLevel);
// Function to process event driven resources
TInt ProcessEventResources(TPowerRequest& req, TInt& aClientLevel, TInt aMaxLevel, TInt aMinLevel, TInt aDefaultLevel, TInt aBlockTime = 0);
IMPORT_C static TInt CaptureIdleResourcesInfo(TUint aControllerId, TUint aNumResources, TPtr* aPtr);
IMPORT_C static TInt CompleteResourceControllerInitialisation();
#ifdef PRM_ENABLE_EXTENDED_VERSION
TInt DoRegisterStaticResourcesDependency(DStaticPowerResourceD**& aStaticResourceDArray, TUint16& aStaticResourceDCount);
TInt CreateResourceDependency(DStaticPowerResourceD** pResArray);
#endif
private:
static void TimerIsrFunc(TAny* ptr); //ISR Function called when specfied timer expires. This is for even driven resources
static void EventDfcFunc(TAny* ptr); //Function to wakeup the fast semphore. This is called from timer ISR.
DStaticPowerResource** iResources;
TUint16 iStaticResourceCount;
NFastSemaphore iEventFastSem; //Semphore to block the PIL of resource controller for event driven resource operations.
TDfc iEventDfc; //Dfc to run to signal the event semaphore when the timer expires. Queued from timer ISR
#ifdef PRM_ENABLE_EXTENDED_VERSION
DStaticPowerResourceD** iDependencyResources;
TUint16 iStaticResDependencyCount;
SNode* iNodeArray;
TUint16 iNodeCount;
#endif
};
#ifdef PRM_ENABLE_EXTENDED_VERSION
DSimulatedPowerResourceController* GetControllerPtr();
#endif
//class definition for Binary Single Instantaneous Positive resource
NONSHARABLE_CLASS(DBSIGISPResource) : public DStaticPowerResource
{
public:
DBSIGISPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for multilevel single instantaneous positive resource
NONSHARABLE_CLASS(DMLSIGISPResource) : public DStaticPowerResource
{
public:
DMLSIGISPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for binary single instantaneous negative resource
NONSHARABLE_CLASS(DBSIGISNResource) : public DStaticPowerResource
{
public:
DBSIGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for multilevel single instantaneous negative resource
NONSHARABLE_CLASS(DMLSIGISNResource) : public DStaticPowerResource
{
public:
DMLSIGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for binary single long latency positive resource
NONSHARABLE_CLASS(DBSLGLSPResource) : public DStaticPowerResource
{
public:
DBSLGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel single long latency positive resource
NONSHARABLE_CLASS(DMLSLGLSPResource) : public DStaticPowerResource
{
public:
DMLSLGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for binary single long latency get & instantaneous set negative resource
NONSHARABLE_CLASS(DBSLGISNResource) : public DStaticPowerResource
{
public:
DBSLGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel single long latency get & instantaneous set negative resource
NONSHARABLE_CLASS(DMLSLGISNResource) : public DStaticPowerResource
{
public:
DMLSLGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for binary single instantaneous get & long latency set positive resource
NONSHARABLE_CLASS(DBSIGLSPResource) : public DStaticPowerResource
{
public:
DBSIGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel single instantaneous get & long latency get positive resource
NONSHARABLE_CLASS(DMLSIGLSPResource) : public DStaticPowerResource
{
public:
DMLSIGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled;
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for Binary Shared Instantaneous Positive resource
NONSHARABLE_CLASS(DBSHIGISPResource) : public DStaticPowerResource
{
public:
DBSHIGISPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for multilevel shared instantaneous positive resource
NONSHARABLE_CLASS(DMLSHIGISPResource) : public DStaticPowerResource
{
public:
DMLSHIGISPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for binary shared instantaneous negative resource
NONSHARABLE_CLASS(DBSHIGISNResource) : public DStaticPowerResource
{
public:
DBSHIGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for multilevel shared instantaneous negative resource
NONSHARABLE_CLASS(DMLSHIGISNResource) : public DStaticPowerResource
{
public:
DMLSHIGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
};
//class definition for binary shared long latency positive resource
NONSHARABLE_CLASS(DBSHLGLSPResource) : public DStaticPowerResource
{
public:
DBSHLGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel shared long latency positive resource
NONSHARABLE_CLASS(DMLSHLGLSPResource) : public DStaticPowerResource
{
public:
DMLSHLGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for binary shared long latency get & instantaneous set negative resource
NONSHARABLE_CLASS(DBSHLGISNResource) : public DStaticPowerResource
{
public:
DBSHLGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel shared long latency get & instantaneous set negative resource
NONSHARABLE_CLASS(DMLSHLGISNResource) : public DStaticPowerResource
{
public:
DMLSHLGISNResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for binary shared instantaneous get & long latency set positive resource
NONSHARABLE_CLASS(DBSHIGLSPResource) : public DStaticPowerResource
{
public:
DBSHIGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for multilevel shared instantaneous get & long latency get positive resource
NONSHARABLE_CLASS(DMLSHIGLSPResource) : public DStaticPowerResource
{
public:
DMLSHIGLSPResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
//class definition for binary shared long latency get & set custom resource
NONSHARABLE_CLASS(DBSHLGLSCResource) : public DStaticPowerResource
{
public:
DBSHLGLSCResource();
TInt DoRequest(TPowerRequest &req);
TInt GetInfo(TDes8* aInfo) const;
static TBool CustomFunction(TInt &aClientId, const TDesC8& aClientName,
TUint aResourceId,
TCustomOperation aCustomOperation, TInt &aLevel,
TAny* aLevelList, TAny* aReserved);
private:
TInt iMinLevel;
TInt iMaxLevel;
TInt iCurrentLevel;
TBool iPolled; //ETrue if this is a polled resource, otherwise event driven type
TInt iBlockTime; //Time duration the thread will be blocked.
};
#endif //__RESCONTROL_PSL_H__