Я пытаюсь подключить Wii Nunchuk к ПК с Windows.Я написал прошивку ARM, которая обрабатывает сторону контроллера.Я также написал приложение для Windows, которое опрашивает данные.Все работает, за исключением того, что у меня задержка в 2 с между нажатием кнопки пользователем и Windows, замечающей это.
Я использую библиотеку hidapi .
Не совсем знаю, как отлаживатьэтот.Я уверен, что Windows продолжает опрашивать устройство, если приложение не запущено (проверено с помощью Wireshark).Это также опрос при запуске приложения или приложение является единственным процессом, который может получить доступ к устройству?Я не хочу, чтобы Windows также опрашивала устройство (но я все еще хочу, чтобы оно было простым HID-устройством).
Устройство является стандартным устройством HID USB, поэтому оно получает hidclass.sys
, hidparse.sys
*Драйверы 1011 *, связанные по умолчанию (если вы можете вызывать эти драйверы ... не уверены, что это правильный язык для sys
файлов).
Я удалил некоторые части кода, чтобы он был короче.
Я пытался: опрашивать быстрее и медленнее, переходя от неблокирующего к блокирующему чтению.
int main(int argc, char* argv[])
{
signal(SIGINT, SigHandler);
signal(SIGTERM, SigHandler);
#ifdef WIN32
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
#endif
int result;
hid_device* usb_handle;
if (hid_init())
return -1;
unsigned char usb_data_buffer[256];
// Open the device using the VID, PID,
// and optionally the Serial number.
usb_handle = hid_open(VID, PID, NULL);
if (!usb_handle) {
printf(" >> Unable to open device\n");
return 1;
}
print_usb_info(usb_handle);
// Lets block because why not
hid_set_nonblocking(usb_handle, 0);
while (running)
{
result = hid_read(usb_handle, usb_data_buffer, sizeof(usb_data_buffer));
controller.stick_dir = DIR_NONE;
controller.stick_raw_x = usb_data_buffer[0];
controller.stick_raw_y = usb_data_buffer[1];
controller.btn_C = (usb_data_buffer[2] & 0b00000010) >> 1;
controller.btn_Z = usb_data_buffer[2] & 0b00000001;
printf("%03d ", controller.stick_raw_x);
printf("%03d ", controller.stick_raw_y);
printf("%01d ", controller.btn_C);
printf("%01d ", controller.btn_Z);
printf("\n");
...
MOUSEINPUT mouseInput = {};
mouseInput.dwFlags = MOUSEEVENTF_MOVE;
INPUT mInput;
if (cursor_pie_offset(&mouseInput, controller.stick_dir, controller.stick_dir_prev))
{
mInput.type = 0;
mInput.mi = mouseInput;
SendInput(1, &mInput, sizeof(mInput));
}
KEYBDINPUT keybdInput = {};
keybdInput.wVk = VK_CONTROL;
INPUT kInput0;
kInput0.type = 1;
kInput0.ki = keybdInput;
#ifdef WIN32
Sleep(5);
#else
usleep(5*1000);
#endif
}
hid_close(usb_handle);
hid_exit();
return 0;
}