1 #include <libusb.h> 2 3 #include "controllers/bulk/bulkcontroller.h" 4 #include "controllers/bulk/bulkenumerator.h" 5 #include "controllers/bulk/bulksupported.h" 6 BulkEnumerator(UserSettingsPointer pConfig)7BulkEnumerator::BulkEnumerator(UserSettingsPointer pConfig) 8 : ControllerEnumerator(), 9 m_context(nullptr), 10 m_pConfig(pConfig) { 11 libusb_init(&m_context); 12 } 13 ~BulkEnumerator()14BulkEnumerator::~BulkEnumerator() { 15 qDebug() << "Deleting USB Bulk devices..."; 16 while (m_devices.size() > 0) { 17 delete m_devices.takeLast(); 18 } 19 libusb_exit(m_context); 20 } 21 is_interesting(struct libusb_device_descriptor * desc)22static bool is_interesting(struct libusb_device_descriptor *desc) { 23 for (int i = 0; bulk_supported[i].vendor_id; ++i) { 24 if ((bulk_supported[i].vendor_id == desc->idVendor) && 25 (bulk_supported[i].product_id == desc->idProduct)) { 26 return true; 27 } 28 } 29 return false; 30 } 31 queryDevices()32QList<Controller*> BulkEnumerator::queryDevices() { 33 qDebug() << "Scanning USB Bulk devices:"; 34 libusb_device **list; 35 ssize_t cnt = libusb_get_device_list(m_context, &list); 36 ssize_t i = 0; 37 int err = 0; 38 39 for (i = 0; i < cnt; i++) { 40 libusb_device *device = list[i]; 41 struct libusb_device_descriptor desc; 42 43 libusb_get_device_descriptor(device, &desc); 44 if (is_interesting(&desc)) { 45 struct libusb_device_handle* handle = nullptr; 46 err = libusb_open(device, &handle); 47 if (err) { 48 qWarning() << "Error opening a device"; 49 continue; 50 } 51 52 BulkController* currentDevice = 53 new BulkController(m_pConfig, m_context, handle, &desc); 54 m_devices.push_back(currentDevice); 55 } 56 } 57 libusb_free_device_list(list, 1); 58 return m_devices; 59 } 60