diff --git a/.i3blocks/batterybar b/.i3blocks/batterybar
index e74dca8..5099f02 100755
--- a/.i3blocks/batterybar
+++ b/.i3blocks/batterybar
@@ -1,13 +1,70 @@
#!/bin/bash
-# Récupération des infos de la batterie
-readarray -t batteries <<< $(acpi battery)
-battery=${batteries[${BLOCK_INSTANCE:-0}]}
+runtime="${XDG_RUNTIME_DIR}/i3blocks"
+[[ ! -d "$runtime" ]] && mkdir -p "$runtime"
-# Stockage en variables
-percentage=$(echo $battery | grep -o -m1 '[0-9]\{1,3\}%' | tr -d '%')
-status=$(echo $battery | grep -E -o -m1 ': [[:alpha:]]*,' | tr -cd '[:alpha:]')
-remaining=$(echo $battery | grep -E -o -m1 '[0-9]{2}:[0-9]{2}')
+human_time() {
+ local seconds="${1}"
+ local minutes=$(( seconds / 60 ))
+ local hours=$(( minutes / 60 ))
+ minutes=$(( minutes % 60 ))
+ printf "%d:%02d\n" "$hours" "$minutes"
+ return
+}
+
+# Récupération des infos de la batterie
+
+source /sys/class/power_supply/BAT1/uevent
+time="$(date +%s)"
+
+# Min et max personnalisés (20 et 80 % ici)
+MIN="$(( POWER_SUPPLY_CHARGE_FULL * 2 / 10 ))"
+MAX="$(( POWER_SUPPLY_CHARGE_FULL * 8 / 10 ))"
+
+# Utiliser toute la plage de la batterie
+#MIN=0
+#MAX="$POWER_SUPPLY_CHARGE_FULL"
+
+# %age réel
+#percentage="$POWER_SUPPLY_CAPACITY"
+
+# %age relatif aux MIN/MAX
+percentage=$(( (POWER_SUPPLY_CHARGE_NOW - MIN) * 100 / (MAX - MIN) ))
+
+# État de la batterie
+status="$POWER_SUPPLY_STATUS"
+
+# Indiquer la limite mise dans le BIOS, si la batterie n’indique pas qu’elle
+# est chargée d’elle-même
+if [[ "$status" == "Charging" && "$POWER_SUPPLY_CAPACITY" -eq 80 ]]
+then
+ status="Full"
+fi
+
+if [[ -f "${runtime}/bat" ]]
+then
+ mapfile -t old < "${runtime}/bat"
+fi
+
+# Estimation naïve du temps restant
+if [[ "${old[0]}" != "$status" ]]
+then
+ printf "%s\n" "$status" "$time" "$POWER_SUPPLY_CHARGE_NOW" > "${runtime}/bat"
+fi
+
+if [[ "$status" == "Discharging" ]]
+then
+ remaining_secs="$(( (POWER_SUPPLY_CHARGE_NOW - MIN) / ((old[2] - POWER_SUPPLY_CHARGE_NOW) / (time - old[1])) ))"
+elif [[ "$status" == "Charging" ]]
+then
+ remaining_secs="$(( (MAX - POWER_SUPPLY_CHARGE_NOW) / ((POWER_SUPPLY_CHARGE_NOW - old[2]) / (time - old[1])) ))"
+else
+ remaining_secs=0
+fi
+
+[[ "$remaining_secs" -lt 0 ]] && remaining_secs=0
+
+remaining="$(human_time "$remaining_secs")"
# Définition des couleurs
dis_colors=("#F2777A" "#F2777A" "#F99157" "#F99157" "#FFCC66" "#FFCC66" "#99CC99" "#99CC99")
@@ -15,52 +72,28 @@ charging_color="#66CCCC"
ac_color="#6699CC"
full_color="#D3D0C8"
-# Création de la barre « graphique »
+# Création de la barre « graphique », 48 états affichables
+
+## à partir du pourcentage de calculé plus tôt
+
percents=$(( percentage / 2 ))
(( percents > 48 )) && percents=48
+## à partir des données brutes
+# percents=$(( (POWER_SUPPLY_CHARGE_NOW - MIN) * 48 / (MAX - MIN) ))
+
+# Définition des symboles
+chars=("█" "░" "░" "▒" "▒" "▓" "▓" "█")
+#chars=("█" "▏" "▎" "▍" "▌" "▋" "▊" "▉")
+#chars=("█" "▁" "▂" "▃" "▄" "▅" "▆" "▇")
+
full_squares=$(( percents / 8 ))
for t in $(seq 1 $full_squares)
do
- squares+="█"
+ squares+="${chars[0]}"
done
-if [[ $(( percents - ( full_squares * 8 ) )) -eq 7 ]]
-then
- #squares+="█"
- squares+="▉"
- #squares+="▇"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 6 ]]
-then
- #squares+="▓"
- squares+="▊"
- #squares+="▆"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 5 ]]
-then
- #squares+="▓"
- squares+="▋"
- #squares+="▅"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 4 ]]
-then
- #squares+="▒"
- squares+="▌"
- #squares+="▄"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 3 ]]
-then
- #squares+="▒"
- squares+="▍"
- #squares+="▃"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 2 ]]
-then
- #squares+="░"
- squares+="▎"
- #squares+="▂"
-elif [[ $(( percents - ( full_squares * 8 ) )) -eq 1 ]]
-then
- #squares+="░"
- squares+="▏"
- #squares+="▁"
-fi
+squares+="${chars[$(( percents - ( full_squares * 8 ) ))]}"
# Complétion de la barre afin d'avoir une taille fixe
blanks=$(( 6 - ${#squares} ))
@@ -81,7 +114,7 @@ case "${status}" in
color="$ac_color"
;;
"Discharging"|"Unknown")
- if (( percentage >= 0 && percentage < 10 )); then
+ if (( percentage < 10 )); then
color="${dis_colors[0]}"
elif (( percentage >= 10 && percentage < 20 )); then
color="${dis_colors[1]}"
@@ -107,10 +140,10 @@ then
message="${status} ${percentage}% ${remaining}"
message=${message% }
else
- message="$squares"
+ message="$squares ${remaining}"
fi
# Affichage
echo "bat $message"
echo "bat ${percentage}%"
-
+declare -p MIN MAX percents percentage >&2