From f805f50732befbf33ad9d944919cd66371190a18 Mon Sep 17 00:00:00 2001 From: Scott Petersen Date: Tue, 4 Jun 2013 22:17:26 -0700 Subject: [PATCH] Moved some stuff to the base class. Cleanup and consistency changes. --- pyad2usb/devices.py | 133 ++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 90 deletions(-) diff --git a/pyad2usb/devices.py b/pyad2usb/devices.py index 3c06d80..b9d2b10 100644 --- a/pyad2usb/devices.py +++ b/pyad2usb/devices.py @@ -26,16 +26,43 @@ class Device(object): on_write = event.Event('Called when data has been written to the device') def __init__(self): - pass + self._id = '' + self._buffer = '' + self._interface = None + self._device = None + self._running = False + self._read_thread = ReadThread(self) # NOTE: not sure this is going to work.. def __del__(self): pass + @property + def id(self): + return self._id + + @id.setter + def id(self, value): + self._id = value + + def is_reader_alive(self): + """ + Indicates whether or not the reader thread is alive. + """ + return self._read_thread.is_alive() + + def stop_reader(self): + """ + Stops the reader thread. + """ + self._read_thread.stop() + class ReadThread(threading.Thread): """ Reader thread which processes messages from the device. """ + READ_TIMEOUT = 10 + def __init__(self, device): """ Constructor @@ -58,7 +85,7 @@ class Device(object): while self._running: try: - self._device.read_line(timeout=10) + self._device.read_line(timeout=self.READ_TIMEOUT) except util.TimeoutError, err: pass @@ -79,7 +106,6 @@ class USBDevice(Device): """ Returns all FTDI devices matching our vendor and product IDs. """ - devices = [] try: @@ -93,20 +119,14 @@ class USBDevice(Device): """ Constructor """ - Device.__init__(self) + self._device = Ftdi() + self._interface = interface self._vendor_id = vid self._product_id = pid self._serial_number = serial self._description = description - self._buffer = '' - self._device = Ftdi() - self._running = False - self._interface = interface - self._id = '' - - self._read_thread = Device.ReadThread(self) def open(self, baudrate=BAUDRATE, interface=None, index=0, no_reader_thread=False): """ @@ -165,22 +185,6 @@ class USBDevice(Device): self.on_close() - @property - def id(self): - return self._id - - def is_reader_alive(self): - """ - Indicates whether or not the reader thread is alive. - """ - return self._read_thread.is_alive() - - def stop_reader(self): - """ - Stops the reader thread. - """ - self._read_thread.stop() - def write(self, data): """ Writes data to the device. @@ -237,6 +241,8 @@ class USBDevice(Device): time.sleep(0.001) except (usb.core.USBError, FtdiError), err: + timer.cancel() + raise util.CommError('Error reading from AD2USB device: {0}'.format(str(err))) else: if got_line: @@ -285,18 +291,9 @@ class SerialDevice(Device): """ Device.__init__(self) - self._device = serial.Serial(timeout=0, writeTimeout=0) # Timeout = non-blocking to match pyftdi. - self._read_thread = Device.ReadThread(self) - self._buffer = '' - self._running = False self._interface = interface self._id = interface - - def __del__(self): - """ - Destructor - """ - pass + self._device = serial.Serial(timeout=0, writeTimeout=0) # Timeout = non-blocking to match pyftdi. def open(self, baudrate=BAUDRATE, interface=None, index=None, no_reader_thread=False): """ @@ -323,7 +320,6 @@ class SerialDevice(Device): # # Moving it to this point seems to resolve # all issues with it. - self._id = '{0}'.format(self._interface) except (serial.SerialException, ValueError), err: self.on_close() @@ -331,7 +327,7 @@ class SerialDevice(Device): raise util.NoDeviceError('Error opening AD2SERIAL device on port {0}.'.format(interface)) else: self._running = True - self.on_open((None, "AD2SERIAL")) # TODO: Fixme. + self.on_open(('N/A', "AD2SERIAL")) if not no_reader_thread: self._read_thread.start() @@ -350,22 +346,6 @@ class SerialDevice(Device): self.on_close() - @property - def id(self): - return self._id - - def is_reader_alive(self): - """ - Indicates whether or not the reader thread is alive. - """ - return self._read_thread.is_alive() - - def stop_reader(self): - """ - Stops the reader thread. - """ - self._read_thread.stop() - def write(self, data): """ Writes data to the device. @@ -389,7 +369,6 @@ class SerialDevice(Device): """ Reads a line from the device. """ - def timeout_event(): timeout_event.reading = False @@ -449,35 +428,25 @@ class SocketDevice(Device): Serial to IP interface. """ - def __init__(self, interface=None): + def __init__(self, interface=("localhost", 10000)): """ Constructor """ - self._host = "localhost" - self._port = 10000 - self._device = None - self._buffer = '' - self._running = False - self._id = '' - - self._read_thread = Device.ReadThread(self) - - def __del__(self): - """ - Destructor - """ - pass + self._interface = interface + self._host, self._port = interface def open(self, baudrate=None, interface=None, index=0, no_reader_thread=False): """ Opens the device. """ if interface is not None: + self._interface = interface self._host, self._port = interface try: self._device = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._device.connect((self._host, self._port)) + self._id = '{0}:{1}'.format(self._host, self._port) except socket.error, err: @@ -487,7 +456,7 @@ class SocketDevice(Device): else: self._running = True - self.on_open((None, "AD2SOCKET")) # TEMP: Change me. + self.on_open(('N/A', "AD2SOCKET")) if not no_reader_thread: self._read_thread.start() @@ -507,22 +476,6 @@ class SocketDevice(Device): self.on_close() - @property - def id(self): - return self._id - - def is_reader_alive(self): - """ - Indicates whether or not the reader thread is alive. - """ - return self._read_thread.is_alive() - - def stop_reader(self): - """ - Stops the reader thread. - """ - self._read_thread.stop() - def write(self, data): """ Writes data to the device. @@ -545,8 +498,6 @@ class SocketDevice(Device): except socket.error, err: raise util.CommError('Error while reading from device: {0}'.format(str(err))) - # ??? - Should we trigger an on_read here as well? - return data def read_line(self, timeout=0.0): @@ -588,6 +539,8 @@ class SocketDevice(Device): time.sleep(0.001) except socket.error, err: + timer.cancel() + raise util.CommError('Error reading from Socket device: {0}'.format(str(err))) else: if got_line: