|
|
|
@ -1,6 +1,6 @@ |
|
|
|
|
#include "g-wolves.h" |
|
|
|
|
|
|
|
|
|
#define DEVICE_WIRELESS(handle) (driver_get_capacity(handle) & DEVICE_CAPACITY_WIRELESS) |
|
|
|
|
#define DEVICE_WIRELESS(handle) (is_connection_wireless(handle)) |
|
|
|
|
|
|
|
|
|
static int send_command(libusb_device_handle* hand, uint8_t command, uint8_t size, void* report, bool wireless) |
|
|
|
|
{ |
|
|
|
@ -86,10 +86,13 @@ device_capacity_t driver_get_capacity(void* handle) |
|
|
|
|
uint8_t wireless = 0; |
|
|
|
|
switch(desc.idProduct) |
|
|
|
|
{ |
|
|
|
|
case HTX_4K_PRODUCT_ID_WIRED: |
|
|
|
|
case HTX_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
case HTS_PLUS_4K_PRODUCT_ID_WIRED: |
|
|
|
|
case HTS_PLUS_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
case HSK_PRO_ACE_PRODUCT_ID_WIRED: |
|
|
|
|
case HSK_PRO_ACE_PRODUCT_ID_WIRELESS: |
|
|
|
|
wireless = 1; |
|
|
|
|
wireless = DEVICE_CAPACITY_WIRELESS; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -147,6 +150,24 @@ char* driver_get_image(void* handle) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool is_connection_wireless(void* handle) |
|
|
|
|
{ |
|
|
|
|
libusb_device* dev = handle; |
|
|
|
|
|
|
|
|
|
struct libusb_device_descriptor desc; |
|
|
|
|
libusb_get_device_descriptor(dev, &desc); |
|
|
|
|
|
|
|
|
|
switch(desc.idProduct) |
|
|
|
|
{ |
|
|
|
|
case HTX_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
case HTS_PLUS_4K_PRODUCT_ID_WIRELESS: |
|
|
|
|
case HSK_PRO_ACE_PRODUCT_ID_WIRELESS: |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int driver_mouse_dpi_get(void* handle, struct MOUSE_DPI_LEVELS* output) |
|
|
|
|
{ |
|
|
|
|
libusb_device* dev = handle; |
|
|
|
@ -229,3 +250,34 @@ int driver_mouse_angle_snap_get(void* handle, bool* output) |
|
|
|
|
libusb_close(hand); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int driver_wireless_connection_type_get(void* handle, bool* output) |
|
|
|
|
{ |
|
|
|
|
*output = is_connection_wireless(handle); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int driver_wireless_battery_state_get(void* handle, int* battery_level, bool* charging) |
|
|
|
|
{ |
|
|
|
|
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_BATTERY report = {0}; |
|
|
|
|
int res = send_command(hand, COMMAND_BATTERY, REPORT_BATTERY_SIZE, &report, DEVICE_WIRELESS(handle)); |
|
|
|
|
if(res <= 0) return -1; |
|
|
|
|
|
|
|
|
|
// Format output values
|
|
|
|
|
*battery_level = report.battery_level; |
|
|
|
|
*charging = report.battery_status; |
|
|
|
|
|
|
|
|
|
// Close and return
|
|
|
|
|
libusb_attach_kernel_driver(hand, 0x2); |
|
|
|
|
libusb_close(hand); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|