XN_C_API XnStatus xnUSBOpenDeviceByPath(const XnUSBConnectionString strDevicePath, XN_USB_DEV_HANDLE* pDevHandlePtr) { XnStatus nRetVal = XN_STATUS_OK; // parse connection string XnUInt16 nVendorID = 0; XnUInt16 nProductID = 0; XnUInt8 nBus = 0; XnUInt8 nAddress = 0; sscanf(strDevicePath, "%hx/%hx@%hhu/%hhu", &nVendorID, &nProductID, &nBus, &nAddress); if (nVendorID == 0 || nProductID == 0 || nBus == 0 || nAddress == 0) { XN_LOG_WARNING_RETURN(XN_STATUS_USB_DEVICE_OPEN_FAILED, "Invalid connection string: %s", strDevicePath); } // find device libusb_device** ppDevices; ssize_t nDeviceCount = libusb_get_device_list(g_InitData.pContext, &ppDevices); libusb_device* pRequestedDevice = NULL; for (ssize_t i = 0; i < nDeviceCount; ++i) { libusb_device* pDevice = ppDevices[i]; // get device descriptor libusb_device_descriptor desc; int rc = libusb_get_device_descriptor(pDevice, &desc); if (rc != 0) { libusb_free_device_list(ppDevices, 1); return (XN_STATUS_USB_ENUMERATE_FAILED); } // check if this is the requested device if (desc.idVendor == nVendorID && desc.idProduct == nProductID && libusb_get_bus_number(pDevice) == nBus && libusb_get_device_address(pDevice) == nAddress) { // add a reference to the device (so it won't be destroyed when list is freed) libusb_ref_device(pDevice); pRequestedDevice = pDevice; break; } } libusb_free_device_list(ppDevices, 1); nRetVal = xnUSBOpenDeviceImpl(pRequestedDevice, pDevHandlePtr); XN_IS_STATUS_OK(nRetVal); return (XN_STATUS_OK); }
XN_C_API XnStatus xnUSBOpenDevice(XnUInt16 nVendorID, XnUInt16 nProductID, void* pExtraParam, void* pExtraParam2, XN_USB_DEV_HANDLE* pDevHandlePtr) { XnStatus nRetVal = XN_STATUS_OK; // make sure library was initialized XN_VALIDATE_USB_INIT(); // Validate parameters XN_VALIDATE_OUTPUT_PTR(pDevHandlePtr); libusb_device* pDevice; nRetVal = FindDevice(nVendorID, nProductID, pExtraParam, &pDevice); XN_IS_STATUS_OK(nRetVal); nRetVal = xnUSBOpenDeviceImpl(pDevice, pDevHandlePtr); XN_IS_STATUS_OK(nRetVal); return (XN_STATUS_OK); }
XN_C_API XnStatus xnUSBOpenDeviceByPath(const XnUSBConnectionString strDevicePath, XN_USB_DEV_HANDLE* pDevHandlePtr) { return xnUSBOpenDeviceImpl(strDevicePath, pDevHandlePtr); }
XN_C_API XnStatus xnUSBOpenDevice(XnUInt16 /*nVendorID*/, XnUInt16 /*nProductID*/, void* /*pExtraParam*/, void* pExtraParam2, XN_USB_DEV_HANDLE* pDevHandlePtr) { return xnUSBOpenDeviceImpl((const XnChar*)pExtraParam2, pDevHandlePtr); }