def _find_handle(self, vendor_id=None, product_id=None, attempts_left=5):
        handle = None
        found_dev = None
        for device in self._context.getDeviceList():
            if vendor_id and product_id:
                # match by vendor and product id
                if (device.getVendorID() == vendor_id and
                        device.getProductID == product_id):
                    handle = self._open_device(device)
                    if handle:
                        found_dev = device
                        break
            elif device.getVendorID() in COMPATIBLE_VIDS:
                # attempt to get the first compatible vendor id
                handle = self._open_device(device)
                if handle:
                    found_dev = device
                    break

        if handle:
            eprint("Device Found: {0}".format(found_dev))
            eprint("Product: {0}".format(
                handle.getASCIIStringDescriptor(found_dev.device_descriptor.iProduct)))
            if found_dev.getProductID() in ACCESSORY_PID:
                return True, handle
            else:
                return False, handle
        elif attempts_left:
            time.sleep(1)
            return self._find_handle(vendor_id, product_id, attempts_left-1)
        else:
            raise usb1.USBError('Device not available')
    def _configure_accessory_mode(self):
        # Don't need to claim interface to do control read/write, and the
        # original driver prevents it
        # self._handle.claimInterface(0)

        version = self._handle.controlRead(
            usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE, 51, 0, 0, 2)

        adk_ver = unpack('<H', version)[0]
        print("ADK version is: %d" % adk_ver)
        assert adk_ver == 2

        # enter accessory information
        for i, data in enumerate((MANUFACTURER, MODEL_NAME, DESCRIPTION,
                                  VERSION, URI, SERIAL_NUMBER)):
            assert self._handle.controlWrite(
                usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE, 52, 0, i,
                data.encode()) == len(data)

        # enable 2 channel audio
        assert self._handle.controlWrite(
            usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE, 58, 1, 0, b'') == 0

        # start device in accessory mode
        self._handle.controlWrite(usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE, 53,
                                  0, 0, b'')

        time.sleep(1)

        isconfigured, newhandle = self._find_handle()
        if isconfigured:
            return newhandle
        else:
            raise usb1.USBError('Error configuring accessory mode')
    def __init__(self,
                 usb_context,
                 write_queue,
                 vendor_id=None,
                 product_id=None):
        self.app_connected = False
        self._context = usb_context
        isconfigured, self._handle = self._find_handle(vendor_id, product_id)

        if isconfigured:
            print("Device is in accessory mode")
            # TODO: should I reset the device?
            # self._handle.claimInterface(0)
            # self._handle.resetDevice()
            # time.sleep(2)
            # isconfigured, self._handle = self._find_handle(vendor_id, product_id)
            # self._handle = self._configure_accessory_mode()
        else:
            self._handle = self._configure_accessory_mode()

        self._handle.claimInterface(0)

        # pause for one second so the android device can react to changes
        time.sleep(1)

        device = self._handle.getDevice()
        config = device[0]
        interface = config[0]
        self._in_endpoint, self._out_endpoint = self._get_endpoints(
            interface[0])
        if self._in_endpoint is None or self._out_endpoint is None:
            self._handle.releaseInterface(0)
            raise usb1.USBError(
                'Unable to retreive endpoints for accessory device')

        read_callback = usb1.USBTransferHelper()
        callback_obj = ReadCallback(self, write_queue)
        read_callback.setEventCallback(
            usb1.TRANSFER_COMPLETED,
            callback_obj,
        )

        self._read_list = []
        for _ in range(64):
            data_reader = self._handle.getTransfer()
            data_reader.setBulk(
                self._in_endpoint,
                0x4000,
                callback=read_callback,
            )
            data_reader.submit()
            self._read_list.append(data_reader)

        self._write_queue = write_queue
        self._is_running = True
        self._write_thread = threading.Thread(target=self._write_thread_proc)
        self._write_thread.start()
Beispiel #4
0
 def rw_callback(self, transfer):
     self.callback_active = True
     if transfer.getStatus() != usb1.TRANSFER_COMPLETED:
         print 'rw_callback: transfer fail, status = %s' % transfer.getStatus(
         )
         print 'Actual length = %d buffer size = %d' % (
             transfer.getActualLength(), len(transfer.getBuffer()))
         raise usb1.USBError(transfer.getStatus())
     data = transfer.getBuffer()[:transfer.getActualLength()]
     #   Don't resubmit... though that would be smart
     #   NOTE: should this handle the case of an odd number of bytes?
     self.read_data_pending = numpy.frombuffer(data, dtype=self.dtype)
     self.callback_active = False
    def __init__(self, usb_context, vendor_id=None, product_id=None):
        self._context = usb_context
        isconfigured, self._handle = self._find_handle(vendor_id, product_id)

        if isconfigured:
            print("Device already in accessory mode, attempting reset")
            # TODO: should I reset the device?
            #self._handle.claimInterface(0)
            #self._handle.resetDevice()
            #time.sleep(2)
            #isconfigured, self._handle = self._find_handle(vendor_id, product_id)
        else:
            self._handle = self._configure_accessory_mode()

        self._handle.claimInterface(0)

        # pause for one second so the android device can react to changes
        time.sleep(1)

        device = self._handle.getDevice()
        config = device[0]
        interface = config[0]
        self._in_endpoint, self._out_endpoint = self._get_endpoints(
            interface[0])
        if self._in_endpoint is None or self._out_endpoint is None:
            self._handle.releaseInterface(0)
            raise usb1.USBError(
                'Unable to retreive endpoints for accessory device')

        self.port = 8000  # port to forward sockets to
        self.app_connected = False
        self._is_running = True

        self._read_callback = ReadCallback(self)
        self._accessory_read_thread = threading.Thread(
            target=self._accessory_read_thread_proc)
        self._accessory_read_thread.start()

        self._socket_dict = {}
        self._socket_selector = selectors.DefaultSelector()
        self._socket_read_thread = threading.Thread(
            target=self._socket_read_thread_proc)
        self._socket_read_thread.start()
    def __init__(self, usb_context, vendor_id=None, product_id=None):
        self.app_connected = False
        self._context = usb_context
        isconfigured, self._handle = self._find_handle(vendor_id, product_id)

        if isconfigured:
            print("Device is in accessory mode")
            # TODO: should I reset the device?
            # self._handle.claimInterface(0)
            # self._handle.resetDevice()
            # time.sleep(2)
            # isconfigured, self._handle = self._find_handle(vendor_id, product_id)
            # self._handle = self._configure_accessory_mode()
        else:
            self._handle = self._configure_accessory_mode()

        self._handle.claimInterface(0)

        # pause for one second so the android device can react to changes
        time.sleep(1)

        device = self._handle.getDevice()
        config = device[0]
        interface = config[0]
        self._in_endpoint, self._out_endpoint = self._get_endpoints(
            interface[0])
        if self._in_endpoint is None or self._out_endpoint is None:
            self._handle.releaseInterface(0)
            raise usb1.USBError(
                'Unable to retreive endpoints for accessory device')

        self._is_running = True
        self._accessory_read_thread = threading.Thread(
            target=self._accessory_read_thread_proc)
        self._accessory_read_thread.start()
        self._sio_client_socket = socket.socket()
        self._sio_read_thread = None
        self._socket_connected = False
    def _find_handle(self, vendor_id=None, product_id=None, attempts_left=5):
        handle = None
        found_pid = None
        for device in self._context.getDeviceList():
            if vendor_id and product_id:
                # match by vendor and product id
                if (device.getVendorID() == vendor_id
                        and device.getProductID == product_id):
                    try:
                        handle = device.open()
                        found_vid = vendor_id
                        found_pid = device.getProductID()
                    except usb1.USBError as err:
                        print(err.args)
                    break
            elif device.getVendorID() in COMPATIBLE_VIDS:
                # attempt to get the first compatible vendor id
                try:
                    handle = device.open()
                    found_vid = device.getVendorID()
                    found_pid = device.getProductID()
                except usb1.USBError as err:
                    print(err.args)
                break

        if handle:
            print('Found {0:x}:{1:x}'.format(found_vid, found_pid))
            if found_pid in ACCESSORY_PID:
                return True, handle
            else:
                return False, handle
        elif attempts_left:
            time.sleep(1)
            return self._find_handle(vendor_id, product_id, attempts_left - 1)
        else:
            raise usb1.USBError('Device not connected')
Beispiel #8
0
 def getPortNumberList(self):
     if self.port_list is None:
         raise usb1.USBError('omg no port list')
     return self.port_list
Beispiel #9
0
 def getSerialNumber(self):
     if self.serial is None:
         raise usb1.USBError('omg no serial')
     return self.serial
 def fakeHandleEventsLocked():
     raise usb1.USBError(0)