#!/bin/bash
#
# AudioScope.sh
#
# At this point I will include and say thank you to "Corona688", a member of http://www.unix.com for his input...
# Also to others on the same site for their input too.
# Many thanks also go to the guys who have helped with this on http://www.linuxformat.com for all your input too...
#
# Tested in SOX mode on this Macbook Pro 13 inch, OSX 10.7.5 with the SOX sinewave generator enabled.
# Tested in /dev/dsp mode on an aging HP notebook running Debian 6.0.x with the /dev/dsp sinewave generator enabled.
# Tested in /dev/dsp mode on an Acer Aspire One netbook booting from a USB stick running PCLinuxOS 2009; also with
# the /dev/dsp sinewave generator enabled.
# Tested on all three in DEMO mode.
#
# Added the first simple circuit at the end of this script.
#
# Relevant pointers to help:-
# http://wisecracker.host22.com/public/AudioScope_Manual.readme
# http://wisecracker.host22.com/public/cal_draw.jpg
# http://wisecracker.host22.com/public/cal_plot.jpg
# http://wisecracker.host22.com/public/mic_ear1.jpg
# http://wisecracker.host22.com/public/mic_ear2.jpg
# http://wisecracker.host22.com/public/mic_ear3.jpg
# http://wisecracker.host22.com/public/mic_ear4.jpg
#
# The latest vesrion will always be here:-
# http://www.unix.com/shell-programming-scripting/212939-start-simple-audio-scope-shell-script.html
#
# NOTE TO SELF:- Remove "/tmp" and replace with "~" when ready, AND, "/tmp" is automatically cleared on this machine per reboot.
# #########################################################
# FOR SOund eXchance USERS ONLY!!! TESTED!!!
# The lines below, from ">" to "xterm", will generate a new shell script and execute it in a new xterm terminal...
# Just EDIT out the comments and then EDIT the line pointing to the correct </full/path/to/sox/> to use it.
# It assumes that you have SoX installed. When this script is run it generates a 1KHz sinewave in a separate window
# that lasts for 8 seconds. Just press ENTER when this window is active and it will repeat again. To quit this script
# and close the window just press Ctrl-C. This generator will be needed for the calibration of some timebase ranges.
#> /tmp/1KHz-Test.sh
#chmod 744 /tmp/1KHz-Test.sh
#printf '#!/bin/bash\n' >> /tmp/1KHz-Test.sh
#printf '> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh
#printf 'data="\\\\x80\\\\x26\\\\x00\\\\x26\\\\x7F\\\\xD9\\\\xFF\\\\xD9"\n' >> /tmp/1KHz-Test.sh
#printf 'for waveform in {0..8191}\n' >> /tmp/1KHz-Test.sh
#printf 'do\n' >> /tmp/1KHz-Test.sh
#printf ' printf "$data" >> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh
#printf 'done\n' >> /tmp/1KHz-Test.sh
#printf 'while true\n' >> /tmp/1KHz-Test.sh
#printf 'do\n' >> /tmp/1KHz-Test.sh
#printf ' /full/path/to/sox/play -b 8 -r 8000 -e unsigned-integer /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh
#printf ' read -p "Press ENTER to rerun OR Ctrl-C to quit:- " -e kbinput\n' >> /tmp/1KHz-Test.sh
#printf 'done\n' >> /tmp/1KHz-Test.sh
#sleep 1
#xterm -e /tmp/1KHz-Test.sh &
# #########################################################
# FOR /dev/dsp USERS ONLY!!! TESTED!!!
# The lines below, from ">" to "xterm", will generate a new shell script and execute it in a new xterm terminal...
# Just EDIT out the comments to use it.
# It assumes that you have /dev/dsp _installed_. When this script is run it generates a 1KHz sinewave in a separate window
# that lasts for 8 seconds. Just press ENTER when this window is active and it will repeat again. To quit this script
# and close the window just press Ctrl-C. This generator will be needed for the calibration of some timebase ranges.
#> /tmp/1KHz-Test.sh
#chmod 744 /tmp/1KHz-Test.sh
#printf '#!/bin/bash\n' >> /tmp/1KHz-Test.sh
#printf '> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh
#printf 'data="\\\\x80\\\\x26\\\\x00\\\\x26\\\\x7F\\\\xD9\\\\xFF\\\\xD9"\n' >> /tmp/1KHz-Test.sh
#printf 'for waveform in {0..8191}\n' >> /tmp/1KHz-Test.sh
#printf 'do\n' >> /tmp/1KHz-Test.sh
#printf ' printf "$data" >> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh
#printf 'done\n' >> /tmp/1KHz-Test.sh
#printf 'while true\n' >> /tmp/1KHz-Test.sh
#printf 'do\n' >> /tmp/1KHz-Test.sh
#printf ' cat /tmp/sinewave.raw > /dev/dsp\n' >> /tmp/1KHz-Test.sh
#printf ' read -p "Press ENTER to rerun OR Ctrl-C to quit:- " -e kbinput\n' >> /tmp/1KHz-Test.sh
#printf 'done\n' >> /tmp/1KHz-Test.sh
#sleep 1
#xterm -e /tmp/1KHz-Test.sh &
# #########################################################
# Variables in use.
ifs_str=$IFS
version=" \$VER: AudioScope.sh_Version_0.00.70_PD_B.Walker_G0LCU. "
setup=" Please wait while the very first scan and configuration file is generated. "
# Default first time run capture mode, 0 = DEMO.
demo=0
# Draw proceedure mode, 0 = OFF
drawline=0
# Pseudo-continuous data file saving.
savefile="0000000000"
save_string="OFF"
# "hold" and "status" will always be reset to "1" on program exit.
hold=1
status=1
# "count", "number" and "char" are reusable variables...
count=0
number=0
char="?"
# Vertical components...
# vert_one and vert_two are the vertical plotting points for the draw() function...
vert_one=2
vert_two=2
vert=12
vert_shift=2
vshift="?"
vert_array=""
vert_draw=9
# Display setup...
graticule="Public Domain, 2013, B.Walker, G0LCU."
# Keyboard components...
kbinput="?"
tbinput=1
# "str_len" is a reusable variable IF required...
str_len=1
# "grab" is used for internal pseudo-synchronisation...
grab=0
# "zero_offset" can only be manually changed in the AudioScope.config file, OR, here...
zero_offset=-2
# Horizontal components...
horiz=9
# Scan retraces...
scan=1
scanloops=1
# Timebase variable components...
subscript=0
# "scan_start" is from 0 to ( length of file - 64 )...
scan_start=0
# "scan_jump" is from 1 to ( ( ( scan_end - scan_start ) / 64) + 1 )...
scan_jump=1
# "scan_end" is at least 64 bytes in from the absolute file end...
scan_end=47935
# Synchronisation variables...
# synchronise switches the syncchroisation ON or OFF...
synchronise="OFF"
# sync_point is any value between 15 and 240 of the REAL grab(s)...
sync_point=128
sync_input="?"
# #########################################################
# Add the program tilte to the Terminal title bar...
# This may NOT work in every Terminal so just comment it out if it doesn't.
printf "\x1B]0;Shell AudioScope.\x07"
# #########################################################
# Generate a config file and temporarily store inside /tmp
if [ -f /tmp/AudioScope.config ]
then
. /tmp/AudioScope.config
else
user_config
fi
user_config()
{
> /tmp/AudioScope.config
chmod 644 /tmp/AudioScope.config
printf "demo=$demo\n" >> /tmp/AudioScope.config
printf "drawline=$drawline\n" >> /tmp/AudioScope.config
printf "hold=1\n" >> /tmp/AudioScope.config
printf "status=1\n" >> /tmp/AudioScope.config
printf "zero_offset=$zero_offset\n" >> /tmp/AudioScope.config
printf "scanloops=$scanloops\n" >> /tmp/AudioScope.config
printf "scan_start=$scan_start\n" >> /tmp/AudioScope.config
printf "scan_jump=$scan_jump\n" >> /tmp/AudioScope.config
printf "scan_end=$scan_end\n" >> /tmp/AudioScope.config
printf "vert_shift=$vert_shift\n" >> /tmp/AudioScope.config
printf "setup='$setup'\n" >> /tmp/AudioScope.config
printf "save_string='$save_string'\n" >> /tmp/AudioScope.config
}
# #########################################################
# Screen display setup function.
display()
{
# Set foregound and background graticule colours and foreground and background other window colours.
printf "\x1B[0;36;44m"
clear
graticule=" +-------+-------+-------+---[\x1B[0;37;44mDISPLAY\x1B[0;36;44m]---+-------+-------+--------+ \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ < \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ < \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ < \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" | | | | + | | | | \n"
graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ \n"
graticule=$graticule" \x1B[0;37;40m+-----------------------------[COMMAND WINDOW]------------------------------+\x1B[0;37;44m \n"
graticule=$graticule" \x1B[0;37;40m| COMMAND:- |\x1B[0;37;44m \n"
graticule=$graticule" \x1B[0;37;40m+------------------------------[STATUS WINDOW]-------------------------------+\x1B[0;37;44m \n"
graticule=$graticule" \x1B[0;37;40m| Stopped... |\x1B[0;37;44m \n"
graticule=$graticule" \x1B[0;37;40m|$setup|\x1B[0;37;44m \n"
graticule=$graticule" \x1B[0;37;40m+----------------------------------------------------------------------------+\x1B[0;37;44m "
printf "$graticule"
# Set the colours for plotting.
printf "\x1B[1;37;44m"
}
# #########################################################
# Pick which method to capture, (and store), the waveform on the fly.
waveform()
{
> /tmp/waveform.raw
chmod 644 /tmp/waveform.raw
# Demo mode, generate 48000 bytes of random data.
if [ $demo -eq 0 ]
then
# Use "sleep" to simulate a 1 second burst.
sleep 1
# "/dev/urandom is now used instead of RANDOM as it is MUCH faster.
dd if=/dev/urandom of=/tmp/waveform.raw bs=48000 count=1
fi
# Using the aging(/old) /dev/dsp device, mono, 8 bits per sample and 8KHz sampling rate, 8000 unsigned-integer bytes of data...
# Now tested on PCLinuxOS 2009 and Debian 6.0.x.
if [ $demo -eq 1 ]
then
# This uses the oss-compat installation from your distro's repository...
dd if=/dev/dsp of=/tmp/waveform.raw bs=8000 count=1
fi
# The main means of obtaining the unsigned-integer data, using SoX, (Sound eXcahnge) from http://sox.sourceforge.net ...
if [ $demo -eq 2 ]
then
# Change the absolute address for your location of "sox"...
/Users/barrywalker/Downloads/sox-14.4.0/sox -q -V0 -d -t raw -r 48000 -b 8 -c 1 -e unsigned-integer -> /tmp/waveform.raw trim 0 00:01
fi
}
# #########################################################
# Plot the points inside the window...
plot()
{
subscript=$scan_start
vert_array=""
for horiz in {9..72}
do
vert=`hexdump -n1 -s$subscript -v -e '1/1 "%u"' /tmp/waveform.raw`
# Add a small offset to give a straight line with zero input allowing for mid-point sound card bit error.
vert=$[ ( $vert + $zero_offset ) ]
if [ $vert -le 0 ]
then
vert=0
fi
if [ $vert -ge 255 ]
then
vert=255
fi
# Pseudo-vertical shift of + or - 1 vertical division maximum.
vert=$[ ( ( $vert / 16 ) + $vert_shift ) ]
# Ensure the plot is NOT out of bounds after moving the shift position.
if [ $vert -le 2 ]
then
vert=2
fi
if [ $vert -ge 17 ]
then
vert=17
fi
subscript=$[ ( $subscript + $scan_jump ) ]
# Generate a smple space delimited 64 sample array.
vert_array="$vert_array$vert "
printf "\x1B[1;37;44m\x1B["$vert";"$horiz"f*"
done
# Set end of plot to COMMAND window.
printf "\x1B[0;37;40m\x1B[20;14f"
}
# #########################################################
# This function connects up the plotted points.
# Defaults to OFF on the very first time run and must be manually enabled if needed.
draw()
{
statusline
IFS=" "
subscript=0
number=0
vert_one=2
vert_two=2
vert_draw=( $vert_array )
for horiz in {9..71}
do
# Obtain the two vertical components.
vert_one=${vert_draw[ $subscript ]}
subscript=$[ ( $subscript + 1 ) ]
vert_two=${vert_draw[ $subscript ]}
# Now subtract them and obtain an absolute value - ALWAYS 0 to positive...
number=$[ ( $vert_two - $vert_one ) ]
number=${number#-}
# This decision section _is_ needed.
if [ $number -le 1 ]
then
: # NOP. Do nothing...
fi
# This section does the drawing...
if [ $number -ge 2 ]
then
if [ $vert_one -gt $vert_two ]
then
vert_one=$[ ( $vert_one - 1 ) ]
while [ $vert_one -gt $vert_two ]
do
printf "\x1B[1;37;44m\x1B["$vert_one";"$horiz"f*"
vert_one=$[ $vert_one - 1 ]
done
fi
if [ $vert_two -gt $vert_one ]
then
vert_one=$[ ( $vert_one + 1 ) ]
while [ $vert_one -lt $vert_two ]
do
printf "\x1B[1;37;44m\x1B["$vert_one";"$horiz"f*"
vert_one=$[ $vert_one + 1 ]
done
fi
fi
IFS=$ifs_str
done
# Set end of plot to COMMAND window.
printf "\x1B[0;37;40m\x1B[20;14f"
}
# #########################################################
# This is the information line _parser_...
statusline()
{
printf "\x1B[0;37;40m\x1B[22;3f \x1B[22;4f"
if [ $status -eq 0 ]
then
printf "Stopped..."
fi
if [ $status -eq 1 ]
then
printf "Running $scan of $scanloops scans..."
fi
if [ $status -eq 2 ]
then
printf "Running in single shot storage mode..."
fi
if [ $status -eq 3 ]
then
printf "Drawing the scan..."
fi
if [ $status -eq 4 ]
then
printf "Synchroniastion set to $sync_point$synchronise..."
fi
if [ $status -eq 5 ]
then
printf "CAUTION, AUTO-SAVING FACILITY ENABLED!!!"
fi
if [ $status -eq 254 ]
then
status=1
setup=$version
printf "\x1B[23;3f$setup"
fi
# Set end of plot to COMMAND window.
printf "\x1B[0;37;40m\x1B[20;14f"
}
# #########################################################
# All keyboard commands appear here when the scanning stops; there will be lots of them to make subtle changes...
kbcommands()
{
IFS=$ifs_str
status=1
scan=1
read -p "Press <CR> to (re)run, HELP or QUIT<CR> " -e kbinput
printf "\x1B[0;37;40m\x1B[20;14f "
# Rerun scans captured or stored.
if [ "$kbinput" == "" ]
then
status=1
statusline
fi
# Run scans in captured, (REAL scan), mode only.
if [ "$kbinput" == "RUN" ]
then
status=1
hold=1
statusline
fi
# Swtich off capture mode and rerun one storage shot only, this disables the DRAW command.
# Use DRAW to re-enable again. This is deliberate for slow machines...
if [ "$kbinput" == "HOLD" ]
then
drawline=0
status=2
hold=0
scanloops=1
statusline
sleep 1
fi
# Quit the program.
if [ "$kbinput" == "QUIT" ]
then
status=255
break
fi
# Display the _online_ HELP file in default terminal colours.
if [ "$kbinput" == "HELP" ]
then
status=0
scanloops=1
hold=0
commandhelp
fi
# Enable DEMO pseudo-capture mode, default, but with 10 sweeps...
if [ "$kbinput" == "DEMO" ]
then
status=1
scan_start=0
scan_jump=1
scanloops=10
scan_end=47935
demo=0
hold=1
statusline
sleep 1
fi
# Enable /dev/dsp capture mode, if your Linux flavour does NOT have it, install oss-compat from the distro's repository.
# This is the mode used to test on Debian 6.0.x and now PCLinuxOS 2009...
if [ "$kbinput" == "DSP" ]
then
status=1
scan_start=0
scan_jump=1
scanloops=1
scan_end=7935
hold=1
demo=1
statusline
sleep 1
fi
# Eable SOX capture mode, this code is designed around this application on a Macbook Pro 13 inch OSX 10.7.5...
if [ "$kbinput" == "SOX" ]
then
status=1
scan_start=0
scan_jump=1
scanloops=1
scan_end=47935
hold=1
demo=2
statusline
sleep 1
fi
# The next three commands set the timebase scans; 1, 10 or 100 before COMMAND mode is re-enabled and can be used.
if [ "$kbinput" == "ONE" ]
then
status=1
scanloops=1
hold=1
fi
if [ "$kbinput" == "TEN" ]
then
status=1
scanloops=10
hold=1
fi
if [ "$kbinput" == "HUNDRED" ]
then
status=1
scanloops=100
hold=1
fi
if [ "$kbinput" == "VER" ]
then
status=254
fi
# ************ Horizontal components. *************
# ************ User timebase section. *************
# Written longhand for kids to understand.
if [ "$kbinput" == "TBVAR" ]
then
# Ensure capture mode is turned off.
# RUN<CR> will re-enable it if required.
scanloops=1
status=1
hold=0
printf "\x1B[0;37;40m\x1B[20;14f"
read -p "Set timebase starting point. From 0 to $scan_end<CR> " -e tbinput
printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f"
# Ensure the timebase values are set to default before changing.
scan_start=0
scan_jump=1
# Eliminate any keyboard error longhand...
# Ensure a NULL string does NOT exist.
if [ "$tbinput" == "" ]
then
scan_start=0
tbinput=0
fi
# Find the length of the inputted string.
str_len=`printf "${#tbinput}"`
# Set the string to the correct last position for the _subscript_ point.
str_len=$[ ( $str_len - 1 ) ]
# Now check for continuous numerical charaters ONLY.
for count in $( seq 0 $str_len )
do
# Reuse variable _number_ to obtain each character per loop.
number=`printf "${tbinput:$count:1}"`
# Now convert the character to a decimal number.
number=`printf "%d" \'$number`
# IF ANY ASCII character exists that is not numerical then reset the scan start point.
if [ $number -le 47 ]
then
scan_start=0
tbinput=0
fi
if [ $number -ge 58 ]
then
scan_start=0
tbinput=0
fi
done
# If all is OK pass the "tbinput" value into the "scan_start" variable.
scan_start=$tbinput
# Do a final check that the number is not out of bounds.
if [ $scan_start -le 0 ]
then
scan_start=0
fi
if [ $scan_start -ge $scan_end ]
then
scan_start=$scan_end
fi
# Use exactly the same method as above to determine the jump interval.
# Now set the jump interval, this is the scan speed...
printf "\x1B[0;37;40m\x1B[20;14f"
read -p "Set timebase user speed. From 1 to $[ ( ( ( ( $scan_end - $scan_start ) / 64 ) + 1 ) ) ]<CR> " -e tbinput
printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f"
# Eliminate any keyboard error longhand...
# Ensure a NULL string does NOT exist.
if [ "$tbinput" == "" ]
then
scan_jump=1
tbinput=1
fi
# Find the length of the inputted string.
str_len=`printf "${#tbinput}"`
# Set the string to the correct last position for the _subscript_ point.
str_len=$[ ( $str_len - 1 ) ]
# Now check for continuous numerical charaters ONLY.
for count in $( seq 0 $str_len )
do
# Reuse variable _number_ to obtain each character per loop.
number=`printf "${tbinput:$count:1}"`
# Now convert the character to a decimal number.
number=`printf "%d" \'$number`
# IF ANY ASCII character exists that is not numerical then reset the scan jump value.
if [ $number -le 47 ]
then
scan_jump=1
tbinput=1
fi
if [ $number -ge 58 ]
then
scan_jump=1
tbinput=1
fi
done
# If all is OK pass the "tbinput" value into the "scan_jump" variable.
scan_jump=$tbinput
# Do a final check that the number is not out of bounds.
if [ $scan_jump -le 1 ]
then
scan_jump=1
fi
# Reuse number for upper limit...
number=$[ ( ( ( $scan_end - $scan_start ) / 64 ) + 1 ) ]
if [ $scan_jump -ge $number ]
then
scan_jump=$number
fi
printf "\x1B[0;37;40m\x1B[22;4fScan start at offset $scan_start, with a jump rate of $scan_jump."
sleep 1
setup=" Uncalibrated horizontal scan, vertical and storage modes, AC coupled only. "
fi
# ********** User timebase section end. ***********
# ********* Calibrated timebase section. **********
if [ "$kbinput" == "FASTEST" ]
then
scan_start=0
scan_jump=1
setup=" Uncalibrated horizontal scan, vertical and storage modes, AC coupled only. "
fi
if [ "$kbinput" == "1mS" ]
then
scan_start=0
setup=" 1mS/DIV, uncalibrated vertical and storage modes, AC coupled only. "
if [ $demo -eq 0 ]
then
scan_jump=6
fi
if [ $demo -eq 1 ]
then
scan_jump=1
fi
if [ $demo -eq 2 ]
then
scan_jump=6
fi
fi
if [ "$kbinput" == "10mS" ]
then
scan_start=0
setup=" 10mS/DIV, uncalibrated vertical and storage modes, AC coupled only. "
if [ $demo -eq 0 ]
then
scan_jump=60
fi
if [ $demo -eq 1 ]
then
scan_jump=10
fi
if [ $demo -eq 2 ]
then
scan_jump=60
fi
fi
if [ "$kbinput" == "100mS" ]
then
scan_start=0
setup=" 100mS/DIV, uncalibrated vertical and storage modes, AC coupled only. "
if [ $demo -eq 0 ]
then
scan_jump=600
fi
if [ $demo -eq 1 ]
then
scan_jump=100
fi
if [ $demo -eq 2 ]
then
scan_jump=600
fi
fi
# *********** Calibrated timebase end. ************
#
# ************* Vertical components. **************
# ******** Pseudo-vertical shift control. *********
if [ "$kbinput" == "SHIFT" ]
then
while true
do
scanloops=1
status=1
hold=0
printf "\x1B[0;37;40m\x1B[20;14f"
# This input method is something akin to BASIC's INKEY$...
read -p "Vertical shift:- U for up 1, D for down 1, <CR> to RETURN:- " -n 1 -s vshift
printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f"
if [ "$vshift" == "" ]
then
break
fi
if [ "$vshift" == "D" ]
then
vert_shift=$[ ( $vert_shift + 1 ) ]
fi
if [ "$vshift" == "U" ]
then
vert_shift=$[ ( $vert_shift - 1 ) ]
# Ensure the shift psoition is NOT out of bounds.
fi
if [ $vert_shift -ge 6 ]
then
vert_shift=6
fi
if [ $vert_shift -le -2 ]
then
vert_shift=-2
fi
printf "\x1B[23;3f Vertical shift is $[ ( 2 - $vert_shift ) ] from the mid-point position... "
done
fi
# ****** Pseudo-vertical shift control end. *******
# ********** Connect all plotted points. **********
if [ "$kbinput" == "DRAW" ]
then
drawline=1
status=3
hold=0
scanloops=1
statusline
sleep 1
fi
# ************* Connected plots done. *************
#
# **** PSEUDO synchronisation and triggering. ****
if [ "$kbinput" == "TRIG" ]
then
synchronise=" and OFF"
sync_point=128
status=0
hold=0
scan_start=$[ ( $scan_start + 1 ) ]
scan_jump=1
scanloops=1
subscript=$scan_start
grab=0
if [ $scan_start -ge $scan_end ]
then
scan_start=0
break
fi
printf "\x1B[0;37;40m\x1B[20;14f"
read -p "Set trigger type, <CR> to disable:- " -e kbinput
printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f"
if [ "$kbinput" == "SYNCEQ" ]
then
synchronise=", ON and fixed"
trigger
for subscript in $( seq $scan_start $scan_end )
do
grab=`hexdump -n1 -s$subscript -v -e '1/1 "%u"' /tmp/waveform.raw`
if [ $grab -eq $sync_point ]
then
scan_start=$subscript
break
fi
done
fi
if [ "$kbinput" == "SYNCGT" ]
then
synchronise=", ON and positive going"
trigger
: # NOP... Place holder only.
fi
if [ "$kbinput" == "SYNCLT" ]
then
synchronise=", ON and negative going"
trigger
: # NOP... Place holder only...
fi
if [ "$kbinput" == "EXT" ]
then
# Remember Corona688's code from the early stages of this thread...
synchronise=", EXTERNAL and waiting"
: # NOP... Place holder only,
fi
status=4
statusline
sleep 1
fi
# ** PSEUDO synchronisation and triggering end. ***
#
# ************* Auto-saving facility. *************
if [ "$kbinput" == "SAVEON" ]
then
status=5
save_string="ON"
statusline
sleep 2
fi
if [ "$kbinput" == "SAVEOFF" ]
then
status=1
save_string="OFF"
statusline
fi
# *********** Auto-saving facility end. ***********
statusline
}
# #########################################################
# Help clears the screen to the startup defaults and prints command line help...
commandhelp()
{
status=2
hold=0
printf "\x1B[0m"
clear
printf "CURRENT COMMANDS AVAILABLE:-\n\n"
printf "<CR> ................................................. Reruns the scan(s) again.\n"
printf "RUN<CR> ......................... Reruns the scan(s), always with real captures.\n"
printf "QUIT<CR> .................................................... Quits the program.\n"
printf "HELP<CR> ................................................ This help as required.\n"
printf "HOLD<CR> ........................................ Switch to pseudo-storage mode.\n"
printf "DEMO<CR> .......... Switch capture to default DEMO mode and 10 continuous scans.\n"
printf "DSP<CR> ...................... Switch capture to Linux /dev/dsp mode and 1 scan.\n"
printf "SOX<CR> ....... Switch capture to multi-platform SOund eXchange mode and 1 scan.\n"
printf "ONE<CR> ......................................... Sets the number of scans to 1.\n"
printf "TEN<CR> ........................................ Sets the number of scans to 10.\n"
printf "HUNDRED<CR> ............. Sets the number of scans to 100, (not very practical).\n"
printf "VER<CR> .................. Displays the version number inside the status window.\n"
printf "TBVAR<CR> ............ Set up uncalibrated user timebase offset and jump points.\n"
printf " SubCommands: ............................. Follow the on screen prompts.\n"
printf "FASTEST<CR> .................. Set all modes to the fastest possible scan speed.\n"
printf "1mS<CR> .......................................... Set scanning rate to 1mS/DIV.\n"
printf "10mS<CR> ........................................ Set scanning rate to 10mS/DIV.\n"
printf "100mS<CR> ...................................... Set scanning rate to 100mS/DIV.\n"
printf "SHIFT<CR> ............ Set the vertical position from -4 to +4 to the mid-point.\n"
printf " SubCommands: ............ Press U or D then <CR> when value is obtained.\n"
printf "\n"
read -p "Press <CR> to continue:- " -e kbinput
clear
printf "CURRENT COMMANDS AVAILABLE:-\n\n"
printf "DRAW<CR> .......... Connect up each vertical plot to give a fully lined display.\n"
printf "TRIG<CR> ........... Sets the synchronisation methods for storage mode retraces.\n"
printf " SubCommand: SYNCEQ ........ Set the internal SYNC to a fixed value only.\n"
printf " SubCommand: SYNCGT ......................................... Unfinished.\n"
printf " SubCommand: SYNCLT ......................................... Unfinished.\n"
printf " SubCommand: EXT ............................................ Unfinished.\n"
printf "SAVEON<CR> .................... Auto-saves EVERY scan with a numerical filename.\n"
printf "SAVEOFF<CR> ....................................... Disables auto-save facility.\n"
printf "\n"
printf "Manual here: < http://wisecracker.host22.com/public/AudioScope_Manual.readme >\n"
printf "\n"
read -p "Press <CR> to continue:- " -e kbinput
display
statusline
}
# #########################################################
# This is the active part of the pseudo-synchroisation section.
trigger()
{
while true
do
printf "\x1B[0;37;40m\x1B[20;14f"
# This input method is something akin to BASIC's INKEY$...
read -p "Sync point:- U for up 1, D for down 1, <CR> to RETURN:- " -n 1 -s sync_input
printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f"
if [ "$sync_input" == "" ]
then
break
fi
if [ "$sync_input" == "U" ]
then
sync_point=$[ ( $sync_point + 1 ) ]
fi
if [ "$sync_input" == "D" ]
then
sync_point=$[ ( $sync_point - 1 ) ]
# Ensure the synchronisation point is NOT out of bounds.
fi
if [ $sync_point -ge 240 ]
then
sync_point=240
fi
if [ $sync_point -le 15 ]
then
sync_point=15
fi
printf "\x1B[23;3f Synchronisation point set to $sync_point... "
done
}
# #########################################################
# Do an initial screen set up...
display
statusline
setup=$version
# #########################################################
# This is the main loop...
while true
do
for scan in $( seq 1 $scanloops )
do
# "hold" determines a new captured scan or retrace of an existing scan...
if [ $hold -eq 1 ]
then
waveform
fi
display
statusline
plot
if [ $drawline -eq 1 ]
then
draw
fi
if [ "$save_string" == "ON" ]
then
savefile=`date +%s`
cp /tmp/waveform.raw /tmp/$savefile
fi
done
status=0
statusline
kbcommands
done
# #########################################################
# Getout, autosave AudioScope.config, cleanup and quit...
if [ $status -eq 255 ]
then
# Save the user configuration file.
user_config
# Remove "Shell AudioScope" from the title bar.
printf "\x1B]0;\x07"
sleep 0.1
# Reset back to normal...
printf "\x1B[0m"
clear
reset
fi
printf "\nProgram terminated...\n\nTerminal reset back to startup defaults...\n\n"
# #########################################################
# The FIRST extremely simple construction part.
# This is a simple I/O board for testing for the Macbook Pro 13 inch...
# It is just as easy to replace the 4 pole 3.5mm Jack Plug with 2 x 3.5mm Stereo Jack
# Plugs for machines with separate I/O sockets.
# Orange. White flylead.
# Tip -----> O <------------------------------------+---------O <----------+--------+
# Ring 1 --> H <-------------------------+-----------)--------O <- Blue. | |
# Ring 2 --> H <--------------+-----+-----)----------)--------O <- Yellow. | |
# _Gnd_ ---> H <----+ | C1 | + | | O <- Green. | |
# +===+ | \ ===== \ \ | \ |
# | | | / --+-- / / | / |
# P1 | | | \ | \ \ | \ |
# | | | R1 / | R2 / R3 / | R4 / |
# \ / | \ | \ \ | \ |
# H | / | / / | / |
# ~~~ | | | | | | | |
# +---------+------)---+----------+---------+------------+ |
# Pseudo-Ground. -> __|__ | |
# ///// +-----------------------------------------------+
# P1 ......... 3.5mm, 4 pole jack plug.
# R1 ......... 2K2, 1/8W, 5% tolerence resistor.
# R2, R3 ..... 33R, 1/8W, 5% tolerence resistor.
# R4 ......... 1M, 1/8W, 5% tolerence resistor.
# C1 ......... 47uF, 16V electrolytic.
# 4 way terminal block.
# Stripboard, (Verobaord), as required.
# Green, yellow, orange, blue and white wire as required.
# Small cable ties, optional.
# Stick on cable clip, optional.
# Crimp terminal, 1 off, optional.
# #########################################################