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')

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:


Loading…
Cancel
Save