aboutsummaryrefslogtreecommitdiff
path: root/battery-bar.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xbattery-bar.sh128
1 files changed, 128 insertions, 0 deletions
diff --git a/battery-bar.sh b/battery-bar.sh
new file mode 100755
index 0000000..df34643
--- /dev/null
+++ b/battery-bar.sh
@@ -0,0 +1,128 @@
+#!/bin/sh
+# Battery status display script for systems with /sys/class/power_supply
+
+SYS_BASE="/sys/class/power_supply"
+
+# Read battery energy values
+# Returns: "energy_now energy_full" or exits with error
+read_battery() {
+ bat="$1"
+ base="$SYS_BASE/$bat"
+
+ [ -r "$base/energy_now" ] || return 1
+ [ -r "$base/energy_full" ] || return 1
+
+ energy_now=$(cat "$base/energy_now" 2>/dev/null) || return 1
+ energy_full=$(cat "$base/energy_full" 2>/dev/null) || return 1
+
+ # Validate numeric values
+ case "$energy_now" in
+ ''|*[!0-9]*) return 1 ;;
+ esac
+ case "$energy_full" in
+ ''|*[!0-9]*) return 1 ;;
+ esac
+
+ echo "$energy_now $energy_full"
+}
+
+# Determine battery state symbol based on status of all batteries
+battery_state_symbol() {
+ charging=0
+ discharging=0
+ full=0
+ not_charging=0
+ bat_found=0
+
+ for bat in BAT0 BAT1; do
+ status_path="$SYS_BASE/$bat/status"
+ [ -r "$status_path" ] || continue
+
+ bat_found=1
+ status=$(cat "$status_path" 2>/dev/null | tr -d '\n')
+ case "$status" in
+ Charging)
+ charging=1
+ ;;
+ Discharging)
+ discharging=1
+ ;;
+ Full)
+ full=1
+ ;;
+ "Not charging")
+ not_charging=1
+ ;;
+ esac
+ done
+
+ # No batteries found
+ [ "$bat_found" -eq 0 ] && echo " " && return 1
+
+ # Priority: charging > discharging > not_charging > full
+ # If any battery is charging, show charging
+ [ "$charging" -eq 1 ] && echo "⁺" && return 0
+ # If any battery is discharging, show discharging
+ [ "$discharging" -eq 1 ] && echo "⁻" && return 0
+ # If any battery is not charging (plugged but not charging)
+ [ "$not_charging" -eq 1 ] && echo "˜" && return 0
+ # All batteries full
+ [ "$full" -eq 1 ] && echo "=" && return 0
+
+ # Unknown status
+ echo " "
+ return 1
+}
+
+battery_bar() {
+ percent="$1"
+
+ [ "$percent" -lt 0 ] && percent=0
+ [ "$percent" -gt 100 ] && percent=100
+
+ filled=$((percent / 10))
+ empty=$((10 - filled))
+
+ bar=""
+ i=0
+ while [ "$i" -lt "$filled" ]; do
+ bar="${bar}█"
+ i=$((i + 1))
+ done
+
+ i=0
+ while [ "$i" -lt "$empty" ]; do
+ bar="${bar}░"
+ i=$((i + 1))
+ done
+
+ echo "$bar"
+}
+
+battery_summary() {
+ total_now=0
+ total_full=0
+ bat_count=0
+
+ for bat in BAT0 BAT1; do
+ vals=$(read_battery "$bat") || continue
+ set -- $vals
+ total_now=$((total_now + $1))
+ total_full=$((total_full + $2))
+ bat_count=$((bat_count + 1))
+ done
+
+ if [ "$bat_count" -eq 0 ] || [ "$total_full" -eq 0 ]; then
+ echo "No battery"
+ return 1
+ fi
+
+ percent=$(( (total_now * 100 + total_full / 2) / total_full ))
+
+ bar=$(battery_bar "$percent")
+ symbol=$(battery_state_symbol)
+
+ echo "▕${bar}▏${percent}${symbol}"
+}
+
+battery_summary