--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/resourcemgmt/hwresourcesmgr/server/inc/HWRMPowerService.h Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,586 @@
+/*
+* Copyright (c) 2006-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:
+*
+*/
+
+
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef HWRMPOWERSERVICE_H
+#define HWRMPOWERSERVICE_H
+
+// INCLUDES
+#include <e32base.h>
+#include "HWRMGenericTimer.h"
+#include "HWRMPowerCommands.h"
+#include "HWRMPower.h"
+#include "HWRMService.h"
+#include "HWRMPowerCommonData.h"
+
+// CONSTANTS
+// None
+const TInt KHWRMPowerMaxMeasurementsBatchSize = 20;
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CHWRMPowerCommonData;
+class CHWRMPluginHandler;
+class TPowerMeasurementsClientData;
+class THWRMPluginPowerIntervalRequestData;
+
+// CLASS DECLARATION
+
+/**
+* Hardware Resource Manager server side service object for Power sessions.
+*
+*/
+class CHWRMPowerService : public CHWRMService
+ {
+ public: // Constructors and Destructor
+
+ /**
+ * Two-phased constructor.
+ *
+ * @param aPluginHandler The plugin handler to use with this service.
+ * @param aPowerCommonData Reference to power common data
+ */
+ static CHWRMPowerService* NewL(CHWRMPluginHandler* aPluginHandler, CHWRMPowerCommonData& aCommonData);
+
+ /**
+ * Destructor.
+ */
+ virtual ~CHWRMPowerService();
+
+ public: // Base class methods
+
+ // From CHWRMService
+ virtual TBool ExecuteMessageL(const RMessage2& aMessage);
+ virtual void ProcessResponseL( TInt aCommandId, TUint8 aTransId, TDesC8& aData, TBool aTimeout );
+ virtual void SuspendSubResource(TInt aSubResource);
+ virtual void ResumeSubResource(TInt aSubResource);
+ virtual void ActivateSubResource(TInt aSubResource, TBool aActivate);
+
+ public:
+ /**
+ * Issues a plugin command to stop the power measurements. Not
+ * associated with a client RMessage2
+ */
+ void StopPowerMeasurementsL();
+
+ /**
+ * Issues a plugin command to Set the Plugin Interval Multiple. Not
+ * associated with a client RMessage2
+ * Specifically added for charge rate current reporting.
+ */
+ void SetPluginIntervalMultipleL(HWRMPowerCommand::TPowerCmd aCommand,
+ TUint aIntervalMultiple);
+
+
+ /**
+ * Gets the Battery consumption info
+ *
+ * Handles EHWRMGetBatteryInfo requests.
+ */
+ void GetBatteryInfoL(const RMessage2& aMessage);
+
+
+ /**
+ * Gets the Baterry voltage info
+ *
+ * Handles EHWRMGetBatteryVoltageInfo requests.
+ */
+ void GetBatteryVoltageInfoL(const RMessage2& aMessage);
+
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+
+ /**
+ * Issues a plugin command to stop the Charging Current measurements. Not
+ * associated with a client RMessage2
+ */
+ void StopChargingCurrentMeasurementsL();
+
+ /**
+ * Issues a plugin command to stop the BatteryFull charging time measurements. Not
+ * associated with a client RMessage2
+ */
+ void StopChargingTimeMeasurementsL();
+
+
+ /**
+ * Gets the charger type
+ *
+ * Handles EHWRMGetBatteryChargerType request.
+ */
+ void GetChargerTypeL(const RMessage2& aMessage);
+
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CHWRMPowerService(CHWRMPowerCommonData& aPowerCommonData);
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL(CHWRMPluginHandler* aPluginHandler);
+
+ private:
+
+ /**
+ * Starts the periodic reporting of avegage battery power value
+ * (period = TIntervalMultiple * BaseTimeInterval)
+ *
+ * Handles EStartAverageBatteryPowerReportingCmdId requests.
+ */
+ void StartAverageBatteryPowerReportingL(const RMessage2& aMessage);
+
+ /**
+ * Stops the periodic reporting of avegage battery power value
+ *
+ * Handles EHWRMStopAverageBatteryPowerReporting requests.
+ */
+ void StopAverageBatteryPowerReportingL(const RMessage2& aMessage);
+
+
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+
+ /**
+ * Starts the periodic reporting of average charging current value
+ * (period = TIntervalMultiple * BaseTimeInterval)
+ *
+ * Handles EHWRMStartAverageChargingCurrentReporting requests.
+ */
+
+
+ void StartAverageChargingCurrentReportingL(const RMessage2& aMessage);
+
+ /**
+ * Stops the periodic reporting of average charging current value/
+ *
+ * Handles requests.
+ */
+ void StopAverageChargingCurrentReportingL(const RMessage2& aMessage);
+
+ /**
+ * Starts the reporting of battery full charging time measurements.
+ * Period is decided by plugin.
+ *
+ * Handles EHWRMStartBatteryFullChargingTimeReporting requests.
+ */
+ void StartChargingTimeReportingL(const RMessage2& aMessage);
+
+
+ /**
+ * Stops the reporting of battery full charging time measurements.
+ *
+ * Handles EHWRMStopBatteryFullChargingTimeReporting requests.
+ */
+ void StopChargingTimeReportingL(const RMessage2& aMessage);
+
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+
+ /**
+ * Handles EHWRMCleanupBattery requests.
+ *
+ * Cleans up the power service so that session can be closed.
+ */
+ void CleanupPowerL();
+
+ /**
+ * Executes a plugin command and handles related transaction.
+ *
+ * @param aCommandId Command ID of the command.
+ */
+ void ExecutePluginCommand(HWRMPowerCommand::TPowerCmd aCommand);
+
+ /**
+ * Executes a plugin command and handles related transaction.
+ *
+ * @param aCommandId Command ID of the command.
+ * @param aSplitCommand ETrue if this command is split into multiple transactions
+ * @param aPckg Command package
+ */
+ void ExecutePluginCommand(HWRMPowerCommand::TPowerCmd aCommand,
+ TBool /* aSplitCommand */,
+ TDesC8& aPckg );
+
+ /**
+ * Executes a plugin command and handles related transaction.
+ *
+ * @param aMessage Message related to this command.
+ * @param aCommandId Command ID of the command.
+ * @param aSplitCommand ETrue if this command is split into multiple transactions
+ */
+ void ExecutePluginCommandL(const RMessage2& aMessage,
+ HWRMPowerCommand::TPowerCmd aCommandId,
+ TBool aSplitCommand );
+
+ /**
+ * Executes a plugin command and handles related transaction.
+ *
+ * @param aMessage Message related to this command.
+ * @param aCommandId Command ID of the command.
+ * @param aSplitCommand ETrue if this command is split into multiple transactions
+ * @param aPckg Command package
+ */
+ void ExecutePluginCommandL(const RMessage2& aMessage,
+ HWRMPowerCommand::TPowerCmd aCommandId,
+ TBool aSplitCommand,
+ TDesC8& aPckg );
+
+
+ /**
+ * Executes a plugin command and handles related transaction.
+ *
+ * @param aMessage Message related to this command.
+ * @param aCommandId Command ID of the command.
+ * @param aSplitCommand ETrue if this command is split into multiple transactions
+ * @param aPckg Command package
+ * @param aArg Generic integer parameter for THWRMPowerPluginRequestData
+ */
+ void ExecutePluginCommandL(const RMessage2& aMessage,
+ HWRMPowerCommand::TPowerCmd aCommandId,
+ TBool aSplitCommand,
+ TDesC8& aPckg,
+ TInt aArg );
+ /**
+ * Cancels a plugin command and handles the related transaction(s).
+ *
+ * @param aCommandId Command ID of the command.
+ */
+ void CancelPluginCommandL(HWRMPowerCommand::TPowerCmd aCommandId);
+
+ /**
+ * Checks the response data size
+ *
+ * @return ETrue if aData.Size() is correct
+ */
+ TBool CheckResponseDataSize( TInt aCommandId, TDesC8& aData) ;
+
+ private: // data
+
+ CHWRMPowerCommonData& iPowerCommonData; // Pointer to Power data object common to all sessions. Not owned.
+
+ TPowerMeasurementsClientData* iPowerVoltageCurrentMeasurementsClientData; // pointer to the Voltage*Current(Power) data measurements of the client
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+ TPowerMeasurementsClientData* iPowerChargingCurrentMeasurementsClientData; // pointer to the consumption data measurements of the client
+ TPowerMeasurementsClientData* iPowerChargingTimeMeasurementsClientData; // pointer to the voltage data measurements of the client
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+ TBool iSuspended; // Flag to indicate if this session is suspended.
+ };
+
+/**
+* PowerService holds two objects of class TPowerMeasurementsClientData one for voltage and
+* one for consumptin measurements.
+* It holds the list of data measurements. Measurements from the plugin are propagated to this class
+* from the CCLientsData of the PowerCommonData.
+* Caches Start and GetMeasuements messages from the client
+* and is responsible for completing or cancelling them.
+*/
+class TPowerMeasurementsClientData
+ {
+public:// Constructors and Destructor
+ /**
+ * C++ Constructor
+ */
+ TPowerMeasurementsClientData();
+
+ /**
+ * C++ Destructor
+ */
+ virtual ~TPowerMeasurementsClientData();
+public:
+
+ /**
+ * Adds a Measurement to the iMeasurementsQue
+ */
+ virtual void AddMeasurementL(TDesC8& aMeasurement) = 0;
+
+
+ /**
+ * If at least one measurement is collected the data is written to
+ * the messasge and the client is completed. If not the
+ * message hanlde is stored and the client is completed
+ * when data is ready
+ */
+ virtual TBool GetMeasurementsL(RMessage2 aMessage) = 0;
+
+ /**
+ * Check if we are receiving measurements.
+ */
+ TBool IsMeasuringOn();
+
+ /**
+ * Set the measuring flag on.
+ */
+ void SetMeasuringOn();
+
+ /**
+ * Set the measuring flag off.
+ */
+ void SetMeasuringOff();
+
+ /**
+ * If there exists a cached message of the client requesting measuremnts, it is completed with Error code aReason
+ */
+ void CompleteGetMeasurementsMessage(TInt aReason);
+
+ /**
+ * If there exists a cached message of the client requesting measuremnts, it is completed with KErrCancel
+ */
+ void CancelPendingGetMeasurementsMessage();
+
+ /*
+ * The Measurements collected are written in the message area of the message.
+ */
+ virtual void WriteMeasurementsInMessageL() = 0;
+
+ /**
+ * If there exists a cached message of the client requesting to STart measuremnts, it is completed with Error code aReason
+ */
+ void CompletePendingStart(TInt aReason);
+
+ /**
+ * Resets the object in order to be ready for a new measurements session.
+ */
+ virtual void Reset();
+
+ /**
+ * Called if the client has registerd for measurements and a new measurement is sent by the plugin.
+ */
+ virtual void NewBatteryMeasurementL(TDesC8& aValue, TUint aPluginInterval) = 0;
+public:
+ //Changing to TUint as Charge current report needs it.
+ TUint iRequestedIntervalMultiple; //The interval multiple that the client requested
+
+ TUint iNumOfBaseIntervalsPassed; // number of Base intervals for which we have accumulated measurements
+ // when this value is equal or greater than the Requested Interval Multiple
+ // the average is calculated and added as a new measurement to the list
+ TBool iMeasuring; // flag indicating if the client has started measuremnets
+ TUint iMeasurementsCount; // number of collected measurements
+
+ RMessage2 iRequestedBatchMessage; // used to complete clients. NULL indicates no pending requests
+ RMessage2 iRequestedStartMessage; // used to complete clients. NULL indicates no pending requests
+ };
+
+class TPowerIntMeasurementsClientData : public TPowerMeasurementsClientData
+ {
+
+ struct TPluginIntMeasurementFormat
+ {
+ TInt iError; //Error Code.
+ TInt iMeasurement; //Measurement received from Plugin.
+ };
+
+ /**
+ * Holds a power measurement.
+ */
+
+ class TPowerIntMeasurement
+ {
+ public:
+ TInt iAverageValue;
+ TSglQueLink iSglQueLink;
+ };
+
+ public:
+
+ typedef TPckgBuf<TInt> TIntMeasurementsPckg;
+
+ TPowerIntMeasurementsClientData();
+
+ ~TPowerIntMeasurementsClientData();
+
+ /**
+ * Adds a Measurement to the iMeasurementsQue
+ */
+ virtual void AddMeasurementL(TDesC8& aMeasurement);
+
+ /*
+ * The Measurements collected are written in the message area of the message.
+ */
+
+ virtual void WriteMeasurementsInMessageL();
+
+ /**
+ * Resets the object in order to be ready for a new measurements session.
+ */
+
+ virtual void Reset();
+
+ /**
+ * Called if the client has registerd for measurements and a new measurement is sent by the plugin.
+ */
+
+ virtual void NewBatteryMeasurementL(TDesC8& aValue, TUint aPluginInterval);
+
+ /**
+ * If at least one measurement is collected the data is written to
+ * the messasge and the client is completed. If not the
+ * message hanlde is stored and the client is completed
+ * when data is ready
+ */
+
+
+ virtual TBool GetMeasurementsL(RMessage2 aMessage);
+
+ /**
+ * Transfers the collecetd data from the list to a TFixedArray, appropriate for client-server
+ * data trasnfer.
+ */
+ void TransferMeasurementsToFixedArrayL(TFixedArray<TInt,KHWRMPowerMaxMeasurementsBatchSize> &aFixedArray);
+
+ private:
+
+ TSglQue<TPowerIntMeasurement> iMeasurementsQue; // list of the measurements
+ TSglQueIter<TPowerIntMeasurement> iMeasurementsQueIter;
+
+ TInt iAccumulator; // measurements are accumulated until there are enough values to calculate the average
+
+
+ };
+
+class TPowerVoltageCurrentMeasurementsClientData : public TPowerMeasurementsClientData
+ {
+
+ /* Power(Voltage and Current) measurement from plugin
+ should in this format.
+ */
+ struct TPluginVoltageCurrentMeasurementFormat
+ {
+ TInt iError; //Error Code.
+ TInt iAverageVoltageMeasurement; //Voltage Measurement received from Plugin.
+ TInt iAverageCurrentMeasurement; //Current Measurement received from Plugin.
+ };
+
+ /**
+ * Holds a power measurement.
+ */
+
+ class TPowerVoltageCurrentMeasurement
+ {
+ public:
+ TInt iAverageVoltageValue;
+ TInt iAverageCurrentValue;
+ TSglQueLink iSglQueLink;
+ };
+
+ struct TPowerVoltageCurrent
+ {
+ TInt iAverageVoltage;
+ TInt iAverageCurrent;
+ };
+
+ public:
+
+ typedef TPckgBuf<TPowerVoltageCurrent> TVoltageCurrentMeasurementsPckg;
+
+ TPowerVoltageCurrentMeasurementsClientData();
+
+ ~TPowerVoltageCurrentMeasurementsClientData();
+
+ /**
+ * Adds a Measurement to the iMeasurementsQue
+ */
+ virtual void AddMeasurementL(TDesC8& aMeasurement);
+
+ /*
+ * The Measurements collected are written in the message area of the message.
+ */
+
+ virtual void WriteMeasurementsInMessageL();
+
+ /**
+ * Resets the object in order to be ready for a new measurements session.
+ */
+
+ virtual void Reset();
+
+ /**
+ * Called if the client has registerd for measurements and a new measurement is sent by the plugin.
+ */
+
+ virtual void NewBatteryMeasurementL(TDesC8& aValue, TUint aPluginInterval);
+
+ /**
+ * If at least one measurement is collected the data is written to
+ * the messasge and the client is completed. If not the
+ * message hanlde is stored and the client is completed
+ * when data is ready
+ */
+
+
+ virtual TBool GetMeasurementsL(RMessage2 aMessage);
+
+ /**
+ * Transfers the collecetd data from the list to a TFixedArray, appropriate for client-server
+ * data trasnfer.
+ */
+ void TransferMeasurementsToFixedArrayL(TFixedArray<TPowerVoltageCurrent,KHWRMPowerMaxMeasurementsBatchSize> &aFixedArray);
+
+ private:
+
+ TSglQue<TPowerVoltageCurrentMeasurement> iMeasurementsQue; // list of the measurements
+ TSglQueIter<TPowerVoltageCurrentMeasurement> iMeasurementsQueIter;
+
+ TInt iVoltageAccumulator; // measurements are accumulated until there are enough values to calculate the average voltage
+ TInt iCurrentAccumulator; // measurements are accumulated until there are enough values to calculate the average current
+
+
+ };
+
+/**
+* Data storage class for plugin requests.
+*/
+class THWRMPluginPowerIntervalRequestData : public THWRMPluginTransactionListItem
+ {
+ public:
+ TUint iRequestedPluginIntervalMultiple;
+
+ /**
+ * Convenience constructor
+ */
+ THWRMPluginPowerIntervalRequestData(TUint aRequestedPluginIntervalMultiple, TInt aCommandId)
+ : THWRMPluginTransactionListItem(0, aCommandId), //TransId is updated later
+ iRequestedPluginIntervalMultiple(aRequestedPluginIntervalMultiple)
+ {
+ };
+ /**
+ * Virtual destructor.
+ */
+ virtual ~THWRMPluginPowerIntervalRequestData()
+ {
+ };
+ };
+
+
+#endif // HWRMPowerSERVICE_H
+
+// End of File