openDevice method

Pointer<libusb_device_handle>? openDevice(
  1. int vendorId,
  2. int productId
)

Implementation

Pointer<libusb_device_handle>? openDevice(int vendorId, int productId) {
  final deviceListPtr = calloc<Pointer<Pointer<libusb_device>>>();
  final ctxPtr = calloc<Pointer<libusb_context>>();

  if (_bindings.libusb_init(ctxPtr) < 0) {
    return null;
  }

  int deviceCount =
      _bindings.libusb_get_device_list(ctxPtr.value, deviceListPtr);
  if (deviceCount < 0) {
    return null;
  }

  for (int i = 0; i < deviceCount; i++) {
    final device = deviceListPtr.value[i];
    final descriptor = calloc<libusb_device_descriptor>();

    if (_bindings.libusb_get_device_descriptor(device, descriptor) == 0) {
      if (descriptor.ref.idVendor == vendorId &&
          descriptor.ref.idProduct == productId) {
        final handlePtr = calloc<Pointer<libusb_device_handle>>();
        int openResult = _bindings.libusb_open(device, handlePtr);

        if (openResult < 0) {
          final errorMsg = _bindings
              .libusb_error_name(openResult)
              .cast<Utf8>()
              .toDartString();
          log("Error open device: $errorMsg (Code: $openResult)");
          calloc.free(descriptor);
          continue;
        }

        //log("Open device Ok");
        calloc.free(descriptor);
        return handlePtr.value;
      }
    }
    calloc.free(descriptor);
  }

  _bindings.libusb_free_device_list(deviceListPtr.value, 1);
  return null;
}