Я ищу способ динамического поиска системного пути для устройств 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;
};
Задача ещё не решена.
Других решений пока нет …