Add Knob color support to mountain keyboard

This commit is contained in:
rom4ster 2024-10-30 23:13:26 +00:00 committed by Adam Honse
parent b138405740
commit 43bd3774e8
4 changed files with 126 additions and 2 deletions

View file

@ -421,6 +421,54 @@ void MountainKeyboardController::SendColorPacketFinishCmd()
}
}
void MountainKeyboardController::SendWheelColorChange(unsigned char color_data [3])
{
wheel_config * usb_buf = GetWheelConfig();
if (usb_buf != nullptr)
{
usb_buf->fixed_byte_1 = 0x01;
usb_buf->fixed_byte_2 = 0x02;
usb_buf->zero_byte = 0x00;
usb_buf->r = color_data[0];
usb_buf->g = color_data[1];
usb_buf->b = color_data[2];
hid_write(dev, (unsigned char *) usb_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE);
}
}
wheel_config * MountainKeyboardController::GetWheelConfig()
{
unsigned char * usb_buf = new unsigned char [MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1];
unsigned char * recv_buf = &usb_buf[1];
for (int i =0; i < 1000; i++)
{
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1);
wheel_config * usb_conf = (wheel_config *) usb_buf;
usb_conf->config_start_first = 0x11;
usb_conf->config_start_second = 0x14;
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE);
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1);
hid_read_timeout(dev, recv_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE, 1);
if (usb_conf->config_start_first == MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIRST_BYTE &&
usb_conf->config_start_second == MOUNTAIN_KEYBOARD_WHEEL_CONFIG_SECOND_BYTE)
{
return usb_conf;
}
}
delete[] usb_buf;
return nullptr;
}
void MountainKeyboardController::SendDirectColorEdgeCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int data_size)
{
static bool first_call = true;

View file

@ -34,6 +34,11 @@
#define MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE 8
#define MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE \
(MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE-MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE)
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE 65
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIRST_BYTE 0x11
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_SECOND_BYTE 0x14
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIXED_BYTE_1 0x01
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIXED_BYTE_2 0x02
enum
{
@ -120,6 +125,23 @@ typedef struct
} mode;
} color_setup;
typedef struct
{
unsigned char report_size;
unsigned char config_start_first;
unsigned char config_start_second;
unsigned char zero_byte;
unsigned char fixed_byte_1;
unsigned char fixed_byte_2;
unsigned char config_intermediate_values [2];
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char config_end_values [54];
} wheel_config;
class MountainKeyboardController
{
public:
@ -140,6 +162,10 @@ public:
void SendDirectColorCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int color_count);
void SendDirectColorEdgeCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int data_size);
void SendWheelColorChange(unsigned char color_data [3]);
wheel_config * GetWheelConfig();
void SaveData(unsigned char mode_idx);
void SelectMode(unsigned char mode_idx);

View file

@ -222,6 +222,11 @@ enum
IDX_KEY_EN_UP_ARROW,
};
enum
{
IDX_WHEEL
};
static unsigned int matrix_tkl_map[KEYBOARD_MATRIX_TKL_HEIGHT][KEYBOARD_MATRIX_TKL_WIDTH] =
{ { 0, NA, 8, 14, 19, 24, NA, 30, 36, 40, 45, NA, 53, 59, 65, 70, 74, 78, 83},
{ 1, 6, 9, 15, 20, 25, 29, 31, 37, 41, 46, NA, 54, 60, 66, NA, 75, 79, 84},
@ -269,7 +274,7 @@ static unsigned int matrix_num_map_lut[KEYBOARD_MATRIX_NUM_KEYS_NO] =
IDX_KEY_EN_NUMPAD_MINUS, IDX_KEY_EN_NUMPAD_PLUS, IDX_KEY_EN_NUMPAD_ENTER
};
static unsigned int matrix_edge_tkl_map_lut[KEYBOARD_MATRIX_EDGE_TKL_KEYS_NO]=
static unsigned int matrix_edge_tkl_map_lut[KEYBOARD_MATRIX_EDGE_TKL_KEYS_NO] =
{
IDX_EDGE_16, IDX_EDGE_17, IDX_EDGE_18, IDX_EDGE_19,
IDX_EDGE_13, IDX_EDGE_20,
@ -296,6 +301,11 @@ static unsigned int matrix_edge_numpad_map_lut[KEYBOARD_MATRIX_EDGE_NUMPAD_KEYS_
IDX_EDGE_41, IDX_EDGE_40, IDX_EDGE_39, IDX_EDGE_38
};
static unsigned int single_wheel_lut[1]=
{
IDX_WHEEL
};
static unsigned int matrix_edge_tkl_map[KEYBOARD_MATRIX_EDGE_TKL_HEIGHT][KEYBOARD_MATRIX_EDGE_TKL_WIDTH] =
{ { NA, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, NA },
{ 0, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 28 },
@ -365,6 +375,15 @@ static const mountain_zone_t zone_definitions[] =
KEYBOARD_MATRIX_EDGE_NUMPAD_KEYS_NO,
KEYBOARD_MATRIX_EDGE_NUMPAD_HEIGHT,
KEYBOARD_MATRIX_EDGE_NUMPAD_WIDTH
},
{
"Wheel Selector",
ZONE_TYPE_SINGLE,
nullptr,
(unsigned int *) &single_wheel_lut,
1,
1,
1
}
};
@ -513,6 +532,16 @@ RGBController_MountainKeyboard::RGBController_MountainKeyboard(MountainKeyboardC
{
controller = controller_ptr;
memset(wheel_color, 0, 3);
wheel_config * wheel_conf = controller->GetWheelConfig();
if (wheel_conf != nullptr) {
wheel_color[0] = wheel_conf->r;
wheel_color[1] = wheel_conf->g;
wheel_color[2] = wheel_conf->b;
}
name = "Mountain Everest Keyboard";
vendor = "Mountain";
type = DEVICE_TYPE_KEYBOARD;
@ -715,6 +744,11 @@ void RGBController_MountainKeyboard::SetupZones()
}
break;
case 4:
{
new_led->name = zones[zone_idx].name + " LED";
}
break;
default:
break;
}
@ -770,7 +804,7 @@ void RGBController_MountainKeyboard::DeviceUpdate(const mode& current_mode)
color_edge_data[(3 * idx)+1] = RGBGetGValue(colors[led_idx]);
color_edge_data[(3 * idx)+2] = RGBGetBValue(colors[led_idx]);
}
else
else if (led_idx < zones[0].leds_count + zones[1].leds_count + zones[2].leds_count + zones[3].leds_count)
{
unsigned int zone_led_idx = led_idx - zones[0].leds_count - zones[1].leds_count - zones[2].leds_count;
unsigned int idx = zone_definitions[3].ptr_lut[zone_led_idx];
@ -778,6 +812,14 @@ void RGBController_MountainKeyboard::DeviceUpdate(const mode& current_mode)
color_edge_data[(3 * idx)+1] = RGBGetGValue(colors[led_idx]);
color_edge_data[(3 * idx)+2] = RGBGetBValue(colors[led_idx]);
}
else
{
wheel_color[0] = RGBGetRValue(colors[led_idx]);
wheel_color[1] = RGBGetGValue(colors[led_idx]);
wheel_color[2] = RGBGetBValue(colors[led_idx]);
}
}
/*---------------------------------------------------------*\
@ -811,7 +853,12 @@ void RGBController_MountainKeyboard::DeviceUpdate(const mode& current_mode)
setup.mode.one_color.g = RGBGetGValue(current_mode.colors[0]);
setup.mode.one_color.b = RGBGetBValue(current_mode.colors[0]);
unsigned char colors [3] = {setup.mode.one_color.r, setup.mode.one_color.g, setup.mode.one_color.b};
controller->SendColorStaticCmd(setup);
wheel_color[0] = colors[0];
wheel_color[1] = colors[1];
wheel_color[2] = colors[2];
}
break;
@ -1031,4 +1078,5 @@ unsigned char RGBController_MountainKeyboard::ConvertDirection(unsigned int dire
void RGBController_MountainKeyboard::DeviceSaveMode()
{
controller->SaveData(modes[active_mode].value);
controller->SendWheelColorChange(wheel_color);
}

View file

@ -54,4 +54,6 @@ private:
MountainKeyboardController* controller;
unsigned char ConvertDirection(unsigned int direction, bool rotation);
void DeviceUpdate(const mode& current_mode);
unsigned char wheel_color [3];
};