diff --git a/Controllers/EVisionKeyboardController/EVisionKeyboardControllerDetect.cpp b/Controllers/EVisionKeyboardController/EVisionKeyboardControllerDetect.cpp index d56c666c..bf50dbc6 100644 --- a/Controllers/EVisionKeyboardController/EVisionKeyboardControllerDetect.cpp +++ b/Controllers/EVisionKeyboardController/EVisionKeyboardControllerDetect.cpp @@ -13,7 +13,9 @@ \*-----------------------------------------------------*/ #define EVISION_KEYBOARD_VID 0x0C45 #define EVISION_KEYBOARD2_VID 0x320F +#define EVISION_KEYBOARD3_VID 0x3299 #define EVISION_KEYBOARD_USAGE_PAGE 0xFF1C +#define ENDORFY_OMNIS_PID 0x0012 #define GLORIOUS_GMMK_TKL_PID 0x5064 #define REDRAGON_K550_PID 0x5204 #define REDRAGON_K552_PID 0x5104 @@ -53,7 +55,7 @@ void DetectEVisionV2Keyboards(hid_device_info* info, const std::string& name) if(dev) { - EVisionV2KeyboardController* controller = new EVisionV2KeyboardController(dev, info->path); + EVisionV2KeyboardController* controller = new EVisionV2KeyboardController(dev, info->path, EVISION_V2_KEYBOARD_LAYOUT); RGBController_EVisionV2Keyboard* rgb_controller = new RGBController_EVisionV2Keyboard(controller, EVISION_V2_KEYBOARD_PART_KEYBOARD); rgb_controller->name = name; @@ -74,6 +76,29 @@ void DetectEVisionV2Keyboards(hid_device_info* info, const std::string& name) } } +void DetectEndorfyKeyboards(hid_device_info* info, const std::string& name) +{ + json settings = ResourceManager::get()->GetSettingsManager()->GetSettings("EndorfySettings"); + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + EVisionV2KeyboardController* controller = new EVisionV2KeyboardController(dev, info->path, ENDORFY_KEYBOARD_LAYOUT); + + RGBController_EVisionV2Keyboard* rgb_controller = new RGBController_EVisionV2Keyboard(controller, EVISION_V2_KEYBOARD_PART_KEYBOARD); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + + if(!settings.contains("AdditionalZones") || settings["AdditionalZones"] == true) + { + rgb_controller = new RGBController_EVisionV2Keyboard(controller, ENDORFY_KEYBOARD_PART_EDGE); + rgb_controller->name = name; + rgb_controller->name += " Edge"; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } + } +} + /*---------------------------------------------------------------------------------------------------------------------------------------------*\ | Keyboards | \*---------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -86,4 +111,5 @@ REGISTER_HID_DETECTOR_IP("EVision Keyboard 0C45:8520", DetectEVisionKeyboards, REGISTER_HID_DETECTOR_IP("EVision Keyboard 320F:502A", DetectEVisionKeyboards, EVISION_KEYBOARD2_VID, WOMIER_K87_PID, 1, EVISION_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("EVision Keyboard 0C45:7698", DetectEVisionKeyboards, EVISION_KEYBOARD_VID, WOMIER_K66_PID, 1, EVISION_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("EVision Keyboard 320F:5064", DetectEVisionKeyboards, EVISION_KEYBOARD2_VID, GLORIOUS_GMMK_TKL_PID, 1, EVISION_KEYBOARD_USAGE_PAGE); +REGISTER_HID_DETECTOR_IP("Endorfy Omnis", DetectEndorfyKeyboards, EVISION_KEYBOARD3_VID, ENDORFY_OMNIS_PID, 1, EVISION_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("CSB/ICL01 Keyboard", DetectEVisionV2Keyboards, EVISION_KEYBOARD2_VID, BYGG_CSB_ICL01_PID, 1, EVISION_KEYBOARD_USAGE_PAGE); diff --git a/Controllers/EVisionKeyboardController/EVisionV2KeyboardController.cpp b/Controllers/EVisionKeyboardController/EVisionV2KeyboardController.cpp index c1775081..1fb0de2c 100644 --- a/Controllers/EVisionKeyboardController/EVisionV2KeyboardController.cpp +++ b/Controllers/EVisionKeyboardController/EVisionV2KeyboardController.cpp @@ -22,7 +22,7 @@ using namespace std::chrono_literals; -static uint8_t keyvalue_map[EVISION_V2_MATRIX_WIDTH * EVISION_V2_MATRIX_HEIGHT] = +static uint8_t evisionv2_map[EVISION_V2_MATRIX_WIDTH * EVISION_V2_MATRIX_HEIGHT] = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 19 20 */ 0, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96, @@ -33,11 +33,23 @@ static uint8_t keyvalue_map[EVISION_V2_MATRIX_WIDTH * EVISION_V2_MATRIX_HEIGHT] 5, 11, 17, 41, 65, 71, 77, 83, 89, 95, 101, 113, 119, }; -EVisionV2KeyboardController::EVisionV2KeyboardController(hid_device* dev_handle, const char* path) +static uint8_t endorfy_map[EVISION_V2_MATRIX_WIDTH * EVISION_V2_MATRIX_HEIGHT] = +{ + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 19 20 */ + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 80, 81, 82, + 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 99, 101, 102, 103, 104, + 105, 106, 107, 111, 115, 116, 117, 118, 119, 120, 121, 123, 124, +}; + +EVisionV2KeyboardController::EVisionV2KeyboardController(hid_device* dev_handle, const char* path, EVisionV2KeyboardLayout layout_) { const uint8_t sz = HID_MAX_STR; wchar_t tmp[sz]; + layout = layout_; dev = dev_handle; location = path; @@ -61,6 +73,18 @@ EVisionV2KeyboardController::EVisionV2KeyboardController(hid_device* dev_handle, map_size = buffer[5]; macros_size = buffer[6] * 0x80; + + switch(layout) + { + case EVISION_V2_KEYBOARD_LAYOUT: + keyvalue_map = evisionv2_map; + led_count = 106; + break; + case ENDORFY_KEYBOARD_LAYOUT: + keyvalue_map = endorfy_map; + led_count = 104; + break; + } } EVisionV2KeyboardController::~EVisionV2KeyboardController() @@ -234,6 +258,7 @@ int EVisionV2KeyboardController::GetMode(EVisionV2KeyboardPart part, EvisionV2Mo size = sizeof(buffer); break; case EVISION_V2_KEYBOARD_PART_LOGO: + case ENDORFY_KEYBOARD_PART_EDGE: offset += EVISION_V2_PARAMETER_LOGO; size = EVISION_V2_PARAMETER_LOGO_ON_OFF - EVISION_V2_PARAMETER_LOGO + 1; break; @@ -268,7 +293,7 @@ int EVisionV2KeyboardController::GetMode(EVisionV2KeyboardPart part, EvisionV2Mo } } } - else if(part == EVISION_V2_KEYBOARD_PART_LOGO) + else if(part == EVISION_V2_KEYBOARD_PART_LOGO || part == ENDORFY_KEYBOARD_PART_EDGE) { // Use ledmode for logo on/off config.ledmode = buffer[EVISION_V2_PARAMETER_LOGO_ON_OFF - EVISION_V2_PARAMETER_LOGO]; @@ -298,7 +323,7 @@ void EVisionV2KeyboardController::SetMode(EVisionV2KeyboardPart part, const Evis buffer[EVISION_V2_PARAMETER_LED_MODE_COLOR] = config.ledmode; } } - else if(part == EVISION_V2_KEYBOARD_PART_LOGO) + else if(part == EVISION_V2_KEYBOARD_PART_LOGO || part == ENDORFY_KEYBOARD_PART_EDGE) { // Use ledmode for logo on/off buffer[EVISION_V2_PARAMETER_LOGO_ON_OFF - EVISION_V2_PARAMETER_LOGO] = config.ledmode; @@ -329,6 +354,7 @@ void EVisionV2KeyboardController::SetMode(EVisionV2KeyboardPart part, const Evis size = sizeof(buffer); break; case EVISION_V2_KEYBOARD_PART_LOGO: + case ENDORFY_KEYBOARD_PART_EDGE: offset += EVISION_V2_PARAMETER_LOGO; size = EVISION_V2_PARAMETER_LOGO_ON_OFF - EVISION_V2_PARAMETER_LOGO + 1; break; @@ -348,7 +374,7 @@ void EVisionV2KeyboardController::SetMode(EVisionV2KeyboardPart part, const Evis void EVisionV2KeyboardController::SetLedsDirect(const std::vector& colours) { - const size_t colours_num = std::min(colours.size(), sizeof(keyvalue_map) / sizeof(keyvalue_map[0])); + const size_t colours_num = std::min(colours.size(), led_count); uint8_t* buffer = new uint8_t[3 * map_size]; memset(buffer, 0, 3 * map_size); @@ -394,7 +420,7 @@ int EVisionV2KeyboardController::GetLedsCustom(uint8_t colorset, std::vector& colours); void SetLedsCustom(uint8_t colorset, const std::vector& colours); + EVisionV2KeyboardLayout layout; + private: std::string device_name; std::string serial; @@ -167,5 +187,8 @@ private: size_t map_size; size_t macros_size; + uint8_t *keyvalue_map; + size_t led_count; + std::mutex query_mutex; }; diff --git a/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.cpp b/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.cpp index 2f559a5e..1e2cba5e 100644 --- a/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.cpp +++ b/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.cpp @@ -15,7 +15,7 @@ using namespace std::chrono_literals; -static unsigned int matrix_map[EVISION_V2_MATRIX_HEIGHT][EVISION_V2_MATRIX_WIDTH] = +static unsigned int evisionv2_matrix[EVISION_V2_MATRIX_HEIGHT][EVISION_V2_MATRIX_WIDTH] = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 19 20 */ { 0, NA, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, NA, NA, NA, NA }, @@ -26,7 +26,18 @@ static unsigned int matrix_map[EVISION_V2_MATRIX_HEIGHT][EVISION_V2_MATRIX_WIDTH { 93, 94, 95, NA, NA, NA, 96, NA, NA, NA, 97, 98, 99, 100, 101, 102, 103, NA, 104, 105, NA } }; -static const char *led_names[] = +static unsigned int endorfy_matrix[EVISION_V2_MATRIX_HEIGHT][EVISION_V2_MATRIX_WIDTH] = +{ + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 19 20 */ + { 0, NA, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, NA, NA, NA, NA }, + { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 }, + { 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 }, + { 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, NA, 70, NA, NA, NA, 71, 72, 73, NA }, + { 74, NA, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, NA, NA, 86, NA, 87, 88, 89, 90 }, + { 91, 92, 93, NA, NA, NA, 94, NA, NA, NA, 95, 96, 97, 98, 99, 100, 101, 102, NA, 103, NA } +}; + +static const char *led_evisionv2[] = { KEY_EN_ESCAPE, //00 KEY_EN_F1, @@ -141,6 +152,119 @@ static const char *led_names[] = KEY_EN_NUMPAD_PERIOD, }; +static const char *led_endorfy[] = +{ + KEY_EN_ESCAPE, //00 + 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, //10 + KEY_EN_F11, + KEY_EN_F12, + KEY_EN_PRINT_SCREEN, + KEY_EN_SCROLL_LOCK, + KEY_EN_PAUSE_BREAK, + + KEY_EN_BACK_TICK, //16 + KEY_EN_1, + KEY_EN_2, + KEY_EN_3, + KEY_EN_4, //20 + KEY_EN_5, + KEY_EN_6, + KEY_EN_7, + KEY_EN_8, + KEY_EN_9, + KEY_EN_0, + KEY_EN_MINUS, + KEY_EN_EQUALS, + KEY_EN_BACKSPACE, + KEY_EN_INSERT, + KEY_EN_HOME, //30 + KEY_EN_PAGE_UP, + KEY_EN_NUMPAD_LOCK, + KEY_EN_NUMPAD_DIVIDE, + KEY_EN_NUMPAD_TIMES, + KEY_EN_NUMPAD_MINUS, + + KEY_EN_TAB, //37 + KEY_EN_Q, + KEY_EN_W, + KEY_EN_E, //40 + 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_ANSI_BACK_SLASH, //50 + KEY_EN_DELETE, + KEY_EN_END, + KEY_EN_PAGE_DOWN, + KEY_EN_NUMPAD_7, + KEY_EN_NUMPAD_8, + KEY_EN_NUMPAD_9, + KEY_EN_NUMPAD_PLUS, + + KEY_EN_CAPS_LOCK, //58 + 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, //70 + KEY_EN_NUMPAD_4, + KEY_EN_NUMPAD_5, + KEY_EN_NUMPAD_6, + + KEY_EN_LEFT_SHIFT, + KEY_EN_Z, //75 + KEY_EN_X, + KEY_EN_C, + KEY_EN_V, + KEY_EN_B, //80 + 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, //90 + KEY_EN_NUMPAD_ENTER, + + KEY_EN_LEFT_CONTROL, + KEY_EN_LEFT_WINDOWS, //93 + KEY_EN_LEFT_ALT, + KEY_EN_SPACE, + KEY_EN_RIGHT_ALT, + KEY_EN_RIGHT_FUNCTION, + KEY_EN_MENU, + KEY_EN_RIGHT_CONTROL, + KEY_EN_LEFT_ARROW, //100 + KEY_EN_DOWN_ARROW, + KEY_EN_RIGHT_ARROW, + KEY_EN_NUMPAD_0, + KEY_EN_NUMPAD_PERIOD, +}; + /**------------------------------------------------------------------*\ @name EVision V2 Keyboard @category Keyboard @@ -165,6 +289,7 @@ RGBController_EVisionV2Keyboard::RGBController_EVisionV2Keyboard(EVisionV2Keyboa description = "EVision Keyboard Device"; location = controller->GetLocation(); serial = controller->GetSerial(); + layout = controller->layout; switch(part) { @@ -175,6 +300,9 @@ RGBController_EVisionV2Keyboard::RGBController_EVisionV2Keyboard(EVisionV2Keyboa case EVISION_V2_KEYBOARD_PART_EDGE: SetupLogoEdgeModes(); break; + case ENDORFY_KEYBOARD_PART_EDGE: + SetupEdgeModes(); + break; } SetupZones(); @@ -579,22 +707,79 @@ void RGBController_EVisionV2Keyboard::SetupLogoEdgeModes() modes.push_back(Off); } +void RGBController_EVisionV2Keyboard::SetupEdgeModes() +{ + mode Freeze; + Freeze.name = "Freeze"; + Freeze.value = ENDORFY_MODE2_FREEZE; + Freeze.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(Freeze); + + mode ColorWave; + ColorWave.name = "Color Wave"; + ColorWave.value = ENDORFY_MODE2_COLOR_WAVE; + ColorWave.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(ColorWave); + + mode Spectrum; + Spectrum.name = "Spectrum Cycle"; + Spectrum.value = ENDORFY_MODE2_SPECTRUM_CYCLE; + Spectrum.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(Spectrum); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = ENDORFY_MODE2_BREATHING; + Breathing.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(Breathing); + + mode Static; + Static.name = "Static"; + Static.value = ENDORFY_MODE2_STATIC; + Static.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(Static); + + mode Off; + Off.name = "Off"; + Off.value = ENDORFY_MODE2_OFF; + Off.flags = MODE_FLAG_AUTOMATIC_SAVE; + modes.push_back(Off); +} + void RGBController_EVisionV2Keyboard::SetupZones() { + unsigned short leds_count; + unsigned int *matrix_map; + const char **led_names; + + switch(layout) + { + case EVISION_V2_KEYBOARD_LAYOUT: + led_names = led_evisionv2; + matrix_map = (unsigned int *)evisionv2_matrix; + leds_count = 106; + break; + case ENDORFY_KEYBOARD_LAYOUT: + led_names = led_endorfy; + matrix_map = (unsigned int *)endorfy_matrix; + leds_count = 104; + break; + } + /*-------------------------------------------------*\ | Clear any existing color/LED configuration | \*-------------------------------------------------*/ zone KB_zone; KB_zone.name = ZONE_EN_KEYBOARD; KB_zone.type = ZONE_TYPE_MATRIX; - KB_zone.leds_count = 106; + KB_zone.leds_count = leds_count; KB_zone.leds_min = KB_zone.leds_count; KB_zone.leds_max = KB_zone.leds_count; KB_zone.matrix_map = new matrix_map_type; KB_zone.matrix_map->height = EVISION_V2_MATRIX_HEIGHT; KB_zone.matrix_map->width = EVISION_V2_MATRIX_WIDTH; - KB_zone.matrix_map->map = (unsigned int *)&matrix_map; + KB_zone.matrix_map->map = matrix_map; zones.push_back(KB_zone); /*-------------------------------------------------*\ diff --git a/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.h b/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.h index d8766cf5..d943be26 100644 --- a/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.h +++ b/Controllers/EVisionKeyboardController/RGBController_EVisionV2Keyboard.h @@ -32,12 +32,14 @@ public: private: void SetupKeyboardModes(); void SetupLogoEdgeModes(); + void SetupEdgeModes(); void LoadConfig(); void KeepaliveThread(); EVisionV2KeyboardController* controller; EVisionV2KeyboardPart part; + EVisionV2KeyboardLayout layout; std::thread* keepalive_thread; std::atomic keepalive_thread_run;