diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.h b/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.h deleted file mode 100644 index c43e926b..00000000 --- a/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.h +++ /dev/null @@ -1,39 +0,0 @@ -/*-----------------------------------------*\ -| HyperXAlloyOrigins60Controller.h | -| | -| Definitions and types for HyperX Alloy | -| Origins 60 RGB Keyboard lighting | -| controller | -| | -| Derek Huber 10/24/2022 | -\*-----------------------------------------*/ - -#include "RGBController.h" - -#include -#include - -#pragma once - -class HyperXAlloyOrigins60Controller -{ -public: - HyperXAlloyOrigins60Controller(hid_device* dev_handle, const char* path); - ~HyperXAlloyOrigins60Controller(); - - std::string GetDeviceLocation(); - std::string GetSerialString(); - - void SetLEDsDirect(std::vector colors); - -private: - hid_device* dev; - std::string location; - - void SendDirectInitialization(); - void SendDirectColorPacket - ( - RGBColor* color_data, - unsigned int color_count - ); -}; diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.cpp b/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.cpp similarity index 83% rename from Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.cpp rename to Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.cpp index e819583f..666fce95 100644 --- a/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.cpp +++ b/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.cpp @@ -1,33 +1,33 @@ /*-----------------------------------------*\ -| HyperXAlloyOrigins60Controller.cpp | +| HyperXAlloyOrigins60and65Controller.cpp | | | -| Driver for HyperX Alloy Origins 60 RGB | -| Keyboard lighting controller | +| Driver for HyperX Alloy Origins 60 and | +| 65 RGB Keyboards lighting controller | | | -| Derek Huber 10/24/2022 | +| Derek Huber 03/18/2023 | \*-----------------------------------------*/ -#include "HyperXAlloyOrigins60Controller.h" +#include "HyperXAlloyOrigins60and65Controller.h" #include -HyperXAlloyOrigins60Controller::HyperXAlloyOrigins60Controller(hid_device* dev_handle, const char* path) +HyperXAlloyOrigins60and65Controller::HyperXAlloyOrigins60and65Controller(hid_device* dev_handle, const char* path) { dev = dev_handle; location = path; } -HyperXAlloyOrigins60Controller::~HyperXAlloyOrigins60Controller() +HyperXAlloyOrigins60and65Controller::~HyperXAlloyOrigins60and65Controller() { hid_close(dev); } -std::string HyperXAlloyOrigins60Controller::GetDeviceLocation() +std::string HyperXAlloyOrigins60and65Controller::GetDeviceLocation() { return("HID " + location); } -std::string HyperXAlloyOrigins60Controller::GetSerialString() +std::string HyperXAlloyOrigins60and65Controller::GetSerialString() { wchar_t serial_string[128]; int ret = hid_get_serial_number_string(dev, serial_string, 128); @@ -43,7 +43,7 @@ std::string HyperXAlloyOrigins60Controller::GetSerialString() return(return_string); } -void HyperXAlloyOrigins60Controller::SetLEDsDirect(std::vector colors) +void HyperXAlloyOrigins60and65Controller::SetLEDsDirect(std::vector colors) { /*-----------------------------------------------------*\ | Set up variables to track progress of color transmit | @@ -76,7 +76,7 @@ void HyperXAlloyOrigins60Controller::SetLEDsDirect(std::vector colors) } } -void HyperXAlloyOrigins60Controller::SendDirectInitialization() +void HyperXAlloyOrigins60and65Controller::SendDirectInitialization() { unsigned char buf[65]; @@ -99,7 +99,7 @@ void HyperXAlloyOrigins60Controller::SendDirectInitialization() hid_send_feature_report(dev, buf, 65); } -void HyperXAlloyOrigins60Controller::SendDirectColorPacket +void HyperXAlloyOrigins60and65Controller::SendDirectColorPacket ( RGBColor* color_data, unsigned int color_count diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.h b/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.h new file mode 100644 index 00000000..af058522 --- /dev/null +++ b/Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.h @@ -0,0 +1,39 @@ +/*---------------------------------------*\ +| HyperXAlloyOrigins60and65Controller.h | +| | +| Definitions and types for HyperX | +| Alloy Origins 60 and 65 RGB Keyboards | +| lighting controller | +| | +| Derek Huber 03/18/2023 | +\*---------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +class HyperXAlloyOrigins60and65Controller +{ +public: + HyperXAlloyOrigins60and65Controller(hid_device* dev_handle, const char* path); + ~HyperXAlloyOrigins60and65Controller(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + + void SetLEDsDirect(std::vector colors); + +private: + hid_device* dev; + std::string location; + + void SendDirectInitialization(); + void SendDirectColorPacket + ( + RGBColor* color_data, + unsigned int color_count + ); +}; diff --git a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp index 04cbda01..8c5667a6 100644 --- a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp +++ b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp @@ -4,14 +4,14 @@ #include "HyperXAlloyFPSController.h" #include "HyperXAlloyOriginsController.h" #include "HyperXAlloyOriginsCoreController.h" -#include "HyperXAlloyOrigins60Controller.h" +#include "HyperXAlloyOrigins60and65Controller.h" #include "RGBController.h" #include "RGBController_HyperXAlloyElite.h" #include "RGBController_HyperXAlloyElite2.h" #include "RGBController_HyperXAlloyFPS.h" #include "RGBController_HyperXAlloyOrigins.h" #include "RGBController_HyperXAlloyOriginsCore.h" -#include "RGBController_HyperXAlloyOrigins60.h" +#include "RGBController_HyperXAlloyOrigins60and65.h" #include /*-----------------------------------------------------*\ @@ -27,15 +27,31 @@ #define HYPERX_ALLOY_ORIGINS_60_PID 0x1734 /*-----------------------------------------------------*\ -| HyperX keyboard vendor and product IDs (HP) | +| HyperX keyboard vendor and product IDs (HP) | \*-----------------------------------------------------*/ #define HP_KEYBOARD_VID 0x03F0 #define HYPERX_ALLOY_ELITE_2_HP_PID 0x058F #define HYPERX_ALLOY_ORIGINS_60_HP_PID 0x0C8E +#define HYPERX_ALLOY_ORIGINS_65_HP_PID 0x038F #define HYPERX_ALLOY_ORIGINS_CORE_HP_PID 0x098F #define HYPERX_ALLOY_ORIGINS_HP_PID 0x0591 +AlloyOrigins60and65MappingLayoutType GetAlloyOrigins60and65MappingLayoutType(int pid) +{ + switch(pid) + { + case HYPERX_ALLOY_ORIGINS_60_PID: + case HYPERX_ALLOY_ORIGINS_60_HP_PID: + return ALLOY_ORIGINS_60_LAYOUT; + + case HYPERX_ALLOY_ORIGINS_65_HP_PID: + return ALLOY_ORIGINS_65_LAYOUT; + + default: + return ALLOY_ORIGINS_60_LAYOUT; + } +} void DetectHyperXAlloyElite(hid_device_info* info, const std::string& name) { @@ -107,40 +123,43 @@ void DetectHyperXAlloyOriginsCore(hid_device_info* info, const std::string& name } } -void DetectHyperXAlloyOrigins60(hid_device_info* info, const std::string& name) +void DetectHyperXAlloyOrigins60and65(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); if(dev) { - HyperXAlloyOrigins60Controller* controller = new HyperXAlloyOrigins60Controller(dev, info->path); - RGBController_HyperXAlloyOrigins60* rgb_controller = new RGBController_HyperXAlloyOrigins60(controller); - rgb_controller->name = name; + HyperXAlloyOrigins60and65Controller* controller = new HyperXAlloyOrigins60and65Controller(dev, info->path); + AlloyOrigins60and65MappingLayoutType layout = GetAlloyOrigins60and65MappingLayoutType(info->product_id); + RGBController_HyperXAlloyOrigins60and65* rgb_controller = new RGBController_HyperXAlloyOrigins60and65(controller, layout); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } -REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXAlloyElite, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01); -REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXAlloyFPS, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 2); +REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXAlloyElite, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01); +REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXAlloyFPS, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 2); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core (HP)", DetectHyperXAlloyOriginsCore, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_HP_PID, 2); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core (HP)", DetectHyperXAlloyOriginsCore, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_HP_PID, 2); #ifdef _WIN32 -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 3); -REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 3, 0xFF90); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60", DetectHyperXAlloyOrigins60, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_PID, 3); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 3); +REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 3, 0xFF90); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60", DetectHyperXAlloyOrigins60and65, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_PID, 3); -REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2 (HP)", DetectHyperXAlloyElite2, HP_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_HP_PID, 3, 0xFF90); -REGISTER_HID_DETECTOR_IP("HyperX Alloy Origins (HP)", DetectHyperXAlloyOrigins, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_HP_PID, 3, 0xFF90); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60 (HP)", DetectHyperXAlloyOrigins60, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_HP_PID, 3); +REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2 (HP)", DetectHyperXAlloyElite2, HP_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_HP_PID, 3, 0xFF90); +REGISTER_HID_DETECTOR_IP("HyperX Alloy Origins (HP)", DetectHyperXAlloyOrigins, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_HP_PID, 3, 0xFF90); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60 (HP)", DetectHyperXAlloyOrigins60and65, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_HP_PID, 3); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 65 (HP)", DetectHyperXAlloyOrigins60and65, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_65_HP_PID, 3); #else -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60", DetectHyperXAlloyOrigins60, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60", DetectHyperXAlloyOrigins60and65, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2 (HP)", DetectHyperXAlloyElite2, HP_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_HP_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins (HP)", DetectHyperXAlloyOrigins, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_HP_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60 (HP)", DetectHyperXAlloyOrigins60, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_HP_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2 (HP)", DetectHyperXAlloyElite2, HP_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_HP_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins (HP)", DetectHyperXAlloyOrigins, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_HP_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 60 (HP)", DetectHyperXAlloyOrigins60and65, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_60_HP_PID, 0); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins 65 (HP)", DetectHyperXAlloyOrigins60and65, HP_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_65_HP_PID, 0); #endif diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.cpp deleted file mode 100644 index 572b3b7a..00000000 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/*-----------------------------------------*\ -| RGBController_HyperXAlloyOrigins60.cpp | -| | -| Generic RGB Interface for HyperX Alloy | -| Origins 60 RGB Keyboard | -| | -| Derek Huber 10/24/2022 | -\*-----------------------------------------*/ - -#include "RGBControllerKeyNames.h" -#include "RGBController_HyperXAlloyOrigins60.h" - -using namespace std::chrono_literals; - -//0xFFFFFFFF indicates an unused entry in matrix -#define NA 0xFFFFFFFF - -static unsigned int matrix_map[5][14] = - { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15 }, - { 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, NA, 43 }, - { 44, NA, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, NA, 57 }, - { 58, 59, 60, 61, NA, NA, 62, NA, NA, 63, 64, 65, 66, 70 } }; - - -static const char* zone_names[] = -{ - ZONE_EN_KEYBOARD -}; - -static zone_type zone_types[] = -{ - ZONE_TYPE_MATRIX -}; - -static const unsigned int zone_sizes[] = -{ - 71 -}; - -static const char *led_names[] = -{ - // First row - KEY_EN_UNUSED, - KEY_EN_ESCAPE, - 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_EQUALS, - KEY_EN_UNUSED, - KEY_EN_BACKSPACE, - - // Second row - 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_ANSI_BACK_SLASH, - - // Third row - 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_UNUSED, - KEY_EN_ANSI_ENTER, - - // Fourth row - KEY_EN_LEFT_SHIFT, - KEY_EN_UNUSED, - 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_UNUSED, - KEY_EN_RIGHT_SHIFT, - - // Fifth row - KEY_EN_LEFT_CONTROL, - KEY_EN_LEFT_WINDOWS, - KEY_EN_LEFT_ALT, - KEY_EN_UNUSED, - KEY_EN_SPACE, - KEY_EN_UNUSED, - KEY_EN_RIGHT_ALT, - KEY_EN_MENU, - KEY_EN_RIGHT_CONTROL, - KEY_EN_UNUSED, - KEY_EN_UNUSED, - KEY_EN_UNUSED, - KEY_EN_RIGHT_FUNCTION -}; - -/**------------------------------------------------------------------*\ - @name HyperX Alloy Origins 60 - @category Keyboard - @type USB - @save :x: - @direct :white_check_mark: - @effects :x: - @detectors DetectHyperXAlloyOrigins60 - @comment -\*-------------------------------------------------------------------*/ - -RGBController_HyperXAlloyOrigins60::RGBController_HyperXAlloyOrigins60(HyperXAlloyOrigins60Controller* controller_ptr) -{ - controller = controller_ptr; - - name = "HyperX Alloy Origins 60 Keyboard Device"; - vendor = "HyperX"; - type = DEVICE_TYPE_KEYBOARD; - description = "HyperX Alloy Origins 60 Keyboard Device"; - location = controller->GetDeviceLocation(); - serial = controller->GetSerialString(); - - mode Direct; - Direct.name = "Direct"; - Direct.value = 0xFFFF; - Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; - Direct.color_mode = MODE_COLORS_PER_LED; - modes.push_back(Direct); - - SetupZones(); - - keepalive_thread_run = 1; - keepalive_thread = new std::thread(&RGBController_HyperXAlloyOrigins60::KeepaliveThread, this); -} - -RGBController_HyperXAlloyOrigins60::~RGBController_HyperXAlloyOrigins60() -{ - keepalive_thread_run = 0; - keepalive_thread->join(); - delete keepalive_thread; - - /*---------------------------------------------------------*\ - | Delete the matrix map | - \*---------------------------------------------------------*/ - for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++) - { - if(zones[zone_index].matrix_map != NULL) - { - delete zones[zone_index].matrix_map; - } - } - - delete controller; -} - -void RGBController_HyperXAlloyOrigins60::SetupZones() -{ - /*---------------------------------------------------------*\ - | Set up zones | - \*---------------------------------------------------------*/ - unsigned int total_led_count = 0; - for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++) - { - zone new_zone; - new_zone.name = zone_names[zone_idx]; - new_zone.type = zone_types[zone_idx]; - new_zone.leds_min = zone_sizes[zone_idx]; - new_zone.leds_max = zone_sizes[zone_idx]; - new_zone.leds_count = zone_sizes[zone_idx]; - - if(zone_types[zone_idx] == ZONE_TYPE_MATRIX) - { - new_zone.matrix_map = new matrix_map_type; - new_zone.matrix_map->height = 5; - new_zone.matrix_map->width = 14; - new_zone.matrix_map->map = (unsigned int *)&matrix_map; - } - else - { - new_zone.matrix_map = NULL; - } - - zones.push_back(new_zone); - - total_led_count += zone_sizes[zone_idx]; - } - - for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++) - { - led new_led; - new_led.name = led_names[led_idx]; - leds.push_back(new_led); - } - - SetupColors(); -} - -void RGBController_HyperXAlloyOrigins60::ResizeZone(int /*zone*/, int /*new_size*/) -{ - /*---------------------------------------------------------*\ - | This device does not support resizing zones | - \*---------------------------------------------------------*/ -} - -void RGBController_HyperXAlloyOrigins60::DeviceUpdateLEDs() -{ - controller->SetLEDsDirect(colors); -} - -void RGBController_HyperXAlloyOrigins60::UpdateZoneLEDs(int /*zone*/) -{ - DeviceUpdateLEDs(); -} - -void RGBController_HyperXAlloyOrigins60::UpdateSingleLED(int /*led*/) -{ - DeviceUpdateLEDs(); -} - -void RGBController_HyperXAlloyOrigins60::DeviceUpdateMode() -{ - -} - -void RGBController_HyperXAlloyOrigins60::KeepaliveThread() -{ - while(keepalive_thread_run.load()) - { - if(active_mode == 0) - { - if((std::chrono::steady_clock::now() - last_update_time) > std::chrono::milliseconds(50)) - { - UpdateLEDs(); - } - } - std::this_thread::sleep_for(10ms);; - } -} diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.h b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.h deleted file mode 100644 index 4eceb0e3..00000000 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.h +++ /dev/null @@ -1,39 +0,0 @@ -/*-----------------------------------------*\ -| RGBController_HyperXAlloyOrigins60.h | -| | -| Generic RGB Interface for HyperX Alloy | -| Origins 60 RGB Keyboard | -| | -| Derek Huber 10/24/2022 | -\*-----------------------------------------*/ - -#pragma once -#include - -#include "RGBController.h" -#include "HyperXAlloyOrigins60Controller.h" - -class RGBController_HyperXAlloyOrigins60 : public RGBController -{ -public: - RGBController_HyperXAlloyOrigins60(HyperXAlloyOrigins60Controller* controller_ptr); - ~RGBController_HyperXAlloyOrigins60(); - - void SetupZones(); - - void ResizeZone(int zone, int new_size); - - void DeviceUpdateLEDs(); - void UpdateZoneLEDs(int zone); - void UpdateSingleLED(int led); - - void DeviceUpdateMode(); - - void KeepaliveThread(); - -private: - HyperXAlloyOrigins60Controller* controller; - std::thread* keepalive_thread; - std::atomic keepalive_thread_run; - std::chrono::time_point last_update_time; -}; diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.cpp new file mode 100644 index 00000000..54e093b7 --- /dev/null +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.cpp @@ -0,0 +1,366 @@ +/*---------------------------------------------*\ +| RGBController_HyperXAlloyOrigins60and65.cpp | +| | +| Generic RGB Interface for HyperX Alloy | +| Origins 60 and 65 RGB Keyboards | +| | +| Derek Huber 03/18/2023 | +\*---------------------------------------------*/ + +#include "RGBControllerKeyNames.h" +#include "RGBController_HyperXAlloyOrigins60and65.h" + +using namespace std::chrono_literals; + +//0xFFFFFFFF indicates an unused entry in matrix +#define NA 0xFFFFFFFF + +static unsigned int matrix_map_60[5][14] = + { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15 }, + { 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, NA, 43 }, + { 44, NA, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, NA, 57 }, + { 58, 59, 60, 61, NA, NA, 62, NA, NA, 63, 64, 65, 66, 70 } }; + +static unsigned int matrix_map_65[5][15] = + { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 69 }, + { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 70 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, NA, 43, 71 }, + { 44, NA, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 57, 73, 72 }, + { 58, 59, 60, 61, NA, NA, 62, NA, NA, 63, 64, 68, 74, 75, 76 } }; + +static const char *led_names_60[] = +{ + // First row + KEY_EN_UNUSED, + KEY_EN_ESCAPE, + 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_EQUALS, + KEY_EN_UNUSED, + KEY_EN_BACKSPACE, + + // Second row + 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_ANSI_BACK_SLASH, + + // Third row + 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_UNUSED, + KEY_EN_ANSI_ENTER, + + // Fourth row + KEY_EN_LEFT_SHIFT, + KEY_EN_UNUSED, + 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_UNUSED, + KEY_EN_RIGHT_SHIFT, + + // Fifth row + KEY_EN_LEFT_CONTROL, + KEY_EN_LEFT_WINDOWS, + KEY_EN_LEFT_ALT, + "Left Space", + KEY_EN_SPACE, + "Right Space", + KEY_EN_RIGHT_ALT, + KEY_EN_MENU, + KEY_EN_RIGHT_CONTROL, + KEY_EN_UNUSED, + KEY_EN_UNUSED, + KEY_EN_UNUSED, + KEY_EN_RIGHT_FUNCTION +}; + +static const char *led_names_65[] = +{ + KEY_EN_UNUSED, + KEY_EN_ESCAPE, + 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_EQUALS, + KEY_EN_UNUSED, + KEY_EN_BACKSPACE, + 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_ANSI_BACK_SLASH, + 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_UNUSED, + KEY_EN_ANSI_ENTER, + KEY_EN_LEFT_SHIFT, + KEY_EN_UNUSED, + 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_UNUSED, + KEY_EN_RIGHT_SHIFT, + KEY_EN_LEFT_CONTROL, + KEY_EN_LEFT_WINDOWS, + KEY_EN_LEFT_ALT, + "Left Space", + KEY_EN_SPACE, + "Right Space", + KEY_EN_RIGHT_ALT, + KEY_EN_UNUSED, + KEY_EN_UNUSED, + KEY_EN_UNUSED, + KEY_EN_RIGHT_FUNCTION, + KEY_EN_HOME, + KEY_EN_DELETE, + KEY_EN_PAGE_UP, + KEY_EN_PAGE_DOWN, + KEY_EN_UP_ARROW, + KEY_EN_LEFT_ARROW, + KEY_EN_DOWN_ARROW, + KEY_EN_RIGHT_ARROW +}; + +static const char* zone_names[] = +{ + ZONE_EN_KEYBOARD +}; + +static zone_type zone_types[] = +{ + ZONE_TYPE_MATRIX +}; + +/**------------------------------------------------------------------*\ + @name HyperX Alloy Origins 60 and 65 + @category Keyboard + @type USB + @save :x: + @direct :white_check_mark: + @effects :x: + @detectors DetectHyperXAlloyOrigins60and65 + @comment +\*-------------------------------------------------------------------*/ + +RGBController_HyperXAlloyOrigins60and65::RGBController_HyperXAlloyOrigins60and65(HyperXAlloyOrigins60and65Controller* controller_ptr, AlloyOrigins60and65MappingLayoutType keyboard_layout) +{ + controller = controller_ptr; + layout = keyboard_layout; + + switch(layout) + { + case ALLOY_ORIGINS_60_LAYOUT: + name = "HyperX Alloy Origins 60 Keyboard Device"; + break; + case ALLOY_ORIGINS_65_LAYOUT: + name = "HyperX Alloy Origins 65 Keyboard Device"; + } + + description = name; + vendor = "HyperX"; + type = DEVICE_TYPE_KEYBOARD; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0xFFFF; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); + + keepalive_thread_run = 1; + keepalive_thread = new std::thread(&RGBController_HyperXAlloyOrigins60and65::KeepaliveThread, this); +} + +RGBController_HyperXAlloyOrigins60and65::~RGBController_HyperXAlloyOrigins60and65() +{ + keepalive_thread_run = 0; + keepalive_thread->join(); + delete keepalive_thread; + + /*---------------------------------------------------------*\ + | Delete the matrix map | + \*---------------------------------------------------------*/ + for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++) + { + if(zones[zone_index].matrix_map != NULL) + { + delete zones[zone_index].matrix_map; + } + } + + delete controller; +} + +void RGBController_HyperXAlloyOrigins60and65::SetupZones() +{ + /*---------------------------------------------------------*\ + | Set up zones | + \*---------------------------------------------------------*/ + + std::vector led_zones; + const char* const *led_names; + + switch(layout) + { + case ALLOY_ORIGINS_60_LAYOUT: + led_names = led_names_60; + led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 71, new matrix_map_type{5, 14, (unsigned int *)&matrix_map_60}}); + break; + case ALLOY_ORIGINS_65_LAYOUT: + led_names = led_names_65; + led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 77, new matrix_map_type{5, 15, (unsigned int *)&matrix_map_65}}); + break; + } + + unsigned int total_led_count = 0; + for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++) + { + zone new_zone; + new_zone.name = led_zones[zone_idx].name; + new_zone.type = led_zones[zone_idx].type; + new_zone.leds_min = led_zones[zone_idx].size; + new_zone.leds_max = led_zones[zone_idx].size; + new_zone.leds_count = led_zones[zone_idx].size; + + if(led_zones[zone_idx].type == ZONE_TYPE_MATRIX) + { + new_zone.matrix_map = led_zones[zone_idx].matrix; + } + else + { + new_zone.matrix_map = NULL; + } + + zones.push_back(new_zone); + + total_led_count += led_zones[zone_idx].size; + } + + for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++) + { + led new_led; + new_led.name = led_names[led_idx]; + leds.push_back(new_led); + } + + SetupColors(); +} + +void RGBController_HyperXAlloyOrigins60and65::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_HyperXAlloyOrigins60and65::DeviceUpdateLEDs() +{ + controller->SetLEDsDirect(colors); +} + +void RGBController_HyperXAlloyOrigins60and65::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_HyperXAlloyOrigins60and65::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_HyperXAlloyOrigins60and65::DeviceUpdateMode() +{ + +} + +void RGBController_HyperXAlloyOrigins60and65::KeepaliveThread() +{ + while(keepalive_thread_run.load()) + { + if(active_mode == 0) + { + if((std::chrono::steady_clock::now() - last_update_time) > std::chrono::milliseconds(50)) + { + UpdateLEDs(); + } + } + std::this_thread::sleep_for(10ms);; + } +} diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.h b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.h new file mode 100644 index 00000000..f28b7935 --- /dev/null +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.h @@ -0,0 +1,54 @@ +/*-------------------------------------------*\ +| RGBController_HyperXAlloyOrigins60and65.h | +| | +| Generic RGB Interface for HyperX Alloy | +| Origins 60 and 65 RGB Keyboards | +| | +| Derek Huber 03/18/2023 | +\*-------------------------------------------*/ + +#pragma once +#include + +#include "RGBController.h" +#include "HyperXAlloyOrigins60and65Controller.h" + +enum AlloyOrigins60and65MappingLayoutType +{ + ALLOY_ORIGINS_60_LAYOUT, + ALLOY_ORIGINS_65_LAYOUT +}; + +typedef struct +{ + const char* name; + const zone_type type; + const unsigned int size; + matrix_map_type* matrix; +} led_zone; + +class RGBController_HyperXAlloyOrigins60and65 : public RGBController +{ +public: + RGBController_HyperXAlloyOrigins60and65(HyperXAlloyOrigins60and65Controller* controller_ptr, AlloyOrigins60and65MappingLayoutType keyboard_layout); + ~RGBController_HyperXAlloyOrigins60and65(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void DeviceUpdateMode(); + + void KeepaliveThread(); + +private: + HyperXAlloyOrigins60and65Controller* controller; + AlloyOrigins60and65MappingLayoutType layout; + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; + std::chrono::time_point last_update_time; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 7debd644..9fa3e70c 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -448,14 +448,14 @@ HEADERS += Controllers/HyperXKeyboardController/HyperXAlloyEliteController.h \ Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.h \ Controllers/HyperXKeyboardController/HyperXAlloyFPSController.h \ - Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.h \ + Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.h \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsController.h \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyFPS.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h \ - Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.h \ + Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h \ Controllers/HyperXMicrophoneController/HyperXMicrophoneController.h \ Controllers/HyperXMicrophoneController/RGBController_HyperXMicrophone.h \ @@ -1047,7 +1047,7 @@ SOURCES += Controllers/HyperXKeyboardController/HyperXAlloyEliteController.cpp \ Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.cpp \ Controllers/HyperXKeyboardController/HyperXAlloyFPSController.cpp \ - Controllers/HyperXKeyboardController/HyperXAlloyOrigins60Controller.cpp \ + Controllers/HyperXKeyboardController/HyperXAlloyOrigins60and65Controller.cpp \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsController.cpp \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp \ Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp \ @@ -1055,7 +1055,7 @@ SOURCES += Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.cpp \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyFPS.cpp \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp \ - Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60.cpp \ + Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins60and65.cpp \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.cpp \ Controllers/HyperXMicrophoneController/HyperXMicrophoneController.cpp \ Controllers/HyperXMicrophoneController/HyperXMicrophoneControllerDetect.cpp \