perfapps/perfmon/engine/src/perfmon_powerlistener.cpp
author hgs
Fri, 17 Sep 2010 14:22:55 +0300
changeset 52 36d60d12b4af
parent 51 b048e15729d6
permissions -rw-r--r--
201037
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
52
hgs
parents: 51
diff changeset
    25
TBool CPerfMonPowerListener::iIsSupported = ETrue;
51
hgs
parents:
diff changeset
    26
52
hgs
parents: 51
diff changeset
    27
/*
hgs
parents: 51
diff changeset
    28
 *
hgs
parents: 51
diff changeset
    29
 * class CPerfMonPowerListener implementation
hgs
parents: 51
diff changeset
    30
 * 
hgs
parents: 51
diff changeset
    31
 */
51
hgs
parents:
diff changeset
    32
52
hgs
parents: 51
diff changeset
    33
CPerfMonPowerListener* CPerfMonPowerListener::NewL()
hgs
parents: 51
diff changeset
    34
    {
hgs
parents: 51
diff changeset
    35
    CPerfMonPowerListener* self = new (ELeave) CPerfMonPowerListener();
hgs
parents: 51
diff changeset
    36
    CleanupStack::PushL(self);
hgs
parents: 51
diff changeset
    37
    self->ConstructL();
hgs
parents: 51
diff changeset
    38
    CleanupStack::Pop();
hgs
parents: 51
diff changeset
    39
    return self;
hgs
parents: 51
diff changeset
    40
    }
51
hgs
parents:
diff changeset
    41
52
hgs
parents: 51
diff changeset
    42
// --------------------------------------------------------------------------------------------
51
hgs
parents:
diff changeset
    43
52
hgs
parents: 51
diff changeset
    44
CPerfMonPowerListener::CPerfMonPowerListener() :
hgs
parents: 51
diff changeset
    45
    iPowerListenerImpl(NULL)
hgs
parents: 51
diff changeset
    46
    {
hgs
parents: 51
diff changeset
    47
    }
51
hgs
parents:
diff changeset
    48
52
hgs
parents: 51
diff changeset
    49
// --------------------------------------------------------------------------------------------
51
hgs
parents:
diff changeset
    50
52
hgs
parents: 51
diff changeset
    51
void CPerfMonPowerListener::ConstructL()
hgs
parents: 51
diff changeset
    52
    {
hgs
parents: 51
diff changeset
    53
    TRAPD(err, iPowerListenerImpl = CPerfMonPowerListenerImpl::NewL());
hgs
parents: 51
diff changeset
    54
    if (err != KErrNone)
51
hgs
parents:
diff changeset
    55
        {
52
hgs
parents: 51
diff changeset
    56
        iPowerListenerImpl = NULL;
51
hgs
parents:
diff changeset
    57
52
hgs
parents: 51
diff changeset
    58
        // Could not initialize power monitoring client. Feature support not available.
hgs
parents: 51
diff changeset
    59
        iIsSupported = EFalse;
51
hgs
parents:
diff changeset
    60
        }
52
hgs
parents: 51
diff changeset
    61
    }
51
hgs
parents:
diff changeset
    62
52
hgs
parents: 51
diff changeset
    63
// --------------------------------------------------------------------------------------------
51
hgs
parents:
diff changeset
    64
52
hgs
parents: 51
diff changeset
    65
CPerfMonPowerListener::~CPerfMonPowerListener()
hgs
parents: 51
diff changeset
    66
    {
hgs
parents: 51
diff changeset
    67
    DeActivate();
51
hgs
parents:
diff changeset
    68
52
hgs
parents: 51
diff changeset
    69
    if (iPowerListenerImpl)
51
hgs
parents:
diff changeset
    70
        {
52
hgs
parents: 51
diff changeset
    71
        delete iPowerListenerImpl;
hgs
parents: 51
diff changeset
    72
        iPowerListenerImpl = 0;
51
hgs
parents:
diff changeset
    73
        }
52
hgs
parents: 51
diff changeset
    74
    }
51
hgs
parents:
diff changeset
    75
52
hgs
parents: 51
diff changeset
    76
// --------------------------------------------------------------------------------------------
51
hgs
parents:
diff changeset
    77
52
hgs
parents: 51
diff changeset
    78
TInt CPerfMonPowerListener::Activate()
hgs
parents: 51
diff changeset
    79
    { 
hgs
parents: 51
diff changeset
    80
    if (iPowerListenerImpl)
51
hgs
parents:
diff changeset
    81
        {
52
hgs
parents: 51
diff changeset
    82
        return iPowerListenerImpl->Activate();
51
hgs
parents:
diff changeset
    83
        }
52
hgs
parents: 51
diff changeset
    84
    else
51
hgs
parents:
diff changeset
    85
        {
hgs
parents:
diff changeset
    86
        return KErrNotSupported;
hgs
parents:
diff changeset
    87
        }
52
hgs
parents: 51
diff changeset
    88
    }
51
hgs
parents:
diff changeset
    89
52
hgs
parents: 51
diff changeset
    90
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
    91
hgs
parents: 51
diff changeset
    92
void CPerfMonPowerListener::DeActivate()
hgs
parents: 51
diff changeset
    93
    {
hgs
parents: 51
diff changeset
    94
    if (iPowerListenerImpl)
hgs
parents: 51
diff changeset
    95
        {
hgs
parents: 51
diff changeset
    96
        iPowerListenerImpl->DeActivate();
hgs
parents: 51
diff changeset
    97
        }
hgs
parents: 51
diff changeset
    98
    }
hgs
parents: 51
diff changeset
    99
hgs
parents: 51
diff changeset
   100
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   101
hgs
parents: 51
diff changeset
   102
TInt CPerfMonPowerListener::GetPower()
hgs
parents: 51
diff changeset
   103
    {
hgs
parents: 51
diff changeset
   104
    if (iPowerListenerImpl)
51
hgs
parents:
diff changeset
   105
        {
52
hgs
parents: 51
diff changeset
   106
        return iPowerListenerImpl->GetPower();
51
hgs
parents:
diff changeset
   107
        }
52
hgs
parents: 51
diff changeset
   108
    else
hgs
parents: 51
diff changeset
   109
        {
hgs
parents: 51
diff changeset
   110
        return 0;
hgs
parents: 51
diff changeset
   111
        }
hgs
parents: 51
diff changeset
   112
    }
51
hgs
parents:
diff changeset
   113
52
hgs
parents: 51
diff changeset
   114
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   115
hgs
parents: 51
diff changeset
   116
TInt CPerfMonPowerListener::GetMaxPower()
hgs
parents: 51
diff changeset
   117
    {
hgs
parents: 51
diff changeset
   118
    if (iPowerListenerImpl)
hgs
parents: 51
diff changeset
   119
        {
hgs
parents: 51
diff changeset
   120
        return iPowerListenerImpl->GetMaxPower();
hgs
parents: 51
diff changeset
   121
        }
hgs
parents: 51
diff changeset
   122
    else
51
hgs
parents:
diff changeset
   123
        {
hgs
parents:
diff changeset
   124
        return 0;
hgs
parents:
diff changeset
   125
        }
52
hgs
parents: 51
diff changeset
   126
    }
51
hgs
parents:
diff changeset
   127
52
hgs
parents: 51
diff changeset
   128
/*
hgs
parents: 51
diff changeset
   129
 *
hgs
parents: 51
diff changeset
   130
 * class CPerfMonPowerListenerImpl implementation
hgs
parents: 51
diff changeset
   131
 * 
hgs
parents: 51
diff changeset
   132
 */
hgs
parents: 51
diff changeset
   133
hgs
parents: 51
diff changeset
   134
CPerfMonPowerListenerImpl* CPerfMonPowerListenerImpl::NewL()
hgs
parents: 51
diff changeset
   135
    {
hgs
parents: 51
diff changeset
   136
    CPerfMonPowerListenerImpl* self = new (ELeave) CPerfMonPowerListenerImpl();
hgs
parents: 51
diff changeset
   137
    CleanupStack::PushL(self);
hgs
parents: 51
diff changeset
   138
    self->ConstructL();
hgs
parents: 51
diff changeset
   139
    CleanupStack::Pop();
hgs
parents: 51
diff changeset
   140
    return self;
hgs
parents: 51
diff changeset
   141
    }
hgs
parents: 51
diff changeset
   142
hgs
parents: 51
diff changeset
   143
// --------------------------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   144
hgs
parents: 51
diff changeset
   145
CPerfMonPowerListenerImpl::CPerfMonPowerListenerImpl() :
hgs
parents: 51
diff changeset
   146
    iHWRMPower(NULL),
hgs
parents: 51
diff changeset
   147
    iLastPowerAvg(0),
hgs
parents: 51
diff changeset
   148
    iMaxPower(0),
hgs
parents: 51
diff changeset
   149
    iOriginalMaxReportingPeriod(0)
hgs
parents: 51
diff changeset
   150
    {
hgs
parents: 51
diff changeset
   151
    }
hgs
parents: 51
diff changeset
   152
hgs
parents: 51
diff changeset
   153
// --------------------------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   154
hgs
parents: 51
diff changeset
   155
void CPerfMonPowerListenerImpl::ConstructL()
hgs
parents: 51
diff changeset
   156
    {
hgs
parents: 51
diff changeset
   157
    iHWRMPower = CHWRMPower::NewL();
hgs
parents: 51
diff changeset
   158
hgs
parents: 51
diff changeset
   159
    // Callbacks to this object
hgs
parents: 51
diff changeset
   160
    User::LeaveIfError(iHWRMPower->SetPowerReportObserver(this));
hgs
parents: 51
diff changeset
   161
hgs
parents: 51
diff changeset
   162
    iOriginalMaxReportingPeriod = GetReportingPeriodL();
hgs
parents: 51
diff changeset
   163
    }
hgs
parents: 51
diff changeset
   164
hgs
parents: 51
diff changeset
   165
// --------------------------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   166
hgs
parents: 51
diff changeset
   167
CPerfMonPowerListenerImpl::~CPerfMonPowerListenerImpl()
hgs
parents: 51
diff changeset
   168
    {
hgs
parents: 51
diff changeset
   169
    DeActivate();
hgs
parents: 51
diff changeset
   170
hgs
parents: 51
diff changeset
   171
    if (iHWRMPower)
51
hgs
parents:
diff changeset
   172
        {
52
hgs
parents: 51
diff changeset
   173
        delete iHWRMPower;
hgs
parents: 51
diff changeset
   174
        iHWRMPower = 0;
hgs
parents: 51
diff changeset
   175
        }
hgs
parents: 51
diff changeset
   176
    }
hgs
parents: 51
diff changeset
   177
hgs
parents: 51
diff changeset
   178
// --------------------------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   179
hgs
parents: 51
diff changeset
   180
TInt CPerfMonPowerListenerImpl::Activate()
hgs
parents: 51
diff changeset
   181
    {
hgs
parents: 51
diff changeset
   182
    // Set infinite reporting period
hgs
parents: 51
diff changeset
   183
    TRAPD(err, SetReportingPeriodL(KHWRMReportingDuration));
hgs
parents: 51
diff changeset
   184
    if (err != KErrNone)
hgs
parents: 51
diff changeset
   185
        {
hgs
parents: 51
diff changeset
   186
        return err;
hgs
parents: 51
diff changeset
   187
        }
hgs
parents: 51
diff changeset
   188
hgs
parents: 51
diff changeset
   189
    TRequestStatus status(KRequestPending);
hgs
parents: 51
diff changeset
   190
hgs
parents: 51
diff changeset
   191
    // Start the power consumption notification
hgs
parents: 51
diff changeset
   192
    iHWRMPower->StartAveragePowerReporting(status, KHWRMSampleIntervalMultiple);
hgs
parents: 51
diff changeset
   193
    User::WaitForRequest(status);
hgs
parents: 51
diff changeset
   194
hgs
parents: 51
diff changeset
   195
    // Check if monitoring was succesfully started or already ongoing.
hgs
parents: 51
diff changeset
   196
    if ((status.Int() != KErrNone) && (status.Int() != KErrAlreadyExists))
hgs
parents: 51
diff changeset
   197
        {
hgs
parents: 51
diff changeset
   198
        return status.Int();
hgs
parents: 51
diff changeset
   199
        }
hgs
parents: 51
diff changeset
   200
hgs
parents: 51
diff changeset
   201
    return KErrNone;
hgs
parents: 51
diff changeset
   202
    }
hgs
parents: 51
diff changeset
   203
hgs
parents: 51
diff changeset
   204
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   205
hgs
parents: 51
diff changeset
   206
void CPerfMonPowerListenerImpl::DeActivate()
hgs
parents: 51
diff changeset
   207
    {
hgs
parents: 51
diff changeset
   208
    if (iHWRMPower)
hgs
parents: 51
diff changeset
   209
        {
hgs
parents: 51
diff changeset
   210
        TRAP_IGNORE(iHWRMPower->StopAveragePowerReportingL());
51
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
52
hgs
parents: 51
diff changeset
   213
    // Restore original value to max sampling duration
hgs
parents: 51
diff changeset
   214
    TRAP_IGNORE(SetReportingPeriodL(iOriginalMaxReportingPeriod));
hgs
parents: 51
diff changeset
   215
hgs
parents: 51
diff changeset
   216
    iPowerBuffer.Reset();
hgs
parents: 51
diff changeset
   217
    iLastPowerAvg = 0;
hgs
parents: 51
diff changeset
   218
    }
hgs
parents: 51
diff changeset
   219
hgs
parents: 51
diff changeset
   220
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   221
hgs
parents: 51
diff changeset
   222
TInt CPerfMonPowerListenerImpl::GetPower()
hgs
parents: 51
diff changeset
   223
    {
hgs
parents: 51
diff changeset
   224
    TInt avgPower = 0;
hgs
parents: 51
diff changeset
   225
    TInt newValueCount = iPowerBuffer.Count();
hgs
parents: 51
diff changeset
   226
hgs
parents: 51
diff changeset
   227
    if (newValueCount > 0)
hgs
parents: 51
diff changeset
   228
        {
hgs
parents: 51
diff changeset
   229
        // Read all new values from buffer and calculate average from them.
hgs
parents: 51
diff changeset
   230
        for (int i = 0; i < newValueCount; i++)
hgs
parents: 51
diff changeset
   231
            {
hgs
parents: 51
diff changeset
   232
            avgPower += iPowerBuffer[i];
hgs
parents: 51
diff changeset
   233
            }
hgs
parents: 51
diff changeset
   234
        avgPower = avgPower / newValueCount;
hgs
parents: 51
diff changeset
   235
hgs
parents: 51
diff changeset
   236
        iPowerBuffer.Reset();
hgs
parents: 51
diff changeset
   237
        iLastPowerAvg = avgPower;
hgs
parents: 51
diff changeset
   238
        }
hgs
parents: 51
diff changeset
   239
    // Use previous value if no new data has been reported since previous call.
hgs
parents: 51
diff changeset
   240
    // This may happen since perfmon sampling and power reporting are not synchronized.
hgs
parents: 51
diff changeset
   241
    else
hgs
parents: 51
diff changeset
   242
        {
hgs
parents: 51
diff changeset
   243
        avgPower = iLastPowerAvg;
hgs
parents: 51
diff changeset
   244
        }
hgs
parents: 51
diff changeset
   245
hgs
parents: 51
diff changeset
   246
    return avgPower;
hgs
parents: 51
diff changeset
   247
    }
hgs
parents: 51
diff changeset
   248
hgs
parents: 51
diff changeset
   249
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   250
hgs
parents: 51
diff changeset
   251
void CPerfMonPowerListenerImpl::PowerMeasurement(TInt aErrCode, CHWRMPower::TBatteryPowerMeasurementData& aMeasurement)
hgs
parents: 51
diff changeset
   252
    {
hgs
parents: 51
diff changeset
   253
    if (aErrCode == KErrNone)
hgs
parents: 51
diff changeset
   254
        {
hgs
parents: 51
diff changeset
   255
        // Calculate power value
hgs
parents: 51
diff changeset
   256
        TInt value = aMeasurement.iAverageVoltage * aMeasurement.iAverageCurrent;
hgs
parents: 51
diff changeset
   257
hgs
parents: 51
diff changeset
   258
        // If charger is connected, reported values may be negative.
hgs
parents: 51
diff changeset
   259
        if (value < 0)
hgs
parents: 51
diff changeset
   260
            {
hgs
parents: 51
diff changeset
   261
            value = 0;
hgs
parents: 51
diff changeset
   262
            }
hgs
parents: 51
diff changeset
   263
hgs
parents: 51
diff changeset
   264
        // Store new value to buffer to wait for reading
hgs
parents: 51
diff changeset
   265
        iPowerBuffer.Append(value);
hgs
parents: 51
diff changeset
   266
hgs
parents: 51
diff changeset
   267
        if ( value > iMaxPower )
hgs
parents: 51
diff changeset
   268
            {
hgs
parents: 51
diff changeset
   269
            iMaxPower = value;
hgs
parents: 51
diff changeset
   270
            }
hgs
parents: 51
diff changeset
   271
        }
hgs
parents: 51
diff changeset
   272
    // Ignore any reports containing error information
hgs
parents: 51
diff changeset
   273
    }
hgs
parents: 51
diff changeset
   274
hgs
parents: 51
diff changeset
   275
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   276
hgs
parents: 51
diff changeset
   277
TInt CPerfMonPowerListenerImpl::GetReportingPeriodL()
hgs
parents: 51
diff changeset
   278
    {
hgs
parents: 51
diff changeset
   279
    CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
hgs
parents: 51
diff changeset
   280
hgs
parents: 51
diff changeset
   281
    CleanupStack::PushL(cenRep);
hgs
parents: 51
diff changeset
   282
    TInt reportingPeriod(0);
hgs
parents: 51
diff changeset
   283
    User::LeaveIfError(cenRep->Get(KPowerMaxReportingPeriod, reportingPeriod));
hgs
parents: 51
diff changeset
   284
    CleanupStack::PopAndDestroy();
hgs
parents: 51
diff changeset
   285
hgs
parents: 51
diff changeset
   286
    return reportingPeriod;
hgs
parents: 51
diff changeset
   287
    }
hgs
parents: 51
diff changeset
   288
hgs
parents: 51
diff changeset
   289
// ---------------------------------------------------------------------------
hgs
parents: 51
diff changeset
   290
hgs
parents: 51
diff changeset
   291
void CPerfMonPowerListenerImpl::SetReportingPeriodL(TInt aDuration)
hgs
parents: 51
diff changeset
   292
    {
hgs
parents: 51
diff changeset
   293
    CRepository* cenRep = CRepository::NewL(KCRUidPowerSettings);
hgs
parents: 51
diff changeset
   294
hgs
parents: 51
diff changeset
   295
    CleanupStack::PushL(cenRep);
hgs
parents: 51
diff changeset
   296
    User::LeaveIfError(cenRep->Set(KPowerMaxReportingPeriod, aDuration));
hgs
parents: 51
diff changeset
   297
    CleanupStack::PopAndDestroy();
hgs
parents: 51
diff changeset
   298
    }
51
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
// End of File