chip-battery/chipmonk.sh

345 lines
7.2 KiB
Bash
Executable File

#!/bin/sh
#
# For the CHIP Computer AXP09 Power mangement IC
#
# Original:
# Jeff Brown http://photonicsguy.ca/projects/chip
# https://github.com/Photonicsguy/CHIP
# Version 1.0 (April 5th, 2016)
#
#
# This version cloned from, with modifications:
# https://github.com/ondsinet/chip/tree/master/Programs/chipmonk
#
if [ "$1" == "-d" ]; then
DAEMON="1"
else
DAEMON="0"
fi
BATTERY_VALUE= #%
BATTERY_STATE= #connected/CHARGING/DISCHARGING/charged
BATTERY_VOLT=
BATTERY_CURR=
POWER_SOURCE=
USB_VOLT=
USB_CURR=
CHG_VOLT=
CHG_CURR=
TEMPERATURE_VALUE=
TEMPERATURE_PRINT=
UPTIME_VALUE=
SENSOR_READ_FREQUENCY=5
FREQ_DIV=2
REPORT_TXT=
read_config(){
BATTERY_SHUT_VALUE=
BATTERY_WARN_VALUE=
BATTERY_WARN_GPIO_VALUE=0
TEMPERATURE_SHUT_VALUE=
TEMPERATURE_WARN_VALUE=50
if [ -f /usr/local/etc/chipmonk.cfg ]; then :
source /usr/local/etc/chipmonk.cfg
else :
#chipmonk_error "can't find /usr/local/etc/chipmonk.cfg"
fi
}
check_i2c_installed(){
# Need to communicate with AXP209 via I2C commands
if [ ! -x /usr/sbin/i2cget -o ! -x /usr/sbin/i2cset ]; then :
chipmonk_error "need i2c-tools" "Use: sudo apt-get install i2c-tools"
fi
}
chipmonk_cleanup(){
return 0
}
chipmonk_stop(){
chipmonk_cleanup
echo "chipmonk: stopped"
exit
}
chipmonk_error(){
chipmonk_cleanup
while [ -n "$1" ]; do :
echo "chipmonk: $1"
shift # get next error string into $1
done
exit 1
}
read_AXP(){ #reads values from the power ic
# Enable ADC registers
i2cset -y -f 0 0x34 0x82 0xff
## REGISTER 00 ##
REG=$(i2cget -y -f 0 0x34 0x00)
STATUS_VCHG=$(($(($REG&0x80))/128))
STATUS_VCHG_AVAIL=$(($(($REG&0x40))/64))
STATUS_VUSB=$(($(($REG&0x20))/32))
STATUS_VUSB_AVAIL=$(($(($REG&0x10))/16))
#STATUS_VHOLD=$(($(($REG&0x08))/8))
STATUS_BAT_DIR=$(($(($REG&0x04))/4))
#ACVB_SHORT=$(($(($REG&0x02))/2))
#STATUS_BOOT=$(($REG&0x01))
##POWER_SOURCE= $((STATUS_VCHG_AVAIL+STATUS_VUSB_AVAIL))
POWER_SOURCE=0
[ $STATUS_VCHG_AVAIL == 1 ] || [ $STATUS_VUSB == 1 ] && POWER_SOURCE=1
## REGISTER 01 ##
REG=$(i2cget -y -f 0 0x34 0x01)
#STATUS_OVRTEMP=$(($(($REG&0x80))/128))
STATUS_CHARGING=$(($(($REG&0x40))/64))
STATUS_BATCON=$(($(($REG&0x20))/32))
#STATUS_=$(($(($REG&0x10))/16))
#STATUS_ACT=$(($(($REG&0x08))/8))
#STATUS_CUREXPEC=$(($(($REG&0x04))/4))
#STATUS_=$(($(($REG&0x02))/2))
#STATUS_=$(($REG&0x01))
#if [ $STATUS_OVRTEMP == 1 ]; then
# echo "Over Temperature"
#fi
#if [ $STATUS_CHARGING == 1 ]; then
# echo "Battery charging"
#fi
#echo "Battery connected: $STATUS_BATCON"
if [ $STATUS_VCHG==1 ]; then
# VCHG voltage
REG=`i2cget -y -f 0 0x34 0x56 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
CHG_VOLT=`echo "$REG*0.0017"|bc`
# VCHG Current
REG=`i2cget -y -f 0 0x34 0x58 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
CHG_CURR=`echo "$REG*0.375"|bc`
else
CHG_VOLT='-'
CHG_CURR='-'
fi
if [ $STATUS_VUSB==1 ]; then
# VUSB voltage
REG=`i2cget -y -f 0 0x34 0x5A w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
USB_VOLT=`echo "$REG*0.0017"|bc`
# VUSB Current
REG=`i2cget -y -f 0 0x34 0x5C w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
USB_CURR=`echo "$REG*0.375"|bc`
else
USB_VOLT='-'
USB_CURR='-'
fi
BATTERY_STATE=
if [ $STATUS_BATCON == 1 ]; then
# Battery Voltage
REG=`i2cget -y -f 0 0x34 0x78 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
BATTERY_VOLT=`echo "$REG*0.0011"|bc`
if [ $STATUS_BAT_DIR == 1 ] || [ $POWER_SOURCE == 1 ]; then
# Battery Charging Current
REG=`i2cget -y -f 0 0x34 0x7A w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG_C=`printf "%d" "$REG"`
BATTERY_CURR=`echo "scale=2;$REG_C*0.5"|bc`
BATTERY_STATE="Charging"
else
# Battery Discharge Current
REG=`i2cget -y -f 0 0x34 0x7C w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG_D=`printf "%d" "$REG"`
BATTERY_CURR=`echo "scale=2;$REG_D*0.5"|bc`
BATTERY_STATE="Discharging"
fi
# Battery %
REG=`i2cget -y -f 0 0x34 0xB9`
BATTERY_VALUE=`printf "%d" "$REG"`
else
BATTERY_VOLT='-'
BATTERY_CURR='-'
BATT_PERCENT='-'
BATTERY_STATE="NO "
fi
# System (IPSOUT) Voltage (IPS is Intelligent Power Select)
#REG=`i2cget -y -f 0 0x34 0x7E w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
#REG=`printf "%d" "$REG"`
#IPSOUT=`echo "$REG*0.0014"|bc`
# Temperature
REG=`i2cget -y -f 0 0x34 0x5E w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'`
REG=`printf "%d" "$REG"`
TEMPERATURE_PRINT=`echo "($REG*0.1)-144.7"|bc`
TEMPERATURE_VALUE=`echo "($REG)-1447"|bc`
#echo "Temperature: "$THERM"°C (I've seen as high as 65°C)"
}
read_stats(){ #reads cpu stats
CPU='-'
UPTIME_VALUE=$(uptime -p |sed 's/\<up\>/&time:/')
#CPU=$(cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}')
#CPU= `cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'`
#echo "${CPU}"
}
compile_report(){
txt_PWR="Not Connected"
if [ $POWER_SOURCE != 0 ];then
txt_PWR="Connected"
fi
txt_VCHG="VCHG: $CHG_VOLT""V"
if [ $CHG_CURR != 0 ];then
txt_VCHG+=" "$CHG_CURR"mA"
fi
txt_VUSB="VUSB: $USB_VOLT""V"
if [ $USB_CURR != 0 ];then
txt_VUSB+=" "$USB_CURR"mA"
fi
txt_VBAT="VBAT: $BATTERY_VOLT""V"
if [ $STATUS_BAT_DIR == 1 ]; then
txt_VBAT+=" +"$BATTERY_CURR"mA"
else
txt_VBAT+=" -"$BATTERY_CURR"mA"
fi
read -r -d '' REPORT_TXT << EOM
$UPTIME_VALUE
Temp: $TEMPERATURE_PRINT°C
Batt: $BATTERY_VALUE% $BATTERY_STATE
Power Supply: $txt_PWR
$txt_VCHG
$txt_VUSB
$txt_VBAT
EOM
}
WARN_TEMP=0
WARN_BATT=0
WARN_POWR=0
WARN_IP=0
WARN_TEMP_DONE=0
WARN_BATT_DONE=0
WARN_POWR_DONE=0
WARN_IP_DONE=0
compile_warnings(){
#battery low
if [ $WARN_BATT == 0 ] && (( BATTERY_VALUE < BATTERY_WARN_VALUE )); then
WARN_BATT=1
echo "warn batt"
elif [ $WARN_BATT == 1 ] && (( BATTERY_VALUE > BATTERY_WARN_VALUE + 2 )); then
WARN_BATT=0
echo "ok batt"
fi
echo "temp: $TEMPERATURE_VALUE"
echo "power source: $POWER_SOURCE"
echo "battery value: $BATTERY_VALUE"
#power disconnected
if [ $WARN_POWR == 0 ] && [ $POWER_SOURCE == 0 ];then
WARN_POWR=1
echo "warn pwr"
elif [ $WARN_POWR == 1 ] && [ $POWER_SOURCE == 1 ];then
WARN_POWR=0
echo "ok pwr"
fi
# echo $WARN_POWR
#too hot
if [ $WARN_TEMP == 0 ] && (( TEMPERATURE_VALUE > TEMPERATURE_WARN_VALUE )); then
WARN_TEMP=1
echo "warn TEMP"
elif [ $WARN_TEMP == 1 ] && (( TEMPERATURE_VALUE < TEMPERATURE_WARN_VALUE - 20 )); then
WARN_TEMP=0
echo "ok TEMP"
fi
# echo $TEMPERATURE_WARN_VALUE
# echo $TEMPERATURE_VALUE
# echo $WARN_TEMP
}
handle_warnings(){
echo
}
check_i2c_installed
#########################################
read_config
read_AXP
read_stats
compile_report
compile_warnings
#########################################
#if [ $PRINT ]; then
echo "$REPORT_TXT"
# exit 0
#fi
trap "chipmonk_stop" 1 2 3 15
#########################################
LAST_TIME_SENSORS=`date +%s`
#LAST_TIME_IP=`date +%s`
if [ $DAEMON == "1" ]; then
while true; do :
read_AXP
read_stats
compile_warnings
#handle_warnings
sleep "$SENSOR_READ_FREQUENCY"
done
fi