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)7 BulkEnumerator::BulkEnumerator(UserSettingsPointer pConfig)
8         : ControllerEnumerator(),
9           m_context(nullptr),
10           m_pConfig(pConfig) {
11     libusb_init(&m_context);
12 }
13 
~BulkEnumerator()14 BulkEnumerator::~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)22 static 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()32 QList<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