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