245 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			245 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
							 |