#!/bin/sh # General constants declaration THRESHOLD_PERCENT_LOW_BAT=5 THRESHOLD_PERCENT_EXTREMELY_LOW_BAT=2 MAX_LOW_BAT_COUNT=5 SLEEP_SECS=2 RESCALE_MAX_PERCENTAGE=120 # Blink Low bat constants declaration BLINK_ICON=0 LOW_BAT_DISPLAY_TIMEOUT=5 # Files and commands declaration USB_PRESENT_FILE="/sys/class/power_supply/axp20x-usb/present" # Cheat for no USB present simulation when debugging BAT_PRESENT_FILE="/sys/class/power_supply/axp20x-battery/present" BAT_PERCENT_FILE="/sys/class/power_supply/axp20x-battery/capacity" BAT_PERCENT_RESCALED_FILE="/tmp/current_battery_percentage" LOW_BAT_ICON="/sys/class/graphics/fb0/low_battery" # Variables declaration low_bat_status=0 low_bat_displayed=0 cur_secs_disp=0 low_bat_count=0 # Default: Hide Low Bat Icon echo 0 > ${LOW_BAT_ICON} # Check low bat # while true; do #echo "Bat present: $(cat ${BAT_PRESENT_FILE})" #echo "USB present: $(cat ${USB_PRESENT_FILE})" #echo "Bat percentage: $(cat ${BAT_PERCENT_FILE})" # Get current bat percentage here once cur_bat_percent=$(cat ${BAT_PERCENT_FILE}) #echo "cur_bat_percent = ${cur_bat_percent}" # Rescale bat percentage between 0 and RESCALE_MAX_PERCENTAGE bat_percent_rescaled=$(printf "%.f" $(echo $cur_bat_percent $RESCALE_MAX_PERCENTAGE | awk '{print $1*$2/100}')) #echo "bat_percent_rescaled = ${bat_percent_rescaled}" # Re-maximize to 100% bat_percent_rescaled_maxed=$(( bat_percent_rescaled < 100 ? bat_percent_rescaled : 100 )) #echo "bat_percent_rescaled_maxed = ${bat_percent_rescaled_maxed}" # Save in file echo ${bat_percent_rescaled_maxed} > ${BAT_PERCENT_RESCALED_FILE} # Low bat status detection if [ "$(cat ${USB_PRESENT_FILE})" -eq "0" ]; then # Value of 0 means wrong i2c reading if [ "${cur_bat_percent}" -ne "0" ]; then # Check if we must change state if [ ${cur_bat_percent} -le ${THRESHOLD_PERCENT_LOW_BAT} -a ${low_bat_status} -eq 0 ]; then # Set Low Bat status low_bat_status=1 low_bat_displayed=1 cur_secs_disp=0 echo 1 > ${LOW_BAT_ICON} elif [ ${cur_bat_percent} -gt ${THRESHOLD_PERCENT_LOW_BAT} -a ${low_bat_status} -eq 1 ]; then # Reset status low_bat_status=0 low_bat_count=0 echo 0 > ${LOW_BAT_ICON} fi fi else if [ ${low_bat_status} -eq 1 ]; then # Reset status low_bat_status=0 low_bat_count=0 echo 0 > ${LOW_BAT_ICON} fi fi # Low bat processing if [ ${low_bat_status} -eq 1 ]; then # Check extremely low bat for clean shutdown if [ ${cur_bat_percent} -le ${THRESHOLD_PERCENT_EXTREMELY_LOW_BAT} ]; then let low_bat_count++ echo "low_bat_count = ${low_bat_count}" # Clean shutdown if [ ${low_bat_count} -ge ${MAX_LOW_BAT_COUNT} ]; then echo "Battery extremely low, shutting down now..." powerdown schedule 1 exit 0 fi fi # Blinking process if [ ${BLINK_ICON} -eq 1 ]; then if [ ${low_bat_displayed} -eq 1 -a ${cur_secs_disp} -ge ${LOW_BAT_DISPLAY_TIMEOUT} ]; then low_bat_displayed=0 cur_secs_disp=0 echo 0 > ${LOW_BAT_ICON} elif [ ${low_bat_displayed} -eq 0 -a ${cur_secs_disp} -ge ${LOW_BAT_DISPLAY_TIMEOUT} ]; then low_bat_displayed=1 cur_secs_disp=0 echo 1 > ${LOW_BAT_ICON} fi fi fi # Sleep before next check sleep ${SLEEP_SECS} # Increase vars let cur_secs_disp+=${SLEEP_SECS} done exit 0