2014-09-24 5 views
3

Я пытаюсь подключиться к контроллеру DS3 PS3. Мне удалось сделать это в C# с использованием реализации libusb, но решил перенести мою реализацию на java. К сожалению, мой переход к java не был таким гладким. Устройство, кажется, можно найти в списке устройств, но при попытке открыть его я получаю следующее сообщение об ошибке «ошибка USB 4: Невозможно, чтобы открыть USB устройство: Нет такого устройства (возможно, он был отключен)»usb4java Ошибка USB 4: Не удается открыть USB-устройство:

public class Main { 
private static final short VID = 0x054c; 
private static final short PID = 0x0268; 

Context context; 

public Main() { 
    context = new Context(); 
    int result = LibUsb.init(context); 

    if (result != LibUsb.SUCCESS) { 
     throw new LibUsbException("Unable to initialize libusb.", result); 
    } 

    ByteBuffer data = ByteBuffer.allocate(49); 
    DeviceHandle ds3Handle = getDeviceHandle(findDevice(VID, PID)); 
    LibUsb.controlTransfer(ds3Handle, (byte)0xa1, (byte)0x1, (short)0x101, (short)0, data, 1000L); 

    LibUsb.exit(context); 
} 

private Device findDevice(int vid, int pid) { 
    Device UsbDevice = null; 
    DeviceList list = new DeviceList(); 
    int result = LibUsb.getDeviceList(context, list); 

    if (result < 0) { 
     throw new LibUsbException("Unable to get device list", result); 
    } 

    try { 
     for(Device device: list) { 
      DeviceDescriptor descriptor = new DeviceDescriptor(); 
      result = LibUsb.getDeviceDescriptor(device, descriptor); 

      if (result != LibUsb.SUCCESS) { 
       throw new LibUsbException("Unable to read device descriptor", result); 
      } 

      if (descriptor.idVendor() == vid && descriptor.idProduct() == pid) { 
       UsbDevice = device; 
       System.out.println("found"); 
      } 
     } 
    } finally { 
     LibUsb.freeDeviceList(list, true); 
    } 

    return UsbDevice; 
} 

private DeviceHandle getDeviceHandle(Device device) { 
    DeviceHandle handle = new DeviceHandle(); 
    int result = LibUsb.open(device, handle); 

    if (result != LibUsb.SUCCESS) { 
     throw new LibUsbException("Unable to open USB device", result); 
    } 

    return handle; 
} 

public static void main(String [] args){ 
    new Main(); 
} 
} 

ответ

8

LibUsb.freeDeviceList (список, истина);

Это проблема true. «final boolean unrefDevices» отображается в javadoc. Ваш код освобождает устройство, прежде чем у вас есть шанс его открыть.

+0

может подтвердить, что это решение проблемы ФП в. Просто столкнулся с той же проблемой, используя тот же пример кода на странице 'usb4java'. Очень признателен! –

+0

Их сайт находится на GitHub. Выпущен PR. https://github.com/usb4java/usb4java.github.io/pull/2 – tresf

+0

Кажется, что ошибка действительно вызвана выпуском устройств, но как я могу это исправить? Когда я изменяю значение true в false, это дает еще одну ошибку. –

0

Просто меняется на ложь не достаточно, то вы также должны вызвать refDevice с устройством вам нужно вернуть пример:

} finally { 
     // Ensure the allocated device list is freed 
     LibUsb.freeDeviceList(list, false); 
    } 

    if (deviceFound != null) { 
     // Device found 
     LibUsb.refDevice(deviceFound); 
    } 
    return deviceFound;