# SimpleScope.py
# A standard text mode Python Audio LF Oscilloscope DEMO.
#
# (This working idea WILL become the basis of a Data-Logger/Transient-Recorder
# being worked on for Linux, Windows, Classic AMIGA and WinUAE using Arduino.)
#
# (Original working idea, (C)2010, B.Walker, G0LCU.)
# Now issued as Public Domian. You may do as you please with this code.
#
# To run type at the Python prompt:-
# >>> execfile('/full/path/to/file/SimpleScope.py')
# Where "/full/path/to/file/" is the drawer(/folder/directory) that
# "SimpleScope.py" resides.
#
# For this DEMO /dev/dsp must exist for it to work, if not, then install
# oss-compat from your distro's repository.
# Ensure the sound system is not in use by another application.
#
# Tested on PCLinuxOS 2009, Knoppix 5.1.1, (and Debian 6.0.0 <- WITH
# oss-compat installed).
# "setterm" and "clear" are assumed to be available.
#
# This is the only import required for this working DEMO.
import os
def main():
# Set everything as global for this DEMO.
global ScopeScreen
global ScopeWindow
global audio
global plot
global position
global horiz
global record
global grab
# Allocate values.
ScopeScreen="(C)2011, B.Walker, G0LCU."
ScopeWindow="Simple LF Audio Oscilloscope."
audio="/dev/dsp"
plot=0
position=67
horiz=0
record=" "
grab=255
# Turn off the cursor.
os.system("setterm -cursor off")
while 1:
# This is the basic Osilloscope graticule window for this DEMO.
ScopeScreen="+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
# Save the this graticule window for further writing to.
ScopeWindow=open("/tmp/ScopeScreen.txt","wb+")
ScopeWindow.write(ScopeScreen)
ScopeWindow.close()
# Grab a string of 64 bytes in size at 8KHz sampling speed.
# If you have an internal microphone just shout into it and
# see a 4 bit depth waveform of you voice.
# Alternatively feed a signal into the external mic input socket
# and adjust the levels using the I/P and O/P volume control mixers.
audio=file("/dev/dsp","rb")
record=audio.read(64)
audio.close()
horiz=0
ScopeWindow=open("/tmp/ScopeScreen.txt","rb+")
while horiz<=63:
# Convert each part of the record string into decimal.
grab=ord(record[horiz])
# Now convert to 4 bit depth for text mode display.
plot=int(grab/16)
# Invert to suit the text display window.
plot=15-plot
# Don't allow an error.
if plot<=0: plot=0
if plot>=15: plot=15
# Set up the horizontal position and plot.
position=68+horiz+plot*67
ScopeWindow.seek(position)
ScopeWindow.write("o")
horiz=horiz+1
# Now get the whole ScopeWindow with the plotted points......
ScopeWindow.seek(0)
ScopeScreen=ScopeWindow.read(1206)
ScopeWindow.close()
# ......and print it to the terminal window.
print os.system("clear"),chr(13)," ",chr(13),
print ScopeScreen
print "Simple Audio Oscilloscope DEMO using /dev/dsp in Linux."
print "Ctrl-C to quit..."
# Reset the cursor assuming it gets here... ;o)
os.system("setterm -cursor on")
main()
# SimpleScope.py program end.
# Enjoy finding simple solutions to often very difficult problems.