91 lines
2.7 KiB
Nix
91 lines
2.7 KiB
Nix
{ pkgs, ... }:
|
|
let
|
|
charge-limit-apply = pkgs.writeShellScriptBin "charge-limit-apply" ''
|
|
if [ "$1" != "80" ] && [ "$1" != "100" ]; then
|
|
echo "Usage: charge-limit-apply <80|100>" >&2
|
|
exit 1
|
|
fi
|
|
${pkgs.fw-ectool}/bin/ectool fwchargelimit "$1"
|
|
echo "$1" > /run/fw-charge-limit
|
|
chmod 644 /run/fw-charge-limit
|
|
'';
|
|
|
|
charge-limit-menu = pkgs.writeShellScriptBin "charge-limit-menu" ''
|
|
choice=$(printf "80%%\n100%%" | ${pkgs.wofi}/bin/wofi --dmenu --prompt "Charge limit")
|
|
case "$choice" in
|
|
"80%") /run/wrappers/bin/sudo ${charge-limit-apply}/bin/charge-limit-apply 80 ;;
|
|
"100%") /run/wrappers/bin/sudo ${charge-limit-apply}/bin/charge-limit-apply 100 ;;
|
|
esac
|
|
'';
|
|
|
|
waybar-battery = pkgs.writeShellScriptBin "waybar-battery" ''
|
|
charging_icons=("" "" "" "" "" "" "" "" "" "")
|
|
default_icons=("" "" "" "" "" "" "" "" "" "")
|
|
|
|
bat_path=$(echo /sys/class/power_supply/BAT*)
|
|
capacity=$(cat "$bat_path/capacity" 2>/dev/null || echo 0)
|
|
status=$(cat "$bat_path/status" 2>/dev/null || echo "Unknown")
|
|
limit=$(cat /run/fw-charge-limit 2>/dev/null || echo 80)
|
|
|
|
# Select icon based on capacity (10 icons, index 0-9)
|
|
idx=$(( capacity / 11 ))
|
|
if [ "$idx" -gt 9 ]; then idx=9; fi
|
|
|
|
if [ "$status" = "Charging" ]; then
|
|
icon="''${charging_icons[$idx]}"
|
|
else
|
|
icon="''${default_icons[$idx]}"
|
|
fi
|
|
|
|
# Determine CSS class
|
|
class=""
|
|
if [ "$capacity" -le 15 ]; then
|
|
class="critical"
|
|
elif [ "$capacity" -le 30 ]; then
|
|
class="warning"
|
|
elif [ "$capacity" -ge 95 ]; then
|
|
class="good"
|
|
fi
|
|
|
|
tooltip="Battery: ''${capacity}% [''${status}]\nCharge limit: ''${limit}%"
|
|
|
|
${pkgs.jq}/bin/jq -cn \
|
|
--arg text "$icon ''${capacity}% (''${limit}%)" \
|
|
--arg tooltip "$tooltip" \
|
|
--arg class "$class" \
|
|
'{text: $text, tooltip: $tooltip, class: $class}'
|
|
'';
|
|
in
|
|
{
|
|
environment.systemPackages = [
|
|
pkgs.fw-ectool
|
|
charge-limit-apply
|
|
charge-limit-menu
|
|
waybar-battery
|
|
];
|
|
|
|
security.sudo.extraRules = [
|
|
{
|
|
users = [ "dominik" ];
|
|
commands = [
|
|
{
|
|
command = "${charge-limit-apply}/bin/charge-limit-apply";
|
|
options = [ "NOPASSWD" ];
|
|
}
|
|
];
|
|
}
|
|
];
|
|
|
|
systemd.services.fw-charge-limit = {
|
|
description = "Set Framework charge limit on boot";
|
|
wantedBy = [ "multi-user.target" ];
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
ExecStart = "${pkgs.writeShellScript "fw-charge-limit-init" ''
|
|
${pkgs.fw-ectool}/bin/ectool fwchargelimit 80
|
|
echo 80 > /run/fw-charge-limit
|
|
chmod 644 /run/fw-charge-limit
|
|
''}";
|
|
};
|
|
};
|
|
}
|