Browse Source

Exception handling. Consistency changes. Docs.

pyserial_fix
Scott Petersen 12 years ago
parent
commit
d30d657cf0
1 changed files with 51 additions and 27 deletions
  1. +51
    -27
      pyad2usb/devices.py

+ 51
- 27
pyad2usb/devices.py View File

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

def __init__(self):
"""
Constructor
"""
self._id = ''
self._buffer = ''
self._interface = None
self._device = None
self._running = False
self._read_thread = Device.ReadThread(self) # NOTE: not sure this is going to work..

def __del__(self):
pass
self._read_thread = Device.ReadThread(self)

@property
def id(self):
"""
Retrieve the device ID.
"""
return self._id

@id.setter
def id(self, value):
"""
Sets the device ID.
"""
self._id = value

def is_reader_alive(self):
@@ -158,9 +164,7 @@ class USBDevice(Device):

self._id = 'USB {0}:{1}'.format(self._device.usb_dev.bus, self._device.usb_dev.address)
except (usb.core.USBError, FtdiError), err:
self.on_close()

raise util.NoDeviceError('Error opening AD2USB device: {0}'.format(str(err)))
raise util.NoDeviceError('Error opening device: {0}'.format(str(err)))
else:
self._running = True
if not no_reader_thread:
@@ -194,13 +198,21 @@ class USBDevice(Device):

self.on_write(data)
except FtdiError, err:
raise util.CommError('Error writing to AD2USB device.')
raise util.CommError('Error writing to device: {0}'.format(str(err)))

def read(self):
"""
Reads a single character from the device.
"""
return self._device.read_data(1)
ret = None

try:
ret = self._device.read_data(1)

except (usb.core.USBError, FtdiError), err:
raise util.CommError('Error reading from device: {0}'.format(str(err)))

return ret

def read_line(self, timeout=0.0):
"""
@@ -243,7 +255,7 @@ class USBDevice(Device):
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 device: {0}'.format(str(err)))
else:
if got_line:
ret = self._buffer
@@ -280,8 +292,8 @@ class SerialDevice(Device):
devices = serial.tools.list_ports.grep(pattern)
else:
devices = serial.tools.list_ports.comports()
except Exception, err:
raise util.CommError('Error enumerating AD2SERIAL devices: {0}'.format(str(err)))
except SerialException, err:
raise util.CommError('Error enumerating serial devices: {0}'.format(str(err)))

return devices

@@ -304,7 +316,7 @@ class SerialDevice(Device):
baudrate = SerialDevice.BAUDRATE

if self._interface is None and interface is None:
raise util.NoDeviceError('No AD2SERIAL device interface specified.')
raise util.NoDeviceError('No device interface specified.')

if interface is not None:
self._interface = interface
@@ -322,9 +334,7 @@ class SerialDevice(Device):
# all issues with it.

except (serial.SerialException, ValueError), err:
self.on_close()

raise util.NoDeviceError('Error opening AD2SERIAL device on port {0}.'.format(interface))
raise util.NoDeviceError('Error opening device on port {0}.'.format(interface))
else:
self._running = True
self.on_open(('N/A', "AD2SERIAL"))
@@ -355,7 +365,7 @@ class SerialDevice(Device):
except serial.SerialTimeoutException, err:
pass
except serial.SerialException, err:
raise util.CommError('Error writing to serial device.')
raise util.CommError('Error writing to device.')
else:
self.on_write(data)

@@ -363,7 +373,15 @@ class SerialDevice(Device):
"""
Reads a single character from the device.
"""
return self._device.read(1)
ret = None

try:
ret = self._device.read(1)

except serial.SerialException, err:
raise util.CommError('Error reading from device: {0}'.format(str(err)))

return ret

def read_line(self, timeout=0.0):
"""
@@ -406,7 +424,7 @@ class SerialDevice(Device):
except (OSError, serial.SerialException), err:
timer.cancel()

raise util.CommError('Error reading from AD2SERIAL device: {0}'.format(str(err)))
raise util.CommError('Error reading from device: {0}'.format(str(err)))
else:
if got_line:
ret = self._buffer
@@ -452,9 +470,7 @@ class SocketDevice(Device):
self._id = '{0}:{1}'.format(self._host, self._port)

except socket.error, err:
self.on_close()

raise util.NoDeviceError('Error opening AD2SOCKET device at {0}:{1}'.format(self._host, self._port))
raise util.NoDeviceError('Error opening device at {0}:{1}'.format(self._host, self._port))
else:
self._running = True

@@ -482,19 +498,27 @@ class SocketDevice(Device):
"""
Writes data to the device.
"""
data_sent = self._device.send(data)
data_sent = None

try:
data_sent = self._device.send(data)

if data_sent == 0:
raise util.CommError('Error writing to device.')

if data_sent == 0:
raise util.CommError('Error while sending data.')
else:
self.on_write(data)

except socket.error, err:
raise util.CommError('Error writing to device: {0}'.format(str(err)))

return data_sent

def read(self):
"""
Reads a single character from the device.
"""
data = None

try:
data = self._device.recv(1)
except socket.error, err:
@@ -543,7 +567,7 @@ class SocketDevice(Device):
except socket.error, err:
timer.cancel()

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


Loading…
Cancel
Save