diff --git a/pyad2usb/ad2usb.py b/pyad2usb/ad2usb.py index dd9987f..9c0783e 100644 --- a/pyad2usb/ad2usb.py +++ b/pyad2usb/ad2usb.py @@ -255,7 +255,7 @@ class AD2USB(object): """ 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. @@ -269,7 +269,7 @@ class AD2USB(object): :type no_reader_thread: bool """ 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): """ diff --git a/pyad2usb/devices.py b/pyad2usb/devices.py index c805292..a5ca05b 100644 --- a/pyad2usb/devices.py +++ b/pyad2usb/devices.py @@ -34,7 +34,6 @@ class Device(object): """ self._id = '' self._buffer = '' - self._interface = None self._device = None self._running = False self._read_thread = Device.ReadThread(self) @@ -162,38 +161,88 @@ class USBDevice(Device): 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 - :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) 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. :param baudrate: The baudrate to use. :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. :type no_reader_thread: bool @@ -203,21 +252,12 @@ class USBDevice(Device): if baudrate is None: 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. try: self._device.open(self._vendor_id, self._product_id, - self._interface, - index, + self._endpoint, + self._device_number, self._serial_number, self._description) @@ -241,9 +281,9 @@ class USBDevice(Device): """ try: # 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: pass @@ -383,6 +423,25 @@ class SerialDevice(Device): 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): """ Constructor @@ -392,20 +451,16 @@ class SerialDevice(Device): """ Device.__init__(self) - self._interface = interface + self._port = interface self._id = interface 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. :param baudrate: The baudrate to use with the device. :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. :type no_reader_thread: bool @@ -415,13 +470,10 @@ class SerialDevice(Device): if baudrate is None: baudrate = SerialDevice.BAUDRATE - if self._interface is None and interface is None: + if self._port is None: 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. try: @@ -434,7 +486,7 @@ class SerialDevice(Device): # all issues with it. 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: self._running = True @@ -448,7 +500,7 @@ class SerialDevice(Device): Closes the device. """ try: - super(SerialDevice, self).close() + Device.close(self) except: pass @@ -561,6 +613,26 @@ class SocketDevice(Device): 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 def ssl(self): """ @@ -570,6 +642,16 @@ class SocketDevice(Device): """ 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 def ssl_certificate(self): """ @@ -627,37 +709,32 @@ class SocketDevice(Device): """ 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 + + :param interface: Tuple containing the hostname and port of our target. + :type interface: tuple """ Device.__init__(self) - self._interface = 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. :param baudrate: The baudrate to use :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. :type no_reader_thread: bool :raises: util.NoDeviceError, util.CommError """ - if interface is not None: - self._interface = interface - self._host, self._port = interface try: self._device = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -700,7 +777,7 @@ class SocketDevice(Device): else: self._device.shutdown(socket.SHUT_RDWR) # Make sure that it closes immediately. - super(SocketDevice, self).close() + Device.close(self) except Exception, ex: pass diff --git a/test.py b/test.py index 43df484..724ab96 100755 --- a/test.py +++ b/test.py @@ -139,29 +139,31 @@ def upload_socket(): dev.close() 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: time.sleep(0.1) - a2u.close() + dev.close() 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.on_open += handle_open @@ -188,21 +190,21 @@ def test_serial(): #dev.close() 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 while running: time.sleep(0.1) - a2u.close() + dev.close() def test_factory(): a2u = pyad2usb.ad2usb.Overseer.create() @@ -238,7 +240,11 @@ def test_factory_watcher(): overseer.close() 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.on_open += handle_open @@ -324,7 +330,13 @@ def test_no_read_thread(): dev.close() 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: print x