174 lines
4.8 KiB
Bash
Executable file
174 lines
4.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
|
||
#############################
|
||
# Icons for Linux Battery
|
||
#############################
|
||
# This icon is used for macOS (no dynamic levels).
|
||
MAC_BATTERY_ICON=""
|
||
|
||
# Charging icon (positive power_now)
|
||
BATTERY_CHARGING_ICON=""
|
||
|
||
# Discharging icons based on capacity
|
||
BATTERY_FULL_ICON="" # 80%–100%
|
||
BATTERY_3QTR_ICON="" # 60%–79%
|
||
BATTERY_HALF_ICON="" # 40%–59%
|
||
BATTERY_QTR_ICON="" # 20%–39%
|
||
BATTERY_EMPTY_ICON="" # 0%–19%
|
||
|
||
#############################
|
||
# macOS Battery
|
||
#############################
|
||
get_battery_info_mac() {
|
||
# pmset is the standard battery command on macOS
|
||
if ! command -v pmset &>/dev/null; then
|
||
return 1
|
||
fi
|
||
|
||
capacity=$(pmset -g batt | grep -o "\d\+%" | head -n1 | tr -d '%')
|
||
if [[ -n "$capacity" ]]; then
|
||
# Just show generic icon + capacity on mac
|
||
echo "$MAC_BATTERY_ICON $capacity%"
|
||
return 0
|
||
fi
|
||
|
||
return 1
|
||
}
|
||
|
||
#############################
|
||
# Linux Battery
|
||
#############################
|
||
get_battery_info_linux() {
|
||
local path="$1"
|
||
|
||
# Early return if path is not valid
|
||
if [ -z "$path" ]; then
|
||
return 1
|
||
fi
|
||
|
||
# capacity
|
||
if [ -r "$path/capacity" ]; then
|
||
capacity=$(cat "$path/capacity")
|
||
else
|
||
capacity=""
|
||
fi
|
||
|
||
# power_now
|
||
power_now=""
|
||
if [ -r "$path/power_now" ]; then
|
||
power_now=$(cat "$path/power_now")
|
||
elif [ -r "$path/current_now" ] && [ -r "$path/voltage_now" ]; then
|
||
# Some systems use current_now and voltage_now
|
||
current_now=$(cat "$path/current_now")
|
||
voltage_now=$(cat "$path/voltage_now")
|
||
if [[ -n "$current_now" && -n "$voltage_now" ]]; then
|
||
# (current_now * voltage_now) / 1e6 => watts
|
||
power_now=$(echo "scale=2; ($current_now * $voltage_now) / 1000000" | bc)
|
||
fi
|
||
fi
|
||
|
||
# If we got capacity at all
|
||
if [[ -n "$capacity" ]]; then
|
||
|
||
# Figure out numeric or empty power
|
||
if [[ -n "$power_now" ]]; then
|
||
# Determine if power_now is micro- or milliwatts
|
||
abs_power_now=${power_now#-} # remove leading '-' if present
|
||
if (( abs_power_now > 10000 )); then
|
||
# microwatts -> W
|
||
power_consumption_watts=$(echo "scale=2; $power_now / 1000000" | bc)
|
||
else
|
||
# milliwatts -> W
|
||
power_consumption_watts=$(echo "scale=2; $power_now / 1000" | bc)
|
||
fi
|
||
fi
|
||
|
||
# Decide if charging or discharging
|
||
# (If power_now > 0 => charging, < 0 => discharging)
|
||
local battery_icon
|
||
if [[ -n "$power_now" ]]; then
|
||
# numeric check: is it > 0 or < 0?
|
||
float_power=$(echo "$power_now" | sed 's/^+//; s/,/./')
|
||
# strip any trailing newline, just in case
|
||
if (( $(echo "$float_power > 0" | bc -l) )); then
|
||
# CHARGING
|
||
battery_icon="$BATTERY_CHARGING_ICON"
|
||
else
|
||
# DISCHARGING - pick icon by capacity
|
||
battery_icon=$(pick_battery_icon "$capacity")
|
||
fi
|
||
else
|
||
# Unknown or no power_now => treat as discharging
|
||
battery_icon=$(pick_battery_icon "$capacity")
|
||
fi
|
||
|
||
# Build the final string
|
||
if [[ -n "$power_consumption_watts" ]]; then
|
||
echo "$battery_icon $capacity% (${power_consumption_watts} W)"
|
||
else
|
||
echo "$battery_icon $capacity%"
|
||
fi
|
||
return 0
|
||
fi
|
||
|
||
return 1
|
||
}
|
||
|
||
#############################
|
||
# Helper to pick icon by capacity
|
||
#############################
|
||
pick_battery_icon() {
|
||
local cap="$1"
|
||
# convert to integer
|
||
if [ "$cap" -ge 80 ]; then
|
||
echo "$BATTERY_FULL_ICON"
|
||
elif [ "$cap" -ge 60 ]; then
|
||
echo "$BATTERY_3QTR_ICON"
|
||
elif [ "$cap" -ge 40 ]; then
|
||
echo "$BATTERY_HALF_ICON"
|
||
elif [ "$cap" -ge 20 ]; then
|
||
echo "$BATTERY_QTR_ICON"
|
||
else
|
||
echo "$BATTERY_EMPTY_ICON"
|
||
fi
|
||
}
|
||
|
||
#############################
|
||
# Gather battery info
|
||
#############################
|
||
get_battery_info_linux_main() {
|
||
battery_paths=(
|
||
"/sys/class/power_supply/macsmc-battery" # Asahi (M1) Fedora Remix
|
||
"/sys/class/power_supply/BAT0" # Standard Linux
|
||
"/sys/class/power_supply/BAT1" # Common secondary
|
||
)
|
||
|
||
for path in "${battery_paths[@]}"; do
|
||
if [ -d "$path" ]; then
|
||
battery_info=$(get_battery_info_linux "$path")
|
||
if [ $? -eq 0 ]; then
|
||
echo "$battery_info"
|
||
return
|
||
fi
|
||
fi
|
||
done
|
||
}
|
||
|
||
#############################
|
||
# Main logic
|
||
#############################
|
||
OS="$(uname)"
|
||
case "$OS" in
|
||
Darwin)
|
||
battery=$(get_battery_info_mac)
|
||
;;
|
||
Linux)
|
||
battery=$(get_battery_info_linux_main)
|
||
;;
|
||
*)
|
||
# Unsupported OS, no output
|
||
battery=""
|
||
;;
|
||
esac
|
||
|
||
echo "$battery"
|