#!/bin/sh -e
#
#  battery: print the state of the battery
#  Copyright (C) 2009 Raphaël Pinson.
#
#  Authors: Raphaël Pinson <raphink@ubuntu.com>
#           Dustin Kirkland <kirkland@canonical.com>
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, version 3 of the License.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.


search () {
   local str expr
   str="$1"
   expr="$2"

   echo "$str" | sed -n "s/${expr}/\1/p"
}


BATS=$(ls /proc/acpi/battery)
NB=$(echo "$BATS" | wc -l)

for bat in $BATS; do
   if [ "$NB" -gt 1 ]; then
      echo -n "$bat: "
   fi

   # read files once
   infofile=$(cat "/proc/acpi/battery/$bat/info")
   statefile=$(cat "/proc/acpi/battery/$bat/state")

   present=$(search "$infofile" "present: *\(.*\)")

   if [ "x${present}" = "xno" ]; then
      echo "n/a"
      break
   fi

   full=$(search "$infofile" "last full capacity: *\(.*\) m[AW]h")
   warn=$(search "$infofile" "design capacity warning: \(.*\) m[AW]h")
   low=$(search "$infofile" "design capacity low: \(.*\) m[AW]h")

   rem=$(search "$statefile" "remaining capacity: *\(.*\) m[AW]h")
   if [ "$rem" -lt "$low" ]; then
      cap_color="{= rk}"
   elif [ "$rem" -lt "$warn" ]; then
      cap_color="{= yk}"
   else
      cap_color="{= gk}"
   fi


   percent=$( echo "$rem" "$full" | awk '{printf "%.0f",  100*$1/$2}')
   if [ "$percent" -lt 17 ]; then
	per_color="{= rk}"
   elif [ "$percent" -lt 33 ]; then
	per_color="{= Rk}"
   elif [ "$percent" -lt 50 ]; then
	per_color="{= yk}"
   elif [ "$percent" -lt 67 ]; then
	per_color="{= Yk}"
   elif [ "$percent" -lt 83 ]; then
	per_color="{= Gk}"
   else
	per_color="{= gk}"
   fi


   state=$(search "$statefile" "charging state: *\(.*\)")
   case $state in
      charging)
         sign="+"
         ;;
      discharging)
         sign="-"
         ;;
      charged)
         sign="="
         ;;
      *)
         sign="$state"
         ;;
   esac

   printf "\005%s%d%%\005{-}\005%s|%s|\005{-} " "$per_color" "$percent" "$cap_color" "$sign"
done
