Browse Source

Interface consistency changes. Properties. Cleanup.

pyserial_fix
Scott Petersen 11 years ago
parent
commit
3a04c94265
3 changed files with 175 additions and 86 deletions
  1. +2
    -2
      pyad2usb/ad2usb.py
  2. +138
    -61
      pyad2usb/devices.py
  3. +35
    -23
      test.py

+ 2
- 2
pyad2usb/ad2usb.py View File

@@ -255,7 +255,7 @@ class AD2USB(object):
""" """
return self._device.id return self._device.id


def open(self, baudrate=None, interface=None, index=None, no_reader_thread=False):
def open(self, baudrate=None, no_reader_thread=False):
""" """
Opens the device. Opens the device.


@@ -269,7 +269,7 @@ class AD2USB(object):
:type no_reader_thread: bool :type no_reader_thread: bool
""" """
self._wire_events() self._wire_events()
self._device.open(baudrate=baudrate, interface=interface, index=index, no_reader_thread=no_reader_thread)
self._device.open(baudrate=baudrate, no_reader_thread=no_reader_thread)


def close(self): def close(self):
""" """


+ 138
- 61
pyad2usb/devices.py View File

@@ -34,7 +34,6 @@ class Device(object):
""" """
self._id = '' self._id = ''
self._buffer = '' self._buffer = ''
self._interface = None
self._device = None self._device = None
self._running = False self._running = False
self._read_thread = Device.ReadThread(self) self._read_thread = Device.ReadThread(self)
@@ -162,38 +161,88 @@ class USBDevice(Device):


return devices return devices


def __init__(self, vid=FTDI_VENDOR_ID, pid=FTDI_PRODUCT_ID, serial=None, description=None, interface=0):
@property
def interface(self):
"""
Retrieves the interface used to connect to the device.

:returns: the interface used to connect to the device.
"""
return (self._device_number, self._endpoint)

@interface.setter
def interface(self, value):
"""
Sets the interface used to connect to the device.

:param value: Tuple containing the device number and endpoint number to use.
:type value: tuple
"""
self._device_number = value[0]
self._endpoint = value[1]

@property
def serial_number(self):
"""
Retrieves the serial number of the device.

:returns: The serial number of the device.
"""

return self._serial_number

@serial_number.setter
def serial_number(self, value):
"""
Sets the serial number of the device.

:param value: The serial number of the device.
:type value: string
"""
self._serial_number = value

@property
def description(self):
"""
Retrieves the description of the device.

:returns: The description of the device.
"""
return self._description

@description.setter
def description(self, value):
"""
Sets the description of the device.

:param value: The description of the device.
:type value: string
"""
self._description = value

def __init__(self, interface=(0, 0)):
""" """
Constructor Constructor


:param vid: Vendor ID
:type vid: int
:param pid: Product ID
:type pid: int
:param serial: The serial number
:type serial: str
:param description: Description of the device.
:type description: str
:param interface: The interface to use
:type interface: int
:param interface: Tuple containing the device number and endpoint number to use.
:type interface: tuple
""" """
Device.__init__(self) Device.__init__(self)


self._device = Ftdi() self._device = Ftdi()
self._interface = interface
self._vendor_id = vid
self._product_id = pid
self._serial_number = serial
self._description = description
self._device_number = interface[0]
self._endpoint = interface[1]
self._vendor_id = USBDevice.FTDI_VENDOR_ID
self._product_id = USBDevice.FTDI_PRODUCT_ID
self._serial_number = None
self._description = None


def open(self, baudrate=BAUDRATE, interface=None, index=0, no_reader_thread=False):
def open(self, baudrate=BAUDRATE, no_reader_thread=False):
""" """
Opens the device. Opens the device.


:param baudrate: The baudrate to use. :param baudrate: The baudrate to use.
:type baudrate: int :type baudrate: int
:param interface: The interface to use.
:type interface: int
:param no_reader_thread: Whether or not to automatically start the reader thread. :param no_reader_thread: Whether or not to automatically start the reader thread.
:type no_reader_thread: bool :type no_reader_thread: bool


@@ -203,21 +252,12 @@ class USBDevice(Device):
if baudrate is None: if baudrate is None:
baudrate = USBDevice.BAUDRATE baudrate = USBDevice.BAUDRATE


if self._interface is None and interface is None:
self._interface = 0

if interface is not None:
self._interface = interface

if index is None:
index = 0

# Open the device and start up the thread. # Open the device and start up the thread.
try: try:
self._device.open(self._vendor_id, self._device.open(self._vendor_id,
self._product_id, self._product_id,
self._interface,
index,
self._endpoint,
self._device_number,
self._serial_number, self._serial_number,
self._description) self._description)


@@ -241,9 +281,9 @@ class USBDevice(Device):
""" """
try: try:
# HACK: Probably should fork pyftdi and make this call in .close(). # HACK: Probably should fork pyftdi and make this call in .close().
self._device.usb_dev.attach_kernel_driver(self._interface)
self._device.usb_dev.attach_kernel_driver(self._device_number)


super(USBDevice, self).close()
Device.close(self)


except: except:
pass pass
@@ -383,6 +423,25 @@ class SerialDevice(Device):


return devices return devices


@property
def interface(self):
"""
Retrieves the interface used to connect to the device.

:returns: the interface used to connect to the device.
"""
return self._port

@interface.setter
def interface(self, value):
"""
Sets the interface used to connect to the device.

:param value: The name of the serial device.
:type value: string
"""
self._port = value

def __init__(self, interface=None): def __init__(self, interface=None):
""" """
Constructor Constructor
@@ -392,20 +451,16 @@ class SerialDevice(Device):
""" """
Device.__init__(self) Device.__init__(self)


self._interface = interface
self._port = interface
self._id = interface self._id = interface
self._device = serial.Serial(timeout=0, writeTimeout=0) # Timeout = non-blocking to match pyftdi. 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, no_reader_thread=False):
""" """
Opens the device. Opens the device.


:param baudrate: The baudrate to use with the device. :param baudrate: The baudrate to use with the device.
:type baudrate: int :type baudrate: int
:param interface: The device to open.
:type interface: str
:param index: Unused.
:type index: int
:param no_reader_thread: Whether or not to automatically start the reader thread. :param no_reader_thread: Whether or not to automatically start the reader thread.
:type no_reader_thread: bool :type no_reader_thread: bool


@@ -415,13 +470,10 @@ class SerialDevice(Device):
if baudrate is None: if baudrate is None:
baudrate = SerialDevice.BAUDRATE baudrate = SerialDevice.BAUDRATE


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


if interface is not None:
self._interface = interface

self._device.port = self._interface
self._device.port = self._port


# Open the device and start up the reader thread. # Open the device and start up the reader thread.
try: try:
@@ -434,7 +486,7 @@ class SerialDevice(Device):
# all issues with it. # all issues with it.


except (serial.SerialException, ValueError), err: except (serial.SerialException, ValueError), err:
raise util.NoDeviceError('Error opening device on port {0}.'.format(interface), err)
raise util.NoDeviceError('Error opening device on port {0}.'.format(self._port), err)


else: else:
self._running = True self._running = True
@@ -448,7 +500,7 @@ class SerialDevice(Device):
Closes the device. Closes the device.
""" """
try: try:
super(SerialDevice, self).close()
Device.close(self)


except: except:
pass pass
@@ -561,6 +613,26 @@ class SocketDevice(Device):
Serial to IP interface. Serial to IP interface.
""" """


@property
def interface(self):
"""
Retrieves the interface used to connect to the device.

:returns: the interface used to connect to the device.
"""
return (self._host, self._port)

@interface.setter
def interface(self, value):
"""
Sets the interface used to connect to the device.

:param value: Tuple containing the device number and endpoint number to use.
:type value: tuple
"""
self._host = value[0]
self._port = value[1]

@property @property
def ssl(self): def ssl(self):
""" """
@@ -570,6 +642,16 @@ class SocketDevice(Device):
""" """
return self._use_ssl return self._use_ssl


@ssl.setter
def ssl(self, value):
"""
Sets whether or not SSL communication is in use.

:param value: Whether or not SSL communication is in use.
:type value: bool
"""
self._use_ssl = value

@property @property
def ssl_certificate(self): def ssl_certificate(self):
""" """
@@ -627,37 +709,32 @@ class SocketDevice(Device):
""" """
self._ssl_ca = value self._ssl_ca = value


def __init__(self, interface=("localhost", 10000), use_ssl=False, ssl_certificate=None, ssl_key=None, ssl_ca=None):
def __init__(self, interface=("localhost", 10000)):
""" """
Constructor Constructor

:param interface: Tuple containing the hostname and port of our target.
:type interface: tuple
""" """
Device.__init__(self) Device.__init__(self)


self._interface = interface
self._host, self._port = interface self._host, self._port = interface
self._use_ssl = use_ssl
self._ssl_certificate = ssl_certificate
self._ssl_key = ssl_key
self._ssl_ca = ssl_ca
self._use_ssl = False
self._ssl_certificate = None
self._ssl_key = None
self._ssl_ca = None


def open(self, baudrate=None, interface=None, index=0, no_reader_thread=False):
def open(self, baudrate=None, no_reader_thread=False):
""" """
Opens the device. Opens the device.


:param baudrate: The baudrate to use :param baudrate: The baudrate to use
:type baudrate: int :type baudrate: int
:param interface: The hostname and port to connect to.
:type interface: tuple
:param index: Unused
:type index: int
:param no_reader_thread: Whether or not to automatically open the reader thread. :param no_reader_thread: Whether or not to automatically open the reader thread.
:type no_reader_thread: bool :type no_reader_thread: bool


:raises: util.NoDeviceError, util.CommError :raises: util.NoDeviceError, util.CommError
""" """
if interface is not None:
self._interface = 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)
@@ -700,7 +777,7 @@ class SocketDevice(Device):
else: else:
self._device.shutdown(socket.SHUT_RDWR) # Make sure that it closes immediately. self._device.shutdown(socket.SHUT_RDWR) # Make sure that it closes immediately.


super(SocketDevice, self).close()
Device.close(self)


except Exception, ex: except Exception, ex:
pass pass


+ 35
- 23
test.py View File

@@ -139,29 +139,31 @@ def upload_socket():
dev.close() dev.close()


def test_usb(): def test_usb():
dev = pyad2usb.ad2usb.devices.USBDevice()
global running


a2u = pyad2usb.ad2usb.AD2USB(dev)
a2u.on_open += handle_open
a2u.on_close += handle_close
a2u.on_read += handle_read
a2u.on_write += handle_write
dev = pyad2usb.ad2usb.devices.USBDevice(interface=(0, 0))


a2u.on_power_changed += handle_power_changed
a2u.on_alarm += handle_alarm_bell
a2u.on_bypass += handle_bypass
#a2u = pyad2usb.ad2usb.AD2USB(dev)
dev.on_open += handle_open
dev.on_close += handle_close
dev.on_read += handle_read
dev.on_write += handle_write


a2u.open()
#a2u.on_power_changed += handle_power_changed
#a2u.on_alarm += handle_alarm_bell
#a2u.on_bypass += handle_bypass


print dev._id
dev.open()

print dev.id


while running: while running:
time.sleep(0.1) time.sleep(0.1)


a2u.close()
dev.close()


def test_serial(): def test_serial():
dev = pyad2usb.ad2usb.devices.SerialDevice(interface='/dev/ttyUSB0')
dev = pyad2usb.ad2usb.devices.SerialDevice(interface='/dev/ttyUSB1')


a2u = pyad2usb.ad2usb.AD2USB(dev) a2u = pyad2usb.ad2usb.AD2USB(dev)
a2u.on_open += handle_open a2u.on_open += handle_open
@@ -188,21 +190,21 @@ def test_serial():
#dev.close() #dev.close()


def test_usb_serial(): def test_usb_serial():
dev = pyad2usb.ad2usb.devices.SerialDevice(interface='/dev/ttyUSB5')
dev = pyad2usb.ad2usb.devices.SerialDevice(interface='/dev/ttyUSB1')


a2u = pyad2usb.ad2usb.AD2USB(dev)
a2u.on_open += handle_open
a2u.on_close += handle_close
a2u.on_read += handle_read
a2u.on_write += handle_write
#a2u = pyad2usb.ad2usb.AD2USB(dev)
dev.on_open += handle_open
dev.on_close += handle_close
dev.on_read += handle_read
dev.on_write += handle_write


a2u.open(baudrate=115200)
dev.open(baudrate=115200)
print dev._id print dev._id


while running: while running:
time.sleep(0.1) time.sleep(0.1)


a2u.close()
dev.close()


def test_factory(): def test_factory():
a2u = pyad2usb.ad2usb.Overseer.create() a2u = pyad2usb.ad2usb.Overseer.create()
@@ -238,7 +240,11 @@ def test_factory_watcher():
overseer.close() overseer.close()


def test_socket(): def test_socket():
dev = pyad2usb.ad2usb.devices.SocketDevice(interface=("10.10.0.1", 10000), use_ssl=True, ssl_certificate='tmp/certs/client1.pem', ssl_key='tmp/certs/client1.key', ssl_ca='tmp/certs/ca.pem')
dev = pyad2usb.ad2usb.devices.SocketDevice(interface=("10.10.0.1", 10000))
dev.ssl = True
dev.ssl_certificate = 'tmp/certs/client1.pem'
dev.ssl_key = 'tmp/certs/client1.key'
dev.ssl_ca = 'tmp/certs/ca.pem'


a2u = pyad2usb.ad2usb.AD2USB(dev) a2u = pyad2usb.ad2usb.AD2USB(dev)
a2u.on_open += handle_open a2u.on_open += handle_open
@@ -324,7 +330,13 @@ def test_no_read_thread():
dev.close() dev.close()


def test_serial_grep(): def test_serial_grep():
re = pyad2usb.devices.SerialDevice.find_all(pattern='VID:PID=9710:7840')
re = pyad2usb.devices.SerialDevice.find_all(pattern='VID:PID=0403:6001')
print 'serial'
for x in re:
print x

print 'usb'
re = pyad2usb.devices.USBDevice.find_all()
for x in re: for x in re:
print x print x




Loading…
Cancel
Save