Added mouse DPI interface

This commit is contained in:
2023-09-28 17:08:28 +02:00
parent 69c9b6e342
commit 7dc6a89c04
5 changed files with 108 additions and 3 deletions

View File

@@ -74,6 +74,26 @@ uint32_t driver_getkey(void)
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)
{
libusb_device* dev = handle;
@@ -119,3 +139,42 @@ char* driver_get_image(void* handle)
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;
}