QVector<CameraInfo> CameraUSB::avaibleCams(const CameraInfo &info) { QVector<CameraInfo> avaibleCams; libusb_context *ctx = NULL; libusb_device **devs; ssize_t cnt; int vendorId = info.getParam("vendorId").toString().toInt(0, 16); int productId = info.getParam("productId").toString().toInt(0, 16); // create context if(libusb_init(&ctx) != LIBUSB_SUCCESS) return avaibleCams; // get list usb device cnt = libusb_get_device_list(ctx, &devs); for(int i = 0; i < cnt; i++) { libusb_device_descriptor desc; if(libusb_get_device_descriptor(devs[i], &desc)==LIBUSB_SUCCESS) { if(desc.idVendor==vendorId && desc.idProduct==productId) { QString addr = QString("%1.%2").arg((int)libusb_get_bus_number(devs[i])) .arg((int)libusb_get_device_address(devs[i])); avaibleCams.append(CameraInfo("DreamCam USB", "USB", addr)); } } } libusb_free_device_list(devs, 1); // destroy usb context libusb_exit(ctx); return avaibleCams; }
bool CameraUSB::connect(const CameraInfo &info) { int ret; // com settings _vendorId = info.getParam("vendorId").toString().toInt(0, 16); _productId = info.getParam("productId").toString().toInt(0, 16); _epIn = info.getParam("EPIN").toString().toInt(0, 16); _epOut = info.getParam("EPOUT").toString().toInt(0, 16); _interfaceNumber = info.getParam("interface").toString().toInt(0, 16); if(_vendorId == 0 || _productId == 0) { qDebug()<<"USB bad vendorId/productId settings"; return false; } // connect if(info.addr().isEmpty()) { qDebug()<<"addr empty"; _devHandle = libusb_open_device_with_vid_pid(_ctx, _vendorId, _productId); } else { // get list usb device libusb_device **devs; ssize_t cnt = libusb_get_device_list(_ctx, &devs); for(int i = 0; i < cnt; i++) { libusb_device_descriptor desc; if(libusb_get_device_descriptor(devs[i], &desc)==LIBUSB_SUCCESS) { if(desc.idVendor==_vendorId && desc.idProduct==_productId) { QString addr = QString("%1.%2").arg((int)libusb_get_bus_number(devs[i])) .arg((int)libusb_get_device_address(devs[i])); if(addr==info.addr()) { _device = devs[i]; libusb_open(devs[i], &_devHandle); } } } } libusb_free_device_list(devs, 1); } if(_devHandle == NULL) { qDebug()<<"Cannot open device"<<endl; return false; } // reset device if((ret = libusb_reset_device(_devHandle)) != 0) qDebug()<<"Cannot reset device"<<libusb_strerror(libusb_error(ret)); if(libusb_kernel_driver_active(_devHandle, _interfaceNumber) == 1) //find out if kernel driver is attached { printf("Kernel Driver Active\n"); if(libusb_detach_kernel_driver(_devHandle, _interfaceNumber) == 0) //detach it printf("Kernel Driver Detached!\n"); } ret = libusb_claim_interface(_devHandle, _interfaceNumber); if(ret != 0) { qDebug()<<"Cannot claim device"<<libusb_strerror(libusb_error(ret)); return false; } if((ret = libusb_clear_halt(_devHandle, _epOut)) != 0) qDebug()<<"Cannot clear EPOUT"<<libusb_strerror(libusb_error(ret)); if((ret = libusb_clear_halt(_devHandle, _epIn)) != 0) qDebug()<<"Cannot clear EPIN"<<libusb_strerror(libusb_error(ret)); //libusb_set_debug(_ctx, LIBUSB_LOG_LEVEL_DEBUG); //flush(); return true; }