wireless driver interface, g-wolves implementation

master
vhaudiquet 12 months ago
parent c11c203e14
commit ad28b82bb8
  1. 6
      README.md
  2. 56
      drivers/g-wolves/g-wolves.c
  3. 3
      src/device/driver_interface.h

@ -49,9 +49,11 @@ int driver_mouse_angle_snap_get(void* handle, bool* output);
/*
* Wireless driver
* - Battery (state + amount)
* - Connection type (usb 2.4/bluetooth/wired)
* - Battery (state + level)
* - Connection type (wired/wireless)
*/
int driver_wireless_battery_state_get(void* handle, int* battery_level, bool* charging);
int driver_wireless_connection_type_get(void* handle, bool* output);
```

@ -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;
}

@ -41,5 +41,8 @@ int driver_mouse_dpi_get(void* handle, struct MOUSE_DPI_LEVELS* output);
int driver_mouse_motion_sync_get(void* handle, bool* output);
int driver_mouse_angle_snap_get(void* handle, bool* output);
/* Wireless drivers */
int driver_wireless_battery_state_get(void* handle, int* battery_level, bool* charging);
int driver_wireless_connection_type_get(void* handle, bool* output);
#endif
Loading…
Cancel
Save