Skip to content

Commit 4a333e9

Browse files
kamaainaCalcProgrammer1
authored andcommitted
Fixed HyperX Alloy Origins Core HID communication on Windows
* Added serial number support * Amended to pass in HID device information for version number rather than enumerate a second time Commits squashed and amended for code style by Adam Honse <[email protected]>
1 parent a20a19e commit 4a333e9

File tree

5 files changed

+66
-26
lines changed

5 files changed

+66
-26
lines changed

Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.cpp

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,31 @@
55
| RGB Keyboard lighting controller |
66
| |
77
| Volodymyr Nazarchuk (Vavooon) 4/28/2021 |
8+
| mike white (kamaaina) 6/9/2021 |
89
\*------------------------------------------*/
910

1011
#include "HyperXAlloyOriginsCoreController.h"
1112

1213
#include <cstring>
1314

1415
// Skip these indices in the color output
15-
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};
16+
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};
1617

17-
HyperXAlloyOriginsCoreController::HyperXAlloyOriginsCoreController(hid_device* dev_handle, const char* path)
18+
HyperXAlloyOriginsCoreController::HyperXAlloyOriginsCoreController(hid_device* dev_handle, hid_device_info* dev_info)
1819
{
19-
dev = dev_handle;
20-
location = path;
20+
dev = dev_handle;
21+
location = dev_info->path;
22+
23+
/*-----------------------------------------------------*\
24+
| Get the firmware version from the device info |
25+
\*-----------------------------------------------------*/
26+
char fw_version_buf[8];
27+
memset(fw_version_buf, '\0', sizeof(fw_version_buf));
28+
29+
unsigned short version = dev_info->release_number;
30+
sprintf(fw_version_buf, "%.2X.%.2X", (version & 0xFF00) >> 8, version & 0x00FF);
31+
32+
firmware_version = fw_version_buf;
2133
}
2234

2335
HyperXAlloyOriginsCoreController::~HyperXAlloyOriginsCoreController()
@@ -30,6 +42,27 @@ std::string HyperXAlloyOriginsCoreController::GetDeviceLocation()
3042
return("HID " + location);
3143
}
3244

45+
std::string HyperXAlloyOriginsCoreController::GetSerialString()
46+
{
47+
wchar_t serial_string[128];
48+
int ret = hid_get_serial_number_string(dev, serial_string, 128);
49+
50+
if(ret != 0)
51+
{
52+
return("");
53+
}
54+
55+
std::wstring return_wstring = serial_string;
56+
std::string return_string(return_wstring.begin(), return_wstring.end());
57+
58+
return(return_string);
59+
}
60+
61+
std::string HyperXAlloyOriginsCoreController::GetFirmwareVersion()
62+
{
63+
return(firmware_version);
64+
}
65+
3366
void HyperXAlloyOriginsCoreController::SetLEDsDirect(std::vector<RGBColor> colors)
3467
{
3568
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<RGBColor> color
72105

73106
unsigned char packet[65];
74107
memset(packet, 0x00, sizeof(packet));
75-
76-
packet[0] = 0xA2;
77-
packet[1] = seq++;
78-
packet[3] = payloadSize;
79108

80-
memcpy(&packet[4], &buf[sentBytes], payloadSize);
109+
packet[1] = 0xA2;
110+
packet[2] = seq++;
111+
packet[4] = payloadSize;
81112

113+
memcpy(&packet[5], &buf[sentBytes], payloadSize);
82114
hid_write(dev, packet, 65);
83115

84116
sentBytes += payloadSize;

Controllers/HyperXKeyboardController/HyperXAlloyOriginsCoreController.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
class HyperXAlloyOriginsCoreController
1919
{
2020
public:
21-
HyperXAlloyOriginsCoreController(hid_device* dev_handle, const char* path);
21+
HyperXAlloyOriginsCoreController(hid_device* dev_handle, hid_device_info* dev_info);
2222
~HyperXAlloyOriginsCoreController();
2323

24-
std::string GetDeviceLocation();
24+
std::string GetDeviceLocation();
25+
std::string GetSerialString();
26+
std::string GetFirmwareVersion();
2527

2628
void SetLEDsDirect(std::vector<RGBColor> colors);
2729

2830
private:
29-
hid_device* dev;
30-
std::string location;
31+
hid_device* dev;
32+
std::string location;
33+
std::string firmware_version;
3134
};

Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void DetectHyperXAlloyOriginsCore(hid_device_info* info, const std::string& name
4949
hid_device* dev = hid_open_path(info->path);
5050
if( dev )
5151
{
52-
HyperXAlloyOriginsCoreController* controller = new HyperXAlloyOriginsCoreController(dev, info->path);
52+
HyperXAlloyOriginsCoreController* controller = new HyperXAlloyOriginsCoreController(dev, info);
5353
RGBController_HyperXAlloyOriginsCore* rgb_controller = new RGBController_HyperXAlloyOriginsCore(controller);
5454
rgb_controller->name = name;
5555
ResourceManager::get()->RegisterRGBController(rgb_controller);
@@ -68,14 +68,14 @@ void DetectHyperXAlloyElite2(hid_device_info* info, const std::string& name)
6868
}
6969
}
7070

71-
REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01);
72-
REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01);
71+
REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_PID, 2, 0xFF01);
72+
REGISTER_HID_DETECTOR_IP("HyperX Alloy FPS RGB", DetectHyperXKeyboards, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_FPS_RGB_PID, 2, 0xFF01);
73+
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 2);
7374

7475
#ifdef _WIN32
75-
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 3);
76-
REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 3, 0xFF90);
76+
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 3);
77+
REGISTER_HID_DETECTOR_IP("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 3, 0xFF90);
7778
#else
78-
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 0);
79-
REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 0);
80-
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins Core", DetectHyperXAlloyOriginsCore, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_CORE_PID, 2);
79+
REGISTER_HID_DETECTOR_I("HyperX Alloy Origins", DetectHyperXAlloyOrigins, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ORIGINS_PID, 0);
80+
REGISTER_HID_DETECTOR_I("HyperX Alloy Elite 2", DetectHyperXAlloyElite2, HYPERX_KEYBOARD_VID, HYPERX_ALLOY_ELITE_2_PID, 0);
8181
#endif

Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ RGBController_HyperXAlloyOriginsCore::RGBController_HyperXAlloyOriginsCore(Hyper
154154
type = DEVICE_TYPE_KEYBOARD;
155155
description = "HyperX Alloy Origins Core Keyboard Device";
156156
location = hyperx->GetDeviceLocation();
157-
serial = "";
157+
serial = hyperx->GetSerialString();
158+
version = hyperx->GetFirmwareVersion();
158159

159160
mode Direct;
160161
Direct.name = "Direct";
@@ -272,7 +273,10 @@ void RGBController_HyperXAlloyOriginsCore::KeepaliveThread()
272273
{
273274
if(active_mode == 0)
274275
{
275-
DeviceUpdateLEDs();
276+
if((std::chrono::steady_clock::now() - last_update_time) > std::chrono::milliseconds(50))
277+
{
278+
DeviceUpdateLEDs();
279+
}
276280
}
277281
std::this_thread::sleep_for(10ms);
278282
}

Controllers/HyperXKeyboardController/RGBController_HyperXAlloyOriginsCore.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class RGBController_HyperXAlloyOriginsCore : public RGBController
3333
void KeepaliveThread();
3434

3535
private:
36-
HyperXAlloyOriginsCoreController* hyperx;
37-
std::thread* keepalive_thread;
38-
std::atomic<bool> keepalive_thread_run;
36+
HyperXAlloyOriginsCoreController* hyperx;
37+
std::thread* keepalive_thread;
38+
std::atomic<bool> keepalive_thread_run;
39+
std::chrono::time_point<std::chrono::steady_clock> last_update_time;
3940
};

0 commit comments

Comments
 (0)