Событие горячего подключения не работает libubs 1.0

Я пытаюсь реализовать события присоединения / отсоединения устройства в моем коде libusb-1.0 из этого пример.

Вот как я это использую:

void registerCallBack() {

int rc;
libusb_init(NULL);
rc = libusb_hotplug_register_callback(NULL, (libusb_hotplug_event) (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), LIBUSB_HOTPLUG_ENUMERATE,
0x2047, LIBUSB_HOTPLUG_MATCH_ANY,
LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,
&handle);
if (LIBUSB_SUCCESS != rc) {
printf("Error creating a hotplug callback\n");
libusb_exit(NULL);
return;
}
printf("Success registering callback\n");
}

Сама функция обратного вызова:

int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,
libusb_hotplug_event event, void *user_data) {
printf("EVENT! %d\n", event);
callJava(); // call java method when event fires
return 0;
}

Если я запускаю этот код и устройство подключено — происходит событие, потому что LIBUSB_HOTPLUG_ENUMERATE задавать. Но если я пытаюсь подключить / отключить устройство во время работы программы, ничего не происходит. Если я устанавливаю флаг 0 (не LIBUSB_HOTPLUG_ENUMERATE) тогда никаких событий не происходит.

я имею Ubuntu Linux 13.10 а также libusb-1.0.16-3, Обратный звонок успешно зарегистрирован.

Постскриптум Я использую libusb в библиотеке C ++ для программы Java.

Спасибо!

3

Решение

У меня была та же проблема, и после небольшой отладки я обнаружил, что само событие горячего подключения происходило и передавалось в канал событий. Однако, глядя на исходный код libusb, я не увидел ни одного выделенного потока, который бы опрашивал эти события. Опрос событий (и вызовы обратного вызова), по-видимому, выполняются как часть общей обработки запроса транзакции. Поэтому я подозреваю (хотя сам не проверял это), что вы должны делать контрольные запросы или запросы данных, чтобы увидеть обратные вызовы «горячей» замены.

Вы можете попробовать создать поток для вызова libusb_handle_events_timeout_completed() с NULL параметр тайм-аута, может быть, раз в секунду. Это может дать вам то, что вы хотите.

Если это правильно, я бы хотел, чтобы у libusb был флаг libusb_init() создать поток специально для событий горячего подключения, не завися от вызовов управления / запроса данных.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]