forked from xtacocorex/chip_batt_autoshutdown
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchip_autoshutdown.sh
executable file
·94 lines (77 loc) · 3.1 KB
/
chip_autoshutdown.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash
# Forked https://github.com/xtacocorex/chip_batt_autoshutdown
# Modified to shutdown on microUSB unplug with code from
# https://bbs.nextthing.co/t/updated-battery-sh-dumps-limits-input-statuses/2921
# Service code from noimjosh https://github.com/noimjosh/chip_autoshutdown/
# MIT LICENSE, SEE LICENSE FILE
# LOGGING HAT-TIP TO http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/
# SIMPLE SCRIPT TO POWER DOWN THE CHIP BASED UPON BATTERY VOLTAGE
# CHANGE THESE TO CUSTOMIZE THE SCRIPT
# ****************************
# ** THESE MUST BE INTEGERS **
CHARGE_LOW_LIMIT=10
MINCHARGECURRENT=10
POLLING_WAIT=1
# ****************************
readonly SCRIPT_NAME=$(basename $0)
LAST_MESSAGE=""
log() {
# echo "`date -u`" "$@"
if [ "$@" != "$LAST_MESSAGE" ]; then
LAST_MESSAGE="$@"
logger -p user.notice -t "battery" "$@"
fi
}
# TALK TO THE POWER MANAGEMENT
/usr/sbin/i2cset -y -f 0 0x34 0x82 0xC3
while true
do
# GET POWER OP MODE
POWER_OP_MODE=$(/usr/sbin/i2cget -y -f 0 0x34 0x01)
# SEE IF BATTERY EXISTS
BAT_EXIST=$(($(($POWER_OP_MODE&0x20))/32))
if [ $BAT_EXIST == 1 ]; then
FUEL_GAUGE=$(i2cget -y -f 0 0x34 0x0b9)
FUEL_GAUGE=$(($FUEL_GAUGE&0x7f))
# CHECK BATTERY LEVEL AGAINST MINVOLTAGELEVEL
if [ $FUEL_GAUGE -le $CHARGE_LOW_LIMIT ]; then
log "CHIP BATTERY CHARGE IS LESS THAN $CHARGE_LOW_LIMIT"
# GET THE CHARGE CURRENT
BAT_ICHG_MSB=$(/usr/sbin/i2cget -y -f 0 0x34 0x7A)
BAT_ICHG_LSB=$(/usr/sbin/i2cget -y -f 0 0x34 0x7B)
BAT_ICHG_BIN=$(( $(($BAT_ICHG_MSB << 4)) | $(($(($BAT_ICHG_LSB & 0x0F)) )) ))
BAT_ICHG_FLOAT=$(echo "($BAT_ICHG_BIN*0.5)"|bc)
# CONVERT TO AN INTEGER
BAT_ICHG=${BAT_ICHG_FLOAT%.*}
# IF CHARGE CURRENT IS LESS THAN MINCHARGECURRENT, WE NEED TO SHUTDOWN
if [ $BAT_ICHG -le $MINCHARGECURRENT ]; then
log "CHIP BATTERY IS NOT CHARGING, SHUTTING DOWN NOW"
shutdown -h now
else
log "CHIP BATTERY IS CHARGING"
fi
else
#read Power OPERATING MODE register @01h
POWER_OP_MODE=$(i2cget -y -f 0 0x34 0x01)
#echo $POWER_OP_MODE
CHARG_IND=$(($(($POWER_OP_MODE&0x40))/64)) # divide by 64 is like shifting rigth 6 times
if [ $CHARG_IND -eq 1 ]; then
log "BATTERY IS CHARGING"
else
BAT_IDISCHG_MSB=$(i2cget -y -f 0 0x34 0x7C)
BAT_IDISCHG_LSB=$(i2cget -y -f 0 0x34 0x7D)
BAT_IDISCHG_BIN=$(( $(($BAT_IDISCHG_MSB << 5)) | $(($(($BAT_IDISCHG_LSB & 0x1F)) )) ))
BAT_IDISCHG=$(echo "($BAT_IDISCHG_BIN)"|bc)
if [ $BAT_IDISCHG -le $MINCHARGECURRENT ]; then
log "BATTERY IS CHARGED"
else
log "BATTERY DISCHARGING"
fi
fi
# log "CHIP BATTERY LEVEL IS GOOD"
fi
else
log "BATTERY NOT PRESENT."
fi
sleep $POLLING_WAIT
done