Отслеживание состояния батареи с помощью CTelephony
Метаданные
Этот пример демонстрирует возможность отслеживания текущего состояния батареи с помощью CTelephony API в устройстве на базе Symbian 3-й редакции.
Пример очень простой, для его использования достаточно реализовать функцию обратного вызова и создать экземпляр класса CBatteryCheck.
При создании экземпляра CBatteryCheck, начальный уровень заряда батареи будет получен с помощью асинхронного запроса GetBatteryInfo(). После его завершения и вызова RunL(), все изменения будут отслеживаться с помощью NotifyChange().
В функции обратного вызова аргумент aChangeStatus содержит уровень заряда батареи в процентах, а aStatus - текущем состоянием батареи:
- CTelephony::EPoweredByBattery- Штатный режим работы.
- CTelephony::EBatteryConnectedButExternallyPowered - Подключено зарядное устройство.
- CTelephony::ENoBatteryConnected - Нет батареи (питание от зарядного устройства).
- CTelephony::EPowerStatusUnknown - Состояние неизвестно.
BatteryLevel.h
#include <Etel3rdParty.h>
class MBatteryObserver
{
public:
virtual void BatteryLevelL(TUint aChargeStatus,
CTelephony::TBatteryStatus aStatus) = 0;
};
class CBatteryCheck : public CActive
{
public:
CBatteryCheck(MBatteryObserver& aObserver);
void ConstructL(void);
~CBatteryCheck();
private:
void GetBatteryInfo();
void RunL();
void DoCancel();
private:
MBatteryObserver& iObserver;
CTelephony* iTelephony;
CTelephony::TBatteryInfoV1 iBatteryInfoV1;
CTelephony::TBatteryInfoV1Pckg iBatteryInfoV1Pckg;
TBool iGettingBattery;
};
BatteryLevel.cpp
CBatteryCheck::~CBatteryCheck()
{
Cancel();
delete iTelephony;
}
void CBatteryCheck::ConstructL(void)
{
iTelephony = CTelephony::NewL();
GetBatteryInfo();
}
CBatteryCheck::CBatteryCheck(MBatteryObserver& aObserver)
: CActive(EPriorityStandard),iObserver(aObserver),iBatteryInfoV1Pckg(iBatteryInfoV1)
{
CActiveScheduler::Add(this);
}
void CBatteryCheck::GetBatteryInfo()
{
if(iTelephony && !IsActive())
{
iGettingBattery = ETrue;
iTelephony->GetBatteryInfo(iStatus, iBatteryInfoV1Pckg);
SetActive();
}
}
void CBatteryCheck::RunL()
{
iObserver.BatteryLevelL(iBatteryInfoV1.iChargeLevel,iBatteryInfoV1.iStatus);
if(iStatus != KErrCancel)
{
iTelephony->NotifyChange(iStatus,CTelephony::EBatteryInfoChange,
iBatteryInfoV1Pckg);
SetActive();
}
iGettingBattery = EFalse;
}
void CBatteryCheck::DoCancel()
{
if(iGettingBattery)
iTelephony->CancelAsync(CTelephony::EGetBatteryInfoCancel);
else
iTelephony->CancelAsync(CTelephony::EBatteryInfoChangeCancel);
}


(no comments yet)