From e9dff40258e657dbc6436e2c50031e767ef4345e Mon Sep 17 00:00:00 2001 From: Yaroslav Chvanov Date: Tue, 1 Feb 2022 16:03:51 +0300 Subject: [PATCH] sinowealth: add types for buttons This button mapping reading and writing support is partially based on a previous work of @phomes and @enkore. Thank you both very much! --- src/driver-sinowealth.c | 223 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) diff --git a/src/driver-sinowealth.c b/src/driver-sinowealth.c index 1e52bab8..71a332a8 100644 --- a/src/driver-sinowealth.c +++ b/src/driver-sinowealth.c @@ -49,6 +49,8 @@ enum sinowealth_command_id { } __attribute__((packed)); _Static_assert(sizeof(enum sinowealth_command_id) == sizeof(uint8_t), "Invalid size"); +#define SINOWEALTH_BUTTON_SIZE 88 + #define SINOWEALTH_CMD_SIZE 6 /* Report length commands that get configuration data should use. */ @@ -232,6 +234,100 @@ struct sinowealth_config_report { } __attribute__((packed)); _Static_assert(sizeof(struct sinowealth_config_report) == SINOWEALTH_CONFIG_REPORT_SIZE, "Invalid size"); +enum sinowealth_button_type { + SINOWEALTH_BUTTON_TYPE_NONE = 0, /* This value might appear on broken configurations. */ + SINOWEALTH_BUTTON_TYPE_BUTTON = 0x11, + SINOWEALTH_BUTTON_TYPE_WHEEL = 0x12, + SINOWEALTH_BUTTON_TYPE_KEY = 0x21, + SINOWEALTH_BUTTON_TYPE_MULTIMEDIA_KEY = 0x22, + SINOWEALTH_BUTTON_TYPE_REPEATED = 0x31, + SINOWEALTH_BUTTON_TYPE_SWITCH_DPI = 0x41, + SINOWEALTH_BUTTON_TYPE_DPI_LOCK = 0x42, + SINOWEALTH_BUTTON_TYPE_SPECIAL = 0x50, + SINOWEALTH_BUTTON_TYPE_MACRO = 0x70, +} __attribute__((packed)); +_Static_assert(sizeof(enum sinowealth_button_type) == sizeof(uint8_t), "Invalid size"); + +/* Bit masks. */ +enum sinowealth_button_key_modifiers { + SINOWEALTH_BUTTON_KEY_MODIFIER_LEFTCTRL = 0x01, + SINOWEALTH_BUTTON_KEY_MODIFIER_LEFTSHIFT = 0x02, + SINOWEALTH_BUTTON_KEY_MODIFIER_LEFTALT = 0x04, + SINOWEALTH_BUTTON_KEY_MODIFIER_LEFTMETA = 0x08, +} __attribute__((packed)); +_Static_assert(sizeof(enum sinowealth_button_key_modifiers) == sizeof(uint8_t), "Invalid size"); + +enum sinowealth_button_macro_mode { + /* Repeat