low_bat_check 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #!/bin/sh
  2. # General constants declaration
  3. THRESHOLD_PERCENT_LOW_BAT=5
  4. THRESHOLD_PERCENT_EXTREMELY_LOW_BAT=2
  5. MAX_LOW_BAT_COUNT=5
  6. SLEEP_SECS=2
  7. RESCALE_MAX_PERCENTAGE=120
  8. # Blink Low bat constants declaration
  9. BLINK_ICON=0
  10. LOW_BAT_DISPLAY_TIMEOUT=5
  11. # Files and commands declaration
  12. USB_PRESENT_FILE="/sys/class/power_supply/axp20x-usb/present"
  13. # Cheat for no USB present simulation when debugging
  14. BAT_PRESENT_FILE="/sys/class/power_supply/axp20x-battery/present"
  15. BAT_PERCENT_FILE="/sys/class/power_supply/axp20x-battery/capacity"
  16. BAT_PERCENT_RESCALED_FILE="/tmp/current_battery_percentage"
  17. LOW_BAT_ICON="/sys/class/graphics/fb0/low_battery"
  18. # Variables declaration
  19. low_bat_status=0
  20. low_bat_displayed=0
  21. cur_secs_disp=0
  22. low_bat_count=0
  23. # Default: Hide Low Bat Icon
  24. echo 0 > ${LOW_BAT_ICON}
  25. # Check low bat #
  26. while true; do
  27. #echo "Bat present: $(cat ${BAT_PRESENT_FILE})"
  28. #echo "USB present: $(cat ${USB_PRESENT_FILE})"
  29. #echo "Bat percentage: $(cat ${BAT_PERCENT_FILE})"
  30. # Get current bat percentage here once
  31. cur_bat_percent=$(cat ${BAT_PERCENT_FILE})
  32. #echo "cur_bat_percent = ${cur_bat_percent}"
  33. # Rescale bat percentage between 0 and RESCALE_MAX_PERCENTAGE
  34. bat_percent_rescaled=$(printf "%.f" $(echo $cur_bat_percent $RESCALE_MAX_PERCENTAGE | awk '{print $1*$2/100}'))
  35. #echo "bat_percent_rescaled = ${bat_percent_rescaled}"
  36. # Re-maximize to 100%
  37. bat_percent_rescaled_maxed=$(( bat_percent_rescaled < 100 ? bat_percent_rescaled : 100 ))
  38. #echo "bat_percent_rescaled_maxed = ${bat_percent_rescaled_maxed}"
  39. # Save in file
  40. echo ${bat_percent_rescaled_maxed} > ${BAT_PERCENT_RESCALED_FILE}
  41. # Low bat status detection
  42. if [ "$(cat ${USB_PRESENT_FILE})" -eq "0" ]; then
  43. # Value of 0 means wrong i2c reading
  44. if [ "${cur_bat_percent}" -ne "0" ]; then
  45. # Check if we must change state
  46. if [ ${cur_bat_percent} -le ${THRESHOLD_PERCENT_LOW_BAT} -a ${low_bat_status} -eq 0 ]; then
  47. # Set Low Bat status
  48. low_bat_status=1
  49. low_bat_displayed=1
  50. cur_secs_disp=0
  51. echo 1 > ${LOW_BAT_ICON}
  52. elif [ ${cur_bat_percent} -gt ${THRESHOLD_PERCENT_LOW_BAT} -a ${low_bat_status} -eq 1 ]; then
  53. # Reset status
  54. low_bat_status=0
  55. low_bat_count=0
  56. echo 0 > ${LOW_BAT_ICON}
  57. fi
  58. fi
  59. else
  60. if [ ${low_bat_status} -eq 1 ]; then
  61. # Reset status
  62. low_bat_status=0
  63. low_bat_count=0
  64. echo 0 > ${LOW_BAT_ICON}
  65. fi
  66. fi
  67. # Low bat processing
  68. if [ ${low_bat_status} -eq 1 ]; then
  69. # Check extremely low bat for clean shutdown
  70. if [ ${cur_bat_percent} -le ${THRESHOLD_PERCENT_EXTREMELY_LOW_BAT} ]; then
  71. let low_bat_count++
  72. echo "low_bat_count = ${low_bat_count}"
  73. # Clean shutdown
  74. if [ ${low_bat_count} -ge ${MAX_LOW_BAT_COUNT} ]; then
  75. echo "Battery extremely low, shutting down now..."
  76. powerdown schedule 1
  77. exit 0
  78. fi
  79. fi
  80. # Blinking process
  81. if [ ${BLINK_ICON} -eq 1 ]; then
  82. if [ ${low_bat_displayed} -eq 1 -a ${cur_secs_disp} -ge ${LOW_BAT_DISPLAY_TIMEOUT} ]; then
  83. low_bat_displayed=0
  84. cur_secs_disp=0
  85. echo 0 > ${LOW_BAT_ICON}
  86. elif [ ${low_bat_displayed} -eq 0 -a ${cur_secs_disp} -ge ${LOW_BAT_DISPLAY_TIMEOUT} ]; then
  87. low_bat_displayed=1
  88. cur_secs_disp=0
  89. echo 1 > ${LOW_BAT_ICON}
  90. fi
  91. fi
  92. fi
  93. # Sleep before next check
  94. sleep ${SLEEP_SECS}
  95. # Increase vars
  96. let cur_secs_disp+=${SLEEP_SECS}
  97. done
  98. exit 0