From 71f56ff1025d433dd7f3a47836f32b15283561f5 Mon Sep 17 00:00:00 2001 From: Micha Gorelick Date: Sat, 20 Feb 2016 16:25:34 -0500 Subject: [PATCH 1/2] Multiple Battery Support --- powerline/segments/common/bat.py | 70 +++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/powerline/segments/common/bat.py b/powerline/segments/common/bat.py index 0579057e..2d7c9982 100644 --- a/powerline/segments/common/bat.py +++ b/powerline/segments/common/bat.py @@ -30,6 +30,7 @@ def _fetch_battery_info(pl): else: devinterface = 'org.freedesktop.DBus.Properties' devtype_name = interface + '.Device' + devices = [] for devpath in up.EnumerateDevices(dbus_interface=interface): dev = bus.get_object(interface, devpath) devget = lambda what: dev.Get( @@ -46,39 +47,62 @@ def _fetch_battery_info(pl): if not bool(devget('PowerSupply')): pl.debug('Not using DBUS+UPower with {0}: not a power supply', devpath) continue + devices.append(devpath) pl.debug('Using DBUS+UPower with {0}', devpath) - return lambda pl: ( - float( - dbus.Interface(dev, dbus_interface=devinterface).Get( + if devices: + def _flatten_battery(pl): + energy = 0.0 + energy_full = 0.0 + state = True + for devpath in devices: + dev = bus.get_object(interface, devpath) + energy_full += float( + dbus.Interface(dev, dbus_interface=devinterface).Get( + devtype_name, + 'EnergyFull' + ), + ) + energy += float( + dbus.Interface(dev, dbus_interface=devinterface).Get( + devtype_name, + 'Energy' + ), + ) + state &= dbus.Interface(dev, dbus_interface=devinterface).Get( devtype_name, - 'Percentage' - ), - ), - dbus.Interface(dev, dbus_interface=devinterface).Get( - devtype_name, - 'State' - ) != 2 - ) + 'State' + ) != 2 + return (energy * 100.0/ energy_full), state + return _flatten_battery pl.debug('Not using DBUS+UPower as no batteries were found') if os.path.isdir('/sys/class/power_supply'): - linux_capacity_fmt = '/sys/class/power_supply/{0}/capacity' + linux_energy_full_fmt = '/sys/class/power_supply/{0}/enery_full' + linux_energy_fmt = '/sys/class/power_supply/{0}/enery' linux_status_fmt = '/sys/class/power_supply/{0}/status' + devices = [] for linux_supplier in os.listdir('/sys/class/power_supply'): - cap_path = linux_capacity_fmt.format(linux_supplier) - status_path = linux_status_fmt.format(linux_supplier) - if not os.path.exists(cap_path): + energy_path = linux_energy_fmt.format(linux_supplier) + if not os.path.exists(energy_path): continue pl.debug('Using /sys/class/power_supply with battery {0}', linux_supplier) + devices.append(linux_supplier) + if devices: def _get_battery_status(pl): - with open(cap_path, 'r') as f: - _capacity = int(float(f.readline().split()[0])) - try: - with open(status_path, 'r') as f: - _ac_powered = (f.readline().strip() != 'Discharging') - except IOError: - _ac_powered = None - return _capacity, _ac_powered + energy = 0.0 + energy_full = 0.0 + state = True + for device in devices: + with open(linux_energy_full_fmt.format(device), 'r') as f: + energy_full += int(float(f.readline().split()[0])) + with open(linux_energy_fmt.format(device), 'r') as f: + energy += int(float(f.readline().split()[0])) + try: + with open(linux_status_fmt.format(device), 'r') as f: + state &= (f.readline().strip() != 'Discharging') + except IOError: + state = None + return (energy * 100.0 / energy_full), state return _get_battery_status pl.debug('Not using /sys/class/power_supply as no batteries were found') else: From ff2b37a63321b06fceb166bb939d03806e825658 Mon Sep 17 00:00:00 2001 From: Micha Gorelick Date: Sat, 20 Feb 2016 16:30:57 -0500 Subject: [PATCH 2/2] flake8 --- powerline/segments/common/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/powerline/segments/common/bat.py b/powerline/segments/common/bat.py index 2d7c9982..160d9430 100644 --- a/powerline/segments/common/bat.py +++ b/powerline/segments/common/bat.py @@ -72,7 +72,7 @@ def _fetch_battery_info(pl): devtype_name, 'State' ) != 2 - return (energy * 100.0/ energy_full), state + return (energy * 100.0 / energy_full), state return _flatten_battery pl.debug('Not using DBUS+UPower as no batteries were found')