perfapps/perfmon/engine/src/perfmon_powerlistener.cpp
changeset 51 b048e15729d6
child 52 36d60d12b4af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perfapps/perfmon/engine/src/perfmon_powerlistener.cpp	Fri Sep 03 17:11:21 2010 +0300
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 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 "perfmon_powerlistener.h"
+#include "../../symbian_version.hrh"
+
+#include <centralrepository.h>
+#include <hwrm/hwrmpowerdomaincrkeys.h>
+
+
+#if (SYMBIAN_VERSION_SUPPORT == SYMBIAN_3)
+
+    CPerfMonPowerListener* CPerfMonPowerListener::NewL()
+        {
+        CPerfMonPowerListener* self = new (ELeave) CPerfMonPowerListener();
+        CleanupStack::PushL(self);
+        self->ConstructL();
+        CleanupStack::Pop();
+        return self;
+        }
+
+    // --------------------------------------------------------------------------------------------
+
+    CPerfMonPowerListener::CPerfMonPowerListener() :
+        iHWRMPower(0),
+        iLastPowerAvg(0),
+        iMaxPower(0),
+        iOriginalMaxReportingPeriod(0)
+        {
+        }
+
+    // --------------------------------------------------------------------------------------------
+
+    void CPerfMonPowerListener::ConstructL()
+        {
+        }
+
+    // --------------------------------------------------------------------------------------------
+
+    CPerfMonPowerListener::~CPerfMonPowerListener()
+        {
+        DeActivate();
+        
+        if (iHWRMPower != 0)
+            {
+            delete iHWRMPower;
+            iHWRMPower = 0;
+            }
+        }
+
+    // --------------------------------------------------------------------------------------------
+
+    TBool CPerfMonPowerListener::IsSupported()
+        {
+        return ETrue;
+        }
+
+    // --------------------------------------------------------------------------------------------
+
+    TInt CPerfMonPowerListener::Activate()
+        {
+        if (iHWRMPower == 0)
+            {
+            TRAPD(err, iHWRMPower = CHWRMPower::NewL());
+            if (err != KErrNone)
+                {
+                return err;
+                }
+
+            // Callbacks to this object
+            err = iHWRMPower->SetPowerReportObserver(this);
+            if (err != KErrNone)
+                {
+                return err;
+                }
+            
+            TRAP_IGNORE(GetReportingPeriodL());
+            }
+
+        // Set infinite reporting period
+        TRAPD(err, SetReportingPeriodL(KReportingDuration));
+        if (err != KErrNone)
+            {
+            return err;
+            }
+
+        TRequestStatus status(KRequestPending);
+
+        // Start the power consumption notification
+        iHWRMPower->StartAveragePowerReporting(status, KSampleIntervalMultiple);
+        User::WaitForRequest(status);
+
+        // Check if monitoring was succesfully started or already ongoing.
+        if ((status.Int() != KErrNone) && (status.Int() != KErrAlreadyExists))
+            {
+            return status.Int();
+            }
+
+        return KErrNone;
+        }
+
+    // ---------------------------------------------------------------------------
+
+    void CPerfMonPowerListener::DeActivate()
+        {
+        if (iHWRMPower != 0)
+            {
+            TRAP_IGNORE(iHWRMPower->StopAveragePowerReportingL());
+            }
+
+        // Restore original value to max sampling duration
+        TRAP_IGNORE(SetReportingPeriodL(iOriginalMaxReportingPeriod));
+
+        iPowerBuffer.Reset();
+        iLastPowerAvg = 0;
+        }
+
+    // ---------------------------------------------------------------------------
+
+    TInt CPerfMonPowerListener::GetPower()
+        {
+        TInt avgPower = 0;
+        TInt newValueCount = iPowerBuffer.Count();
+
+        if (newValueCount > 0)
+            {
+            // Read all new values from buffer and calculate average from them.
+            for (int i = 0; i < newValueCount; i++)
+                {
+                avgPower += iPowerBuffer[i];
+                }
+            avgPower = avgPower / newValueCount;
+
+            iPowerBuffer.Reset();
+            iLastPowerAvg = avgPower;
+            }
+        else
+            {
+            avgPower = iLastPowerAvg;
+            }
+
+        return avgPower;
+        }
+
+    // ---------------------------------------------------------------------------
+
+    void CPerfMonPowerListener::PowerMeasurement(TInt aErrCode, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
+        {
+        if (aErrCode == KErrNone)
+            {
+            // Store new value to buffer to wait for reading
+            TInt value = aMeasurement.iAverageVoltage * aMeasurement.iAverageCurrent;
+
+            // If charger is connected, reported values may be negative.
+            if (value < 0)
+                {
+                value = 0;
+                }
+
+            iPowerBuffer.Append(value);
+
+            if ( value > iMaxPower )
+                {
+                iMaxPower = value;
+                }
+            }
+        // Ignore any errors
+        }
+
+    void CPerfMonPowerListener::GetReportingPeriodL()
+        {
+        CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
+
+        CleanupStack::PushL(cenRep);
+        User::LeaveIfError(cenRep->Get(KPowerMaxReportingPeriod, iOriginalMaxReportingPeriod));
+        CleanupStack::Pop();
+
+        delete cenRep;
+        }
+
+    void CPerfMonPowerListener::SetReportingPeriodL(TInt aDuration)
+        {
+        CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
+
+        CleanupStack::PushL(cenRep);
+        User::LeaveIfError(cenRep->Set(KPowerMaxReportingPeriod, aDuration));
+        CleanupStack::Pop();
+        
+        delete cenRep;
+        }
+
+// SYMBIAN_VERSION_SUPPORT < SYMBIAN_3
+#else
+
+    // Stub implementation for older Symbian versions
+
+    CPerfMonPowerListener* CPerfMonPowerListener::NewL()
+        {
+        CPerfMonPowerListener* self = new (ELeave) CPerfMonPowerListener();
+        CleanupStack::PushL(self);
+        self->ConstructL();
+        CleanupStack::Pop();
+        return self;
+        }
+
+    CPerfMonPowerListener::CPerfMonPowerListener() :
+        iHWRMPower(0),
+        iLastPowerAvg(0),
+        iMaxPower(0)
+        {
+        }
+
+    void CPerfMonPowerListener::ConstructL()
+        {
+        }
+
+    CPerfMonPowerListener::~CPerfMonPowerListener()
+        {
+        DeActivate();
+        }
+
+    TBool CPerfMonPowerListener::IsSupported()
+        {
+        return EFalse;
+        }
+
+    TInt CPerfMonPowerListener::Activate()
+        {
+        return KErrNotSupported;
+        }
+
+    void CPerfMonPowerListener::DeActivate()
+        {
+        }
+
+    TInt CPerfMonPowerListener::GetPower()
+        {
+        return 0;
+        }
+
+    void CPerfMonPowerListener::PowerMeasurement(TInt aErrCode, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
+        {
+        }
+
+#endif
+
+// End of File