FunKey-OS/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/low_bat_check

123 lines
3.3 KiB
Bash
Executable File

#!/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