Hidapi hid_write () возвращает ошибку (Windows 10, C ++) - PullRequest
0 голосов
/ 19 марта 2020

Я пытался управлять светодиодами на моей мыши, используя hidapi, но всякий раз, когда я запускаю hid_write (), он возвращает -1. Я обнаружил, что ошибка вызывается внутри функции при вызове WriteFile () и что ошибка «Доступ запрещен». Существует часть программного обеспечения (iCue) для управления светодиодами и использования wireshark. Думаю, я понял, что отправить на мышь: Wireshark Screenshot

Мой код:

int main() {
CorsairHIDDevices corsair_devs; //Initialize vector of HID devices
int num = detectCorsairMouseHIDDevice(corsair_devs); //Enumerates HID devices and adds the mouse devices to corsair_devs. Returns number of devices added.
hid_device* handle;
handle = hid_open(corsair_devs[0].vendor_id, corsair_devs[0].product_id, nullptr);

//Creates message to send to mouse based on info from wireshark
int logoLed = 1;
int sideLed = 1;
int scrollLed = 1;
int ledCode = logoLed + 2 * sideLed + 4 * scrollLed;
int red = 255;
int green = 0;
int blue = 0;
uint8_t buf[64] = { 0 };
buf[0] = 0x07; buf[1] = 0xaa;
buf[4] = ledCode;
buf[5] = 0x07; buf[8] = 0x64;
buf[9] = red; buf[12] = red;
buf[10] = green; buf[13] = green;
buf[11] = blue; buf[14] = blue;
buf[15] = 0x05;

hid_write(handle, buf, 64); //Sends message to mouse. Returns -1 (error).
}

Когда перечислено, есть 5 устройств, соответствующих мыши, я не совсем уверен, что это значит или как выяснить, какое использовать, но я попробовал все из них, и ни одно из них не работало. У меня нет большого опыта использования хидапи; большая часть кода переназначена с здесь . Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 20 марта 2020

Неважно, я получил его на работу. Я отказался от хидапи и начал работать с libusb.

libusb_init(NULL);

libusb_device** devs;
libusb_device* mouse_dev = NULL;
int numDevs = libusb_get_device_list(NULL, &devs);
for (int i = 0; i < numDevs; i++) {
    libusb_device* dev = devs[i];
    libusb_device_descriptor desc = { 0 };
    libusb_get_device_descriptor(dev, &desc);
    if (desc.idVendor == 0x1B1C) {
        mouse_dev = dev;
    }
}
libusb_device_handle* handleCorsair;
libusb_open(mouse_dev, &handleCorsair);

if (libusb_kernel_driver_active(handleCorsair, 0) == 1) {
    libusb_detach_kernel_driver(handleCorsair, 0);
}

libusb_claim_interface(handleCorsair, 1);

libusb_free_device_list(devs, 1);

int logoLed = 1; //Set colour for logo LED? 
int sideLed = 1; //Set colour for side LED?
int scrollLed = 1; //Set colour for scroll LED?
int ledCode = logoLed + 2 * sideLed + 4 * scrollLed;

int red = 255; //Intensity of red channel
int green = 255; //Intensity of green channel
int blue = 255; //Intensity of blue channel

uint8_t buff[64] = { 0 };
buff[0] = 0x07; buff[1] = 0xaa; buff[4] = ledCode; buff[5] = 0x07; buff[8] = 0x64;
buff[9] = red; buff[12] = red;
buff[10] = green; buff[13] = green;
buff[11] = blue; buff[14] = blue;
buff[15] = 0x05;

libusb_interrupt_transfer(handleCorsair, 0x02, buff, 64, NULL, 0);

libusb_release_interface(handleCorsair, 1);
libusb_close(handleCorsair);
libusb_exit(NULL);
...