|
|
@ -74,6 +74,26 @@ uint32_t driver_getkey(void) |
|
|
|
return (VENDOR_ID << 16) | id; |
|
|
|
return (VENDOR_ID << 16) | id; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
device_capacity_t driver_get_capacity(void* handle) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
libusb_device* dev = handle; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct libusb_device_descriptor desc; |
|
|
|
|
|
|
|
libusb_get_device_descriptor(dev, &desc); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t wireless = 0; |
|
|
|
|
|
|
|
switch(desc.idProduct) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case HTX_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
|
|
|
case HTS_PLUS_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
|
|
|
case HSK_PRO_ACE_PRODUCT_ID_WIRELESS: |
|
|
|
|
|
|
|
wireless = 1; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return DEVICE_CAPACITY_MOUSE | wireless; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
char* driver_get_name(void* handle) |
|
|
|
char* driver_get_name(void* handle) |
|
|
|
{ |
|
|
|
{ |
|
|
|
libusb_device* dev = handle; |
|
|
|
libusb_device* dev = handle; |
|
|
@ -119,3 +139,42 @@ char* driver_get_image(void* handle) |
|
|
|
return ""; |
|
|
|
return ""; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int driver_mouse_dpi_get(void* handle, struct MOUSE_DPI_LEVELS* output) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
libusb_device* dev = handle; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Prepare usb device for transfer
|
|
|
|
|
|
|
|
libusb_device_handle* hand; |
|
|
|
|
|
|
|
int openres = libusb_open(dev, &hand); |
|
|
|
|
|
|
|
if(openres) return -1; |
|
|
|
|
|
|
|
libusb_detach_kernel_driver(hand, 0x2); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Send command
|
|
|
|
|
|
|
|
struct REPORT_DPI_SETTINGS report = {0}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool wireless = false; |
|
|
|
|
|
|
|
if(driver_get_capacity(handle) & DEVICE_CAPACITY_WIRELESS) wireless = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int res = send_command(hand, COMMAND_DPI_SETTINGS, REPORT_DPI_SETTINGS_SIZE, &report, wireless); |
|
|
|
|
|
|
|
if(res <= 0) return -1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Format 'output' packet
|
|
|
|
|
|
|
|
output->max_level_count = 5; |
|
|
|
|
|
|
|
output->level_count = report.level_count; |
|
|
|
|
|
|
|
output->level_current = report.level_current; |
|
|
|
|
|
|
|
output->led_available = true; |
|
|
|
|
|
|
|
output->xy_available = false; |
|
|
|
|
|
|
|
for(size_t i = 0; i < report.level_count; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
output->level[i].dpi_x = report.levels[i].dpi_x_high << 8 | report.levels[i].dpi_x_low; |
|
|
|
|
|
|
|
output->level[i].dpi_y = report.levels[i].dpi_y_high << 8 | report.levels[i].dpi_y_low; |
|
|
|
|
|
|
|
output->level[i].r = report.levels[i].led_r; |
|
|
|
|
|
|
|
output->level[i].g = report.levels[i].led_g; |
|
|
|
|
|
|
|
output->level[i].b = report.levels[i].led_b; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libusb_attach_kernel_driver(hand, 0x2); |
|
|
|
|
|
|
|
libusb_close(hand); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|