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