From 249aa814231d5d36a4c3733b0f1573ff00ad3473 Mon Sep 17 00:00:00 2001 From: Barry H Date: Thu, 1 Feb 2024 17:38:55 +0000 Subject: [PATCH] Add Valkyrie VK99 Normal --- .../RGBController_ValkyrieKeyboard.cpp | 144 +++++++++++++++++- .../RGBController_ValkyrieKeyboard.h | 12 +- .../ValkyrieKeyboardController.cpp | 74 ++++++--- .../ValkyrieKeyboardController.h | 37 +++-- .../ValkyrieKeyboardControllerDetect.cpp | 26 +++- 5 files changed, 252 insertions(+), 41 deletions(-) diff --git a/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.cpp b/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.cpp index be452c57..9cca958d 100644 --- a/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.cpp +++ b/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.cpp @@ -5,6 +5,7 @@ | keyboard devices | | | | Nollie(Nuonuo) 2023/12/6 | +| Bartholomew Ho (imnotmental) 02/01/2024 | \*-----------------------------------------*/ #include "RGBControllerKeyNames.h" @@ -21,6 +22,14 @@ static unsigned int matrix_map[6][22] = { 69, NA, NA, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, NA, NA, 81, NA, 82, 83, 84, 85 }, { 86, 87, 88, NA, NA, NA, NA, 89, NA, NA, NA, NA, 90, 91, 92, 93, 94, 95, NA, 96, 97, NA } }; +static unsigned int normal_matrix_map[6][22] = + {{ 0, NA, 1, 2, 3, 4, NA, 5, 6, 7, 8, NA, 9, 10, 11, 12, NA, 13, 14, 15, 16, 17 }, + { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, NA, NA, NA, 32, 33, 34, 35, 36 }, + { 37, NA, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, NA, NA, 51, 52, 53, 54, 55 }, + { 56, NA, NA, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, NA, 67, 68, NA, 69, 70, 71, 72, NA }, + { 73, NA, NA, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, NA, NA, 85, NA, 86, 87, 88, 89 }, + { 90, 91, 92, NA, NA, NA, NA, 93, NA, NA, NA, NA, 94, 95, 96, 97, 98, 99, NA, 100, 101, NA } }; + static const char* zone_names[] = { ZONE_EN_KEYBOARD @@ -36,6 +45,11 @@ static const unsigned int zone_sizes[] = 98 }; +static const unsigned int normal_zone_sizes[] = +{ + 102 +}; + static const char *led_names[] = { KEY_EN_ESCAPE, @@ -137,6 +151,112 @@ static const char *led_names[] = KEY_EN_NUMPAD_0, KEY_EN_NUMPAD_PERIOD }; + +static const char *normal_led_names[] = + { + KEY_EN_ESCAPE, + KEY_EN_F1, + KEY_EN_F2, + KEY_EN_F3, + KEY_EN_F4, + KEY_EN_F5, + KEY_EN_F6, + KEY_EN_F7, + KEY_EN_F8, + KEY_EN_F9, + KEY_EN_F10, + KEY_EN_F11, + KEY_EN_F12, + KEY_EN_DELETE, + KEY_EN_PRINT_SCREEN, + KEY_EN_PAUSE_BREAK, + KEY_EN_HOME, + KEY_EN_END, + KEY_EN_BACK_TICK, + KEY_EN_1, + KEY_EN_2, + KEY_EN_3, + KEY_EN_4, + KEY_EN_5, + KEY_EN_6, + KEY_EN_7, + KEY_EN_8, + KEY_EN_9, + KEY_EN_0, + KEY_EN_MINUS, + KEY_EN_PLUS, + KEY_EN_BACKSPACE, + KEY_EN_INSERT, + KEY_EN_NUMPAD_LOCK, + KEY_EN_NUMPAD_DIVIDE, + KEY_EN_NUMPAD_TIMES, + KEY_EN_NUMPAD_MINUS, + KEY_EN_TAB, + KEY_EN_Q, + KEY_EN_W, + KEY_EN_E, + KEY_EN_R, + KEY_EN_T, + KEY_EN_Y, + KEY_EN_U, + KEY_EN_I, + KEY_EN_O, + KEY_EN_P, + KEY_EN_LEFT_BRACKET, + KEY_EN_RIGHT_BRACKET, + KEY_EN_BACK_SLASH, + KEY_EN_PAGE_UP, + KEY_EN_NUMPAD_7, + KEY_EN_NUMPAD_8, + KEY_EN_NUMPAD_9, + KEY_EN_NUMPAD_PLUS, + KEY_EN_CAPS_LOCK, + KEY_EN_A, + KEY_EN_S, + KEY_EN_D, + KEY_EN_F, + KEY_EN_G, + KEY_EN_H, + KEY_EN_J, + KEY_EN_K, + KEY_EN_L, + KEY_EN_SEMICOLON, + KEY_EN_QUOTE, + KEY_EN_ANSI_ENTER, + KEY_EN_PAGE_DOWN, + KEY_EN_NUMPAD_4, + KEY_EN_NUMPAD_5, + KEY_EN_NUMPAD_6, + KEY_EN_LEFT_SHIFT, + KEY_EN_Z, + KEY_EN_X, + KEY_EN_C, + KEY_EN_V, + KEY_EN_B, + KEY_EN_N, + KEY_EN_M, + KEY_EN_COMMA, + KEY_EN_PERIOD, + KEY_EN_FORWARD_SLASH, + KEY_EN_RIGHT_SHIFT, + KEY_EN_UP_ARROW, + KEY_EN_NUMPAD_1, + KEY_EN_NUMPAD_2, + KEY_EN_NUMPAD_3, + KEY_EN_NUMPAD_ENTER, + KEY_EN_LEFT_CONTROL, + KEY_EN_LEFT_WINDOWS, + KEY_EN_LEFT_ALT, + KEY_EN_SPACE, + KEY_EN_RIGHT_ALT, + KEY_EN_RIGHT_FUNCTION, + KEY_EN_RIGHT_CONTROL, + KEY_EN_LEFT_ARROW, + KEY_EN_DOWN_ARROW, + KEY_EN_RIGHT_ARROW, + KEY_EN_NUMPAD_0, + KEY_EN_NUMPAD_PERIOD +}; /**------------------------------------------------------------------*\ @name Valkyrie @category Keyboard @@ -148,9 +268,10 @@ static const char *led_names[] = @comment \*-------------------------------------------------------------------*/ -RGBController_ValkyrieKeyboard::RGBController_ValkyrieKeyboard(ValkyrieKeyboardController* controller_ptr) +RGBController_ValkyrieKeyboard::RGBController_ValkyrieKeyboard(ValkyrieKeyboardController* controller_ptr, ValkyrieKeyboardMappingLayoutType keyboard_layout) { controller = controller_ptr; + layout = keyboard_layout; name = "Valkyrie Keyboard Device"; vendor = "Valkyrie"; @@ -180,6 +301,7 @@ RGBController_ValkyrieKeyboard::~RGBController_ValkyrieKeyboard() { delete zones[zone_index].matrix_map; } + break; } delete controller; @@ -197,13 +319,18 @@ void RGBController_ValkyrieKeyboard::SetupZones() unsigned int matrix_width = 0; unsigned int* matrix_map_ptr = NULL; - switch(controller->GetUSBPID()) + switch(layout) { - case VALKYRIE_99_PRO_PID: + case PRO_LAYOUT: zone_size = zone_sizes[zone_idx]; matrix_width = 22; matrix_map_ptr = (unsigned int *)&matrix_map; break; + + default: + zone_size = normal_zone_sizes[zone_idx]; + matrix_width = 22; + matrix_map_ptr = (unsigned int *)&normal_matrix_map; } zone new_zone; @@ -224,7 +351,16 @@ void RGBController_ValkyrieKeyboard::SetupZones() for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++) { led new_led; - new_led.name = led_names[led_idx]; + + switch(layout) + { + case PRO_LAYOUT: + new_led.name = led_names[led_idx]; + break; + default: + new_led.name = normal_led_names[led_idx]; + } + leds.push_back(new_led); } diff --git a/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.h b/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.h index d31ede72..f38c8424 100644 --- a/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.h +++ b/Controllers/ValkyrieKeyboardController/RGBController_ValkyrieKeyboard.h @@ -5,16 +5,23 @@ | keyboard devices | | | | Nollie(Nuonuo) 2023/12/6 | +| Bartholomew Ho (imnotmental) 02/01/2024 | \*-----------------------------------------*/ #pragma once #include "RGBController.h" #include "ValkyrieKeyboardController.h" +enum ValkyrieKeyboardMappingLayoutType +{ + NORMAL_LAYOUT, + PRO_LAYOUT, +}; + class RGBController_ValkyrieKeyboard : public RGBController { public: - RGBController_ValkyrieKeyboard(ValkyrieKeyboardController* controller_ptr); + RGBController_ValkyrieKeyboard(ValkyrieKeyboardController* controller_ptr, ValkyrieKeyboardMappingLayoutType keyboard_layout); ~RGBController_ValkyrieKeyboard(); void SetupZones(); @@ -25,5 +32,6 @@ public: void DeviceUpdateMode(); private: - ValkyrieKeyboardController* controller; + ValkyrieKeyboardController* controller; + ValkyrieKeyboardMappingLayoutType layout; }; diff --git a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.cpp b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.cpp index 097b4c9d..661884bd 100644 --- a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.cpp +++ b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.cpp @@ -5,16 +5,18 @@ | controller | | | | Nollie(Nuonuo) 2023/12/6 | +| Bartholomew Ho (imnotmental) 02/01/2024 | \*-----------------------------------------*/ #include #include "ValkyrieKeyboardController.h" -ValkyrieKeyboardController::ValkyrieKeyboardController(hid_device* dev_handle, const char* path, const unsigned short pid) +ValkyrieKeyboardController::ValkyrieKeyboardController(hid_device* dev_handle, const char* path, const unsigned short pid, const int interface) { - dev = dev_handle; - location = path; - usb_pid = pid; + dev = dev_handle; + location = path; + usb_pid = pid; + interface_num = interface; } ValkyrieKeyboardController::~ValkyrieKeyboardController() @@ -48,18 +50,42 @@ unsigned short ValkyrieKeyboardController::GetUSBPID() return(usb_pid); } -void ValkyrieKeyboardController::SendColors(unsigned char* color_data,unsigned int color_data_size) +int ValkyrieKeyboardController::GetInterfaceNum() +{ + return(interface_num); +} + +void ValkyrieKeyboardController::SendColors(unsigned char* color_data,unsigned int color_data_size) { // unsigned char* color_data_ptr = color_data; - unsigned char usb_buf[392]; - int led_num = 98; - for(int i = 0; i < led_num; i++) + unsigned char usb_buf_pro[392]; + unsigned char usb_buf_normal[408]; + int led_num = 0; + + switch(interface_num) { - usb_buf[i * 4] = key_code_99[i]; - usb_buf[i * 4 + 1] = color_data[i * 3]; - usb_buf[i * 4 + 2] = color_data[i * 3 + 1]; - usb_buf[i * 4 + 3] = color_data[i * 3 + 2]; + case 3: + led_num = 98; + for(int i = 0; i < led_num; i++) + { + usb_buf_pro[i * 4] = key_code_99[i]; + usb_buf_pro[i * 4 + 1] = color_data[i * 3]; + usb_buf_pro[i * 4 + 2] = color_data[i * 3 + 1]; + usb_buf_pro[i * 4 + 3] = color_data[i * 3 + 2]; + } + break; + default: + led_num = 102; + for(int i = 0; i < led_num; i++) + { + usb_buf_normal[i * 4] = key_code_103[i]; + usb_buf_normal[i * 4 + 1] = color_data[i * 3]; + usb_buf_normal[i * 4 + 2] = color_data[i * 3 + 1]; + usb_buf_normal[i * 4 + 3] = color_data[i * 3 + 2]; + } } + + SendInitializeColorPacket(); for(int i = 0; i <= 6; i++) { @@ -71,13 +97,27 @@ void ValkyrieKeyboardController::SendColors(unsigned char* color_data,unsigned char send_usb_buf[65]; memset(send_usb_buf, 0x00, sizeof(send_usb_buf)); - for(int index = 0; index < usb_data_num; index++) + switch(interface_num) { - send_usb_buf[index * 4 + 1] = usb_buf[index * 4 + i * 64 ]; - send_usb_buf[index * 4 + 2] = usb_buf[index * 4 + i * 64 + 1]; - send_usb_buf[index * 4 + 3] = usb_buf[index * 4 + i * 64 + 2]; - send_usb_buf[index * 4 + 4] = usb_buf[index * 4 + i * 64 + 3]; + case 3: + for(int index = 0; index < usb_data_num; index++) + { + send_usb_buf[index * 4 + 1] = usb_buf_pro[index * 4 + i * 64 ]; + send_usb_buf[index * 4 + 2] = usb_buf_pro[index * 4 + i * 64 + 1]; + send_usb_buf[index * 4 + 3] = usb_buf_pro[index * 4 + i * 64 + 2]; + send_usb_buf[index * 4 + 4] = usb_buf_pro[index * 4 + i * 64 + 3]; + } + break; + default: + for(int index = 0; index < usb_data_num; index++) + { + send_usb_buf[index * 4 + 1] = usb_buf_normal[index * 4 + i * 64 ]; + send_usb_buf[index * 4 + 2] = usb_buf_normal[index * 4 + i * 64 + 1]; + send_usb_buf[index * 4 + 3] = usb_buf_normal[index * 4 + i * 64 + 2]; + send_usb_buf[index * 4 + 4] = usb_buf_normal[index * 4 + i * 64 + 3]; + } } + /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ diff --git a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.h b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.h index fb8c80d1..4afc6800 100644 --- a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.h +++ b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardController.h @@ -5,6 +5,7 @@ | keyboard lighting controller | | | | Nollie(Nuonuo) 2023/12/6 | +| Bartholomew Ho (imnotmental) 02/01/2024 | \*-----------------------------------------*/ #pragma once @@ -20,17 +21,19 @@ /*-----------------------------------------------------*\ | Keyboard product IDs | \*-----------------------------------------------------*/ -#define VALKYRIE_99_PRO_PID 0x024F +#define VALKYRIE_99_PRO_PID 0x024F +#define VALKYRIE_99_NORMAL_PID 0x024F class ValkyrieKeyboardController { public: - ValkyrieKeyboardController(hid_device* dev_handle, const char* path, const unsigned short pid); + ValkyrieKeyboardController(hid_device* dev_handle, const char* path, const unsigned short pid, const int interface); ~ValkyrieKeyboardController(); std::string GetDeviceLocation(); std::string GetSerialString(); unsigned short GetUSBPID(); + int GetInterfaceNum(); void SendColors ( @@ -42,19 +45,29 @@ private: hid_device* dev; std::string location; unsigned short usb_pid; + int interface_num; void SendInitializeColorPacket(); void SendTerminateColorPacket(); int key_code_99[98] = - { - 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x77, - 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x67, - 0x74,0x20,0x21,0x22,0x7A,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, - 0x2E,0x2F,0x30,0x31,0x43,0x76,0x32,0x33,0x34,0x7B,0x37,0x38,0x39,0x3A, - 0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x55,0x79,0x44,0x45,0x46,0x49, - 0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x65,0x56,0x57, - 0x58,0x6A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x62,0x63,0x64,0x66,0x68,0x69 - }; - + { + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x77, + 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x67, + 0x74,0x20,0x21,0x22,0x7A,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, + 0x2E,0x2F,0x30,0x31,0x43,0x76,0x32,0x33,0x34,0x7B,0x37,0x38,0x39,0x3A, + 0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x55,0x79,0x44,0x45,0x46,0x49, + 0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x65,0x56,0x57, + 0x58,0x6A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x62,0x63,0x64,0x66,0x68,0x69 + }; + int key_code_103[102] = + { + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x77,0x70,0x73, + 0x75,0x78,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x67, + 0x74,0x20,0x21,0x22,0x7A,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x43,0x76,0x32,0x33,0x34,0x7B,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E, + 0x3F,0x40,0x41,0x42,0x55,0x79,0x44,0x45,0x46,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x65,0x56,0x57,0x58,0x6A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60, + 0x62,0x63,0x64,0x66,0x68,0x69 + }; }; diff --git a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardControllerDetect.cpp b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardControllerDetect.cpp index 74773daf..18846dbd 100644 --- a/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardControllerDetect.cpp +++ b/Controllers/ValkyrieKeyboardController/ValkyrieKeyboardControllerDetect.cpp @@ -4,17 +4,31 @@ #include "RGBController_ValkyrieKeyboard.h" #include +ValkyrieKeyboardMappingLayoutType GetKeyboardMappingLayoutType(int interface) +{ + switch(interface) + { + case 3: + return PRO_LAYOUT; + default: + return NORMAL_LAYOUT; + } +} + void DetectValkyrieKeyboardControllers(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); if(dev) { - ValkyrieKeyboardController* controller = new ValkyrieKeyboardController(dev, info->path, info->product_id); - RGBController_ValkyrieKeyboard* rgb_controller = new RGBController_ValkyrieKeyboard(controller); - rgb_controller->name = name; - ResourceManager::get()->RegisterRGBController(rgb_controller); + ValkyrieKeyboardController* controller = new ValkyrieKeyboardController(dev, info->path, info->product_id, info->interface_number); + ValkyrieKeyboardMappingLayoutType layout = GetKeyboardMappingLayoutType(info->interface_number); + RGBController_ValkyrieKeyboard* rgb_controller = new RGBController_ValkyrieKeyboard(controller, layout); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); } -} /* DetectValkyrieKeyboardControllers() */ +} -REGISTER_HID_DETECTOR_IPU("valkyrie-99pro",DetectValkyrieKeyboardControllers,VALKYRIE_VID,VALKYRIE_99_PRO_PID,3,0xFF13,0x0001); +/* DetectValkyrieKeyboardControllers() */ +REGISTER_HID_DETECTOR_IPU("Valkyrie VK99 Pro", DetectValkyrieKeyboardControllers, VALKYRIE_VID, VALKYRIE_99_PRO_PID, 3, 0xFF13, 0x0001); +REGISTER_HID_DETECTOR_IPU("Valkyrie VK99", DetectValkyrieKeyboardControllers, VALKYRIE_VID, VALKYRIE_99_NORMAL_PID, 2, 0xFF13, 0x0001);