]> git.neil.brown.name Git - plato.git/commitdiff
battery: add support for monitoring battery voltage.
authorNeilBrown <neil@brown.name>
Thu, 16 Apr 2015 04:03:19 +0000 (14:03 +1000)
committerNeilBrown <neil@brown.name>
Thu, 16 Apr 2015 04:03:19 +0000 (14:03 +1000)
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 <neil@brown.name>
utils/battery.py

index 46f2686224a8d34f8788f630ee3b1b09e02ffbc1..4f8a3748debafb826e03ac016cf49c4ee1ca1c66 100755 (executable)
@@ -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())