Определение уровня заряда батареи
Для того, чтобы определить уровень, статус и время работы аккумулятора или ИБП, нам понадобится всего лишь одна функция и одна структура. Прежде всего нам понадобится структура 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)) {
- return 0;
- }
- switch (sps.ACLineStatus) { // статус питания
- case 0:
- cout << "Power off";
- break;
- case 1:
- cout << "Power on";
- break;
- case 255:
- default:
- cout << "Unknown";
- break;
- }
- cout << "\n";
- switch (sps.BatteryFlag) { // статус заряда
- case 1:
- cout << "High level";
- break;
- case 2:
- cout << "Low level";
- break;
- case 4:
- cout << "Critical level";
- break;
- case 8:
- cout << "Charging";
- break;
- case 128:
- cout << "No battery";
- break;
- case 255:
- default:
- cout << "Unknown 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;
- 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 : "
- << hours << ":" << minutes << ":" << seconds;
- } else {
- cout << "\nUnknown";
- }
- return 0;
- }