|
|
@ -7,12 +7,10 @@ |
|
|
|
#include <string.h> |
|
|
|
#include <string.h> |
|
|
|
#include <stdbool.h> |
|
|
|
#include <stdbool.h> |
|
|
|
|
|
|
|
|
|
|
|
#define DEVICE_VENDOR_ID 0x33e4 |
|
|
|
#include "devices/htx.h" |
|
|
|
#define DEVICE_PRODUCT_ID_WIRED 0x5708 |
|
|
|
#include "devices/hts_plus.h" |
|
|
|
#define DEVICE_PRODUCT_ID_WIRELESS 0x5707 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define DPI_MAX_VALUE 26000 |
|
|
|
#define VENDOR_ID 0x33e4 |
|
|
|
#define DPI_MAX_LEVEL_COUNT 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define REPORT_MAX_SIZE 0x40 // 64 Bytes
|
|
|
|
#define REPORT_MAX_SIZE 0x40 // 64 Bytes
|
|
|
|
|
|
|
|
|
|
|
@ -40,7 +38,7 @@ |
|
|
|
#define COMMAND_BATTERY 0x8F |
|
|
|
#define COMMAND_BATTERY 0x8F |
|
|
|
#define COMMAND_WIRELESS_MOUSE 0x90 // -> send the next report to mouse, checking if mouse is connected
|
|
|
|
#define COMMAND_WIRELESS_MOUSE 0x90 // -> send the next report to mouse, checking if mouse is connected
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct HTX_DPI_LEVEL |
|
|
|
typedef struct DPI_LEVEL |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint8_t dpi_x_high; |
|
|
|
uint8_t dpi_x_high; |
|
|
|
uint8_t dpi_x_low; |
|
|
|
uint8_t dpi_x_low; |
|
|
@ -52,51 +50,51 @@ typedef struct HTX_DPI_LEVEL |
|
|
|
uint8_t led_r; |
|
|
|
uint8_t led_r; |
|
|
|
uint8_t led_g; |
|
|
|
uint8_t led_g; |
|
|
|
uint8_t led_b; |
|
|
|
uint8_t led_b; |
|
|
|
} __attribute__((packed)) htx_dpi_level_t; |
|
|
|
} __attribute__((packed)) dpi_level_t; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct HTX_REPORT_HEADER |
|
|
|
typedef struct REPORT_HEADER |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint8_t a1; // 0xa1: request_type on receive, 0x00 on set
|
|
|
|
uint8_t a1; // 0xa1: request_type on receive, 0x00 on set
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t report_size; // report size, after header
|
|
|
|
uint8_t report_size; // report size, after header
|
|
|
|
uint8_t command; // COMMAND
|
|
|
|
uint8_t command; // COMMAND
|
|
|
|
uint8_t wireless; // 0 on wired, 1 on wireless
|
|
|
|
uint8_t wireless; // 0 on wired, 1 on wireless
|
|
|
|
} __attribute__((packed)) htx_report_header_t; |
|
|
|
} __attribute__((packed)) report_header_t; |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_DPI_SETTINGS |
|
|
|
struct REPORT_DPI_SETTINGS |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t level_current; // current dpi level
|
|
|
|
uint8_t level_current; // current dpi level
|
|
|
|
uint8_t level_count; // count of dpi levels
|
|
|
|
uint8_t level_count; // count of dpi levels
|
|
|
|
|
|
|
|
|
|
|
|
htx_dpi_level_t levels[5]; |
|
|
|
dpi_level_t levels[5]; |
|
|
|
uint8_t zeros[23]; |
|
|
|
uint8_t zeros[23]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_UNKNOWN_0 |
|
|
|
struct REPORT_UNKNOWN_0 |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t value0; |
|
|
|
uint8_t value0; |
|
|
|
uint8_t value1; |
|
|
|
uint8_t value1; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 2]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 2]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_UNKNOWN_1 |
|
|
|
struct REPORT_UNKNOWN_1 |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t value0; |
|
|
|
uint8_t value0; |
|
|
|
uint8_t value1; |
|
|
|
uint8_t value1; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 2]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 2]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_CLICK_DEBOUNCE_SETTINGS |
|
|
|
struct REPORT_CLICK_DEBOUNCE_SETTINGS |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
// A = 0ms B = 1 ms C = 2 ms D = 3 ms E = 4 ms
|
|
|
|
// A = 0ms B = 1 ms C = 2 ms D = 3 ms E = 4 ms
|
|
|
|
uint8_t debounce_preset; // 0x00 = A, 0x01 = B, 0x02 = C, 0x03 = D, 0x04 = E, AUTO = 0x00
|
|
|
|
uint8_t debounce_preset; // 0x00 = A, 0x01 = B, 0x02 = C, 0x03 = D, 0x04 = E, AUTO = 0x00
|
|
|
@ -107,38 +105,38 @@ struct HTX_REPORT_CLICK_DEBOUNCE_SETTINGS |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - 8]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - 8]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_LIFT_OFF |
|
|
|
struct REPORT_LIFT_OFF |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
// 1 = Low, 2 = High
|
|
|
|
// 1 = Low, 2 = High
|
|
|
|
uint8_t lift_off; |
|
|
|
uint8_t lift_off; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 1]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 1]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_ANGLE_SNAP |
|
|
|
struct REPORT_ANGLE_SNAP |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
// 0 = disabled, 1 = enabled
|
|
|
|
// 0 = disabled, 1 = enabled
|
|
|
|
uint8_t angle_snap; |
|
|
|
uint8_t angle_snap; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 1]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 1]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_MOTION_SYNC |
|
|
|
struct REPORT_MOTION_SYNC |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t motion_sync; |
|
|
|
uint8_t motion_sync; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 1]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 1]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_UNKNOWN_6 |
|
|
|
struct REPORT_UNKNOWN_6 |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t value0; |
|
|
|
uint8_t value0; |
|
|
|
uint8_t value1; |
|
|
|
uint8_t value1; |
|
|
@ -147,23 +145,23 @@ struct HTX_REPORT_UNKNOWN_6 |
|
|
|
uint8_t value4; |
|
|
|
uint8_t value4; |
|
|
|
uint8_t value5; |
|
|
|
uint8_t value5; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 5]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 5]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_BATTERY |
|
|
|
struct REPORT_BATTERY |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t battery_status; // 0 : not charging, 1 : charging
|
|
|
|
uint8_t battery_status; // 0 : not charging, 1 : charging
|
|
|
|
uint8_t battery_level; // in %
|
|
|
|
uint8_t battery_level; // in %
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 2]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 2]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
|
|
struct HTX_REPORT_WIRELESS |
|
|
|
struct REPORT_WIRELESS |
|
|
|
{ |
|
|
|
{ |
|
|
|
htx_report_header_t header; |
|
|
|
report_header_t header; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t mouse_connected; // 0 if disconnected, else 1
|
|
|
|
uint8_t mouse_connected; // 0 if disconnected, else 1
|
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(htx_report_header_t) - 1]; |
|
|
|
uint8_t zeros[REPORT_MAX_SIZE - sizeof(report_header_t) - 1]; |
|
|
|
} __attribute__((packed)); |
|
|
|
} __attribute__((packed)); |