Browse Source

Moved some stuff to the base class. Cleanup and consistency changes.

pyserial_fix
Scott Petersen 11 years ago
parent
commit
f805f50732
1 changed files with 43 additions and 90 deletions
  1. +43
    -90
      pyad2usb/devices.py

+ 43
- 90
pyad2usb/devices.py View File

@@ -26,16 +26,43 @@ class Device(object):
on_write = event.Event('Called when data has been written to the device') on_write = event.Event('Called when data has been written to the device')


def __init__(self): 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): def __del__(self):
pass 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): class ReadThread(threading.Thread):
""" """
Reader thread which processes messages from the device. Reader thread which processes messages from the device.
""" """


READ_TIMEOUT = 10

def __init__(self, device): def __init__(self, device):
""" """
Constructor Constructor
@@ -58,7 +85,7 @@ class Device(object):


while self._running: while self._running:
try: try:
self._device.read_line(timeout=10)
self._device.read_line(timeout=self.READ_TIMEOUT)
except util.TimeoutError, err: except util.TimeoutError, err:
pass pass


@@ -79,7 +106,6 @@ class USBDevice(Device):
""" """
Returns all FTDI devices matching our vendor and product IDs. Returns all FTDI devices matching our vendor and product IDs.
""" """

devices = [] devices = []


try: try:
@@ -93,20 +119,14 @@ class USBDevice(Device):
""" """
Constructor Constructor
""" """

Device.__init__(self) Device.__init__(self)


self._device = Ftdi()
self._interface = interface
self._vendor_id = vid self._vendor_id = vid
self._product_id = pid self._product_id = pid
self._serial_number = serial self._serial_number = serial
self._description = description 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): def open(self, baudrate=BAUDRATE, interface=None, index=0, no_reader_thread=False):
""" """
@@ -165,22 +185,6 @@ class USBDevice(Device):


self.on_close() 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): def write(self, data):
""" """
Writes data to the device. Writes data to the device.
@@ -237,6 +241,8 @@ class USBDevice(Device):
time.sleep(0.001) time.sleep(0.001)


except (usb.core.USBError, FtdiError), err: except (usb.core.USBError, FtdiError), err:
timer.cancel()

raise util.CommError('Error reading from AD2USB device: {0}'.format(str(err))) raise util.CommError('Error reading from AD2USB device: {0}'.format(str(err)))
else: else:
if got_line: if got_line:
@@ -285,18 +291,9 @@ class SerialDevice(Device):
""" """
Device.__init__(self) 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._interface = interface
self._id = 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): 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 # Moving it to this point seems to resolve
# all issues with it. # all issues with it.
self._id = '{0}'.format(self._interface)


except (serial.SerialException, ValueError), err: except (serial.SerialException, ValueError), err:
self.on_close() self.on_close()
@@ -331,7 +327,7 @@ class SerialDevice(Device):
raise util.NoDeviceError('Error opening AD2SERIAL device on port {0}.'.format(interface)) raise util.NoDeviceError('Error opening AD2SERIAL device on port {0}.'.format(interface))
else: else:
self._running = True self._running = True
self.on_open((None, "AD2SERIAL")) # TODO: Fixme.
self.on_open(('N/A', "AD2SERIAL"))


if not no_reader_thread: if not no_reader_thread:
self._read_thread.start() self._read_thread.start()
@@ -350,22 +346,6 @@ class SerialDevice(Device):


self.on_close() 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): def write(self, data):
""" """
Writes data to the device. Writes data to the device.
@@ -389,7 +369,6 @@ class SerialDevice(Device):
""" """
Reads a line from the device. Reads a line from the device.
""" """

def timeout_event(): def timeout_event():
timeout_event.reading = False timeout_event.reading = False


@@ -449,35 +428,25 @@ class SocketDevice(Device):
Serial to IP interface. Serial to IP interface.
""" """


def __init__(self, interface=None):
def __init__(self, interface=("localhost", 10000)):
""" """
Constructor 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): def open(self, baudrate=None, interface=None, index=0, no_reader_thread=False):
""" """
Opens the device. Opens the device.
""" """
if interface is not None: if interface is not None:
self._interface = interface
self._host, self._port = interface self._host, self._port = interface


try: try:
self._device = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._device = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._device.connect((self._host, self._port)) self._device.connect((self._host, self._port))

self._id = '{0}:{1}'.format(self._host, self._port) self._id = '{0}:{1}'.format(self._host, self._port)


except socket.error, err: except socket.error, err:
@@ -487,7 +456,7 @@ class SocketDevice(Device):
else: else:
self._running = True self._running = True


self.on_open((None, "AD2SOCKET")) # TEMP: Change me.
self.on_open(('N/A', "AD2SOCKET"))


if not no_reader_thread: if not no_reader_thread:
self._read_thread.start() self._read_thread.start()
@@ -507,22 +476,6 @@ class SocketDevice(Device):


self.on_close() 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): def write(self, data):
""" """
Writes data to the device. Writes data to the device.
@@ -545,8 +498,6 @@ class SocketDevice(Device):
except socket.error, err: except socket.error, err:
raise util.CommError('Error while reading from device: {0}'.format(str(err))) raise util.CommError('Error while reading from device: {0}'.format(str(err)))


# ??? - Should we trigger an on_read here as well?

return data return data


def read_line(self, timeout=0.0): def read_line(self, timeout=0.0):
@@ -588,6 +539,8 @@ class SocketDevice(Device):
time.sleep(0.001) time.sleep(0.001)


except socket.error, err: except socket.error, err:
timer.cancel()

raise util.CommError('Error reading from Socket device: {0}'.format(str(err))) raise util.CommError('Error reading from Socket device: {0}'.format(str(err)))
else: else:
if got_line: if got_line:


Loading…
Cancel
Save