246 lines
6.6 KiB
Text
246 lines
6.6 KiB
Text
|
#!/bin/sh
|
||
|
# Author: Nico Schottelius <nico AT schottelius DOT org>
|
||
|
# Date: 10th of April 2k+1
|
||
|
# Last Modified: 27th of June 2k+2
|
||
|
# Version: 0.7
|
||
|
# Comment: This tool shows how many minutes are one percent and at
|
||
|
# the end it shows the time the battery would live, if it has 100%
|
||
|
# capacity.
|
||
|
#
|
||
|
#
|
||
|
# BUGS:
|
||
|
#
|
||
|
# - The first values is most times not so good, because we didn't really
|
||
|
# catch one complete percent; FIXED: 11th of April 2k+1
|
||
|
#
|
||
|
# - if you stop before we've 2 values, awk will get a division through zero!
|
||
|
# FIXED: 11th of April 2k+1
|
||
|
#
|
||
|
# Changelog:
|
||
|
#
|
||
|
# 27th of June 2002:
|
||
|
# - fixed bug: when charging, apmcount said you lost percent...fixed through
|
||
|
# grep -v "battery charging"
|
||
|
#
|
||
|
# 11th of April 2001:
|
||
|
# - Ahh! I am awake again and now it seems apmcount becomes some kind of
|
||
|
# stable. Version 0.3 looks pretty good, although it still has the awk-zero-
|
||
|
# division bug. Also sometimes when you kill apmcount early there are some
|
||
|
# bad messages from the shell; Currently working on 0.4 to fix all errors
|
||
|
# and maybe typos. Version 0.5 won't have the debug messages in it
|
||
|
# anymore.
|
||
|
#
|
||
|
# 10th of April 2001:
|
||
|
# - I need to know how long the battery of my new notebooks lasts.
|
||
|
# As I didn't find anything good I started scripting this here.
|
||
|
#
|
||
|
#
|
||
|
# 27th of April 2001:
|
||
|
# Just pasted this old picture I have found written by me.
|
||
|
#
|
||
|
# /
|
||
|
# run as long as we don't got a signal
|
||
|
# |
|
||
|
# |
|
||
|
# save_percent in temp_p
|
||
|
# |
|
||
|
# |
|
||
|
# save_time_in_gnu_style in temp_t
|
||
|
# |
|
||
|
# |
|
||
|
# if temp_p not equals last i (i).
|
||
|
# --> the percentage has changed
|
||
|
#
|
||
|
#
|
||
|
#
|
||
|
# 1st of May 2k+1: Moved INTERVAL to the top of the script,
|
||
|
# so it is easier for the user to change the interval.
|
||
|
#
|
||
|
#
|
||
|
# APMCOUNT runs pretty fine, if you let it run for about
|
||
|
# 10 minutes it is more or less exactly :)
|
||
|
#
|
||
|
|
||
|
set +x
|
||
|
|
||
|
|
||
|
# How many records to skip ? One is normally quiet good!
|
||
|
SKIP=1
|
||
|
|
||
|
# INTERVAL: How long to sleep (in secs) and check for the time again
|
||
|
INTERVAL="5"
|
||
|
|
||
|
|
||
|
#### MESSAGES TO THE USER #####
|
||
|
|
||
|
PERCENT_ONE="This percentage lasted (in secs): "
|
||
|
PERCENT_ALL="The complete battery would aprox. live about (minutes)"
|
||
|
TIME_RAN="We ran so long:"
|
||
|
PERCENT_START="We started at percent:"
|
||
|
PERCENT_STOP="We stoped at percent:"
|
||
|
USED_PERCENT="We used so many percent of battery:"
|
||
|
ONE_HOUR_TIME="For one hour running this machine we need"
|
||
|
TO_LESS_PERCENT="Sorry, we ran to short and didn't get enough percents. \
|
||
|
Please take some more time to run `basename $0`."
|
||
|
TO_LESS_TIME="Sorry, we ran to short. Give me some more time to run."
|
||
|
SORRY_ONLINE="Sorry, running apmcount while beeing AC-Online is senseless."
|
||
|
|
||
|
####### END OF MESSAGES ########
|
||
|
|
||
|
|
||
|
################ STOP CHANGING OR NOT, WHAT YOU WANT :) #####################
|
||
|
|
||
|
# TRAP signals
|
||
|
trap EXIT="yes" SIGINT SIGSEGV SIGQUIT SIGTERM
|
||
|
|
||
|
# in SAVE we'll save the time it needed for the last percent
|
||
|
# in TIME is the time saved
|
||
|
SAVE=""
|
||
|
TIME=""
|
||
|
|
||
|
# temporary memory p=percent, t=time
|
||
|
temp_p=""
|
||
|
temp_t=""
|
||
|
|
||
|
# i is the count variable
|
||
|
i="0"
|
||
|
|
||
|
# We use START later, but cut out the first value
|
||
|
START=$[$i+$SKIP]
|
||
|
|
||
|
# howto get the seconds
|
||
|
DATE="date +%s"
|
||
|
|
||
|
# Set the first value
|
||
|
eval SAVE_$i=`apm | awk '{ print $6 }' | sed 's/\(.*\)%/\1/g'`
|
||
|
eval TIME_$i=`$DATE`
|
||
|
|
||
|
# Shall we exit
|
||
|
EXIT="no"
|
||
|
|
||
|
# check for status: Online/offline
|
||
|
|
||
|
if [ "`apm | grep "battery charging"`" != "" ]; then
|
||
|
echo $SORRY_ONLINE
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# do it until we recieve the ctrl+C sequenz
|
||
|
while [ $EXIT != "yes" ] ; do
|
||
|
|
||
|
# position number sixth is "XX%" (67%), eleminate the percent sign
|
||
|
# with % sign
|
||
|
temp_p=`apm | awk '{ print $6 }' | sed 's/\(.*\)%/\1/g'`
|
||
|
|
||
|
# Save the current time
|
||
|
temp_t=`$DATE`
|
||
|
|
||
|
# Check whether the values are different or not, if yes,
|
||
|
# increment i, and place the values in the right place
|
||
|
# else do nothing
|
||
|
if [ `eval echo \\$SAVE_$i` -ne `echo $temp_p` ];then
|
||
|
|
||
|
# increment i
|
||
|
i=$[$i+1];
|
||
|
|
||
|
# place the data in our pseudo array
|
||
|
eval SAVE_$i=\$temp_p
|
||
|
|
||
|
# place the time in our pseudo array
|
||
|
eval TIME_$i=\$temp_t
|
||
|
|
||
|
# Display the time the last percent lasted
|
||
|
eval echo \$PERCENT_ONE \$[\$TIME_$i - \$TIME_$[$i-1]]
|
||
|
|
||
|
fi
|
||
|
|
||
|
# sleep until we repeat the while loop again
|
||
|
sleep $INTERVAL
|
||
|
|
||
|
# end of days
|
||
|
done
|
||
|
|
||
|
# now calculate the rest
|
||
|
# We got the time in seconds:
|
||
|
# The last time - the first time
|
||
|
|
||
|
# We stop at the last element
|
||
|
END=$i
|
||
|
|
||
|
|
||
|
################################################
|
||
|
# Check whether we can start the report or not.
|
||
|
################################################
|
||
|
|
||
|
|
||
|
# If $i (the count variable) is less than / equal to Start, forget the thing
|
||
|
# At least 2 values are needed for division :)
|
||
|
|
||
|
if [ $i -le $START ]; then
|
||
|
echo $TO_LESS_PERCENT
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
|
||
|
# allcountedpercent must be > 0
|
||
|
# allcountedpercent = Start_percent(20) - End_percent (10)
|
||
|
# Start_percent = counted_percents (i) - SKIP (defined above)
|
||
|
# Also the time should be more than zero
|
||
|
|
||
|
# percentage is getting less, so start - end
|
||
|
eval COMPLETE_PERCENT="\$[\$SAVE_$START - \$SAVE_$END]"
|
||
|
|
||
|
# First the time, time is getting higher, so END - START
|
||
|
eval COMPLETE_SECS="\$[\$TIME_$END - \$TIME_$START]"
|
||
|
|
||
|
|
||
|
# if not greater than 0
|
||
|
if [ ! $COMPLETE_PERCENT -gt 0 ];then
|
||
|
echo $TO_LESS_PERCENT
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# if not greater than 0
|
||
|
if [ ! $COMPLETE_SECS -gt 0 ];then
|
||
|
echo $TO_LESS_TIME
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
########## REPORT BEGINS ############
|
||
|
echo $TIME_RAN $COMPLETE_SECS
|
||
|
eval echo \$PERCENT_START \$SAVE_$START
|
||
|
eval echo \$PERCENT_STOP \$SAVE_$END
|
||
|
echo $USED_PERCENT $COMPLETE_PERCENT
|
||
|
|
||
|
# In German we call the "Dreisatz", you should understand the next lines
|
||
|
#
|
||
|
# We've X seconds and X percent, both are present.
|
||
|
# We look for 100 percent and 3600 seconds
|
||
|
#
|
||
|
# X percent / X * 100 = 100 percent
|
||
|
# X seconds / X * 3600 = 1 hour
|
||
|
#
|
||
|
# So if we wanna have the time 100, the battery would last with
|
||
|
# 100 %, we need the following:
|
||
|
# 100_percent_time = ( time_lasted / percent_needed ) * 100
|
||
|
#
|
||
|
#
|
||
|
# We ran X minutes / seconds with X percent battery power
|
||
|
# We run 60 minutes with X minutes / X * 60 (or 3600 for seconds)
|
||
|
# ONE_HOUR= ( percents_needed / time_lasted ) * 3600
|
||
|
#
|
||
|
#
|
||
|
|
||
|
HUNDRED_P_TIME=`echo "$COMPLETE_SECS $COMPLETE_PERCENT" | \
|
||
|
awk '{ print ($1 / $2) * 100 / 60 }'`
|
||
|
|
||
|
echo $PERCENT_ALL $HUNDRED_P_TIME
|
||
|
|
||
|
# Now let's calculate how many percent are needed to run this
|
||
|
# machine one hour
|
||
|
|
||
|
ONE_HOUR=`echo "$COMPLETE_SECS $COMPLETE_PERCENT" | \
|
||
|
awk '{ print ($2 / $1) * 3600 }'`
|
||
|
|
||
|
echo $ONE_HOUR_TIME $ONE_HOUR
|