HID (USB) デバイスのシステム パスを動的に見つける方法を探しています。
私の Ubuntu マシンでは /dev/usb/hiddevX ですが、hiddevices が別の場所にマウントされるディストリビューションがあると思います。
具体的には、HID デバイスを開くために C プログラムでこれが必要です。これは、デバイスがどこにマウントされていても、すべてのシステムで機能するはずです。
現在の機能:
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;
};