Как отладить задержку Windows USB HID контроллера? - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь подключить 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;
}
...