Фальстарт

Определение уровня заряда батареи

Александр Анохин, 3 сентября 2007

Для того, чтобы определить уровень, статус и время работы аккумулятора или ИБП, нам понадобится всего лишь одна функция и одна структура. Прежде всего нам понадобится структура SYSTEM_POWER_STATUS:

  1. typedef struct _SYSTEM_POWER_STATUS {
  2. BYTE ACLineStatus;
  3. BYTE BatteryFlag;
  4. BYTE BatteryLifePercent;
  5. BYTE Reserved1;
  6. DWORD BatteryLifeTime;
  7. DWORD BatteryFullLifeTime;
  8. } SYSTEM_POWER_STATUS,
  9. *LPSYSTEM_POWER_STATUS;

Рассмотрим поля структуры:

Для заполнения этой структуры будем использовать функцию:

  1. BOOL WINAPI GetSystemPowerStatus(
  2. LPSYSTEM_POWER_STATUS lpSystemPowerStatus
  3. );

Единственный параметр — указатель на структуру SYSTEM_POWER_STATUS. Функция возвращает true, в случае получения информации, false в остальных случаях. Напишем пример:

  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <windows.h>
  4. #include <iostream>
  5. using namespace std;
  6. int _tmain(int argc, _TCHAR* argv[]) {
  7. SYSTEM_POWER_STATUS sps;
  8. if (!GetSystemPowerStatus(&sps)) {
  9. return 0;
  10. }
  11. switch (sps.ACLineStatus) { // статус питания
  12. case 0:
  13. cout << "Power off";
  14. break;
  15. case 1:
  16. cout << "Power on";
  17. break;
  18. case 255:
  19. default:
  20. cout << "Unknown";
  21. break;
  22. }
  23. cout << "\n";
  24. switch (sps.BatteryFlag) { // статус заряда
  25. case 1:
  26. cout << "High level";
  27. break;
  28. case 2:
  29. cout << "Low level";
  30. break;
  31. case 4:
  32. cout << "Critical level";
  33. break;
  34. case 8:
  35. cout << "Charging";
  36. break;
  37. case 128:
  38. cout << "No battery";
  39. break;
  40. case 255:
  41. default:
  42. cout << "Unknown status";
  43. break;
  44. }
  45. // оставшийся заряд батареи в процентах
  46. cout << "\nBattery life percent : "
  47. << (int)sps.BatteryLifePercent << "%";
  48. long batteryLife = sps.BatteryLifeTime;
  49. int seconds;
  50. int totalminutes;
  51. int minutes;
  52. int hours;
  53. // оставшееся время работы от батареи
  54. if (batteryLife != -1) {
  55. seconds = batteryLife % 60;
  56. totalminutes = batteryLife / 60;
  57. minutes = totalminutes % 60;
  58. hours = totalminutes /60;
  59. cout << "\nBattery life time: "
  60. << hours << ":" << minutes << ":" << seconds;
  61. } else {
  62. cout << "\nUnknown";
  63. }
  64. // полное время работы от батареи
  65. long batteryFull = sps.BatteryFullLifeTime;
  66. if (batteryFull != -1) {
  67. seconds = batteryFull % 60;
  68. totalminutes = batteryFull / 60;
  69. minutes = totalminutes % 60;
  70. hours = totalminutes / 60;
  71. cout << "\nBattery full time : "
  72. << hours << ":" << minutes << ":" << seconds;
  73. } else {
  74. cout << "\nUnknown";
  75. }
  76. return 0;
  77. }