#!/system/bin/sh
#
# batt_mon
#
# NITdroid battery monitor
#
# Reads charge levels from /dev/retu using retu-adc from
# registers #3 and #8 of RETU ASIC.
#
# As there is no public documentation all batt values reported
# to Android are estimates and algorithms are based on pure
# observation and speculation.
# 
# Keeps happy Android by supplanting /sys/class/power_supply.
#
# Otto Solares Cabrera <solca@guug.org>

# calm down a restart storm
sleep 1

if ! mount -t tmpfs -o size=100k none /sys/class/power_supply; then
    echo "Could not supplant /sys/class/power_supply"
    exit 1
fi

umask 22

mkdir /sys/class/power_supply/ac
mkdir /sys/class/power_supply/usb
mkdir /sys/class/power_supply/battery

# initial constants
echo 0 >/sys/class/power_supply/ac/online
echo 0 >/sys/class/power_supply/usb/online
echo D >/sys/class/power_supply/battery/status
echo G >/sys/class/power_supply/battery/health
echo 1 >/sys/class/power_supply/battery/present
echo 0 >/sys/class/power_supply/battery/capacity
echo 0 >/sys/class/power_supply/battery/batt_vol
echo 0 >/sys/class/power_supply/battery/batt_temp
echo "Li-polymer" >/sys/class/power_supply/battery/technology

# poll charge
while true; do
    curr_input=$(retu-adc 3)
    curr_charge=$(retu-adc 8)

    # report raw charge value (useless)
    echo ${curr_charge} >/sys/class/power_supply/battery/batt_vol

    # it's charging or discharging
    if test ${curr_input} -lt 10; then
        echo 0 >/sys/class/power_supply/ac/online
        echo D >/sys/class/power_supply/battery/status
        # compensate when AC is unplugged
        curr_charge=$(expr ${curr_charge} "+" 28)
    else
        echo 1 >/sys/class/power_supply/ac/online
        echo C >/sys/class/power_supply/battery/status
        # compensate when AC is plugged
        curr_charge=$(expr ${curr_charge} "-" 28)
    fi

    # calculate current batt capacity level
    if test ${curr_charge} -gt 500; then
        curr_capacity=$(expr "(" ${curr_charge} "+" 450 ")" "/" 10)
    else
        curr_capacity=$(expr "(" ${curr_charge} "-" 300 ")" "*" 96 "/" 200)
    fi

    # out of limits means batt is full
    if test ${curr_capacity} -lt 0 -o ${curr_capacity} -gt 100; then
        curr_capacity=100
        echo F >/sys/class/power_supply/battery/status
    fi

    # it's charging and batt is full
    if test ${curr_input} -gt 350; then
        curr_capacity=100
        echo F >/sys/class/power_supply/battery/status
    fi

    # report batt capacity level (important)
    echo ${curr_capacity} >/sys/class/power_supply/battery/capacity

    sleep 2
done

umount /sys/class/power_supply
