perfapps/perfmon/engine/src/perfmon_powerlistener.cpp
author hgs
Fri, 03 Sep 2010 17:11:21 +0300
changeset 51 b048e15729d6
child 52 36d60d12b4af
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
 
hgs
parents:
diff changeset
    18
// INCLUDE FILES
hgs
parents:
diff changeset
    19
#include "perfmon_powerlistener.h"
hgs
parents:
diff changeset
    20
#include "../../symbian_version.hrh"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <centralrepository.h>
hgs
parents:
diff changeset
    23
#include <hwrm/hwrmpowerdomaincrkeys.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#if (SYMBIAN_VERSION_SUPPORT == SYMBIAN_3)
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
    CPerfMonPowerListener* CPerfMonPowerListener::NewL()
hgs
parents:
diff changeset
    29
        {
hgs
parents:
diff changeset
    30
        CPerfMonPowerListener* self = new (ELeave) CPerfMonPowerListener();
hgs
parents:
diff changeset
    31
        CleanupStack::PushL(self);
hgs
parents:
diff changeset
    32
        self->ConstructL();
hgs
parents:
diff changeset
    33
        CleanupStack::Pop();
hgs
parents:
diff changeset
    34
        return self;
hgs
parents:
diff changeset
    35
        }
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    // --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
    CPerfMonPowerListener::CPerfMonPowerListener() :
hgs
parents:
diff changeset
    40
        iHWRMPower(0),
hgs
parents:
diff changeset
    41
        iLastPowerAvg(0),
hgs
parents:
diff changeset
    42
        iMaxPower(0),
hgs
parents:
diff changeset
    43
        iOriginalMaxReportingPeriod(0)
hgs
parents:
diff changeset
    44
        {
hgs
parents:
diff changeset
    45
        }
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
    // --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
    void CPerfMonPowerListener::ConstructL()
hgs
parents:
diff changeset
    50
        {
hgs
parents:
diff changeset
    51
        }
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    // --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
    CPerfMonPowerListener::~CPerfMonPowerListener()
hgs
parents:
diff changeset
    56
        {
hgs
parents:
diff changeset
    57
        DeActivate();
hgs
parents:
diff changeset
    58
        
hgs
parents:
diff changeset
    59
        if (iHWRMPower != 0)
hgs
parents:
diff changeset
    60
            {
hgs
parents:
diff changeset
    61
            delete iHWRMPower;
hgs
parents:
diff changeset
    62
            iHWRMPower = 0;
hgs
parents:
diff changeset
    63
            }
hgs
parents:
diff changeset
    64
        }
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    // --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
    TBool CPerfMonPowerListener::IsSupported()
hgs
parents:
diff changeset
    69
        {
hgs
parents:
diff changeset
    70
        return ETrue;
hgs
parents:
diff changeset
    71
        }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    // --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    TInt CPerfMonPowerListener::Activate()
hgs
parents:
diff changeset
    76
        {
hgs
parents:
diff changeset
    77
        if (iHWRMPower == 0)
hgs
parents:
diff changeset
    78
            {
hgs
parents:
diff changeset
    79
            TRAPD(err, iHWRMPower = CHWRMPower::NewL());
hgs
parents:
diff changeset
    80
            if (err != KErrNone)
hgs
parents:
diff changeset
    81
                {
hgs
parents:
diff changeset
    82
                return err;
hgs
parents:
diff changeset
    83
                }
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
            // Callbacks to this object
hgs
parents:
diff changeset
    86
            err = iHWRMPower->SetPowerReportObserver(this);
hgs
parents:
diff changeset
    87
            if (err != KErrNone)
hgs
parents:
diff changeset
    88
                {
hgs
parents:
diff changeset
    89
                return err;
hgs
parents:
diff changeset
    90
                }
hgs
parents:
diff changeset
    91
            
hgs
parents:
diff changeset
    92
            TRAP_IGNORE(GetReportingPeriodL());
hgs
parents:
diff changeset
    93
            }
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
        // Set infinite reporting period
hgs
parents:
diff changeset
    96
        TRAPD(err, SetReportingPeriodL(KReportingDuration));
hgs
parents:
diff changeset
    97
        if (err != KErrNone)
hgs
parents:
diff changeset
    98
            {
hgs
parents:
diff changeset
    99
            return err;
hgs
parents:
diff changeset
   100
            }
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
        TRequestStatus status(KRequestPending);
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
        // Start the power consumption notification
hgs
parents:
diff changeset
   105
        iHWRMPower->StartAveragePowerReporting(status, KSampleIntervalMultiple);
hgs
parents:
diff changeset
   106
        User::WaitForRequest(status);
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
        // Check if monitoring was succesfully started or already ongoing.
hgs
parents:
diff changeset
   109
        if ((status.Int() != KErrNone) && (status.Int() != KErrAlreadyExists))
hgs
parents:
diff changeset
   110
            {
hgs
parents:
diff changeset
   111
            return status.Int();
hgs
parents:
diff changeset
   112
            }
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
        return KErrNone;
hgs
parents:
diff changeset
   115
        }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
    // ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    void CPerfMonPowerListener::DeActivate()
hgs
parents:
diff changeset
   120
        {
hgs
parents:
diff changeset
   121
        if (iHWRMPower != 0)
hgs
parents:
diff changeset
   122
            {
hgs
parents:
diff changeset
   123
            TRAP_IGNORE(iHWRMPower->StopAveragePowerReportingL());
hgs
parents:
diff changeset
   124
            }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
        // Restore original value to max sampling duration
hgs
parents:
diff changeset
   127
        TRAP_IGNORE(SetReportingPeriodL(iOriginalMaxReportingPeriod));
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
        iPowerBuffer.Reset();
hgs
parents:
diff changeset
   130
        iLastPowerAvg = 0;
hgs
parents:
diff changeset
   131
        }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    // ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    TInt CPerfMonPowerListener::GetPower()
hgs
parents:
diff changeset
   136
        {
hgs
parents:
diff changeset
   137
        TInt avgPower = 0;
hgs
parents:
diff changeset
   138
        TInt newValueCount = iPowerBuffer.Count();
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
        if (newValueCount > 0)
hgs
parents:
diff changeset
   141
            {
hgs
parents:
diff changeset
   142
            // Read all new values from buffer and calculate average from them.
hgs
parents:
diff changeset
   143
            for (int i = 0; i < newValueCount; i++)
hgs
parents:
diff changeset
   144
                {
hgs
parents:
diff changeset
   145
                avgPower += iPowerBuffer[i];
hgs
parents:
diff changeset
   146
                }
hgs
parents:
diff changeset
   147
            avgPower = avgPower / newValueCount;
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
            iPowerBuffer.Reset();
hgs
parents:
diff changeset
   150
            iLastPowerAvg = avgPower;
hgs
parents:
diff changeset
   151
            }
hgs
parents:
diff changeset
   152
        else
hgs
parents:
diff changeset
   153
            {
hgs
parents:
diff changeset
   154
            avgPower = iLastPowerAvg;
hgs
parents:
diff changeset
   155
            }
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
        return avgPower;
hgs
parents:
diff changeset
   158
        }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    // ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    void CPerfMonPowerListener::PowerMeasurement(TInt aErrCode, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
hgs
parents:
diff changeset
   163
        {
hgs
parents:
diff changeset
   164
        if (aErrCode == KErrNone)
hgs
parents:
diff changeset
   165
            {
hgs
parents:
diff changeset
   166
            // Store new value to buffer to wait for reading
hgs
parents:
diff changeset
   167
            TInt value = aMeasurement.iAverageVoltage * aMeasurement.iAverageCurrent;
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
            // If charger is connected, reported values may be negative.
hgs
parents:
diff changeset
   170
            if (value < 0)
hgs
parents:
diff changeset
   171
                {
hgs
parents:
diff changeset
   172
                value = 0;
hgs
parents:
diff changeset
   173
                }
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
            iPowerBuffer.Append(value);
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
            if ( value > iMaxPower )
hgs
parents:
diff changeset
   178
                {
hgs
parents:
diff changeset
   179
                iMaxPower = value;
hgs
parents:
diff changeset
   180
                }
hgs
parents:
diff changeset
   181
            }
hgs
parents:
diff changeset
   182
        // Ignore any errors
hgs
parents:
diff changeset
   183
        }
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
    void CPerfMonPowerListener::GetReportingPeriodL()
hgs
parents:
diff changeset
   186
        {
hgs
parents:
diff changeset
   187
        CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
        CleanupStack::PushL(cenRep);
hgs
parents:
diff changeset
   190
        User::LeaveIfError(cenRep->Get(KPowerMaxReportingPeriod, iOriginalMaxReportingPeriod));
hgs
parents:
diff changeset
   191
        CleanupStack::Pop();
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
        delete cenRep;
hgs
parents:
diff changeset
   194
        }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
    void CPerfMonPowerListener::SetReportingPeriodL(TInt aDuration)
hgs
parents:
diff changeset
   197
        {
hgs
parents:
diff changeset
   198
        CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
        CleanupStack::PushL(cenRep);
hgs
parents:
diff changeset
   201
        User::LeaveIfError(cenRep->Set(KPowerMaxReportingPeriod, aDuration));
hgs
parents:
diff changeset
   202
        CleanupStack::Pop();
hgs
parents:
diff changeset
   203
        
hgs
parents:
diff changeset
   204
        delete cenRep;
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
// SYMBIAN_VERSION_SUPPORT < SYMBIAN_3
hgs
parents:
diff changeset
   208
#else
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
    // Stub implementation for older Symbian versions
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    CPerfMonPowerListener* CPerfMonPowerListener::NewL()
hgs
parents:
diff changeset
   213
        {
hgs
parents:
diff changeset
   214
        CPerfMonPowerListener* self = new (ELeave) CPerfMonPowerListener();
hgs
parents:
diff changeset
   215
        CleanupStack::PushL(self);
hgs
parents:
diff changeset
   216
        self->ConstructL();
hgs
parents:
diff changeset
   217
        CleanupStack::Pop();
hgs
parents:
diff changeset
   218
        return self;
hgs
parents:
diff changeset
   219
        }
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    CPerfMonPowerListener::CPerfMonPowerListener() :
hgs
parents:
diff changeset
   222
        iHWRMPower(0),
hgs
parents:
diff changeset
   223
        iLastPowerAvg(0),
hgs
parents:
diff changeset
   224
        iMaxPower(0)
hgs
parents:
diff changeset
   225
        {
hgs
parents:
diff changeset
   226
        }
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
    void CPerfMonPowerListener::ConstructL()
hgs
parents:
diff changeset
   229
        {
hgs
parents:
diff changeset
   230
        }
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    CPerfMonPowerListener::~CPerfMonPowerListener()
hgs
parents:
diff changeset
   233
        {
hgs
parents:
diff changeset
   234
        DeActivate();
hgs
parents:
diff changeset
   235
        }
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
    TBool CPerfMonPowerListener::IsSupported()
hgs
parents:
diff changeset
   238
        {
hgs
parents:
diff changeset
   239
        return EFalse;
hgs
parents:
diff changeset
   240
        }
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    TInt CPerfMonPowerListener::Activate()
hgs
parents:
diff changeset
   243
        {
hgs
parents:
diff changeset
   244
        return KErrNotSupported;
hgs
parents:
diff changeset
   245
        }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
    void CPerfMonPowerListener::DeActivate()
hgs
parents:
diff changeset
   248
        {
hgs
parents:
diff changeset
   249
        }
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
    TInt CPerfMonPowerListener::GetPower()
hgs
parents:
diff changeset
   252
        {
hgs
parents:
diff changeset
   253
        return 0;
hgs
parents:
diff changeset
   254
        }
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
    void CPerfMonPowerListener::PowerMeasurement(TInt aErrCode, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
hgs
parents:
diff changeset
   257
        {
hgs
parents:
diff changeset
   258
        }
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
#endif
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
// End of File