nix/module/PowerlimitThinkpad.nix

89 lines
2.1 KiB
Nix
Raw Normal View History

# ThinkPad charge limits.
{
pkgs,
lib,
config,
...
}@args:
with lib;
let
cfg = config.module.powerlimit.thinkpad;
2024-06-25 04:04:39 +03:00
controlFileMin = "/sys/class/power_supply/BAT0/charge_control_start_threshold";
controlFileMax = "/sys/class/power_supply/BAT0/charge_control_end_threshold";
script = pkgs.writeShellScriptBin "powerlimit" ''
function toggle() {
if status; then
echo ${toString cfg.offMax} > ${controlFileMax}
echo ${toString cfg.offMin} > ${controlFileMin}
else
echo ${toString cfg.onMin} > ${controlFileMin}
echo ${toString cfg.onMax} > ${controlFileMax}
fi
2024-06-25 04:04:39 +03:00
pkill -RTMIN+6 waybar
true
}
2024-06-25 04:04:39 +03:00
function widget() {
status && printf '' || printf ''
}
function status() {
local current=$(cat ${controlFileMax})
local enabled="${toString cfg.onMax}"
2024-06-25 04:04:39 +03:00
[[ "''${current}" = "''${enabled}" ]]
}
2024-06-25 04:04:39 +03:00
''${@}
'';
in
{
options = {
module.powerlimit.thinkpad = {
enable = mkEnableOption "Powerlimit Service";
onMin = mkOption {
default = 40;
type = types.int;
};
onMax = mkOption {
default = 80;
type = types.int;
};
offMin = mkOption {
default = 90;
type = types.int;
};
offMax = mkOption {
default = 95;
type = types.int;
};
};
};
2024-06-25 04:04:39 +03:00
config = mkIf cfg.enable {
environment.systemPackages = [ script ];
systemd = {
services.powerlimit = {
description = "Limit battery charge.";
enable = true;
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
RemainAfterExit = "yes";
ExecStart = "${getExe pkgs.bash} -c 'echo ${toString cfg.onMin} > ${controlFileMin}; echo ${toString cfg.onMax} > ${controlFileMax};'";
ExecStop = "${getExe pkgs.bash} -c 'echo ${toString cfg.offMax} > ${controlFileMax}; echo ${toString cfg.offMin} > ${controlFileMin};'";
};
};
# HACK: Allow user access.
tmpfiles.rules = [
"z ${controlFileMax} 0777 - - - -"
"z ${controlFileMin} 0777 - - - -"
];
};
};
}