Hi Mark Baxter, This is going to work somewhere in the near future. Thanks a lot for giving it to the group. Very interesting, also as studying material. Paul. On Sep 26, 2011, at 6:32 PM, Mark BurningHawk Baxter wrote:
> Okay. I'll paste it in below. Below that, I'll give instructions for > extracting the pasted text and making it a file. in case this grou *WILL* > allow attachments, I ahve also attached it; if you don't know how to get the > attachment to where you want it, contact me and I'll explain that too. > > Okay. There is a line of stars (*) and then the text of the program, and > then another lines of Stars (*), and then buletted (YAY) instructions after > that. So, off we go then: > > ************ > > #!/bin/bash > > # Commented version, merged between yours and my second version, > # and cleaned up a little. > # All comments begin with a # > > # If the number of arguments given to timer is not equal to 3 > # then do the next few statements until the else > if [ $# -ne 3 ] > then > > # say some stuff about using the defaults > echo "Usage: timer [interval in seconds] [end time in minutes] [number of > loops]" > echo "Using default interval 300 seconds(five minutes), total time 30 > minutes, 2 loops" > > # set the defaults > # this is where you were getting the 20 minutes on the other script, > # because its check was less than 2 arguments > # in seconds > waitTime=180 > # in minutes > endTime=15 > # just a count > loops=4 > > # otherwise > else > > # use the argments the user gave > # $1 is the first argument, $2 the second, and $3 the third > waitTime=$1 > endTime=$2 > loops=$3 > > # finish the if statement > fi > > > # Do not modify below this line unless > # you know what you are doing. > > # Set up 4 default variables to keep track of the seconds and loops > > # will be used to count seconds within each cycle/iteration loop that have > been done > totalSeconds=0 > > # The next line of code does lots of stuff, detailed in the paragraph below > # which all together basically say "multiply the variable by 60", > # which calculates the end time in seconds from the minutes the user gave > # because my loops work in seconds. > # Broken down and explained in parts: > # The backticks enclose another command, the results of which are stored in > # The variable endTimeInSeconds. > # The echo sends text back to the screen. > # $endTime gets replaced by the number of minutes the script is using > # (default 20 or user provided). > # *60+1 are sent to the screen as they are. > # | is the pipe which takes the screen's text that was supposed to get > # displayed and redirects it to the following command. > # bc - An arbitrary precision calculator language. > # in the terminal, at the prompt, type man bc > # which will display the manual for bc. > # You can do this for most all commands. > endTimeInSeconds=`echo $endTime*60 | bc` > > # Will be used to count interval seconds within each loop that has been done. > # resets to 1 each iteration/cycle loop > totalSecondsInIteration=0 > > # Used to keep track of how many times the user has been notified within the > cycle. > # (using base 1 instead of base 0 so when the script speaks the count, it > starts at 1) > # (most counting in programming starts at 0) > totalIterationCount=1 > > # Will be used to count loops that have been done > totalLoops=0 > > # While the number of loops that have been done (totalLoops) is not equal to > # the number of loops the script is using, do the commands that are between > # the do and done lines. > # The ! means NOT. > > #first sleep 30 seconds to give time to get set up, then plays a sound. > echo "Counting down to start." > sleep 30 > afplay ~/sounds/electronicping.wav > > while [ ! "$totalLoops" = "$loops" ] > do > > # While the total seconds that have been done is not equal to the number > # of seconds desired per cycle/iteration, do the commands that are between > # the do and done lines. > while [ ! "$totalSeconds" = "$endTimeInSeconds" ] > do > > # This is just a debugging line to see if I have all the counts right, > which prints > # to the screen. > # Add a # to comment it out so it doesn't display. > # Or remove the # at the beginning of the line to make it display. > #echo "totalSecondsInIteration:$totalSecondsInIteration waitTime:$waitTime > totalSeconds=$totalSeconds endTimeInSeconds=$endTimeInSeconds" > > # If the number of seconds that have been done equals the number of seconds > # we want to be done, run the commands between the then and fi. > if [ "$totalSecondsInIteration" = "$waitTime" ] > then > > # Notify the user. > # Speak the count of seconds that have been done. > # The & sends the command into the background so the script > # can continue, which makes the script more accurate on its seconds. > # You'll get some whacky results if the time it takes to complete > # the command is longer than the time it takes to do your desired loop. > #say "$totalIterationCount" & > > # Calculate the percentage complete. > percentDone=`echo "$totalSeconds*100/$endTimeInSeconds" | bc` > # Speak the percentage complete. > say $percentDone" percent" & > > # Play a sound. > afplay ~/sounds/electronicping.wav & > > # Reset the number of seconds that have been done this iteration. > totalSecondsInIteration=0 > > # Increment the count of notifications to the user. > totalIterationCount=`echo $totalIterationCount+1 | bc` > fi > > # Increment the seconds that have been done this iteration. > totalSecondsInIteration=`echo $totalSecondsInIteration+1 | bc` > > # Increment the total seconds that have been done. > totalSeconds=`echo $totalSeconds+1 | bc` > > # Make the script wait 1 second before continuing. > sleep 1 > > done > > # reset all the cycle variables > totalSeconds=0 > totalSecondsInIteration=0 > totalIterationCount=1 > > # increment the number of loops that have been done > totalLoops=`echo $totalLoops+1 | bc` > > # notify the user that a complete cycle has occurred. > afplay ~/sounds/foghorn2.wav & > say "End Loop $totalLoops" & > > done > > # Delay long enough to play the last loop's notification. > sleep 2 > > # notify the user that the script has ended > say "All done" > > *************** > Here are instructions for extracting that and saving it as a file which will > work from Finder ot Terminal: > > •1) Select/highlight all the text between the stars, but not including the > stars, and copy it to the pasteboard. (If you need further help with this, > tell me off list). > •2) Open TextEdit and paste the contents of the pasteboard into a new file. > Save this new file to whatever directory in your home directory you will be > most comfortable finding it in. For this post, I will assume you saved it as > "timer." There is no extension necessary. > •3) Carefully determine the exact path to the newly saved Timer file. On my > machine, this past looks like > ~/timer > Because I save it on the root of my home directory (NOT the root directory > for the machine!). Once you know the exact path to the file, proceed: > •4) Open Terminal. If you need more help with this, contact me off list. > Once a Terminal window opens, type the following: > Chmod 755 (the exact path to the Timer file.) On my machine, this would look > like: > Chmod 755 ~/timer > •5) This timer will not only count down, but it plays a sound at certain > intervals within the main count-down sequence. It was designed to count > intervals while working out, but can also be used to time stuff in the oven, > your toenails growing, whatever. Thus, you need to tell it how many second > each interval will be, how long the entire count-down runs for, and how many > count-downs you want. For experienced programmers, those values can be set > from within TextEdit (contact me for more details on this). > •6) As I sent Timer, it is set up to beep every 3 minutes until 15 minutes > have been counted, then play another sound. It occurs to me that you don't > have the wave files that play these sounds, so you will have to substitute > them in the "Afplay" statement > within the script, or the thing will crash. > •7) The easiest way to start the timer is to open a Terminal window and type > "./(pathname)." Thus, I would type > "./timer" If you wish to change the defaults, you may enter the new values > for interval time, count-down time and number of count-downs by entering the > number of intervals (seconds), total time to count down (minutes) and number > of times to do the total count-down (also minutes). Thus, if I wanted to > change my timer to count down for one hour, giving me four intervals of 15 > minutes, for a total of four hours, I would type, from within the Terminal > window: > .timer 900 60 4 > 900 seconds in 15 minutes, 60 minutes in an hour, 4 hours total timing. > •8) Remember that if you do not set different values, Timer wil use the > defaults, which might give you a different timing result than you want. > •9) you may also find the file through Finder and simply press Command O to > open it, however this method will not give you the option to reset the > defaults. > •10) If you wish to modify this Timer, for example you will need to do so to > put in your own sounds (contact me off list and I will send the wave files > *I* use, but you are encouraged to use your own), highlight the file in > Finder and then, from the File menu, choose "open with," and then "other," > and "textEdit.app" from the menu that pops up. After you are done modifying > it in TextEdit, make sure that, when you save it, make sure that there is no > ".rtf," extension tacked on by TextEdit, as it wants to do that unless you > tell it not to. Again, write me off list if you need help with that. > •11) Enjoy your new, very flexible timer! Again, thanks to Theresa Ford for > writing the thing, she deserves full credit. > > > • Mark BurningHawk Baxter > • AIM, Skype and Twitter: BurningHawk1969 > • MSN: burninghawk1...@hotmail.com > • My home page: > • http://MarkBurningHawk.net/ > > <timer>-- > You received this message because you are subscribed to the Google Groups > "MacVisionaries" group. > To post to this group, send email to macvisionaries@googlegroups.com. > To unsubscribe from this group, send email to > macvisionaries+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/macvisionaries?hl=en. > -- You received this message because you are subscribed to the Google Groups "MacVisionaries" group. To post to this group, send email to macvisionaries@googlegroups.com. To unsubscribe from this group, send email to macvisionaries+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/macvisionaries?hl=en.