diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp b/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp index 101b5312..9dcfa5f8 100644 --- a/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp +++ b/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp @@ -5,6 +5,7 @@ | RGB Keyboard lighting controller | | | | Volodymyr Nazarchuk (Vavooon) 4/28/2021 | +| mike white (kamaaina) 6/9/2021 | \*------------------------------------------*/ #include "HyperXAlloyOriginsCoreController.h" @@ -12,12 +13,23 @@ #include // Skip these indices in the color output -static unsigned int skip_idx[] = {6, 7, 14, 15, 22, 23, 30, 31, 38, 39, 44, 46, 47, 54, 55, 58, 60, 61, 62, 63, 70, 71, 78, 79, 86, 87, 94, 95, 101, 102, 103, 109, 110, 111, 118, 119}; +static unsigned int skip_idx[] = {6, 7, 14, 15, 22, 23, 30, 31, 38, 39, 44, 46, 47, 54, 55, 58, 60, 61, 62, 63, 70, 71, 78, 79, 86, 87, 94, 95, 101, 102, 103, 109, 110, 111, 118, 119}; -HyperXAlloyOriginsCoreController::HyperXAlloyOriginsCoreController(hid_device* dev_handle, const char* path) +HyperXAlloyOriginsCoreController::HyperXAlloyOriginsCoreController(hid_device* dev_handle, hid_device_info* dev_info) { - dev = dev_handle; - location = path; + dev = dev_handle; + location = dev_info->path; + + /*-----------------------------------------------------*\ + | Get the firmware version from the device info | + \*-----------------------------------------------------*/ + char fw_version_buf[8]; + memset(fw_version_buf, '\0', sizeof(fw_version_buf)); + + unsigned short version = dev_info->release_number; + sprintf(fw_version_buf, "%.2X.%.2X", (version & 0xFF00) >> 8, version & 0x00FF); + + firmware_version = fw_version_buf; } HyperXAlloyOriginsCoreController::~HyperXAlloyOriginsCoreController() @@ -30,6 +42,27 @@ std::string HyperXAlloyOriginsCoreController::GetDeviceLocation() return("HID " + location); } +std::string HyperXAlloyOriginsCoreController::GetSerialString() +{ + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + return(""); + } + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +std::string HyperXAlloyOriginsCoreController::GetFirmwareVersion() +{ + return(firmware_version); +} + void HyperXAlloyOriginsCoreController::SetLEDsDirect(std::vector colors) { for(unsigned int skip_cnt = 0; skip_cnt < (sizeof(skip_idx) / sizeof(skip_idx[0])); skip_cnt++) @@ -72,13 +105,12 @@ void HyperXAlloyOriginsCoreController::SetLEDsDirect(std::vector color unsigned char packet[65]; memset(packet, 0x00, sizeof(packet)); - - packet[0] = 0xA2; - packet[1] = seq++; - packet[3] = payloadSize; - memcpy(&packet[4], &buf[sentBytes], payloadSize); + packet[1] = 0xA2; + packet[2] = seq++; + packet[4] = payloadSize; + memcpy(&packet[5], &buf[sentBytes], payloadSize); hid_write(dev, packet, 65); sentBytes += payloadSize; diff --git a/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h b/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h index ea444b5d..91ba44f6 100644 --- a/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h +++ b/Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h @@ -18,14 +18,17 @@ class HyperXAlloyOriginsCoreController { public: - HyperXAlloyOriginsCoreController(hid_device* dev_handle, const char* path); + HyperXAlloyOriginsCoreController(hid_device* dev_handle, hid_device_info* dev_info); ~HyperXAlloyOriginsCoreController(); - std::string GetDeviceLocation(); + std::string GetDeviceLocation(); + std::string GetSerialString(); + std::string GetFirmwareVersion(); void SetLEDsDirect(std::vector colors); private: - hid_device* dev; - std::string location; + hid_device* dev; + std::string location; + std::string firmware_version; }; diff --git a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp index 55ca4af3..9ed96925 100644 --- a/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp +++ b/Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp @@ -49,7 +49,7 @@ void DetectHyperXAlloyOriginsCore(hid_device_info* info, const std::string& name hid_device* dev = hid_open_path(info->path); if( dev ) { - HyperXAlloyOriginsCoreController* controller = new HyperXAlloyOriginsCoreController(dev, info->path); + HyperXAlloyOriginsCoreController* controller = new HyperXAlloyOriginsCoreController(dev, info); RGBController_HyperXAlloyOriginsCore* rgb_controller = new RGBController_HyperXAlloyOriginsCore(controller); rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); @@ -68,14 +68,14 @@ void DetectHyperXAlloyElite2(hid_device_info* info, const std::string& name) } } -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); +REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_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", 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", 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 Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 2); +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_HyperXAlloyOriginsCore.cpp b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.cpp index 88f7860b..5322bb0b 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.cpp +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.cpp @@ -154,7 +154,8 @@ RGBController_HyperXAlloyOriginsCore::RGBController_HyperXAlloyOriginsCore(Hyper type = DEVICE_TYPE_KEYBOARD; description = "HyperX Alloy Origins Core Keyboard Device"; location = hyperx->GetDeviceLocation(); - serial = ""; + serial = hyperx->GetSerialString(); + version = hyperx->GetFirmwareVersion(); mode Direct; Direct.name = "Direct"; @@ -272,7 +273,10 @@ void RGBController_HyperXAlloyOriginsCore::KeepaliveThread() { if(active_mode == 0) { - DeviceUpdateLEDs(); + if((std::chrono::steady_clock::now() - last_update_time) > std::chrono::milliseconds(50)) + { + DeviceUpdateLEDs(); + } } std::this_thread::sleep_for(10ms); } diff --git a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h index 70e89938..0920e6dc 100644 --- a/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h +++ b/Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h @@ -33,7 +33,8 @@ public: void KeepaliveThread(); private: - HyperXAlloyOriginsCoreController* hyperx; - std::thread* keepalive_thread; - std::atomic keepalive_thread_run; + HyperXAlloyOriginsCoreController* hyperx; + std::thread* keepalive_thread; + std::atomic keepalive_thread_run; + std::chrono::time_point last_update_time; };