|
|
@@ -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: |
|
|
|