2014-02-06 4 views
6

Я тестирую приложение, чтобы пользователи знали, когда подключать и отключать свой ноутбук, чтобы получить максимальную отдачу от батареи своего ноутбука. Кроме того, я пытаюсь воспроизвести всплывающую подсказку с помощью измерителя мощности Windows.Как Windows рассчитывает оставшееся время на батарее?

До сих пор это довольно успешно с несколькими отличиями.

  1. Уведомление о времени, оставшееся до Windows, например. «X hr XX min (XX%)« осталось », не отображается до примерно минуты.
  2. винда оставшегося время кажется более стабильным при изменении нагрузки батареи

Это приводит меня к мысли, что время для Windows оставшегося алгоритм усреднения последней минуты или около того, но я не могу найти любую документацию об этом. Кто-нибудь знает, что он делает, чтобы воспроизвести его?

Вот моя реализация (в Python, но вопрос является агностиком). Я думаю, что мне нужно будет усреднить самые последние x скорости разряда от опроса каждые y секунд, но нужно знать значения для x и y.

t = wmi.WMI(moniker = "//./root/wmi") 
batts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0') 

time_left = 0 
for _i, b in enumerate(batts): 
    time_left += float(b.RemainingCapacity)/float(b.DischargeRate) 

hours = int(time_left) 
mins = 60 * (time_left % 1.0) 
return '%i hr %i min' % (hours, mins) 
+0

Просто пояснение - вы используете [любую из этих функций] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373163%28v=vs.85%29.aspx) где-то ? – admdrew

+1

Это, конечно, оценка. У него нет машины времени, чтобы знать, что вы собираетесь начать играть в игру и быстро разрядить батарею. –

+1

@admdrew Я использую 'wmi', пакет Python, который предположительно на некотором уровне обертывает эти функции. Я выполняю реализацию из [этого ответа] (http://stackoverflow.com/a/16380996/1706564). –

ответ

5

Окна следует за ACPI specification, и с учетом спецификации дает метод расчета оставшегося времени автономной работы, я полагаю, это было бы, как они делают это.

Редактировать: Найдено somewhat confirming source.

Я имею в виду, в частности, главу 3.9.3 «Газовый датчик заряда».

Remaining Battery Percentage[%] = Battery Remaining Capacity [mAh/mWh]/Last Full Charged Capacity [mAh/mWh]* 100

, если вам нужно, что в часах:

Remaining Battery Life [h]= Battery Remaining Capacity [mAh/mWh]/Battery Present Drain Rate [mA/mW]

Это по существу представляет собой текущую скорость изменения мощности заряда в единицу времени, вам нужно посмотреть на спецификации ACPI чтобы увидеть, как Windows его реализует.

Переменные, о которых я мог предположить, должны были быть запрошены у контроллера батареи, и я бы разрешил Windows обрабатывать все проблемы совместимости. Для этого существуют классы Windows Management InstrumentationWin32_Battery и (возможно, более подходит) Win32_PortableBattery. После некоторого дальнейшего копания кажется, что эти классы вычисляют оставшееся время для вас и не подвергают текущему заряду батареи (возможно, для того, чтобы побудить людей рассчитать только одну проблему/закругление и т. Д.). Самая близкая «крутая» вещь, которую вы можете сделать, это оценить/рассчитать разряд батареи на FullChargeCapacity/DesignCapacity. Следующее лучшее, что я смог найти, выглядит как API нижнего уровня, открытый через IOCTL_BATTERY_QUERY_INFORMATION, но похоже, что он также не дает текущей емкости заряда в милливольтах. Т.Л., д-р Используйте оставшееся время и проценты, рассчитанные для Вас вышеуказанных классов, если возможно:/


Как и в сторону, некоторые производители ноутбуков комплектуют свои собственные инструменты для расчета оставшегося времени и запросов конкретных микро реализации контроллера в их собственные аккумуляторы и могут сделать более информированный/неличный вопрос о оставшейся батарее.

+0

Отлично. Если вы можете добавить, как запросить его у Windows, как описано в msdn.microsoft.com/en-us/library/aa394074%28VS.85%29.aspx, ваша щедрость. –

Смежные вопросы