diff --git a/pkgs/additional/sane-sysinfo/sane-sysinfo b/pkgs/additional/sane-sysinfo/sane-sysinfo index c908993b..18b7a26c 100755 --- a/pkgs/additional/sane-sysinfo/sane-sysinfo +++ b/pkgs/additional/sane-sysinfo/sane-sysinfo @@ -68,6 +68,31 @@ class Formatter: suffix_hr: str = SUFFIX_HR suffix_min: str = SUFFIX_MIN + def render_icon(self, direction: ChargeDirection, percentage: float) -> str: + return f"{self._choose_icon(direction, percentage)}{self.suffix_icon}" + + def render_hours_minutes(self, minutes: int) -> str: + hr = minutes // 60 + min = minutes % 60 + return f"{hr}{self.suffix_hr}{min:02}{self.suffix_min}" + + def render_percent(self, pct: int) -> str: + return f"{pct}{self.suffix_percent}" + + def _choose_icon(self, direction: ChargeDirection, percentage: float) -> str: + level = percentage / 25 + level = max(0, min(3, level)) + level = int(round(level)) + + logger.debug(f"render_icon: direction={direction} level={level}") + + if direction == ChargeDirection.Charging: + return ICON_BAT_CHG[level] + elif direction == ChargeDirection.Discharging: + return ICON_BAT_DIS[level] + + raise RuntimeError(f"invalid ChargeDirection {direction}") + class PowerSupply: """ reads values from /sys/class/power_supply/$dev/ API @@ -85,7 +110,7 @@ class PowerSupply: def try_read_uncached(self, rel_path: str) -> str | None: try: v = open(f"{self.sysfs_node}/{rel_path}").read() - logger.debug(f"${self.sysfs_node}/{rel_path}: {v}") + logger.debug(f"{self.sysfs_node}/{rel_path}: {v}") return v except: return None @@ -161,20 +186,6 @@ class BatteryInfo: ) -def render_icon(direction: ChargeDirection, percentage: float) -> str: - level = percentage / 25 - level = max(0, min(3, level)) - level = int(round(level)) - - logger.debug(f"render_icon: direction={direction} level={level}") - - if direction == ChargeDirection.Charging: - return ICON_BAT_CHG[level] - elif direction == ChargeDirection.Discharging: - return ICON_BAT_DIS[level] - - raise RuntimeError(f"invalid ChargeDirection {direction}") - def try_path(p: str) -> BatteryInfo | None: """ try to read battery information from some p = "/sys/class/power_supply/$node" path @@ -205,28 +216,22 @@ def try_all_paths() -> BatteryInfo | None: return p -def fmt_minutes(f: Formatter, icon: str, if_indefinite: str, minutes: int | None) -> str: - logger.debug(f"charge/discharge time: {minutes} min") - - if minutes < 1440: - hr = minutes // 60 - min = minutes % 60 - return f"{icon}{f.suffix_icon}{hr}{f.suffix_hr}{min:02}{f.suffix_min}" - else: - logger.debug("charge/discharge duration > 1d") - return f"{icon}{f.suffix_icon}{if_indefinite}" - def pretty_output(f: Formatter, p: BatteryInfo) -> str: if p.minutes_to_charged != None: logger.debug("charging") - icon = render_icon(ChargeDirection.Charging, p.percent_charged) + icon = f.render_icon(ChargeDirection.Charging, p.percent_charged) duration = p.minutes_to_charged else: logger.debug("discharging") - icon = render_icon(ChargeDirection.Discharging, p.percent_charged) + icon = f.render_icon(ChargeDirection.Discharging, p.percent_charged) duration = p.minutes_to_discharged - return fmt_minutes(f, icon, f"{p.percent_charged}{f.suffix_percent}", duration) + if duration is not None and duration < 1440: + details = f.render_hours_minutes(duration) + else: + details = f.render_percent(p.percent_charged) + + return f"{icon}{details}" def main() -> None: logging.basicConfig()