如何在Java程序中阅读和解释/ proc / acpi / battery / *?

时间:2011-08-20 01:16:10

标签: java linux ubuntu

我正在尝试编写一个java函数,从/ proc / acpi / battery / BAT0 / {state info}获取电池信息。
虽然我确实有合理的输出,只要我的电池没有插入并且充满电,我注意到一个问题是在完全充电并插入电源时发生的。

状态文件中的剩余容量高于在info文件中找到的上一个完整容量值。 两个输出是 的/ proc / ACPI /电池/ BAT0 /信息

present:                 yes
design capacity:         7800 mAh
last full capacity:      5488 mAh
battery technology:      rechargeable
design voltage:          11100 mV
design capacity warning: 780 mAh
design capacity low:     236 mAh
cycle count:          0
capacity granularity 1:  78 mAh
capacity granularity 2:  78 mAh
model number:            DELL PD6857
serial number:           1857
battery type:            LION
OEM info:                SMP

的/ proc / ACPI /电池/ BAT0 /状态

present:                 yes
capacity state:          ok
charging state:          charging
present rate:            2668 mA
remaining capacity:      4422 mAh
present voltage:         12843 mV

问题在于,当我完全充电时,我的剩余容量是7800mAh,这是我的设计容量但是当从AC取下时剩余容量下降并且我的presen速率跳跃使剩余容量等于或低于我的最后满负荷。

问题是如何解决权力问题。

根据这两个文件中的信息,我如何使用java创建一个计时器,以确定电池充满之前剩余的时间以及电池电量耗尽前的剩余时间。

这是我在java代码中的函数。

public static int currentCharge(){
    double currentPercent=0;
    int lastFullCapacityInt=0;
    int remainingCapacityInt=0;
    try{
        BufferedReader infoIn=new BufferedReader(new InputStreamReader(new FileInputStream(batteryInfo)));
        BufferedReader stateIn=new BufferedReader(new InputStreamReader(new FileInputStream(batteryState)));
        //first get "last full capacity" from info file.
        String lastFullCapacity="";
        while((lastFullCapacity=infoIn.readLine())!=null){
            if(lastFullCapacity.contains("last full capacity")){
                String[] s=lastFullCapacity.split(":");
                String p=s[1].trim();
                String[] pp=p.split(" ");
                String ppp=pp[0].trim();
                lastFullCapacityInt=Integer.parseInt(ppp);
            }
        }
        infoIn.close();
        //get current capacity from state file
        String remainingCapacity="";
        while((remainingCapacity=stateIn.readLine())!=null){
            if(remainingCapacity.contains("remaining capacity")){
                String[] s=remainingCapacity.split(":");
                String p=s[1].trim();
                String[] pp=p.split(" ");
                String ppp=pp[0].trim();
                remainingCapacityInt=Integer.parseInt(ppp);
            }
        }
        stateIn.close();

    } catch(Exception e){
    }
    currentPercent=(((double)remainingCapacityInt/lastFullCapacityInt)*100);
    int c=(int)currentPercent;
    double d=(currentPercent-c)*100;
    if(((int)d)>50)
            c+=1;
    System.out.println(currentPercent);
    return (c);
}

当我的电池充满电时,只想添加/ proc / acpi / battery / BAT0 /状态文件,这样每个人都可以看到我在说什么。

present:                 yes
capacity state:          ok
charging state:          charged
present rate:            1 mA
remaining capacity:      7800 mAh
present voltage:         13010 mV

下一次读数是在断开交流电源后大约20秒

present:                 yes
capacity state:          ok
charging state:          discharging
present rate:            1993 mA
remaining capacity:      5456 mAh
present voltage:         12650 mV

1 个答案:

答案 0 :(得分:2)

您可能误读了info文件的内容。 present rateremaining capacity不是以相同的单位来衡量的 - 前者是以毫安为单位的放电率,而后者是以毫安时为单位的容量。 (如果我们将电流作为距离,则相当于每小时英里数和英里数。)

因此,在给定放电率和剩余容量的情况下,您可以通过将容量除以速率来获得预测的“空闲时间”;由于这两个值是以毫安小时和毫安为单位测量的,因此结果以小时为单位。使用您的上一个信息文件作为示例,例如:

capacity  = 5456 (mAh)
rate      = 1993 (mA)
time left = 5456 / 1993 = 2.73 (hours)

关于为什么当您拔下机器电源时剩余容量突然下降的原因,可能是您的电池电量不足,或者机器的电池电量测量不是特别准确。