Определите системный путь для устройств 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;
};

1

Решение

Задача ещё не решена.

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

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

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