Определите системный путь для устройств HID

Я ищу способ динамического поиска системного пути для устройств HID (USB).

На моей машине с Ubuntu это /dev/usb/hiddevX, но я предполагаю, что есть дистрибутивы, где hiddevices монтируются в другом месте.

Чтобы быть более конкретным: мне нужно это в программе на C, чтобы открыть HID-устройство - это должно работать в любой системе, независимо от того, где монтируются устройства.

Текущая функция:

int openDevice(int vendorId, int productId) {

    char devicePath[24];
    unsigned int numIterations = 10, i, handle;

    for (i = 0; i < numIterations; i++) {

        sprintf(devicePath, "/dev/usb/hiddev%d", i);

        if((handle = open(devicePath, O_RDONLY)) >= 0) {

            if(isDesiredDevice(handle, vendorId, productId))
                break;

            close(handle);
        }
    }

    if (i >= numIterations) {
        ThrowException(Exception::TypeError(String::New("Could not find device")));
    }

    return handle;
}

Это хорошо работает, но мне не нравится жестко закодированный / dev / usb / hiddev

Редактирование: Оказалось, что некоторые другие программисты используют запасные варианты для /dev/usb/hid/hiddevX и /dev/hiddevX, поэтому я также создал эти запасные варианты.

Обновленный метод:

/**
 * Returns the correct handle (file descriptor) on success
 *
 * @param int vendorId
 * @param int productId
 * @return int
 */
int IO::openDevice(int vendorId, int productId) {

    char devicePath[24];

    const char *devicePaths[] = {
        "/dev/usb/hiddev\%d",
        "/dev/usb/hid/hiddev\%d",
        "/dev/hiddev\%d",
        NULL
    };

    unsigned int numIterations = 15, i, j, handle;

    for (i = 0; devicePaths[i]; i++) {

        for (j = 0; j < numIterations; j++) {

            sprintf(devicePath, devicePaths[i], j);

            if((handle = open(devicePath, O_RDONLY)) >= 0) {

                if(isDesiredDevice(handle, vendorId, productId))
                    return handle;

                close(handle);
            }
        }
    };

    ThrowException(Exception::Error(String::New("Couldn't find device!")));
    return 0;
};

0 ответов

Другие вопросы по тегам