diff --git a/Controllers/MountainKeyboardController/MountainKeyboardController.cpp b/Controllers/MountainKeyboardController/MountainKeyboardController.cpp index 688230f2..480beef1 100644 --- a/Controllers/MountainKeyboardController/MountainKeyboardController.cpp +++ b/Controllers/MountainKeyboardController/MountainKeyboardController.cpp @@ -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; diff --git a/Controllers/MountainKeyboardController/MountainKeyboardController.h b/Controllers/MountainKeyboardController/MountainKeyboardController.h index 81a71b7b..944aba0e 100644 --- a/Controllers/MountainKeyboardController/MountainKeyboardController.h +++ b/Controllers/MountainKeyboardController/MountainKeyboardController.h @@ -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); diff --git a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp index a9ab41d1..281b00d5 100644 --- a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp +++ b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp @@ -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); } diff --git a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h index 0b4f5f09..d75860d1 100644 --- a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h +++ b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h @@ -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]; };