diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/hwresourcesmgr/server/src/HWRMPowerCommonData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMPowerCommonData.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,1293 @@ +// 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: +// + + + + +// INCLUDE FILES +#include +#include "HWRMtrace.h" +#include "HWRMPowerCommonData.h" +#include "HWRMClientServer.h" +#include "HWRMPowerDomainCRKeys.h" +#include "HWRMPrivateCRKeys.h" +#include "HWRMConfiguration.h" +#include "HWRMPowerService.h" +#include "HWRMPower.h" +#include "HWRMPowerService.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +const TInt KMilliToMicroSeconds = 1000; + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CHWRMPowerCommonData::CHWRMPowerCommonData +// C++ constructor +// ----------------------------------------------------------------------------- +// +CHWRMPowerCommonData::CHWRMPowerCommonData() + :iBatteryInfoQue(_FOFF(TBatteryInfoData,iSglQueLink)), + iBatteryInfoIter(iBatteryInfoQue), + iBatteryVoltageInfoQue(_FOFF(TBatteryInfoData,iSglQueLink)), + iBatteryVoltageInfoIter(iBatteryVoltageInfoQue) +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + ,iChargerTypeInfoQue(_FOFF(TBatteryInfoData,iSglQueLink)), + iChargerTypeInfoIter(iChargerTypeInfoQue) +#endif //SYMBIAN_HWRM_EXTPOWERINFO + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CHWRMPowerCommonData()" ) ); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CHWRMPowerCommonData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMPowerCommonData::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CHWRMPowerCommonData::ConstructL(CHWRMPluginHandler* aPluginHandler) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::ConstructL()" ) ); + + // Get read only values from cenrep + iRepository = CRepository::NewL(KCRUidPowerSettings); + + iMaxReportingPeriodNotifyHandler = CCenRepListener::NewL(*this, + *iRepository, + KPowerMaxReportingPeriod); + iMaxReportingPeriodNotifyHandler->StartListeningL(); + + TInt value(0); + User::LeaveIfError(iRepository->Get(KPowerBaseTimeInterval, value)); + if ( value < 1 ) + { + User::Leave(KErrArgument); + } + iBaseTimeInterval = value * 1000; // milliseconds to microseconds + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMPowerCommonData::ConstructL - iBaseTimeInterval: %d" ), iBaseTimeInterval ); + + User::LeaveIfError(iRepository->Get(KPowerMaxReportingPeriod, value)); + if ( value < 1 ) + { + User::Leave(KErrArgument); + } + iMaximumReportingPeriod = value * KMilliToMicroSeconds; // milliseconds to microseconds + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMPowerCommonData::ConstructL - iMaximumReportingPeriod: %d" ), iMaximumReportingPeriod ); + + // Register for indications from HWRM plugin. + aPluginHandler->RegisterForIndications(this); + + iPowerService = CHWRMPowerService::NewL(aPluginHandler, *this); + + iPowerReportMeasurementsTimer = CHWRMGenericTimer::NewL(*this, iMaximumReportingPeriod, EPowerReportClientsId); + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + iChargingCurrentMeasurementsTimer = CHWRMGenericTimer::NewL(*this, iMaximumReportingPeriod, EChargingCurrentClientsId); + + //Timer should not be started for charging time measurements. So pass KHWRMGenericTimerMaxTime. + iChargingTimeMeasurementsTimer = CHWRMGenericTimer::NewL(*this, KHWRMGenericTimerMaxTime, EChargingTimeClientsId); +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + iPowerReportClientsData = CClientsData::NewL(*iPowerReportMeasurementsTimer); +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + iChargingCurrentClientsData = CClientsData::NewL(*iChargingCurrentMeasurementsTimer); + iChargingTimeClientsData = CClientsData::NewL(*iChargingTimeMeasurementsTimer); +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::ConstructL - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMPowerCommonData::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CHWRMPowerCommonData* CHWRMPowerCommonData::NewL(CHWRMPluginHandler* aPluginHandler) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::NewL()" ) ); + + CHWRMPowerCommonData* self = new( ELeave ) CHWRMPowerCommonData(); + + CleanupStack::PushL( self ); + self->ConstructL(aPluginHandler); + CleanupStack::Pop(); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMPowerCommonData::NewL - return 0x%x" ), self ); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CHWRMPowerCommonData::~CHWRMPowerCommonData() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::~CHWRMPowerCommonData()" ) ); + + delete iPowerService; + iPowerService = NULL; + + iMaxReportingPeriodNotifyHandler->StopListening(); + delete iMaxReportingPeriodNotifyHandler; + iMaxReportingPeriodNotifyHandler = NULL; + + delete iRepository; + iRepository = NULL; + + delete iPowerReportClientsData; + iPowerReportClientsData = NULL; + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + + delete iChargingCurrentClientsData; + iChargingCurrentClientsData = NULL; + + delete iChargingTimeClientsData; + iChargingTimeClientsData = NULL; + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + if (iPowerReportMeasurementsTimer) + { + iPowerReportMeasurementsTimer->Cancel(); + delete iPowerReportMeasurementsTimer; + iPowerReportMeasurementsTimer = NULL; + } + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + + if(iChargingCurrentMeasurementsTimer) + { + iChargingCurrentMeasurementsTimer->Cancel(); + delete iChargingCurrentMeasurementsTimer; + iChargingCurrentMeasurementsTimer = NULL; + } + + if (iChargingTimeMeasurementsTimer) + { + iChargingTimeMeasurementsTimer->Cancel(); + delete iChargingTimeMeasurementsTimer; + iChargingTimeMeasurementsTimer = NULL; + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + TBatteryInfoData* batteryInfoData; + + iBatteryInfoIter.SetToFirst(); + + while((batteryInfoData = iBatteryInfoIter++) != NULL) + { + iBatteryInfoQue.Remove(*batteryInfoData); + delete batteryInfoData; + } + + iBatteryVoltageInfoIter.SetToFirst(); + + while((batteryInfoData = iBatteryVoltageInfoIter++) != NULL) + { + iBatteryVoltageInfoQue.Remove(*batteryInfoData); + delete batteryInfoData; + } + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + + iChargerTypeInfoIter.SetToFirst(); + + while((batteryInfoData = iChargerTypeInfoIter++) != NULL) + { + iChargerTypeInfoQue.Remove(*batteryInfoData); + delete batteryInfoData; + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::~CHWRMPowerCommonData - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::ProcessIndicationL +// Callback function From MHWRMIndicationHandler +// Called by the plugin handler to indicate that a new +// measurement report is ready +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::ProcessIndicationL( const TUint32 aId, TDesC8& aData ) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::ProcessIndicationL()" ) ); + + switch (aId) + { + case HWRMPowerCommand::EAverageBatteryPowerIndicationId: + { + if (iPowerReportClientsData->IsMeasuringOn()) + { + HWRMPowerCommand::TBatteryPowerReportPackage batteryPowerReportPckg; + batteryPowerReportPckg.Copy(aData); + HWRMPowerCommand::TBatteryPowerReport batteryPowerReport = batteryPowerReportPckg(); + + if (batteryPowerReport.iErrorCode == KErrNone) + { + iPowerReportClientsData->BatteryMeasurementIndicationL(batteryPowerReportPckg); + } + } + } + break; + + #ifdef SYMBIAN_HWRM_EXTPOWERINFO + + case HWRMPowerCommand::EAverageBatteryChargingCurrentIndicationId: + { + if (iChargingCurrentClientsData->IsMeasuringOn()) + { + HWRMPowerCommand::TBatteryChargingCurrentReportPackage batteryChargeCurrentReportPckg; + batteryChargeCurrentReportPckg.Copy(aData); + HWRMPowerCommand::TBatteryChargeCurrentReport batteryChargeCurrentReport= batteryChargeCurrentReportPckg(); + + if (batteryChargeCurrentReport.iErrorCode == KErrNone) + { + iChargingCurrentClientsData->BatteryMeasurementIndicationL(batteryChargeCurrentReportPckg); + } + } + } + break; + + case HWRMPowerCommand::EBatteryFullChargingTimeIndicationId: + { + if (iChargingTimeClientsData->IsMeasuringOn()) + { + HWRMPowerCommand::TBatteryFullChargingTimeReportPackage batteryChargeTimePckg; + batteryChargeTimePckg.Copy(aData); + HWRMPowerCommand::TBatteryFullChargingTimeReport batteryChargeTimeReport= batteryChargeTimePckg(); + + if (batteryChargeTimeReport.iErrorCode == KErrNone) + { + iChargingTimeClientsData->BatteryMeasurementIndicationL(batteryChargeTimePckg); + } + } + } + break; +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + } + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::EventIndicationL - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::GenericTimerFired +// Callback function From MHWRMGenericTimerCallback +// Called when the timer is fired. The PowerCommonData +// hold two of them one for Voltage, one for Consumption +// Measurements. Informs clients, cleans up and stops the +// plugin. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::GenericTimerFired(TInt aTimerId, TBool /*aCutOff*/) + { + TInt err(KErrNone); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::GenericTimerFired()" ) ); + + switch(aTimerId) + { + case EPowerReportClientsId: + { + iPowerReportClientsData->MaxReportingPeriodReached(); + TRAP(err, DoStopPowerMeasurementsL()); + break; + } + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + + case EChargingCurrentClientsId: + { + iChargingCurrentClientsData->MaxReportingPeriodReached(); + TRAP(err,DoStopChargingCurrentMeasurementsL()); + break; + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + } + + if (err != KErrNone) + { + // All the pending batch request have been completed now. + // Also plugin will not send any more measurements. + COMPONENT_TRACE3(_L( "HWRM Server - CHWRMPowerCommonData::GenericTimerFired(%d) - Stopping measurement failed: %d" ), aTimerId, err ); + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::GenericTimerFired - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoStopPowerMeasurementsL +// Issues a plugin command to stop the Power measurements. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoStopPowerMeasurementsL() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopPowerMeasurementsL()" ) ); + + iPowerService->StopPowerMeasurementsL(); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopPowerMeasurementsL - return" ) ); + } + + + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoStopChargingCurrentMeasurementsL +// Issues a plugin command to stop the Charging current measurements. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoStopChargingCurrentMeasurementsL() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopChargingCurrentMeasurementsL()" ) ); + + iPowerService->StopChargingCurrentMeasurementsL(); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopChargingCurrentMeasurementsL - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoStopChargingTimeMeasurementsL +// Issues a plugin command to stop BatteryFull charging time measurement. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoStopChargingTimeMeasurementsL() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopChargingTimeMeasurementsL()" ) ); + + iPowerService->StopChargingTimeMeasurementsL(); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoStopChargingTimeMeasurementsL - return" ) ); + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoMaxReportingValueChanged +// Handles the max reporting period cenrep value changes for all measurements. +// --------------------------------------------------------- +void CHWRMPowerCommonData::MaxPeriodChangedL(TTimeIntervalMicroSeconds32& aNewMaxPeriod, + TTimeIntervalMicroSeconds32& aOldMaxPeriod) + { + + DoMaxReportingValueChangedL(iPowerReportMeasurementsTimer, aNewMaxPeriod, aOldMaxPeriod); +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + DoMaxReportingValueChangedL(iChargingCurrentMeasurementsTimer, aNewMaxPeriod, aOldMaxPeriod); + DoMaxReportingValueChangedL(iChargingTimeMeasurementsTimer, aNewMaxPeriod, aOldMaxPeriod); +#endif //SYMBIAN_HWRM_EXTPOWERINFO + } + + + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoMaxReportingValueChangedL +// Handles the max reporting period cenrep value changes. +// --------------------------------------------------------- + + +void CHWRMPowerCommonData::DoMaxReportingValueChangedL(CHWRMGenericTimer* aTimer, + TTimeIntervalMicroSeconds32& aNewMaxPeriod, + TTimeIntervalMicroSeconds32& aOldMaxPeriod) + { + /* + * Timer Usage: + * aTimer->IsActive() : Checks if timer is running(active, which means measurement is going on.) + * aTimer->Freeze() : Stop the timer. + * aTimer->GetTimerId(): Get the measurement(power,charging,..) corresponding to timer. + * aTimer->RunL() : Calls CHWRMPowerCommonData::GenericTimerFired, which stops the measurements. + * + * - If new max reporting period is negative, complete pending measurement with KErrGeneral and stop the measurements. + * - If timer is not running, just set the timer. + * - If new max reporting period is zero, stop the timer if running and measurements will go on for infinite duration. + * - If new max reporting period is more than elapsed time, stop current time and start for remaining time(Max-elapsed). + * - If new max reporting period is less than elapsed time, complete pending measurement with KErrTimedOut and stop the measurements. + */ + #ifdef _DEBUG + _LIT(KHWRMPowerCommonDataPanic,"CHWRMPowerCommonData"); + #endif + __ASSERT_DEBUG((aTimer)!=NULL, User::Panic(KHWRMPowerCommonDataPanic,KErrBadHandle)); + + if(aNewMaxPeriod.Int() < 0) + { + if(aTimer->IsActive()) + { + //Cenrep value is negative, Inform client that timer has expired. + aTimer->Freeze(); + + switch(aTimer->GetTimerId()) + { + case EPowerReportClientsId: + { + iPowerReportClientsData->MaxReportingPeriodReached(KErrGeneral); + break; + } + +#ifdef SYMBIAN_HWRM_EXTPOWERINFO + + case EChargingCurrentClientsId: + { + iChargingCurrentClientsData->MaxReportingPeriodReached(KErrGeneral); + break; + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + + } + aTimer->RunL(); + } + } + else + { + iMaximumReportingPeriod = aNewMaxPeriod.Int(); + + aTimer->SetMaximumTime(aNewMaxPeriod); + + if(aOldMaxPeriod.Int() == 0) + { + aTimer->Set(aNewMaxPeriod); + } + else if(aTimer->IsActive()) + { + if(aNewMaxPeriod.Int() == 0) + { + //Stop Timer and don't Start Timer + aTimer->Freeze(); + } + else + { + //Ex: If aOldMaxPeriod=8sec, aNewMaxPeriod=10sec, + // elapsedTime=4sec, start timer with 6sec. + + //Freeze will stop the timer and return remaining time. + TTimeIntervalMicroSeconds32 remainingTime = aTimer->Freeze(); + TTimeIntervalMicroSeconds32 elapsedTime; + elapsedTime = aOldMaxPeriod.Int() - remainingTime.Int(); + if(aNewMaxPeriod > elapsedTime) + { + //Start a new Timer. + aTimer->Set((aNewMaxPeriod.Int() - elapsedTime.Int())); + } + else + { + //Inform Client that Timer has expired. + aTimer->Freeze(); + aTimer->RunL(); + } + } + } + } + } + +// ----------------------------------------------------------------------------- +// CHWRMPowerCommonData::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CHWRMPowerCommonData::HandleNotifyInt(TUint32 aId, TInt aNewValue) + { + COMPONENT_TRACE3(_L("HWRM Server - CHWRMPowerCommonData::HandleNotifyInt(0x%x, 0x%x)"), aId, aNewValue) ; + + switch(aId) + { + case KPowerMaxReportingPeriod: + { + TTimeIntervalMicroSeconds32 oldMaxPeriod = iMaximumReportingPeriod; + TTimeIntervalMicroSeconds32 newMaxPeriod = aNewValue*KMilliToMicroSeconds; + + if(oldMaxPeriod.Int() != newMaxPeriod.Int()) + { + TRAP_IGNORE(MaxPeriodChangedL(newMaxPeriod, oldMaxPeriod)); + } + break; + } + default: + COMPONENT_TRACE2(_L("HWRM Server - CHWRMPowerCommonData::HandleNotifyInt Cannot handle(0x%x)"), aId); + break; + + } + + COMPONENT_TRACE1(_L("HWRM Server - CHWRMPowerCommonData::HandleNotifyInt - return") ); + } + +// ----------------------------------------------------------------------------- +// CHWRMPowerCommonData::HandleNotifyError +// ----------------------------------------------------------------------------- +// +#if defined(COMPONENT_TRACE_FLAG) && defined(_DEBUG) +void CHWRMPowerCommonData::HandleNotifyError(TUint32 aId, TInt error, CCenRepListener* aHandler) +#else +void CHWRMPowerCommonData::HandleNotifyError(TUint32 /*aId*/, TInt /*error*/, CCenRepListener* /*aHandler*/) +#endif + { + COMPONENT_TRACE4(_L("HWRM Server - CHWRMPowerCommonData::HandleNotifyError(0x%x, 0x%x, 0x%x)"), aId, error, aHandler); + + + COMPONENT_TRACE1(_L("HWRM Server - CHWRMPowerCommonData::HandleNotifyError - return") ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoSetPluginIntervalMultipleL +// Issues a plugin command to set the plugin interval. +// Used by charging current reporting. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoSetPluginIntervalMultipleL(HWRMPowerCommand::TPowerCmd aCommand, + TUint aIntervalMultiple) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoSetPluginIntervalMultipleL()" ) ); + + iPowerService->SetPluginIntervalMultipleL(aCommand, aIntervalMultiple); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoSetPluginIntervalMultipleL - return" ) ); + } + + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoGetBatteryInfoL +// 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. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoGetBatteryInfoL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetBatteryInfoL()" ) ); + + TBatteryInfoData* batteryInfoData = new(ELeave) TBatteryInfoData(aPowerService, aMessage); + + if (iBatteryInfoQue.IsEmpty()) + { + CleanupStack::PushL(batteryInfoData); + + RMessage2 dummy; + iPowerService->GetBatteryInfoL(dummy); + + CleanupStack::Pop(batteryInfoData); + } + iBatteryInfoQue.AddFirst(*batteryInfoData); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetBatteryInfoL - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoGetBatteryVoltageInfoL +// 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. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoGetBatteryVoltageInfoL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetBatteryVoltageInfoL()" ) ); + + TBatteryInfoData* batteryVoltageInfoData = new(ELeave) TBatteryInfoData(aPowerService, aMessage); + + if (iBatteryVoltageInfoQue.IsEmpty()) + { + CleanupStack::PushL(batteryVoltageInfoData); + + RMessage2 dummy; + iPowerService->GetBatteryVoltageInfoL(dummy); + + CleanupStack::Pop(batteryVoltageInfoData); + } + iBatteryVoltageInfoQue.AddFirst(*batteryVoltageInfoData); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetBatteryVoltageInfoL - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CompletePendingGetBatteryInfo +// Completes and removes from the respective list any pending +// GetBatteryInfo requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CompletePendingGetBatteryInfo(TInt aReason, TPckg &aDataPckg) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetBatteryInfo()" ) ); + + TBatteryInfoData* batteryInfoData; + TInt error; + + //inform everybody + iBatteryInfoIter.SetToFirst(); + while((batteryInfoData = iBatteryInfoIter++) != NULL) + { + error = aReason; + if (error == KErrNone) + { + error = batteryInfoData->iRequestedMessage.Write(0,aDataPckg); + } + batteryInfoData->iRequestedMessage.Complete(error); + iBatteryInfoQue.Remove(*batteryInfoData); + + delete batteryInfoData; + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetBatteryInfo - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CompletePendingGetBatteryVoltageInfo +// Completes and removes from the respective list any pending +// GetBatteryVoltageInfo requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CompletePendingGetBatteryVoltageInfo(TInt aReason, TPckg &aDataPckg) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetBatteryVoltageInfo()" ) ); + + TBatteryInfoData* batteryVoltageInfoData; + TInt error; + + //inform everybody + iBatteryVoltageInfoIter.SetToFirst(); + while((batteryVoltageInfoData = iBatteryVoltageInfoIter++) != NULL) + { + error = aReason; + if (error == KErrNone) + { + error = batteryVoltageInfoData->iRequestedMessage.Write(0,aDataPckg); + } + batteryVoltageInfoData->iRequestedMessage.Complete(error); + iBatteryVoltageInfoQue.Remove(*batteryVoltageInfoData); + + delete batteryVoltageInfoData; + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetBatteryVoltageInfo - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CancelPendingGetBatteryInfo +// Cancels and removes from the respective list any pending +// GetBatteryInfo requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CancelPendingGetBatteryInfo(CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetBatteryInfo()" ) ); + + TBatteryInfoData* batteryInfoData; + + //inform everybody + iBatteryInfoIter.SetToFirst(); + while((batteryInfoData = iBatteryInfoIter++) != NULL) + { + if ( &(batteryInfoData->iPowerClientService) == &aPowerService) + { + batteryInfoData->iRequestedMessage.Complete(KErrCancel); + iBatteryInfoQue.Remove(*batteryInfoData); + + delete batteryInfoData; + } + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetBatteryInfo - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CancelPendingGetBatteryVoltageInfo +// Cancels and removes from the respective list any pending +// GetBatteryVoltageInfo requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CancelPendingGetBatteryVoltageInfo(CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetBatteryVoltageInfo()" ) ); + + TBatteryInfoData* batteryVoltageInfoData; + + //inform everybody + iBatteryVoltageInfoIter.SetToFirst(); + while((batteryVoltageInfoData = iBatteryVoltageInfoIter++) != NULL) + { + if ( &(batteryVoltageInfoData->iPowerClientService) == &aPowerService) + { + batteryVoltageInfoData->iRequestedMessage.Complete(KErrCancel); + iBatteryVoltageInfoQue.Remove(*batteryVoltageInfoData); + + delete batteryVoltageInfoData; + } + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetBatteryVoltageInfo - return" ) ); + } +#ifdef SYMBIAN_HWRM_EXTPOWERINFO +// --------------------------------------------------------- +// CHWRMPowerCommonData::DoGetChargerTypeL +// 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. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::DoGetChargerTypeL(const RMessage2& aMessage, const CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetChargerTypeL()" ) ); + + TBatteryInfoData* batteryInfoData = new(ELeave) TBatteryInfoData(aPowerService, aMessage); + + if (iChargerTypeInfoQue.IsEmpty()) + { + CleanupStack::PushL(batteryInfoData); + + RMessage2 dummy; + iPowerService->GetChargerTypeL(dummy); + + CleanupStack::Pop(batteryInfoData); + } + iChargerTypeInfoQue.AddFirst(*batteryInfoData); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::DoGetChargerTypeL - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CompletePendingGetChargerType +// Completes and removes from the respective list any pending +// GetChargerType requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CompletePendingGetChargerType(TInt aReason, TPckg &aDataPckg) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetChargerType()" ) ); + + TBatteryInfoData* batteryInfoData; + TInt error; + + //inform everybody + iChargerTypeInfoIter.SetToFirst(); + while((batteryInfoData = iChargerTypeInfoIter++) != NULL) + { + error = aReason; + if (error == KErrNone) + { + error = batteryInfoData->iRequestedMessage.Write(0,aDataPckg); + } + batteryInfoData->iRequestedMessage.Complete(error); + iChargerTypeInfoQue.Remove(*batteryInfoData); + + delete batteryInfoData; + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CompletePendingGetChargerType - return" ) ); + } + +// --------------------------------------------------------- +// CHWRMPowerCommonData::CancelPendingGetChargerType +// Cancels and removes from the respective list any pending +// GetChargerType requests. +// --------------------------------------------------------- +// +void CHWRMPowerCommonData::CancelPendingGetChargerType(CHWRMPowerService& aPowerService) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetChargerType()" ) ); + + TBatteryInfoData* batteryInfoData; + + //inform everybody + iChargerTypeInfoIter.SetToFirst(); + while((batteryInfoData = iChargerTypeInfoIter++) != NULL) + { + if ( &(batteryInfoData->iPowerClientService) == &aPowerService) + { + batteryInfoData->iRequestedMessage.Complete(KErrCancel); + iChargerTypeInfoQue.Remove(*batteryInfoData); + + delete batteryInfoData; + } + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMPowerCommonData::CancelPendingGetChargerType - return" ) ); + } + +#endif //SYMBIAN_HWRM_EXTPOWERINFO + +// --------------------------------------------------------- +// CClientsData::NewL +// Two-phased constructor. +// --------------------------------------------------------- +// +CClientsData* CClientsData::NewL(CHWRMGenericTimer& aMeasurementsTimer) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::NewL(()" ) ); + + CClientsData* self = new( ELeave ) CClientsData(aMeasurementsTimer); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + COMPONENT_TRACE2(_L( "HWRM Server - CClientsData::NewL( - return 0x%x" ), self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CClientsData::CClientsData +// C++ constructor +// ----------------------------------------------------------------------------- +// +CClientsData::CClientsData(CHWRMGenericTimer& aMeasurementsTimer) + :iMeasurementsTimer(aMeasurementsTimer), + iClientsQue(_FOFF(TClientData,iSglQueLink)), + iClientsQueIter(iClientsQue) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::CClientsData()" ) ); + + iMeasuring = EFalse; + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::CClientsData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CClientsData::ConstructL() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::ConstructL()" ) ); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::ConstructL - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::GenericTimerFired +// Called when the generic timer expires or reaches the MaxPeriod. +// Completes any pending client-sever messages and resets the +// data (Held by the service) of each client. The list is then emptied +// ----------------------------------------------------------------------------- +// +void CClientsData::MaxReportingPeriodReached(TInt aReason) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::MaxReportingPeriodReached()" ) ); + + TClientData* clientData; + + //inform everybody + iClientsQueIter.SetToFirst(); + while((clientData = iClientsQueIter++) != NULL) + { + clientData->iPowerMeasurementsClientData.CompleteGetMeasurementsMessage(aReason); + clientData->iPowerMeasurementsClientData.Reset(); + } + + //reset the measurements data + CleanUpMeasurementsData(); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::MaxReportingPeriodReached - return" ) ); + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CClientsData::~CClientsData() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::~CClientsData()" ) ); + + CleanUpMeasurementsData(); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::~CClientsData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::EmptyClientsQue +// Deletes all the items of the delts queue and empties it. +// ----------------------------------------------------------------------------- +// +void CClientsData::EmptyClientsQue() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::EmptyClientsQue()" ) ); + + TClientData* clientData; + + iClientsQueIter.SetToFirst(); + + while((clientData = iClientsQueIter++) != NULL) + { + iClientsQue.Remove(*clientData); + delete clientData; + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::EmptyClientsQue - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::FindClient +// Finds the clientthat correspond to the aPowerMeasurementsClientData. +// ----------------------------------------------------------------------------- +// +TClientData* CClientsData::FindClient(TPowerMeasurementsClientData* aPowerMeasurementsClientData) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::FindClient()" ) ); + + TBool found(EFalse); + TClientData* clientData; + + iClientsQueIter.SetToFirst(); + + while( found == EFalse && ((clientData = iClientsQueIter++) != NULL)) + { + if (&(clientData->iPowerMeasurementsClientData) == aPowerMeasurementsClientData) + { + found = ETrue; + } + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::FindClient - return" ) ); + + return clientData; + } + +// ----------------------------------------------------------------------------- +// CClientsData::RecalculatePluginInterval +// Adjusts the interval used by the plugin when a new client requests +// measurement with a time interval that changes the GCD. +// ----------------------------------------------------------------------------- +// +void CClientsData::RecalculatePluginInterval(TUint &aIntervalMultiple) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RecalculatePluginInterval()" ) ); + + TClientData* clientData; + + iClientsQueIter.SetToFirst(); + + clientData = iClientsQueIter++; + TUint newGCD = clientData->iPowerMeasurementsClientData.iRequestedIntervalMultiple; + + while((clientData = iClientsQueIter++) != NULL) + { + newGCD = CalculateGCD(clientData->iPowerMeasurementsClientData.iRequestedIntervalMultiple,newGCD); + } + aIntervalMultiple = newGCD; + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RecalculatePluginInterval - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::GetPluginIntervalMultiple +// Getter for the plugin's interval multiple. +// ----------------------------------------------------------------------------- +// +void CClientsData::GetPluginIntervalMultiple(TUint &aIntervalMultiple) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::GetPluginIntervalMultiple()" ) ); + + aIntervalMultiple = iPluginIntervalMultiple; + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::GetPluginIntervalMultiple - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::UpdatePluginIntervalMultiple +// Setter for the plugin's time interval. +// ----------------------------------------------------------------------------- +// +void CClientsData::UpdatePluginIntervalMultiple(TUint aIntervalMultiple) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::UpdatePluginIntervalMultiple()" ) ); + + iPluginIntervalMultiple = aIntervalMultiple; + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::UpdatePluginIntervalMultiple - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::IsClientsQueEmpty +// Cheks if the Clients Queue is empty +// ----------------------------------------------------------------------------- +// +TBool CClientsData::IsClientsQueEmpty() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::IsClientsQueEmpty()" ) ); + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::IsClientsQueEmpty - return" ) ); + + return iClientsQue.IsEmpty(); + } + +// ----------------------------------------------------------------------------- +// CClientsData::CalculateGCD +// Computes the Greatest Common Divisor of num1 and num2. +// ----------------------------------------------------------------------------- +// +TUint CClientsData::CalculateGCD(TUint num1, TUint num2) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::CalculateGCD()" ) ); + + if (num2 == 0) + { + return num1; + } + else + { + return CalculateGCD(num2, num1 % num2); + } + } + +// ----------------------------------------------------------------------------- +// CClientsData::AddMeasurementsClientL +// Creates and adds to the list a data structure containing all the +// appropriate client data. +// ----------------------------------------------------------------------------- +// +void CClientsData::AddMeasurementsClientL(TPowerMeasurementsClientData& aPowerMeasurementsClientData) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::AddMeasurementsClientL()" ) ); + + TClientData* clientData = new(ELeave) TClientData(aPowerMeasurementsClientData); + + iClientsQue.AddFirst(*clientData); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::AddMeasurementsClientL - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::RemoveMeasurementsClientData +// Deletes all the data relevant to the client whose PowerService holds +// aPowerMeasurementsClientData. +// ----------------------------------------------------------------------------- +// +void CClientsData::RemoveMeasurementsClientData(TPowerMeasurementsClientData* aPowerMeasurementsClientData) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RemoveMeasurementsClientData()" ) ); + + TClientData* clientData; + clientData = FindClient(aPowerMeasurementsClientData); + + if (clientData) + { + iClientsQue.Remove(*clientData); + delete clientData; + + if (iClientsQue.IsEmpty()) + { + SetMeasuringOff(); + } + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RemoveMeasurementsClientData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::RemoveMeasurementsClientL +// Deletes all the data relevant to the client whose PowerService holds +// aPowerMeasurementsClientData. Leaves in the case the client is not found. +// ----------------------------------------------------------------------------- +// +void CClientsData::RemoveMeasurementsClientL(TPowerMeasurementsClientData* aPowerMeasurementsClientData) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RemoveMeasurementsClientL()" ) ); + + TClientData* clientData; + clientData = FindClient(aPowerMeasurementsClientData); + + if (clientData == NULL) + { + User::Leave(KErrNotFound); + } + + iClientsQue.Remove(*clientData); + delete clientData; + + if (iClientsQue.IsEmpty()) + { + SetMeasuringOff(); + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::RemoveMeasurementsClientL - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::NeedPluginIntervalAdjustment +// Checks if a adjustement is needed for the interval used by the plugin. +// The Interval Multiple requested by the new client is passed +// ----------------------------------------------------------------------------- +// + +TBool CClientsData::NeedPluginIntervalAdjustment(TUint aIntervalMultiple) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::NeedPluginIntervalAdjustment()" ) ); + + TBool needAdjustment; + + if (iClientsQue.IsEmpty()) + { + needAdjustment = EFalse; + } + else + { + TUint currentPluginIntervalMultiple; + GetPluginIntervalMultiple(currentPluginIntervalMultiple); + TUint currentGCD = currentPluginIntervalMultiple; + TUint newInterval = aIntervalMultiple; + + if( (newInterval % currentGCD) == 0) + { + needAdjustment = EFalse; + } + else + { + needAdjustment = ETrue; + } + } + + COMPONENT_TRACE2(_L( "HWRM Server - CClientsData::NeedPluginIntervalAdjustment( - return 0x%x" ), needAdjustment ); + + return needAdjustment; + } + +// ----------------------------------------------------------------------------- +// CClientsData::CleanUpMeasurementsData +// Deletes all the measurement related data. Used at destruction time. +// ----------------------------------------------------------------------------- +// +void CClientsData::CleanUpMeasurementsData() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::CleanUpMeasurementsData()" ) ); + + EmptyClientsQue(); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::CleanUpMeasurementsData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CClientsData::BatteryMeasurementIndicationL +// Handles a measurement callback indication from the plugin. +// ----------------------------------------------------------------------------- +// +void CClientsData::BatteryMeasurementIndicationL(TDesC8& aValue) + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::BatteryMeasurementIndicationL()" ) ); + + TClientData* clientData; + + iClientsQueIter.SetToFirst(); + + while((clientData = iClientsQueIter++) != NULL) + { + clientData->iPowerMeasurementsClientData.NewBatteryMeasurementL(aValue, iPluginIntervalMultiple); + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::BatteryMeasurementIndicationL - return" ) ); + } + + +// ----------------------------------------------------------------------------- +// TPowerMeasurementsClientData::IsMeasuringOn +// Check if plugin measuring is on. +// ----------------------------------------------------------------------------- +// +TBool CClientsData::IsMeasuringOn() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::IsMeasuringOn()" ) ); + + COMPONENT_TRACE2(_L( "HWRM Server - CClientsData::IsMeasuringOn( - return 0x%x" ), iMeasuring ); + + return iMeasuring; + } + +// ----------------------------------------------------------------------------- +// TPowerMeasurementsClientData::SetMeasuringOn +// Set the plugin measuring flag on. +// ----------------------------------------------------------------------------- +// +void CClientsData::SetMeasuringOn() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::SetMeasuringOn()" ) ); + + iMeasuring = ETrue; + iMeasurementsTimer.Set(0); + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::SetMeasuringOn - return" ) ); + } + +// ----------------------------------------------------------------------------- +// TPowerMeasurementsClientData::SetMeasuringOff +// Set the plugin measuring flag off. +// ----------------------------------------------------------------------------- +// +void CClientsData::SetMeasuringOff() + { + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::SetMeasuringOff()" ) ); + + iMeasuring = EFalse; + iMeasurementsTimer.Cancel(); + + TClientData* clientData; + iClientsQueIter.SetToFirst(); + while((clientData = iClientsQueIter++) != NULL) + { + clientData->iPowerMeasurementsClientData.SetMeasuringOff(); + } + + COMPONENT_TRACE1(_L( "HWRM Server - CClientsData::SetMeasuringOff - return" ) ); + } + +TClientData::TClientData(TPowerMeasurementsClientData& aPowerMeasurementsClientData) + :iPowerMeasurementsClientData(aPowerMeasurementsClientData) + { + COMPONENT_TRACE1(_L( "HWRM Server - TClientData::TClientData()" ) ); + COMPONENT_TRACE1(_L( "HWRM Server - TClientData::TClientData - return" ) ); + } + +TBatteryInfoData::TBatteryInfoData(const CHWRMPowerService& aPowerClientService, const RMessage2& aRequestedMessage) + :iPowerClientService(aPowerClientService), + iRequestedMessage(aRequestedMessage) + { + COMPONENT_TRACE1(_L( "HWRM Server - TBatteryInfoData::TBatteryInfoData()" ) ); + COMPONENT_TRACE1(_L( "HWRM Server - TBatteryInfoData::TBatteryInfoData - return" ) ); + } +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File