2014-02-06 210 views
6

我正在测试一个应用程序,以便让用户知道何时插入和拔下笔记本电脑以最大限度地利用笔记本电脑电池。除此之外,我试图从Windows功率计复制工具提示。Windows如何计算电池的剩余时间?

到目前为止,这是相当成功的一些差异。

  1. Windows剩余时间通知,例如, “剩余X小时XX分钟(XX%)”,直到大约一分钟后才显示。
  2. 在Windows剩余时间更换电池负载

下显得比较稳重,这些使我想到了Windows剩余时间算法均在过去分钟左右,但我找不到任何文档。有谁知道它到底做了什么,所以我可以重现它?

这里是我的实现(在Python中,但问题是语言不可知的)。我想我需要平均每y秒投票的最近x放电率,但需要知道的值为xy

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

Windows按照该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。 我能找到的下一个最好的东西似乎是通过IOCTL_BATTERY_QUERY_INFORMATION暴露的较低级别的API,但似乎它也不能以毫瓦小时为单位提供当前的充电容量。 TL;博士用剩下的时间,通过上述类,如果可能为你计算的百分比:/


顺便说一句,一些笔记本电脑厂商捆绑自己的工具来计算剩余时间和查询特定微控制器实现他们的拥有自己的电池,并能够对剩余电池做出更明智/非线性的猜测。

+0

这很棒。如果您可以按照msdn.microsoft.com/en-us/library/aa394074%28VS.85%29.aspx中所述的方式添加如何从Windows进行查询,赏金是您的。 –