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