@Override
  public void open() throws IOException {
    Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount());

    Log.d(TAG, "Claiming control interface.");
    mControlInterface = mDevice.getInterface(0);
    Log.d(TAG, "Control iface=" + mControlInterface);
    // class should be USB_CLASS_COMM

    if (!mConnection.claimInterface(mControlInterface, true)) {
      throw new IOException("Could not claim control interface.");
    }
    mControlEndpoint = mControlInterface.getEndpoint(0);
    Log.d(TAG, "Control endpoint direction: " + mControlEndpoint.getDirection());

    Log.d(TAG, "Claiming data interface.");
    mDataInterface = mDevice.getInterface(1);
    Log.d(TAG, "data iface=" + mDataInterface);
    // class should be USB_CLASS_CDC_DATA

    if (!mConnection.claimInterface(mDataInterface, true)) {
      throw new IOException("Could not claim data interface.");
    }
    mReadEndpoint = mDataInterface.getEndpoint(1);
    Log.d(TAG, "Read endpoint direction: " + mReadEndpoint.getDirection());
    mWriteEndpoint = mDataInterface.getEndpoint(0);
    Log.d(TAG, "Write endpoint direction: " + mWriteEndpoint.getDirection());
  }
Exemple #2
0
  /**
   * デバイスの利用開始。
   *
   * @return null=正常、null以外=エラーメッセージ
   */
  public String onStart(UsbDevice device) {
    Log.d(TAG, "onStart:" + device);
    if (!device.equals(usbDevice)) {
      return "No device attach.";
    }
    if (!usbManager.hasPermission(usbDevice)) {
      return "No device permission.";
    }

    usbConnection = usbManager.openDevice(usbDevice);
    // TODO:インターフェースの検出は端折ってます。
    UsbInterface usbIf = usbDevice.getInterface(INTERFACE_INDEX);

    // EndPointの検索。分かってる場合は直接取り出しても良い。
    for (int i = 0; i < usbIf.getEndpointCount(); i++) {
      UsbEndpoint ep = usbIf.getEndpoint(i);
      Log.d(TAG, "tye=" + ep.getType());
      if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {
        if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
          endpointIn = ep;
        } else if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
          endpointOut = ep;
        }
      }
    }
    if (endpointIn == null || endpointOut == null) {
      Log.e(TAG, "Device has not IN/OUT Endpoint.");
      return "Device has not IN/OUT Endpoint.";
    }
    // デバイスの確保
    usbConnection.claimInterface(usbIf, true);
    isReady = true;
    return null;
  }
  public void usbDeviceDump(UsbDevice usbDevice) {
    //		Log.d(TAG, "usbDeviceDump " + usbDevice);

    if (usbDevice == null) {
      Log.e(TAG, "usbDevice is NULL!");
      return;
    }

    int numInterfaces = usbDevice.getInterfaceCount();

    // Log.d(TAG, numInterfaces + " interfaces");
    Log.d(
        TAG,
        "Device found: VendorId="
            + usbDevice.getVendorId()
            + " ProductId="
            + usbDevice.getProductId());

    for (int i = 0; i < numInterfaces; i++) {
      UsbInterface usbInterface = usbDevice.getInterface(i);
      //			Log.d(TAG, "\tInterface(" + i + "): class=" + usbInterface.getInterfaceClass() + "
      // protocol=" + usbInterface.getInterfaceProtocol());

      int numEndpoints = usbInterface.getEndpointCount();
      //			Log.d(TAG, numEndpoints + " endpoints");

      for (int j = 0; j < numEndpoints; j++) {
        UsbEndpoint usbEndpoint = usbInterface.getEndpoint(j);
        //				Log.d(TAG, "\t\tEndpoint(" + j + ")");
      }
    }
  }
  private void setDevice(UsbDevice device) {
    mConnection = mUsbManager.openDevice(device);
    intf = device.getInterface(0);
    UsbEndpoint epOut = null;
    UsbEndpoint epIn = null;
    UsbEndpoint epEv = null;
    // Looking for Bulk Endpoints
    for (int i = 0; i < intf.getEndpointCount(); i++) {
      UsbEndpoint ep = intf.getEndpoint(i);
      if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
        if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
          epOut = ep;
        } else {
          epIn = ep;
        }
      }
      if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {
        epEv = ep;
      }
    }
    if (epOut == null || epIn == null || epEv == null) {
      throw new IllegalArgumentException("not all endpoints found");
    }

    mEndpointBulkOut = epOut;
    mEndpointBulkIn = epIn;
    mEndpointIntr = epEv;
    inMaxPS = mEndpointBulkIn.getMaxPacketSize();
  }
  @Override
  protected void initEndpoints() throws IOException {
    UsbInterface usbInterface = mDevice.getInterface(0);

    if (!mConnection.claimInterface(usbInterface, true)) {
      throw new IOException("Error claiming Prolific interface 0");
    }

    for (int i = 0; i < usbInterface.getEndpointCount(); ++i) {
      UsbEndpoint currentEndpoint = usbInterface.getEndpoint(i);

      switch (currentEndpoint.getType()) {
        case UsbConstants.USB_ENDPOINT_XFER_BULK:
          if (currentEndpoint.getDirection() == UsbConstants.USB_DIR_IN) {
            mReadEndpoint = currentEndpoint;
          } else {
            mWriteEndpoint = currentEndpoint;
          }
          break;

        case UsbConstants.USB_ENDPOINT_XFER_INT:
          mControlEndpoint = currentEndpoint;
          break;
      }
    }
  }
  public void setDevice(UsbManager usbManager, UsbDevice usbDevice) {
    //		Log.d(TAG, "setDevice " + usbDevice);

    device = usbDevice;

    if (device != null) {
      usbDeviceDump(usbDevice);

      UsbInterface controlInterface = device.getInterface(1);

      endpoint = controlInterface.getEndpoint(0);

      UsbDeviceConnection connection = usbManager.openDevice(device);

      if (connection != null && connection.claimInterface(controlInterface, true)) {
        controlConnection = connection;
        serial = UsbSerialDevice.createUsbSerialDevice(device, controlConnection);
        boolean t = serial.open();
        Log.d("Set DEVICE : ", "" + t);
        serial.setBaudRate(9600);
        serial.setParity(UsbSerialInterface.PARITY_NONE);
        serial.setStopBits(UsbSerialInterface.STOP_BITS_1);
        serial.setDataBits(UsbSerialInterface.DATA_BITS_8);
      } else {
        Log.e(TAG, "open connection FAIL");
        controlConnection = null;
      }
    }
  }
Exemple #7
0
  public ZBCoordinator(Context context, String actionUsbPermission) {
    super();
    UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();

    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    UsbDevice device = null;
    while (deviceIterator.hasNext()) {
      UsbDevice devi = deviceIterator.next();
      // TODO Remove hardcoded IDs
      if (devi.getProductId() == 0x05dc && devi.getVendorId() == 0x16c0) device = devi;
      // TODO Make sure this is the ZBCoordinator using RAW Descriptors
    }

    PendingIntent mPermissionIntent =
        PendingIntent.getBroadcast(context, 0, new Intent(actionUsbPermission), 0);

    if (device != null && !manager.hasPermission(device))
      manager.requestPermission(device, mPermissionIntent);

    if (device != null && manager.hasPermission(device)) {
      UsbInterface intf = device.getInterface(0);
      this.endpointInt = intf.getEndpoint(0);
      this.usbDeviceConnection = manager.openDevice(device);
      this.usbDeviceConnection.claimInterface(intf, false);
      this.canUse = true;
    }
  }
 public static boolean isCdcDevice(UsbDevice device) {
   int iIndex = device.getInterfaceCount();
   for (int i = 0; i <= iIndex - 1; i++) {
     UsbInterface iface = device.getInterface(i);
     if (iface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) return true;
   }
   return false;
 }
 // searches for an adb interface on the given USB device
 private static UsbInterface findAdbInterface(UsbDevice device) {
   Log.d(TAG, "findAdbInterface " + device);
   int count = device.getInterfaceCount();
   for (int i = 0; i < count; i++) {
     UsbInterface intf = device.getInterface(i);
     if (intf.getInterfaceClass() == 255
         && intf.getInterfaceSubclass() == 66
         && intf.getInterfaceProtocol() == 1) {
       return intf;
     }
   }
   return null;
 }
Exemple #10
0
  /** Disconnect Android from USB */
  public void disconnect() {
    if (m_connected) {
      m_connected = false;
    }

    if (m_handler != null) {
      m_handler.stop();
    }

    if (m_sender != null && m_sender.is_active()) {
      if (m_sender.stop()) {
        Log.d(LinkManager.class.getSimpleName(), "There was non-send message !");
        // TODO : autre traitement ?
      }
    }
    if (m_receiver != null && m_receiver.is_active()) {
      if (m_receiver.stop()) {
        Log.d(LinkManager.class.getSimpleName(), "All the message were not handled !");
        // TODO : autre traitement ?
      }
    }

    if (m_device != null) {
      /*    try {
          m_device.close();
      } catch (IOException e) { }*/
      m_device = null;
    }

    m_listener.UsbStop();
  }
    @Override
    public void open(UsbDeviceConnection connection) throws IOException {
      if (mConnection != null) {
        throw new IOException("Already open");
      }

      mConnection = connection;
      boolean opened = false;
      try {
        Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount());
        mControlInterface = mDevice.getInterface(0);
        Log.d(TAG, "Control iface=" + mControlInterface);
        // class should be USB_CLASS_COMM

        if (!mConnection.claimInterface(mControlInterface, true)) {
          throw new IOException("Could not claim control interface.");
        }
        mControlEndpoint = mControlInterface.getEndpoint(0);
        Log.d(TAG, "Control endpoint direction: " + mControlEndpoint.getDirection());

        Log.d(TAG, "Claiming data interface.");
        mDataInterface = mDevice.getInterface(1);
        Log.d(TAG, "data iface=" + mDataInterface);
        // class should be USB_CLASS_CDC_DATA

        if (!mConnection.claimInterface(mDataInterface, true)) {
          throw new IOException("Could not claim data interface.");
        }
        mReadEndpoint = mDataInterface.getEndpoint(1);
        Log.d(TAG, "Read endpoint direction: " + mReadEndpoint.getDirection());
        mWriteEndpoint = mDataInterface.getEndpoint(0);
        Log.d(TAG, "Write endpoint direction: " + mWriteEndpoint.getDirection());
        if (mEnableAsyncReads) {
          Log.d(TAG, "Async reads enabled");
        } else {
          Log.d(TAG, "Async reads disabled.");
        }
        opened = true;
      } finally {
        if (!opened) {
          mConnection = null;
        }
      }
    }
  @Override
  public boolean open() {

    // Restart the working thread and writeThread if it has been killed before and  get and claim
    // interface
    restartWorkingThread();
    restartWriteThread();

    if (connection.claimInterface(mInterface, true)) {
      Log.i(CLASS_ID, "Interface succesfully claimed");
    } else {
      Log.i(CLASS_ID, "Interface could not be claimed");
      return false;
    }

    // Assign endpoints
    int numberEndpoints = mInterface.getEndpointCount();
    for (int i = 0; i <= numberEndpoints - 1; i++) {
      UsbEndpoint endpoint = mInterface.getEndpoint(i);
      if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK
          && endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
        inEndpoint = endpoint;
      } else {
        outEndpoint = endpoint;
      }
    }

    // Default Setup
    if (setControlCommand(XDCVCP_IFC_ENABLE, XDCVCP_UART_ENABLE, null) < 0) return false;
    setBaudRate(DEFAULT_BAUDRATE);
    if (setControlCommand(XDCVCP_SET_LINE_CTL, XDCVCP_LINE_CTL_DEFAULT, null) < 0) return false;
    setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
    if (setControlCommand(XDCVCP_SET_MHS, XDCVCP_MHS_DEFAULT, null) < 0) return false;

    // Initialize UsbRequest
    requestIN = new UsbRequest();
    requestIN.initialize(connection, inEndpoint);

    // Pass references to the threads
    setThreadsParams(requestIN, outEndpoint);

    return true;
  }
  private boolean isCSCID(UsbDevice device) {
    if (device.getDeviceClass() == UsbConstants.USB_CLASS_CSCID) return true;

    int count = device.getInterfaceCount();
    for (int i = 0; i < count; i++) {
      UsbInterface iface = device.getInterface(i);
      if (iface == null) {
        Log.d(TAG, "isCSCID null interface");
        continue;
      }

      Log.d(TAG, "isCSCID iface class:" + iface.getInterfaceClass());

      if (iface.getInterfaceClass() == UsbConstants.USB_CLASS_CSCID) {
        return true;
      }
    }

    return false;
  }
 private byte[] getCTL() {
   byte[] data = new byte[2];
   int response =
       connection.controlTransfer(
           XDCVCP_REQTYPE_DEVICE2HOST,
           XDCVCP_GET_LINE_CTL,
           0,
           mInterface.getId(),
           data,
           data.length,
           USB_TIMEOUT);
   Log.i(CLASS_ID, "Control Transfer Response: " + String.valueOf(response));
   return data;
 }
  private void setDevice(UsbDevice device) {
    usbInterfaceFound = null;
    endpointOut = null;
    endpointIn = null;

    for (int i = 0; i < device.getInterfaceCount(); i++) {
      UsbInterface usbif = device.getInterface(i);

      UsbEndpoint tOut = null;
      UsbEndpoint tIn = null;

      int tEndpointCnt = usbif.getEndpointCount();
      if (tEndpointCnt >= 2) {
        for (int j = 0; j < tEndpointCnt; j++) {
          if (usbif.getEndpoint(j).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
            if (usbif.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_OUT) {
              tOut = usbif.getEndpoint(j);
            } else if (usbif.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_IN) {
              tIn = usbif.getEndpoint(j);
            }
          }
        }

        if (tOut != null && tIn != null) {
          // This interface have both USB_DIR_OUT
          // and USB_DIR_IN of USB_ENDPOINT_XFER_BULK
          usbInterfaceFound = usbif;
          endpointOut = tOut;
          endpointIn = tIn;
        }
      }
    }

    if (usbInterfaceFound == null) {
      return;
    }

    deviceFound = device;

    if (device != null) {
      UsbDeviceConnection connection = usbManager.openDevice(device);
      if (connection != null && connection.claimInterface(usbInterfaceFound, true)) {
        usbDeviceConnection = connection;
        Thread thread = new Thread(this);
        thread.start();

      } else {
        usbDeviceConnection = null;
      }
    }
  }
 private int setControlCommand(int request, int value, byte[] data) {
   int dataLength = 0;
   if (data != null) {
     dataLength = data.length;
   }
   int response =
       connection.controlTransfer(
           XDCVCP_REQTYPE_HOST2DEVICE,
           request,
           value,
           mInterface.getId(),
           data,
           dataLength,
           USB_TIMEOUT);
   Log.i(CLASS_ID, "Control Transfer Response: " + String.valueOf(response));
   return response;
 }
  /**
   * Initialize the USB device. Determines endpoints and prepares communication.
   *
   * @throws IOException if the device cannot be opened
   */
  private void initDevice() throws IOException {
    Log.d(LOG_TAG, "setDevice " + this.mUsbDevice);
    // find interface
    if (this.mUsbDevice.getInterfaceCount() != 1) {
      Log.e(LOG_TAG, "Could not find interface");
      return;
    }
    mIntf = this.mUsbDevice.getInterface(0);
    // device should have two endpoints
    if (mIntf.getEndpointCount() != 2) {
      Log.e(LOG_TAG, "Could not find endpoints");
      return;
    }
    // endpoints should be of type bulk
    UsbEndpoint ep = mIntf.getEndpoint(0);
    if (ep.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) {
      Log.e(LOG_TAG, "Endpoint is not of type bulk");
      return;
    }
    // check endpoint direction
    if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
      mEpIn = mIntf.getEndpoint(0);
      mEpOut = mIntf.getEndpoint(1);
    } else {
      mEpIn = mIntf.getEndpoint(1);
      mEpOut = mIntf.getEndpoint(0);
    }

    UsbDeviceConnection connection = mUsbManager.openDevice(mUsbDevice);
    if (connection != null && connection.claimInterface(mIntf, true)) {
      Log.d(LOG_TAG, "open SUCCESS");
      mConnection = connection;
    } else {
      Log.d(LOG_TAG, "open FAIL");
      throw new IOException("could not open usb connection");
    }
  }
  /** The man thread for the demo */
  @Override
  public void run() {
    /* Get the OUT endpoint.  It is the second endpoint in the interface */
    UsbEndpoint endpointOUT = intf.getEndpoint(1);

    /* Get the IN endpoint.  It is the first endpoint in the interface */
    UsbEndpoint endpointIN = intf.getEndpoint(0);

    /* Create the packets that we are going to send to the attached USB
     * device.
     */
    byte[] getPushButtonStatusPacket = new byte[] {(byte) 0x81};
    byte[] toggleLEDsPacket = new byte[] {(byte) 0x80};
    byte[] getPotentiometerRequest = new byte[] {(byte) 0x37};

    byte[] getPotentiometerResults = new byte[64];
    byte[] getPushButtonStatusResults = new byte[64];
    int potentiometerLastResults = Integer.MAX_VALUE;
    int result = 0;
    boolean needToToggleLEDs = false;

    while (true) {
      /* If the connection was closed, destroy the connections and variables
       * and exit this thread.
       */
      if (wasCloseRequested() == true) {
        destroy();
        return;
      }

      /* Sleep the thread for a while */
      try {
        Thread.sleep(50);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }

      /* Send the request to get the push button status */
      do {
        result =
            connection.bulkTransfer(
                endpointOUT, getPushButtonStatusPacket, getPushButtonStatusPacket.length, 1000);
      } while ((result < 0) && (wasCloseRequested() == false));

      /* Read the push button status */
      do {
        result =
            connection.bulkTransfer(
                endpointIN, getPushButtonStatusResults, getPushButtonStatusResults.length, 1000);
      } while ((result < 0) && (wasCloseRequested() == false));

      /* If there was data successfully read,... */
      if (result > 0) {
        /* convert the byte data to a boolean representing the current button state */
        boolean currentButtonState =
            (getPushButtonStatusResults[1] == CUSTOM_HID_DEMO_BUTTON_PRESSED) ? true : false;

        /* We only need to send a message to the GUI if the current button state is different than
         * the old button state.
         */
        if ((currentButtonState != lastButtonState) || (buttonStatusInitialized == false)) {
          lastButtonState = currentButtonState;
          handler.obtainMessage(0, new MessageButton(lastButtonState)).sendToTarget();
        }
      }

      /* Check to see if we need to toggle the LEDs.  We are synchronizing on
       * The toggleLEDCount object here to insure that the user isn't changing
       * the value as we are checking it.
       */
      synchronized (toggleLEDCount) {
        if (toggleLEDCount > 0) {
          needToToggleLEDs = true;
          toggleLEDCount--;
        }
      }

      /* If we need to toggle the LEDs, send out the toggle LED command */
      if (needToToggleLEDs == true) {
        do {
          result =
              connection.bulkTransfer(endpointOUT, toggleLEDsPacket, toggleLEDsPacket.length, 1000);
        } while ((result < 0) && (wasCloseRequested() == false));
        needToToggleLEDs = false;
      }

      /* Send the request to read the Potentiometer */
      do {
        result =
            connection.bulkTransfer(
                endpointOUT, getPotentiometerRequest, getPotentiometerRequest.length, 1000);
      } while ((result < 0) && (wasCloseRequested() == false));

      /* Read the results of that request */
      do {
        result =
            connection.bulkTransfer(
                endpointIN, getPotentiometerResults, getPotentiometerResults.length, 1000);
      } while ((result < 0) && (wasCloseRequested() == false));

      /* Convert the resulting data to an int */
      byte[] potentiometerBuffer = new byte[] {0, 0, 0, 0};
      potentiometerBuffer[0] = getPotentiometerResults[1];
      potentiometerBuffer[1] = getPotentiometerResults[2];

      ByteBuffer buf = ByteBuffer.wrap(potentiometerBuffer);
      buf.order(ByteOrder.LITTLE_ENDIAN);
      int potentiometerResults = buf.getInt();

      /* If the new results are different from the previous results, then send
       * a message to the specified handler containing the new data.
       */

      // handler.obtainMessage(0,new MessagePotentiometer((potentiometerResults *
      // 100)/0x3FF)).sendToTarget();

      //	potentiometerLastResults = potentiometerResults;

    }
  }
    @Override
    public void open(UsbDeviceConnection connection) throws IOException {
      if (mConnection != null) {
        throw new IOException("Already open");
      }

      UsbInterface usbInterface = mDevice.getInterface(0);

      if (!connection.claimInterface(usbInterface, true)) {
        throw new IOException("Error claiming Prolific interface 0");
      }

      mConnection = connection;
      boolean opened = false;
      try {
        for (int i = 0; i < usbInterface.getEndpointCount(); ++i) {
          UsbEndpoint currentEndpoint = usbInterface.getEndpoint(i);

          switch (currentEndpoint.getAddress()) {
            case READ_ENDPOINT:
              mReadEndpoint = currentEndpoint;
              break;

            case WRITE_ENDPOINT:
              mWriteEndpoint = currentEndpoint;
              break;

            case INTERRUPT_ENDPOINT:
              mInterruptEndpoint = currentEndpoint;
              break;
          }
        }

        if (mDevice.getDeviceClass() == 0x02) {
          mDeviceType = DEVICE_TYPE_0;
        } else {
          try {
            Method getRawDescriptorsMethod = mConnection.getClass().getMethod("getRawDescriptors");
            byte[] rawDescriptors = (byte[]) getRawDescriptorsMethod.invoke(mConnection);
            byte maxPacketSize0 = rawDescriptors[7];
            if (maxPacketSize0 == 64) {
              mDeviceType = DEVICE_TYPE_HX;
            } else if ((mDevice.getDeviceClass() == 0x00) || (mDevice.getDeviceClass() == 0xff)) {
              mDeviceType = DEVICE_TYPE_1;
            } else {
              Log.w(TAG, "Could not detect PL2303 subtype, " + "Assuming that it is a HX device");
              mDeviceType = DEVICE_TYPE_HX;
            }
          } catch (NoSuchMethodException e) {
            Log.w(
                TAG,
                "Method UsbDeviceConnection.getRawDescriptors, "
                    + "required for PL2303 subtype detection, not "
                    + "available! Assuming that it is a HX device");
            mDeviceType = DEVICE_TYPE_HX;
          } catch (Exception e) {
            Log.e(
                TAG,
                "An unexpected exception occured while trying " + "to detect PL2303 subtype",
                e);
          }
        }

        setControlLines(mControlLinesValue);
        resetDevice();

        doBlackMagic();
        opened = true;
      } finally {
        if (!opened) {
          mConnection = null;
          connection.releaseInterface(usbInterface);
        }
      }
    }
        public void run() {
          Log("USB Thread started");

          UsbEndpoint readEp = null;
          UsbDeviceConnection usbConnection = null;
          UsbInterface Intf = null;
          UsbInterface Intf0 = null;
          UsbEndpoint readEp0 = null;
          UsbEndpoint writeEp0 = null;
          byte[] readbuffer = new byte[64];

          Log("Entering Read loop");
          interfaceclaimed = false;
          while (!_shouldstop) {
            if (_usbDevice == null) {
              Log("No device. Open device and Recheck in 1 sec...");
              interfaceclaimed = false;
              FindDevice();
              Sleep(10000);
              continue;
            }
            if (!interfaceclaimed) {
              Log("Read loop Aquiring Interface 0 and Endpoint 1");
              Intf = _usbDevice.getInterface(1);
              readEp = Intf.getEndpoint(0);
              Log("Read loop Aquiring Interface 0 and Endpoint 0");
              Intf0 = _usbDevice.getInterface(0);
              readEp0 = Intf0.getEndpoint(0);
              writeEp0 = Intf0.getEndpoint(1);
              if (!_usbManager.getDeviceList().containsKey(_deviceName)) {
                Log("Failed to connect to the device. Retrying to acquire it.");
                FindDevice();
                if (!_usbManager.getDeviceList().containsKey(_deviceName)) {
                  Log("No device. Recheking in 10 sec...");
                  _connectionHandler.onDeviceNotFound();
                  Sleep(10000);
                  continue;
                }
              }

              try {

                usbConnection = _usbManager.openDevice(_usbDevice);

                if (usbConnection == null) {
                  Log(
                      "Cannot start reader because the user didn't gave me permissions or the device is not present. Retrying in 2 sec...");
                  _connectionHandler.onUSBPermissionError();
                  Sleep(2000);
                  continue;
                }

                Log("USB loop claiming interface");
                // Claim and lock the interface in the android system.
                if (usbConnection.claimInterface(Intf, true)
                    && usbConnection.claimInterface(Intf0, true)) {
                  Log("USB loop Interface claimed successful");
                  interfaceclaimed = true;
                  _connectionHandler.onUSBDeviceClaimed();
                }
              } catch (SecurityException e) {
                Log(
                    "Cannot start reader because the user didn't gave me permissions. Retrying in 2 sec...");
                interfaceclaimed = false;
                Sleep(2000);
                continue;
              }
            }
            /*
            int filed = readConnection.getFileDescriptor();
            int epaddress = readEp.getAddress();
            TeensyDeviceUsbNativeHelper nativehelper = new TeensyDeviceUsbNativeHelper(filed,64,epaddress);
            nativehelper.beginUrbReadLoop();
            byte[] buffer2 = new byte[64];
            nativehelper.readUrb(1000, buffer2);
            //_receivedQueue.add(buffer2);
              	Log(String.format("Message received of lengths %s and content: %s", 64, composeString(buffer2)));
            */
            synchronized (_writelocker) {
              // Queue a USBRequest to USB if any data is in queue
              if (_writeQueue.size() > 0) {
                byte[] writebuffer = _writeQueue.poll();
                Log(String.format("Writing to USB: %s", CAN_Frame.bytesToHexString(writebuffer)));
                // Log("USB loop sending bulk write request");
                if (usbConnection.bulkTransfer(writeEp0, writebuffer, 64, 100) < 0) {
                  // failed to transfer
                  Log("USB loop sending bulk write request FAILED");
                } // else Log("USB loop sending bulk write request SUCCEEDED");
              }
            }

            synchronized (_locker) {
              // Log("Read loop Waiting for requst to complete");
              if (usbConnection.bulkTransfer(readEp0, readbuffer, 64, 100) >= 0) {
                byte[] readbuffertrimmed = new byte[readbuffer[0]];
                System.arraycopy(readbuffer, 0, readbuffertrimmed, 0, readbuffer[0]);
                _receivedQueue.add(readbuffertrimmed);
                Log(String.format("Message received: %s", CAN_Frame.bytesToHexString(readbuffer)));
                _connectionHandler.onUSBRecieve();
              }
            }
            // Sleep for 10 ms to pause, so other thread can write data or anything.
            // As both read and write data methods lock each other - they cannot be run in parallel.
            // Looks like Android is not so smart in planning the threads, so we need to give it a
            // small time
            // to switch the thread context.
            // Sleep(10);
          }
          if (usbConnection != null) {
            usbConnection.releaseInterface(Intf);
            usbConnection.releaseInterface(Intf0);
            interfaceclaimed = false;
            usbConnection.close();
            _connectionHandler.onUsbStopped();
            Log("USB Thread ENDED!");
          }
        }