# -*- python -*- from plugins.powersupply import PowerSupply from common import * class MyBattery(Entry): COMPACT = 0 NORMAL = 1 DETAILED = 2 def __init__(self, *args, show_all = False, show_battery = 0, details = 1, batteries = None, **kwargs): self.show_all = show_all self.show_battery = show_battery self.supply_filter = batteries self.details = details self.supplies = None self.batteries = None self.reload() Entry.__init__(self, *args, **kwargs) def reload(self): name = None newsupplies = {} newbatteries = [] if self.batteries is not None: if isinstance(self.batteries, int): name = self.batteries[self.show_battery] else: name = self.show_battery for supply in PowerSupply.supplies(): if self.supply_filter is not None: if supply not in self.supply_filter: continue supply = PowerSupply(supply) if supply.type != 'Battery': continue newsupplies[supply.name] = supply newbatteries.append(supply.name) if self.supply_filter is not None: newbatteries = [b for b in self.supply_filter if b in newsupplies] if name is None: index = 0 elif isinstance(name, int): index = name % len(newbatteries) if len(newbatteries) > 0 else 0 elif name in self.batteries: index = self.batteries.index(index) else: index = 0 self.supplies, self.batteries, self.show_battery = newsupplies, newbatteries, index def action(self, col, button, x, y): if button == LEFT_BUTTON: self.show_all = not self.show_all self.invalidate() elif button == MIDDLE_BUTTON: self.details += 1 self.details %= 3 self.invalidate() elif button == RIGHT_BUTTON: self.reload() self.invalidate() elif button == SCROLL_UP: if len(self.batteries) > 0: self.show_battery += 1 self.show_battery %= len(self.batteries) self.invalidate() elif button == SCROLL_DOWN: if len(self.batteries) > 0: self.show_battery -= 1 if self.show_battery < 0: self.show_battery += len(self.batteries) self.invalidate() def colourise(self, text): try: value = text.replace(',', '.') value = float(value) if '.' in value else int(value) colour = '39' if value < 80: colour = '32' if value < 50: colour = '33' if value < 15: colour = '31' if value < 5: colour = '7;31' return '\033[%sm%s\033[0m' % (colour, text) except: return text def battery(self, bat): bat = self.supplies[bat] name = bat.name[:1].upper() + bat.name[1:].lower() if bat.is_online(): try: charge = (bat.get_charge(), bat.get_charge_full(), bat.charge_full_design) current = bat.get_current() status = bat.get_status().lower() left = None if charge[0] == charge[1]: capacity = '100' else: capacity = '%.1f' % (charge[0] / charge[1] * 100) capacity = self.colourise(capacity) if current > 0: if status == 'charging': left = (charge[1] - charge[0]) / current elif status == 'discharging': left = charge[0] / current if left is not None: hours = int(left) minutes = int((left - hours) * 60 + 0.5) if minutes >= 60: minutes -= 60 hours += 1 left = '%ih%02im until %s' % (hours, minutes, status.replace('ing', 'ed')) if self.details == MyBattery.COMPACT: if status == 'full': return 'full' elif status == 'charging': status = '+' elif status == 'discharging': status = '-' else: status = '?' if left is None: return '%s%%%s' % (capacity, status) else: return '%s%%%s %s' % (capacity, status, left) elif self.details == MyBattery.NORMAL: if left is None: return '%s: %s%% %s' % (name, capacity, status) else: return '%s: %s%% %s %s' % (name, capacity, status, left) else: if charge[1] == charge[2]: health = '100' else: health = '%.1f' % (charge[1] / charge[2] * 100) health = self.colourise(health) volt = bat.get_voltage() / bat.voltage_min_design if volt < 1: volt = '\033[31m%.1f\033[0m' % volt elif volt < 1.05: volt = '\033[33m%.1f\033[0m' % volt else: volt = '%.1f' % volt if left is None: return '%s: %s%% %s, %s%% healthy, %sx voltage' % (name, capacity, status, health, volt) else: return '%s: %s%% %s %s, %s%% healthy, %sx voltage' % (name, capacity, status, left, health, volt) except Exception as e: return (repr(e)) return ('%s: ???' % name) if self.details > 0 else '???' else: return ('%s: offline' % name) if self.details > 0 else 'offline' def function(self): if len(self.batteries) == 0: return 'no batteries available' if self.show_all: return SEPARATOR.join(self.battery(bat) for bat in self.batteries) else: return self.battery(self.batteries[self.show_battery])