low_bat_check 3.6 KB

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