diff --git a/.gitignore b/.gitignore index 1623246..98eb1b6 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,5 @@ docs/_build/ # PyBuilder target/ +notes.txt diff --git a/SoftOscilloscope.py b/SoftOscilloscope.py index c95d0f2..2bc2524 100644 --- a/SoftOscilloscope.py +++ b/SoftOscilloscope.py @@ -2,77 +2,28 @@ import matplotlib.pyplot as plt from matplotlib import animation import numpy as np - -class Oscilloscope(object): - def __init__(self, stream=None): - self.stream = None - self.stream_type = None + +class BasePlot(object): + def __init__(self, stream): + self.stream = stream self.fig = plt.figure() self.fig.canvas.mpl_connect('close_event', self.handle_close) self.plot_list = [] - self.stream_is_open = False - self.stream_args = None - - def init_serial(self, com_port, baud_rate): - try: - self.stream = serial.Serial() - self.stream.port = com_port - self.stream.baud_rate = baud_rate - self.stream_type = 'serial' - self.stream_args = (com_port, baud_rate) - except SerialException, message: - print message - return - - def init_socket(self, address, port): - try: - self.stream = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.stream.connect((address, port)) - self.settimeout(5) - self.stream = self.stream.makefile() - self.stream_is_open = True - self.stream_type = 'socket' - self.stream_args = (address, port) - except SocketException, message: - print message - return - - def init_stream(self, stream): - if hasattr(stream, 'readline'): - if hasattr(stream, 'open') or hasattr(stream, 'connect'): - self.stream = stream - self.stream_type = 'generic' - else: - return - else: - return - + def open_stream(self): - if self.stream is None: - print "Stream not initialized." - return - if not self.stream_is_open - try: - if self.stream_type == 'serial': - self.stream.open() - elif self.stream_type == 'socket': - self.init_socket() - elif self.stream_type == 'generic': - if hasattr(self.stream, 'open'): - self.stream.open() - elif hasattr(self.stream, 'connect'): - self.stream.connect() - else - return - else: - return - self.stream_is_open = True - except error, message: - print message - return - else: - return - + self.stream.open() + + def close_stream(self): + if hasattr(self.stream, 'flushInput'): + self.stream.flushInput() + if hasattr(self.stream, 'flushOutput'): + self.stream.flushOutput() + self.stream.close() + print "stream closed" + + def handle_close_event(self, event): + self.close_stream() + def plot_init(self): trial_data = self.stream.readline().rstrip().split() for i in xrange(1, len(trial_data) + 1): @@ -101,20 +52,11 @@ def plot_animate(self, fn, read_size=1): plot[1]._invalidy = True except ValueError: pass + except error, message: + print message + return return [x[1] for x in self.plot_list] - - def handle_close(self, evt): - self.close_stream() - - def close_stream(self): - if hasattr(self.stream, 'flushInput'): - self.stream.flushInput() - if hasattr(self.stream, 'flushOutput'): - self.stream.flushOutput() - if hasattr(self.stream, 'close'): - self.stream.close() - print "stream closed" - + def start(self, read_size=1): self.open_stream() animated_plot = animation.FuncAnimation( @@ -127,4 +69,33 @@ def start(self, read_size=1): try: self.fig.show() except: - self.close_stream() \ No newline at end of file + self.close_stream() + +class SerialPlot(BasePlot): + def __init__(self, com_port, baud_rate): + self.serial_port = serial.Serial() + self.serial_port.baud_rate = baud_rate + self.serial_port.com_port = com_port + super(SerialPlot, self).__init__(self.serial_port) + + +class SocketPlot(BasePlot): + def __init__(self, address, port): + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.settimeout(5) + self.socket.connect((address, port)) + super(SocketPlot, self).__init__(self.socket.makefile()) + + def open_stream(self): + self.socket.connect((address, port)) + self.socket.settimeout(5) + self.stream = self.socket.makefile() + +class GenericStreamPlot(BasePlot): + def __init__(self, stream): + if hasattr(stream, 'open') \ + and hasattr(stream, 'close') \ + and hasattr(stream, 'readline'): + super(GenericStreamPlot, self).__init__(stream) + else: + raise BadAttributeError("One of the open/close/readline attributes is missing") \ No newline at end of file