Определение уровня заряда батареи
Автор: Александр Анохин
Сайт: http://www.zahodi-ka.ru
Копирование материала разрешено только с сохранением авторства и прямой ссылки на сайт
Для того, чтобы определить уровень, статус и время работы аккумулятора или UPS'а, нам понадобится всего лишь одна функция и одна структура. Прежде всего нам понадобится структура SYSTEM_POWER_STATUS:
typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS,
*LPSYSTEM_POWER_STATUS;
Рассмотрим поля структуры:
ACLineStatus – статус питания, показывает, подключен ли девайс к сети переменного тока. Может принимать следующие значения:
- 0 - Не подключен
- 1 - Подключен
- 255 - Не определено
BatteryFlag – статус заряда батареи. Может принимать следующие занчения:
- 1 - Заряд батареи более 66%
- 2 - Заряд батареи ниже 33%
- 4 - Критический уровень заряда – менее 5%
- 8 - Зарядка
- 128 - Батарея отсутствует
- 255 - Не определено.
BatteryLifePercent – уровень зарядки батареи в процентах
Reserved1 – зарезервировано для последующих версий
BatteryLifeTime – время, оставшееся до разряда батареи в сек.
BatteryFullLifeTime – полное время работы от баратеи в сек.
Для заполнения этой структуры будем использовать функцию
BOOL WINAPI GetSystemPowerStatus(
LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);
Единственный параметр – указатель на структуру SYSTEM_POWER_STATUS. Функция возвращает true, в случае получения информации, false в остальных случаях.
Напишем пример:
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SYSTEM_POWER_STATUS sps;
if (GetSystemPowerStatus(&sps))
{
switch (sps.ACLineStatus) // печатаем статус питания
{
case 0:
cout << "Power off";
break;
case 1:
cout << "Power on";
break;
case 255:
default:
cout << "Unknown";
break;
}
switch (sps.BatteryFlag) // статус заряда
{
case 1:
cout << "\nHigh level";
break;
case 2:
cout << "\nLow level";
break;
case 4:
cout << "\nCritical level";
break;
case 8:
cout << "\nCharging";
break;
case 128:
cout << "\nNo battery";
break;
case 255:
default:
cout << "\nUnknown status";
break;
}
// печатаем оставшийся заряд батареи в процентах
cout << "\nBattery life percent : "
<< (int)sps.BatteryLifePercent << "%";
long batteryLife = sps.BatteryLifeTime;
int seconds;
int totalminutes;
int minutes;
int hours;
// печатаем оставшееся время работы от батареи
if (batteryLife != -1)
{
seconds = batteryLife % 60;
totalminutes = batteryLife/60;
minutes = totalminutes % 60;
int hours = totalminutes/60;
cout << "\nBattery life time : "
<< hours << ":" << minutes << ":" << seconds;
}
else cout << "\nUnknown";
// печатаем полное время работы от батареи
long batteryFull = sps.BatteryFullLifeTime;
if (batteryFull != -1)
{
seconds = batteryFull % 60;
totalminutes = batteryFull/60;
minutes = totalminutes % 60;
hours = totalminutes/60;
cout << "\nBattery full time : " << batteryFull;
}
else cout << "\nUnknown";
}
return 0;
}