diff options
| -rw-r--r-- | tv/5pkgs/q/default.nix | 97 | 
1 files changed, 74 insertions, 23 deletions
diff --git a/tv/5pkgs/q/default.nix b/tv/5pkgs/q/default.nix index 7e2a30c3e..a3a7cd739 100644 --- a/tv/5pkgs/q/default.nix +++ b/tv/5pkgs/q/default.nix @@ -84,11 +84,18 @@ let        eval "$(${pkgs.gnused}/bin/sed -n '          s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p        ' $uevent)" -      if test "x''${POWER_SUPPLY_CHARGE_NOW-}" = x; then -        exit # not battery -      fi +      case $POWER_SUPPLY_NAME in +        AC) +          exit # not battery +          ;; +      esac        exec </dev/null        exec ${pkgs.gawk}/bin/awk ' +        function die(s) { +          printf "%s: %s\n", name, s +          exit 1 +        } +          function print_hm(h, m) {            m = (h - int(h)) * 60            return sprintf("%dh%dm", h, m) @@ -115,39 +122,83 @@ let          }          END { -          voltage_unit = "V" -          voltage_now = ENVIRON["POWER_SUPPLY_VOLTAGE_NOW"] / 10^6 -          voltage_min_design = ENVIRON["POWER_SUPPLY_VOLTAGE_MIN_DESIGN"] / 10^6 +          name = ENVIRON["POWER_SUPPLY_NAME"] + +          charge_unit = "Ah" +          charge_now = ENVIRON["POWER_SUPPLY_CHARGE_NOW"] / 10^6 +          charge_full = ENVIRON["POWER_SUPPLY_CHARGE_FULL"] / 10^6            current_unit = "A"            current_now = ENVIRON["POWER_SUPPLY_CURRENT_NOW"] / 10^6 +          energy_unit = "Wh" +          energy_now = ENVIRON["POWER_SUPPLY_ENERGY_NOW"] / 10^6 +          energy_full = ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6 +            power_unit = "W" -          power_now = current_now * voltage_now +          power_now = ENVIRON["POWER_SUPPLY_POWER_NOW"] / 10^6 + +          voltage_unit = "V" +          voltage_now = ENVIRON["POWER_SUPPLY_VOLTAGE_NOW"] / 10^6 +          voltage_min_design = ENVIRON["POWER_SUPPLY_VOLTAGE_MIN_DESIGN"] / 10^6 + +          #printf "charge_now: %s\n", charge_now +          #printf "charge_full: %s\n", charge_full +          #printf "current_now: %s\n", current_now +          #printf "energy_now: %s\n", energy_now +          #printf "energy_full: %s\n", energy_full +          #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"] +          #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6 +          #printf "power_now: %s\n", power_now +          #printf "voltage_now: %s\n", voltage_now + +          if (current_now == 0 && voltage_now != 0) { +            current_now = power_now / voltage_now +          } +          if (power_now == 0) { +            power_now = current_now * voltage_now +          } +          if (charge_now == 0 && voltage_min_design != 0) { +            charge_now = energy_now / voltage_min_design +          } +          if (energy_now == 0) { +            energy_now = charge_now * voltage_min_design +          } +          if (charge_full == 0 && voltage_min_design != 0) { +            charge_full = energy_full / voltage_min_design +          } +          if (energy_full == 0) { +            energy_full = charge_full * voltage_min_design +          } + +          if (charge_now == 0 || charge_full == 0) { +            die("unknown charge") +          } -          charge_unit = "Ah" -          charge_now = ENVIRON["POWER_SUPPLY_CHARGE_NOW"] / 10^6 -          charge_full = ENVIRON["POWER_SUPPLY_CHARGE_FULL"] / 10^6            charge_ratio = charge_now / charge_full -          energy_unit = "Wh" -          energy_full = charge_full * voltage_min_design - -          printf "%s %s %d%% %.2f%s/%.2f%s %d%s/%.1f%s %s\n" \ -            , ENVIRON["POWER_SUPPLY_NAME"] \ -            , print_bar(10, charge_ratio) \ -            , charge_ratio * 100 \ -            , charge_now, charge_unit \ -            , current_now, current_unit \ -            , energy_full, energy_unit \ -            , power_now, power_unit \ -            , print_hm(charge_now / current_now) +          out = out name +          out = out sprintf(" %s", print_bar(10, charge_ratio)) +          out = out sprintf(" %d%", charge_ratio * 100) +          out = out sprintf(" %.2f%s", charge_now, charge_unit) +          if (current_now != 0) { +            out = out sprintf("/%.1f%s", current_now, current_unit) +          } +          out = out sprintf(" %d%s", energy_full, energy_unit) +          if (power_now != 0) { +            out = out sprintf("/%.1f%s", power_now, power_unit) +          } +          if (current_now != 0) { +            out = out sprintf(" %s", print_hm(charge_now / current_now)) +          } + +          print out          }        '      '';    in ''      for uevent in /sys/class/power_supply/*/uevent; do -      ${power_supply} "$uevent" +      ${power_supply} "$uevent" || :      done    '';  | 
