resourcemgmt/hwresourcesmgr/server/inc/HWRMPowerCommonData.h
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resourcemgmt/hwresourcesmgr/server/inc/HWRMPowerCommonData.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,497 @@
+/*
+* 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 HWRMPOWERCOMMONDATA_H
+#define HWRMPOWERCOMMONDATA_H
+
+//  INCLUDES
+#include <e32base.h>
+#include "HWRMPower.h"
+#include "HWRMPowerService.h"
+#include "HWRMGenericTimer.h"
+#include "HWRMPluginService.h"
+#include "HWRMPluginHandler.h"
+#include "cenrepobserver.h"
+
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CHWRMPluginHandler;
+class CHWRMPowerService;
+class CClientsData;
+class TPowerMeasurementsClientData;
+
+// CLASS DECLARATION
+
+/** Item of the list that holds data for a GetBatteryInfo or GetBatteryVoltageInfo request.
+ * Used by the PowerCommonData iBatteryVoltageInfoQue, iBatteryInfoQue and iChargerTypeInfoQue.
+ */
+class TBatteryInfoData
+	{
+public:
+	TBatteryInfoData(const CHWRMPowerService& aPowerClientService, const RMessage2& aRequestedMessage);
+public:
+	const CHWRMPowerService& 		iPowerClientService; // Used to identify the client that the message belongs to.
+	RMessage2						iRequestedMessage;
+	TSglQueLink						iSglQueLink;
+	};    
+
+
+/**
+* Container for Power data that is common for all sessions.
+* Also handles Power related cenrep.
+* HWRM server upkeeps the instance.
+*
+*/
+class CHWRMPowerCommonData : public CBase,
+							 public MHWRMIndicationHandler,
+							 public MHWRMGenericTimerCallback,
+							 public MCenRepObserver
+    {
+public: // Constructors and Destructor
+
+    /**
+    * Two-phased constructor.
+    *
+    * @param aPluginHandler Pointer to plugin handler for Power
+    */
+    static CHWRMPowerCommonData* NewL(CHWRMPluginHandler* aPluginHandler);
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CHWRMPowerCommonData();
+
+public: // Functions from base classes	
+	/**
+	* Called by the PluginHandler to indicate a new event
+	* 
+	* From MHWRMIndicationHandler
+	*
+    * @param aId  The indication ID
+    * @param aData  Data associated with the indication 
+	*/
+	void ProcessIndicationL( const TUint32 aId, TDesC8& aData );
+	
+	/**
+	* Called when the timer is fired
+	* 
+	* From MHWRMGenericTimerCallback
+	*
+	* @param aTimerId Id used to distinguish among different timers
+	* @param aCutOff not used here
+	*/
+	void GenericTimerFired(TInt aTimerId, TBool /*aCutOff*/);
+
+public: // New functions
+
+    /**
+    * Issues a plugin command to stop the Consumption measurements.
+    */    
+    void DoStopPowerMeasurementsL();
+    
+    /**
+     * Called when the Maximum Reporting period in Cenrep is changed
+     * 
+     * @param aNewMaxPeriod the new max reporting period in Cenrep 
+     * @param aOldMaxPeriod the old max reporting period in Cenrep
+     */
+    void MaxPeriodChangedL(TTimeIntervalMicroSeconds32& aNewMaxPeriod,
+                           TTimeIntervalMicroSeconds32& aOldMaxPeriod);
+    /*
+     * Invoked by MaxPeriodChangeL
+     * 
+     * @param aTimer A generic Timer that has to be altered depending on the reporting period
+     * @param aNewMaxPeriod the new max reporting period in Cenrep 
+     * @param aOldMaxPeriod the old max reporting period in Cenrep
+     */
+    void DoMaxReportingValueChangedL(CHWRMGenericTimer* aTimer, 
+                                    TTimeIntervalMicroSeconds32& aNewMaxPeriod,
+                                    TTimeIntervalMicroSeconds32& aOldMaxPeriod);
+
+    // From MCenRepObserver
+    void HandleNotifyInt(TUint32 aId, TInt aNewValue);
+    void HandleNotifyError(TUint32 aId, TInt error, CCenRepListener* aHandler);
+
+
+    /**
+    * Issues a plugin command to set the plugin interval of charge current measurements.
+    * 
+    * @param aCommand distinguishes which interval is to be set (possible values: ESetVoltageIntervalMultipleCmdId, ESetCosnumptionIntervalMultipleCmdId)
+    * @param aIntervalMultiple the value that the plugin interval will be set to
+    */          
+    void DoSetPluginIntervalMultipleL(HWRMPowerCommand::TPowerCmd aCommand,
+                                    TUint aIntervalMultiple);
+
+    /**
+     * Issues a plugin command to get Battery Info. If there is an outstanding plugin request there isn't a new
+ 	 * one issued but the appropriate data are stored in a queue. This data are used later to complete or cancel the client.
+     * 
+     * @param aPowerService the service of the client session that issued the command.
+     * @param aMessage the client message that requested the the Battery Info.
+     */        
+    void DoGetBatteryInfoL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService);
+    
+    /**
+     * Issues a plugin command to get Battery Voltage Info. If there is an outstanding plugin request there isn't a new
+ 	 * one issued but the appropriate data are stored in a queue. This data are used later to complete or cancel the client.
+     * 
+     * @param aPowerService the service of the client session that issued the command.
+     * @param aMessage the client message that requested the the Battery Info.
+     */       
+    void DoGetBatteryVoltageInfoL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService);
+    
+    /**
+     * Completes any pending GetBatteryInfo requests.
+     * 
+     * @param aReason	the Error code that is used for completion.
+     * @param aDataPckg data that will be written in the response message (can be an empty Des).
+     */       
+    void CompletePendingGetBatteryInfo(TInt aReason, TPckg<CHWRMPower::TBatteryConsumptionData> &aDataPckg);
+
+    /**
+     * Completes any pending GetBatteryVoltageInfo requests.
+     * 
+     * @param aReason	the Error code that is used for completion.
+     * @param aDataPckg data that will be written in the response message (can be an empty Des).
+     */       
+    void CompletePendingGetBatteryVoltageInfo(TInt aReason, TPckg<CHWRMPower::TBatteryVoltageData> &aDataPckg);
+    
+    /**
+     * Cancels any pending GetBatteryInfo requests.
+     * 
+     * @param aPowerService the service of the client session that issued the command. Used to identify the requests taht belong to the client.
+     */          
+    void CancelPendingGetBatteryInfo(CHWRMPowerService& aPowerService);
+
+    /**
+     * Cancels any pending GetBatteryVoltageInfo requests.
+     * 
+     * @param aPowerService the service of the client session that issued the command. Used to identify the requests taht belong to the client.
+     */          
+    void CancelPendingGetBatteryVoltageInfo(CHWRMPowerService& aPowerService);
+
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+    /**
+    * Issues a plugin command to stop the charging current measurements.
+    */    
+    void DoStopChargingCurrentMeasurementsL();
+
+    /**
+    * Issues a plugin command to stop the BatteryFull charging time measurements.
+    */    
+    void DoStopChargingTimeMeasurementsL();
+
+     /**
+     * Issues a plugin command to get charger type. If there is an outstanding plugin request there isn't a new
+ 	 * one issued but the appropriate data are stored in a queue. This data are used later to complete the request.
+     * 
+     * @param aPowerService the service of the client session that issued the command.
+     * @param aMessage the client message that requested the charger type.
+     */        
+    void DoGetChargerTypeL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService);
+
+     /**
+     * Completes any pending ChargerType Info requests.
+     * 
+     * @param aReason	the Error code that is used for completion.
+     * @param aDataPckg data that will be written in the response message (can be an empty Des).
+     */       
+    void CompletePendingGetChargerType(TInt aReason, TPckg<CHWRMPower::TBatteryChargerType> &aDataPckg);
+
+    /**
+     * Cancels any pending GetChargetType requests.
+     * 
+     * @param aPowerService the service of the client session that issued the command. Used to identify the requests taht belong to the client.
+     */        
+    void CancelPendingGetChargerType(CHWRMPowerService& aPowerService);
+
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+    
+private:
+
+	/**
+	* C++ default constructor.
+	*/
+	CHWRMPowerCommonData();
+	
+	/**
+	* By default Symbian 2nd phase constructor is private.
+	*
+	* @param aPluginHandler Pointer to plugin handler for Power
+	*/
+	void ConstructL(CHWRMPluginHandler* aPluginHandler);
+
+public:
+    CRepository*                    iRepository;                        // Cenrep client
+    CCenRepListener*                iMaxReportingPeriodNotifyHandler;   // Cenrep notifyhandler
+    CClientsData*                   iPowerReportClientsData;            // List of clients that have registered for Average Power Measurements Reporting
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+	CClientsData*					iChargingCurrentClientsData;	// List of clients that have registered for Average Charging Current Measurements Reporting
+	CClientsData*					iChargingTimeClientsData;	    // List of clients that have registered for Battery Full Charging Time Measurements Reporting
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+	
+	TSglQue<TBatteryInfoData> 		iBatteryInfoQue;				// list of the pending GetBatteryInfo requests
+	TSglQueIter<TBatteryInfoData> 	iBatteryInfoIter;				// iterator of the list
+	
+	TSglQue<TBatteryInfoData> 		iBatteryVoltageInfoQue;			// list of the pending GetBatteryVoltageInfo requests
+	TSglQueIter<TBatteryInfoData> 	iBatteryVoltageInfoIter;		// iterator of the list
+
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+    TSglQue<TBatteryInfoData> 		iChargerTypeInfoQue;			// list of the pending GetChargerType requests
+	TSglQueIter<TBatteryInfoData> 	iChargerTypeInfoIter;			// iterator of the list
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+
+
+    
+private:
+	TUint							iBaseTimeInterval;				// Value of Base Time Interval is cached here from CenRep
+	TUint 							iMaximumReportingPeriod;		// Value of Maximum Reporting Period is cached here from CenRep
+  
+    CHWRMGenericTimer*   			iPowerReportMeasurementsTimer;      // Cutoff timer. Owned.
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+    CHWRMGenericTimer*  	 		iChargingCurrentMeasurementsTimer; 	// Cutoff timer. Owned.    
+    CHWRMGenericTimer*  	 		iChargingTimeMeasurementsTimer; 	// Cutoff timer. Owned.    
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+
+
+	CHWRMPowerService*    			iPowerService;  				// Power service used to stop measurements 
+																	// or setting the plugin interval
+    };
+   
+/** IDs used to distinguish bewtween the two timers that the CommonData own */
+enum TClientsIds
+	{
+	EPowerReportClientsId = 0
+	
+#ifdef SYMBIAN_HWRM_EXTPOWERINFO
+    ,EChargingCurrentClientsId,
+	EChargingTimeClientsId
+#endif //SYMBIAN_HWRM_EXTPOWERINFO
+    
+	};
+
+/** Item of the list that class CClientsData holds. One exists for each client
+ * that registers for measurements. Holds a pointer to the TPowerMeasurementsClientData
+ * that are owned by the HWRMPowerService of each client.   
+ */
+class TClientData
+	{
+public:
+	TClientData(TPowerMeasurementsClientData& aPowerMeasurementsClientData);
+public:
+	TPowerMeasurementsClientData& 	iPowerMeasurementsClientData; 
+	TSglQueLink						iSglQueLink;
+	};
+
+/**
+ * Contains all the clients that have registered for a type of measurements reporting.
+ * Handles indications for this type of measurements and informs every registered
+ * client for the event. Also holds the Max Period timer.
+ * 
+ * One instance of this class exists for Voltage and one for Consumption measurements.
+ * It is a central point where the measurements are indicated and then dispatched 
+ * to each of the clients.
+ * 
+ * It is populated during the reporting session and reset after the end of the session
+ * either because the last client called stop, or because the maximum reporting 
+ * period was reached. 
+ * 
+ * When the last client calls stop CLientsData will stop the plugin.
+ * 
+ * When multiple clients registered the Greatest Common Devisor of the 
+ * Requested Time Intervals is calculated and used by the plugin. 
+ * All the calculations are carried by this class.
+ * 
+ * When the Max period is reached all the clients are completed, reset and the 
+ * plugin is stopped.
+ *
+ */
+class CClientsData : public CBase					 
+	{
+public:
+	static CClientsData* NewL(CHWRMGenericTimer& aMeasurementsTimer);
+	
+	virtual ~CClientsData();
+		
+public:
+	/**
+    * Called when a measurement indication is received from the plugin.
+    * 
+    * @param aValue value of the indicated measurement
+    */
+	void BatteryMeasurementIndicationL(TDesC8& aValue);
+
+	/**
+    * Getter for the active interval multiple.
+    * 
+    * @param aIntervalMultiple holds the returned value
+    */
+    void GetPluginIntervalMultiple(TUint &aIntervalMultiple);
+    
+    /**
+    * Setter for the plugin's voltage time interval.
+    * 
+    * @param aIntervalMultiple value that the plugin's voltage time interval is set to
+    */
+    void UpdatePluginIntervalMultiple(TUint aIntervalMultiple);
+
+    /**
+    * Checks if the plugin measurements are On.
+    */        
+    TBool IsMeasuringOn();
+    
+    /**
+    * Sets the plugin measurements flag On.
+    */        
+    void SetMeasuringOn();
+    
+    /**
+    * Sets the plugin measurements flag On.
+    */        
+    void SetMeasuringOff();
+     
+    /**
+	* Cheks if the Clients Queue is empty
+	*/       
+    TBool IsClientsQueEmpty();
+     
+    /**
+    * Creates and adds to the list a data structure 
+    * containing all the appropriate client data.
+    * 
+    * @param aPowerMeasurementsClientData pointer to the data to be added
+    */        
+    void AddMeasurementsClientL(TPowerMeasurementsClientData& aPowerMeasurementsClientData);
+   
+     
+    /**
+    * Deletes all the data relevant to the client that sent the message.
+    * 
+    * @param aPowerMeasurementsClientData pointer to the data that will be removed and deleted
+    * 
+    */       
+    void RemoveMeasurementsClientData(TPowerMeasurementsClientData* aPowerMeasurementsClientData);
+    
+    /**
+    * Deletes all the data relevant to the client that sent the message.
+    * 
+    * @param aPowerMeasurementsClientData pointer to the data that will be removed and deleted
+    * 
+    * @leave KErrNotFound Client not found in the list.
+    */       
+    void RemoveMeasurementsClientL(TPowerMeasurementsClientData* aPowerMeasurementsClientData);
+
+    /**
+	* Adjusts the interval used by the plugin when a new client registers
+	* with a time interval that causes a change of the GCD.
+	* 
+	*  @param aIntervalMultiple Tthe new value of the GCD
+	*/       
+    void RecalculatePluginInterval(TUint &aIntervalMultiple);
+          	
+    /**
+	* Checks if a adjustement is needed for the 
+	* interval used by the plugin
+	* 
+	* @param aIntervalMultiple The interval of the incoming client.
+	*/       
+    TBool NeedPluginIntervalAdjustment(TUint aIntervalMultiple);
+    
+    /**
+	* Deletes all the measurements related data
+	* Used at destruction time.
+	*/	    
+    void CleanUpMeasurementsData();
+     
+	/**
+	* Calculation of the Greatest Common Divisor of two numbers.
+	*/
+	TUint CalculateGCD(TUint num1, TUint num2);
+
+	/**
+	* Called when the Max Reporting Period is reached. 
+	* 
+	*/	
+	void MaxReportingPeriodReached(TInt aReason=KErrTimedOut);
+
+private:
+	/*
+	* Deletes all the items of the queue and empties it.
+	*/  
+	void EmptyClientsQue();
+
+	/**
+	* The Measurements collected so far are written in the
+	* message area of the data
+	*/		
+	void WriteMeasurementsInMessageL(TClientData* aClientData, TUint aCount);
+	
+	/**
+	* Returns the ClientData that correspond to the aPowerMeasurementsClientData. 
+	* Each session has a TPowerMeasurementsClientData object. Hence each client is
+	* uniqely identified by this object.
+	* 
+	* @return Pointer to the TClientData of the client that holds the aPowerMeasurementsClientData. NULL if client is not found
+	*/		
+	TClientData* FindClient(TPowerMeasurementsClientData* aPowerMeasurementsClientData);
+	
+private:
+    /**
+    * C++ default constructor.
+    */
+	CClientsData(CHWRMGenericTimer& aMeasurementsTimer);
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    *
+    * @param aPluginHandler Pointer to plugin handler for Power
+    */
+    void ConstructL();        
+
+private:
+	TBool 								iMeasuring;						// Indicates if the plugin measurements are On or Off
+    //Changing to TUint as Charge current report needs it. Also other measurements to be changed in future.    
+    TUint                               iPluginIntervalMultiple;        // the Interval Multiple that is currently in use by the plugin
+	CHWRMGenericTimer&					iMeasurementsTimer;  			// Cutoff timer. Used to set and cancel the Max Period Timer
+   
+	TSglQue<TClientData> 				iClientsQue;					// list of the registered clients
+	TSglQueIter<TClientData> 			iClientsQueIter;				// iterator of the list  
+ };
+
+#endif  // HWRMPOWERCOMMONDATA_H
+            
+// End of File