Hotplug事件不起作用libubs 1.0

时间:2014-02-27 11:34:20

标签: c++ libusb-1.0

我正在尝试在此example的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.10libusb-1.0.16-3。回调已成功注册。

P.S。我在C ++库中使用libusb进行Java程序。

谢谢!

1 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,通过一些调试,我发现hotplug事件本身正在发生并被推送到事件管道。但是,通过查看libusb源代码,我没有看到任何可以轮询这些事件的专用线程。事件轮询(和回调调用)似乎是作为通用事务请求处理的一部分完成的。所以我怀疑(虽然我自己没有测试过)你必须要控制或数据请求来查看热插拔回调。

您可能会尝试生成一个线程,使用libusb_handle_events_timeout_completed()超时参数调用NULL,也许每秒一次。这可能会给你你想要的东西。

如果这是正确的,我希望libusb在libusb_init()上有一个标志,专门为hotplug事件创建一个线程,而不依赖于控制/数据请求调用。