From 461dbc6edcf8169ac82eef5fd0f8c5d32a6b8509 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 16 Apr 2015 14:03:19 +1000 Subject: [PATCH] battery: add support for monitoring battery voltage. Use twl4030 to watch the battery voltage and use it to estimate capacity when bq27000 not present. The voltage is in a different place in old and new kernels. Signed-off-by: NeilBrown --- utils/battery.py | 59 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/utils/battery.py b/utils/battery.py index 46f2686..4f8a374 100755 --- a/utils/battery.py +++ b/utils/battery.py @@ -32,6 +32,7 @@ import gobject import pango import time import suspend +import glob capfile = "/sys/class/power_supply/bq27000-battery/capacity" fullfile = "/sys/class/power_supply/bq27000-battery/time_to_full_now" @@ -39,6 +40,12 @@ emptyfile = "/sys/class/power_supply/bq27000-battery/time_to_empty_now" statusfile = "/sys/class/power_supply/bq27000-battery/status" status2file = "/sys/class/power_supply/twl4030_usb/status" onlinefile = "/sys/class/power_supply/twl4030_usb/online" +# in 3.7 battery volts is here.. +bvoltfile = "/sys/devices/platform/twl4030_madc_hwmon/in12_input" +# in 4.0 it is here, which is not reliable and nearly unusable. +# "/sys/devices/platform/68000000.ocp/48070000.i2c/i2c-0/0-0048/48070000.i2c:twl@48:madc/iio:device2/in_voltage12_input" +# so use glob.glob("/sys/bus/iio/devices/iio:device*/in_voltage12_input") +bvoltglob = "/sys/bus/iio/devices/iio:device*/in_voltage12_input" ccfile = "/sys/class/power_supply/bq27000-battery/cycle_count" cffile = "/sys/class/power_supply/bq27000-battery/charge_full" cfdfile = "/sys/class/power_supply/bq27000-battery/charge_full_design" @@ -49,13 +56,26 @@ currfile = "/sys/class/power_supply/bq27000-battery/current_now" filename = "/usr/local/pixmaps/battery_%03d.png" filename_charging = "/usr/local/pixmaps/battery_%03d_charging_%d.png" -def file_text(name): +def file_text(name, globname = None): try: f = open(name) except: - return "" - t = f.read() + if not globname: + return "" + names = glob.glob(globname) + if not names: + return "" + name = names[0] + try: + f = open(name) + except: + return "" + try: + t = f.read() + except: + t = "NO-DEVICE" return t.strip() + def file_num(name): try: i = int(file_text(name)) @@ -64,8 +84,22 @@ def file_num(name): return i prevfile = "" + +def voltcap(): + v = file_text(bvoltfile, bvoltglob) + if v == "NO-DEVICE": + return 0 + vi = int(v) + return (vi-3200) * 100 / (4200-3200) + +def getcap(): + cap = file_text(capfile) + if cap != "NO-DEVICE": + return int(cap) + return voltcap() + def setfile(icon): - cap = file_num(capfile) + cap = getcap() capr = int((cap+5)/10)*10 curr = file_num(currfile) status = file_text(chgfile) @@ -81,7 +115,7 @@ def setfile(icon): if f == prevfile: return icon.set_from_file(f) - + def update(): global icon global configwindow @@ -165,9 +199,10 @@ class BatteryMonitor: if now < self.period_start + 5: return "-" cur = (self.chg_start - chg) * 3600 / (now - self.period_start) - if cur <= 0: - cur = 1 - sec = chg * 3600 / cur + if cur: + sec = chg * 3600 / cur + else: + sec = 0 min = sec/60 hr = int(min / 60) min -= hr*60 @@ -194,7 +229,7 @@ class BatteryConfig(gtk.Window): if configwindow == self: configwindow = None self.destroy() - + def create_ui(self): # two columns of name/value @@ -212,6 +247,7 @@ class BatteryConfig(gtk.Window): self.addlabel('Capacity', fd) self.addlabel('Status', fd) self.addlabel('Status2', fd) + self.addlabel('Batt-Volts', fd) self.addlabel('Online', fd) self.addlabel('Current', fd) self.addlabel('Avg Current', fd) @@ -290,12 +326,13 @@ class BatteryConfig(gtk.Window): def shutdown(self, widget): os.system("sync") os.system("poweroff -f") - + def update_labels(self, *a): - self.labels['Capacity'].set_text(to_percent(file_num(capfile), 100)) + self.labels['Capacity'].set_text(to_percent(getcap(), 100)) self.labels['Status'].set_text(file_text(statusfile)) self.labels['Status2'].set_text(file_text(status2file)) + self.labels['Batt-Volts'].set_text("%s (%s%%)"%(file_text(bvoltfile, bvoltglob),voltcap())) self.labels['Online'].set_text(file_text(onlinefile)) self.labels['Current'].set_text(file_text(currfile)) self.labels['Avg Current'].set_text(self.m.avg_curr()) -- 2.39.5