diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.cpp b/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.cpp new file mode 100644 index 00000000..193f891e --- /dev/null +++ b/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.cpp @@ -0,0 +1,173 @@ +/*-----------------------------------------*\ +| HyperXAlloyElite2Controller.cpp | +| | +| Driver for HyperX Alloy Elite2 RGB | +| Keyboard lighting controller | +| | +| KundaPanda (vojdo) 02/04/2021 | +\*-----------------------------------------*/ + +#include "HyperXAlloyElite2Controller.h" + +#include + +/*-----------------------------------------*\ +| Skip these indices in the color output | +\*-----------------------------------------*/ +static const unsigned int SKIP_INDICES[] = { 6, 23, 29, 41, 47, 70, 71, 75, 76, 77, 87, 88, 93, 99, 100, 102, 108, 113 }; + +HyperXAlloyElite2Controller::HyperXAlloyElite2Controller(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +HyperXAlloyElite2Controller::~HyperXAlloyElite2Controller() +{ + hid_close(dev); +} + +std::string HyperXAlloyElite2Controller::GetDeviceLocation() +{ + return("HID " + location); +} + +std::string HyperXAlloyElite2Controller::GetSerialString() +{ + wchar_t serial_string[128]; + hid_get_serial_number_string(dev, serial_string, 128); + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +void HyperXAlloyElite2Controller::SetLEDsDirect(const std::vector& colors) +{ + unsigned char buf[65]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Variables to keep track of color sending and skipping | + \*-----------------------------------------------------*/ + size_t buf_idx = 1; + size_t color_idx = 0; + size_t packets_sent = 0; + size_t skipped = 0; + const unsigned int* skip_idx = &SKIP_INDICES[0]; + + /*-----------------------------------------------------*\ + | Initialize direct control | + \*-----------------------------------------------------*/ + SendDirectInitialization(); + + /*-----------------------------------------------------*\ + | Continue filling and sending packets while color data | + | remains | + \*-----------------------------------------------------*/ + while(color_idx < colors.size()) + { + /*-------------------------------------------------*\ + | Packets have colors in groups of 4 bytes, with | + | the first byte being 0x81 and then R, G, B. | + \*-------------------------------------------------*/ + buf[buf_idx] = 0x81; + + /*-------------------------------------------------*\ + | If at a skipped index, add null data to packet | + | and increment skipped count and index | + | Otherwise, copy color data to buffer and increment| + | color index | + \*-------------------------------------------------*/ + if(*skip_idx == color_idx + skipped) + { + buf[buf_idx + 1] = 0; + buf[buf_idx + 2] = 0; + buf[buf_idx + 3] = 0; + + skip_idx++; + + if(skip_idx >= SKIP_INDICES + sizeof(SKIP_INDICES) / sizeof(unsigned int)) + { + skip_idx = SKIP_INDICES; + } + + skipped++; + } + else + { + buf[buf_idx + 1] = RGBGetRValue(colors[color_idx]); + buf[buf_idx + 2] = RGBGetGValue(colors[color_idx]); + buf[buf_idx + 3] = RGBGetBValue(colors[color_idx]); + + color_idx++; + } + + /*-------------------------------------------------*\ + | Increment packet buffer index by 4 bytes | + \*-------------------------------------------------*/ + buf_idx += 4; + + /*-------------------------------------------------*\ + | If the packet buffer is full, send it and reset | + | buffer indexing | + | OR | + | If all colors have been filled into the buffer, | + | send the packet | + \*-------------------------------------------------*/ + if((buf_idx >= sizeof(buf)) || (color_idx == colors.size())) + { + /*---------------------------------------------*\ + | Send packet | + \*---------------------------------------------*/ + hid_send_feature_report(dev, buf, sizeof(buf)); + + /*---------------------------------------------*\ + | Zero out buffer and reset index | + \*---------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + buf_idx = 1; + + /*---------------------------------------------*\ + | Increment packet counter | + \*---------------------------------------------*/ + packets_sent++; + } + } + + /*-----------------------------------------------------*\ + | Send empty packets until 9 total packets have been | + | sent | + \*-----------------------------------------------------*/ + for(size_t remaining_packets = 0; packets_sent + remaining_packets < 9; remaining_packets++) + { + hid_send_feature_report(dev, buf, sizeof(buf)); + } +} + +void HyperXAlloyElite2Controller::SendDirectInitialization() +{ + unsigned char buf[65]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up Select Profile packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x00; + buf[0x01] = 0x04; + buf[0x02] = 0xF2; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_send_feature_report(dev, buf, 65); +} diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.h b/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.h new file mode 100644 index 00000000..cf69ac74 --- /dev/null +++ b/Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| HyperXAlloyElite2Controller.h | +| | +| Definitions and types for HyperX Alloy | +| Elite2 RGB Keyboard lighting controller | +| | +| KundaPanda (vojdo) 02/04/2021 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +class HyperXAlloyElite2Controller +{ +public: + HyperXAlloyElite2Controller(hid_device* dev_handle, const char* path); + ~HyperXAlloyElite2Controller(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + + void SetLEDsDirect(const std::vector& colors); + +private: + hid_device* dev; + std::string location; + + void SendDirectInitialization(); +}; diff --git a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp index 6afeeb8e..d7c5c25d 100644 --- a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp +++ b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp @@ -1,7 +1,9 @@ #include "Detector.h" +#include "HyperXAlloyElite2Controller.h" #include "HyperXAlloyOriginsController.h" #include "HyperXKeyboardController.h" #include "RGBController.h" +#include "RGBController_HyperXAlloyElite2.h" #include "RGBController_HyperXAlloyOrigins.h" #include "RGBController_HyperXKeyboard.h" #include @@ -11,6 +13,7 @@ \*-----------------------------------------------------*/ #define HYPERX_KEYBOARD_VID 0x0951 #define HYPERX_ALLOY_ELITE_PID 0x16BE +#define HYPERX_ALLOY_ELITE_2_PID 0x1711 #define HYPERX_ALLOY_FPS_RGB_PID 0x16DC #define HYPERX_ALLOY_ORIGINS_PID 0x16E5 #define HYPERX_ALLOY_ORIGINS_CORE_PID 0x16E6 @@ -38,14 +41,27 @@ void DetectHyperXAlloyOrigins(hid_device_info* info, const std::string& name) ResourceManager::get()->RegisterRGBController(rgb_controller); } } +void DetectHyperXAlloyElite2(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + if( dev ) + { + HyperXAlloyElite2Controller* controller = new HyperXAlloyElite2Controller(dev, info->path); + RGBController_HyperXAlloyElite2* rgb_controller = new RGBController_HyperXAlloyElite2(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} -REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01); -REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01); +REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01); +REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01); #ifdef _WIN32 -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 3); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 3); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_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); #else -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 0); -REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 0); -#endif \ No newline at end of file +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_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); +#endif diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.cpp new file mode 100644 index 00000000..25a5748e --- /dev/null +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.cpp @@ -0,0 +1,342 @@ +/*-----------------------------------------*\ +| RGBController_HyperXAlloyElite2.cpp | +| | +| Generic RGB Interface for HyperX Alloy | +| Elite2 RGB Keyboard | +| | +| KundaPanda (vojdo) 02/04/2021 | +\*-----------------------------------------*/ + +#include "RGBController_HyperXAlloyElite2.h" + +using namespace std::chrono_literals; + +//0xFFFFFFFF indicates an unused entry in matrix +#define NA 0xFFFFFFFF + +static unsigned int matrix_map[8][22] = +{ + { NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 102, 105, 106, 96, NA, NA }, + { 108, 109, 110, 111, 112, NA, 113, 114, 115, NA, 116, 117, 118, NA, 119, 120, 121, NA, 122, 123, 124, 125 }, + { 0, 11, 17, 22, 27, NA, 33, 38, 43, 49, 55, 61, 65, 68, NA, 74, 78, 83, NA, NA, NA, NA }, + { 1, 6, 12, 18, 23, 28, 34, 39, 44, 50, 56, 62, 66, 69, NA, 75, 79, 84, 87, 92, 97, 103 }, + { 2, NA, 7, 13, 19, 24, 29, 35, 40, 45, 51, 57, 63, 67, 70, 76, 80, 85, 88, 93, 98, 104 }, + { 3, NA, 8, 14, 20, 25, 30, 36, 41, 46, 52, 58, 64, NA, 71, NA, NA, NA, 89, 94, 99, NA }, + { 4, NA, NA, 9, 15, 21, 26, 31, 37, 42, 47, 53, 59, 72, NA, NA, 81, NA, 90, 95, 100, 107 }, + { 5, 10, 16, NA, NA, NA, NA, 32, NA, NA, NA, 48, 60, 54, 73, 77, 82, 86, 91, NA, 101, NA } +}; + +static const char* zone_names[] = +{ + "Keyboard", +}; + +static zone_type zone_types[] = +{ + ZONE_TYPE_MATRIX, +}; + +static const unsigned int zone_sizes[] = +{ + 126, +}; + +static const char *led_names[] = +{ + "Key: Escape", + "Key: `", + "Key: Tab", + "Key: Caps Lock", + "Key: Left Shift", + "Key: Left Control", + // Skip index 6 + "Key: 1", + "Key: Q", + "Key: A", + "Key: Z", + "Key: Left Windows", + "Key: F1", + "Key: 2", + "Key: W", + "Key: S", + "Key: X", + "Key: Left Alt", + "Key: F2", + "Key: 3", + "Key: E", + "Key: D", + "Key: C", + // Skip index 23 + "Key: F3", + "Key: 4", + "Key: R", + "Key: F", + "Key: V", + // Skip index 29 + "Key: F4", + "Key: 5", + "Key: T", + "Key: G", + "Key: B", + "Key: Space", + "Key: F5", + "Key: 6", + "Key: Y", + "Key: H", + "Key: N", + // Skip index 41 + "Key: F6", + "Key: 7", + "Key: U", + "Key: J", + "Key: M", + // Skip index 47 + "Key: F7", + "Key: 8", + "Key: I", + "Key: K", + "Key: ,", + "Key: Right Alt", + "Key: F8", + "Key: 9", + "Key: O", + "Key: L", + "Key: .", + // Skip index 59 + "Key: Menu", + "Key: F9", + "Key: 0", + "Key: P", + "Key: ;", + "Key: /", + "Key: Right Windows", + "Key: F10", + "Key: -", + "Key: [", + // Skip index 70 + // Skip index 71 + "Key: '", + "Key: F11", + "Key: =", + // Skip index 75 + // Skip index 76 + "Key: ]", + "Key: F12", + "Key: Backspace", + "Key: \\ (ANSI)", + "Key: Enter (ISO)", + "Key: Right Shift", + "Key: Right Control", + "Key: Print Screen", + "Key: Insert", + "Key: Delete", + // Skip index 87 + // Skip index 88 + "Key: Left Arrow", + "Key: Scroll Lock", + "Key: Home", + "Key: End", + // Skip index 93 + "Key: Up Arrow", + "Key: Down Arrow", + "Key: Pause/Break", + "Key: Page Up", + "Key: Page Down", + // Skip index 99 + // Skip index 100 + "Key: Right Arrow", + // Skip index 102 + "Key: Num Lock", + "Key: Number Pad 7", + "Key: Number Pad 4", + "Key: Number Pad 1", + "Key: Number Pad 0", + // Skip index 108 + "Key: Number Pad /", + "Key: Number Pad 8", + "Key: Number Pad 5", + "Key: Number Pad 2", + // Skip index 113 + // Skip index 114 + // Last multimedia key + "Key: Media Mute", + "Key: Number Pad *", + "Key: Number Pad 9", + "Key: Number Pad 3", + "Key: Number Pad 6", + // Skip index 120 + "Key: Number Pad .", + // First multimedia key + "Key: Media Previous", + // Skip index 123 + // Skip index 124 + "Key: Number Pad -", + "Key: Number Pad +", + // Second multimedia key + "Key: Media Play/Pause", + // Third multimedia key + "Key: Media Next", + "Key: Number Pad Enter", + "RGB Strip 1", + "RGB Strip 2", + "RGB Strip 3", + "RGB Strip 4", + "RGB Strip 5", + "RGB Strip 6", + "RGB Strip 7", + "RGB Strip 8", + "RGB Strip 9", + "RGB Strip 10", + "RGB Strip 11", + "RGB Strip 12", + "RGB Strip 13", + "RGB Strip 14", + "RGB Strip 15", + "RGB Strip 16", + "RGB Strip 17", + "RGB Strip 18", +}; + +RGBController_HyperXAlloyElite2::RGBController_HyperXAlloyElite2(HyperXAlloyElite2Controller* hyperx_ptr) +{ + hyperx = hyperx_ptr; + + name = "HyperX Alloy Elite 2 Keyboard Device"; + vendor = "HyperX"; + type = DEVICE_TYPE_KEYBOARD; + description = "HyperX Alloy Elite 2 Keyboard Device"; + location = hyperx->GetDeviceLocation(); + serial = hyperx->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(); + + /*-----------------------------------------------------*\ + | The Corsair Lighting Node Pro requires a packet within| + | 20 seconds of sending the lighting change in order | + | to not revert back into rainbow mode. Start a thread | + | to continuously send a keepalive packet every 5s | + \*-----------------------------------------------------*/ + keepalive_thread_run = true; + keepalive_thread = new std::thread(&RGBController_HyperXAlloyElite2::KeepaliveThreadFunction, this); +} + +RGBController_HyperXAlloyElite2::~RGBController_HyperXAlloyElite2() +{ + keepalive_thread_run = false; + 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 != nullptr) + { + delete zones[zone_index].matrix_map; + } + } + + delete hyperx; +} + +void RGBController_HyperXAlloyElite2::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 = 8; + new_zone.matrix_map->width = 22; + new_zone.matrix_map->map = (unsigned int *)&matrix_map; + } + else + { + new_zone.matrix_map = nullptr; + } + + 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_HyperXAlloyElite2::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_HyperXAlloyElite2::DeviceUpdateLEDs() +{ + last_update_time = std::chrono::steady_clock::now(); + + if(active_mode == 0) + { + hyperx->SetLEDsDirect(colors); + } +} + +void RGBController_HyperXAlloyElite2::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_HyperXAlloyElite2::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_HyperXAlloyElite2::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_HyperXAlloyElite2::DeviceUpdateMode() +{ + +} + +void RGBController_HyperXAlloyElite2::KeepaliveThreadFunction() +{ + while(keepalive_thread_run) + { + if(active_mode == 0) + { + if((std::chrono::steady_clock::now() - last_update_time) > std::chrono::milliseconds(1000)) + { + DeviceUpdateLEDs(); + } + } + std::this_thread::sleep_for(50ms); + } +} diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.h b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.h new file mode 100644 index 00000000..39660f7d --- /dev/null +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.h @@ -0,0 +1,42 @@ +/*-----------------------------------------*\ +| RGBController_HyperXAlloyElite2.h | +| | +| Generic RGB Interface for HyperX Alloy | +| Elite2 RGB Keyboard | +| | +| KundaPanda (vojdo) 02/04/2021 | +\*-----------------------------------------*/ + +#pragma once +#include +#include +#include + +#include "RGBController.h" +#include "HyperXAlloyElite2Controller.h" + +class RGBController_HyperXAlloyElite2 : public RGBController +{ +public: + RGBController_HyperXAlloyElite2(HyperXAlloyElite2Controller* hyperx_ptr); + ~RGBController_HyperXAlloyElite2(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + + void KeepaliveThreadFunction(); + +private: + HyperXAlloyElite2Controller* hyperx; + std::atomic keepalive_thread_run; + std::thread* keepalive_thread; + std::chrono::time_point last_update_time; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 347fd153..fbca8a70 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -235,8 +235,10 @@ HEADERS += Controllers/HoltekController/RGBController_HoltekA1FA.h \ Controllers/HyperXDRAMController/HyperXDRAMController.h \ Controllers/HyperXDRAMController/RGBController_HyperXDRAM.h \ + Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.h \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsController.h \ Controllers/HyperXKeyboardController/HyperXKeyboardController.h \ + Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.h \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.h \ Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h \ Controllers/HyperXMouseController/HyperXPulsefireFPSProController.h \ @@ -487,9 +489,11 @@ SOURCES += Controllers/HyperXDRAMController/HyperXDRAMController.cpp \ Controllers/HyperXDRAMController/HyperXDRAMControllerDetect.cpp \ Controllers/HyperXDRAMController/RGBController_HyperXDRAM.cpp \ + Controllers/HyperXKeyboardController/HyperXAlloyElite2Controller.cpp \ Controllers/HyperXKeyboardController/HyperXAlloyOriginsController.cpp \ Controllers/HyperXKeyboardController/HyperXKeyboardController.cpp \ Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp \ + Controllers/HyperXKeyboardController/RGBController_HyperXAlloyElite2.cpp \ Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOrigins.cpp \ Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.cpp \ Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp \