Skip to content

Commit e9b3507

Browse files
Bobby QuantumCalcProgrammer1
authored andcommitted
SteelSeries Aerox 5 Wired Support resolves #4134
1 parent 949991f commit e9b3507

File tree

4 files changed

+224
-1
lines changed

4 files changed

+224
-1
lines changed

Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@save :white_check_mark:
1717
@direct :white_check_mark:
1818
@effects :white_check_mark:
19-
@detectors DetectSteelSeriesRival3,DetectSteelSeriesAerox3,DetectSteelSeriesAerox9
19+
@detectors DetectSteelSeriesRival3,DetectSteelSeriesAerox3,DetectSteelSeriesAerox5,DetectSteelSeriesAerox9
2020
@comment
2121
\*-------------------------------------------------------------------*/
2222

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*---------------------------------------------------------*\
2+
| SteelSeriesAerox5Controller.cpp |
3+
| |
4+
| Controller for the Steelseries Aerox5 Wired |
5+
| |
6+
| Bobby Quantum (BobbyQuantum) 19 May 2024 |
7+
| |
8+
| This file is part of the OpenRGB project |
9+
| SPDX-License-Identifier: GPL-2.0-only |
10+
\*---------------------------------------------------------*/
11+
12+
#include "SteelSeriesAerox5Controller.h"
13+
#include "LogManager.h"
14+
15+
SteelSeriesAerox5Controller::SteelSeriesAerox5Controller(hid_device* dev_handle, steelseries_type proto_type, const char* path)
16+
: SteelSeriesMouseController(dev_handle, proto_type, path)
17+
{
18+
SendInit();
19+
}
20+
21+
SteelSeriesAerox5Controller::~SteelSeriesAerox5Controller()
22+
{
23+
hid_close(dev);
24+
}
25+
26+
void SteelSeriesAerox5Controller::SendInit()
27+
{
28+
/*-----------------------------------------------------------------*\
29+
| This sets sensitivity and allows software mode?? max 5 uint8 |
30+
| buffer[2] = Count eg. 0 thru 5 |
31+
| buffer[4] to [8] = dpi / 50 range = 0x04 - 0xC7 eg. 400 = 0x08 |
32+
\*-----------------------------------------------------------------*/
33+
uint8_t buffer[STEELSERIES_AEROX5_PACKET_SIZE] = { 0x00, 0x2D };
34+
35+
hid_send_feature_report(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE);
36+
}
37+
38+
std::string SteelSeriesAerox5Controller::GetFirmwareVersion()
39+
{
40+
uint8_t result = 0;
41+
const uint8_t CMD = 0x90;
42+
const uint8_t sz = 16;
43+
char version[sz + 1];
44+
45+
uint8_t buffer[STEELSERIES_AEROX5_PACKET_SIZE] = { 0x00, CMD, 0x00 };
46+
47+
hid_send_feature_report(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE);
48+
do
49+
{
50+
result = hid_read_timeout(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE, STEELSERIES_AEROX5_TIMEOUT);
51+
LOG_DEBUG("[%s] Reading version buffer: Bytes Read %d Buffer %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", STEELSERIES_AEROX5_NAME, result,
52+
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9], buffer[10]);
53+
} while(result > 0 && buffer[0] != CMD);
54+
55+
if(buffer[0] == CMD)
56+
{
57+
/*-----------------------------------------------------------------*\
58+
| Read the version from the second character |
59+
\*-----------------------------------------------------------------*/
60+
memcpy(version, &buffer[1], sz);
61+
version[sz] = 0;
62+
std::string tmp = std::string(version);
63+
LOG_DEBUG("[%s] Version: %s as string %s", STEELSERIES_AEROX5_NAME, version, tmp.c_str());
64+
65+
return tmp;
66+
}
67+
else
68+
{
69+
LOG_DEBUG("[%s] Unable to get version: giving up!", STEELSERIES_AEROX5_NAME);
70+
return "";
71+
}
72+
}
73+
74+
steelseries_mouse SteelSeriesAerox5Controller::GetMouse()
75+
{
76+
return aerox_5;
77+
}
78+
79+
void SteelSeriesAerox5Controller::SetLightEffectAll(uint8_t /*effect*/)
80+
{
81+
/*-----------------------------------------------------------------*\
82+
| Not used by this device |
83+
\*-----------------------------------------------------------------*/
84+
}
85+
86+
void SteelSeriesAerox5Controller::SetColor
87+
(
88+
unsigned char zone_id,
89+
unsigned char red,
90+
unsigned char green,
91+
unsigned char blue,
92+
unsigned char brightness
93+
)
94+
{
95+
uint8_t buffer[STEELSERIES_AEROX5_PACKET_SIZE] = { 0x00, 0x21, 0x01 };
96+
97+
uint8_t offset = 0x03;
98+
99+
switch (zone_id)
100+
{
101+
case 0:
102+
offset = 0x03;
103+
break;
104+
case 1:
105+
buffer[2] = 0x02;
106+
offset = 0x06;
107+
break;
108+
case 2:
109+
buffer[2] = 0x04;
110+
offset = 0x09;
111+
break;
112+
case 3:
113+
buffer[1] = 0x26;
114+
offset = 0x04;
115+
break;
116+
default:
117+
return;
118+
}
119+
120+
buffer[offset] = red;
121+
buffer[offset + 1] = green;
122+
buffer[offset + 2] = blue;
123+
124+
hid_write(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE);
125+
std::this_thread::sleep_for(std::chrono::milliseconds(2));
126+
127+
if (brightness != current_brightness)
128+
{
129+
SetBrightness(brightness);
130+
current_brightness = brightness;
131+
}
132+
}
133+
134+
void SteelSeriesAerox5Controller::SetBrightness(uint8_t brightness)
135+
{
136+
uint8_t buffer[3] = { 0x00, 0x23, brightness };
137+
138+
hid_write(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE);
139+
140+
std::this_thread::sleep_for(std::chrono::milliseconds(2));
141+
}
142+
143+
void SteelSeriesAerox5Controller::Save()
144+
{
145+
uint8_t buffer2[3] = { 0x00, 0x11, 0x00 };
146+
147+
hid_write(dev, buffer2, STEELSERIES_AEROX5_PACKET_SIZE);
148+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*---------------------------------------------------------*\
2+
| SteelSeriesAerox5Controller.h |
3+
| |
4+
| Controller for the Steelseries Aerox5 Wired |
5+
| |
6+
| Bobby Quantum (BobbyQuantum) 19 May 2024 |
7+
| |
8+
| This file is part of the OpenRGB project |
9+
| SPDX-License-Identifier: GPL-2.0-only |
10+
\*---------------------------------------------------------*/
11+
12+
#include <cstring>
13+
#include <string>
14+
#include <hidapi/hidapi.h>
15+
#include "RGBController.h"
16+
#include "SteelSeriesGeneric.h"
17+
#include "SteelSeriesMouseController.h"
18+
19+
#pragma once
20+
21+
#define STEELSERIES_AEROX5_NAME "SteelSeries Aerox 5"
22+
#define STEELSERIES_AEROX5_PACKET_SIZE 65
23+
#define STEELSERIES_AEROX5_TIMEOUT 250
24+
25+
static const steelseries_mouse aerox_5 =
26+
{
27+
{ 0x04 },
28+
{
29+
{"Front", 0 },
30+
{"Middle", 1 },
31+
{"Rear", 2 },
32+
{"Reactive", 3 },
33+
}
34+
};
35+
36+
37+
class SteelSeriesAerox5Controller : public SteelSeriesMouseController
38+
{
39+
public:
40+
SteelSeriesAerox5Controller(hid_device *dev_handle,
41+
steelseries_type proto_type,
42+
const char *path);
43+
~SteelSeriesAerox5Controller();
44+
45+
std::string GetFirmwareVersion();
46+
steelseries_mouse GetMouse();
47+
48+
void Save() override;
49+
void SetLightEffectAll(uint8_t effect);
50+
void SetColor(unsigned char zone_id,
51+
unsigned char red,
52+
unsigned char green,
53+
unsigned char blue,
54+
unsigned char brightness);
55+
56+
private:
57+
void SendInit();
58+
void SetBrightness(uint8_t brightness);
59+
uint8_t current_brightness;
60+
};

Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "RGBController.h"
44
#include "SteelSeriesGeneric.h"
55

6+
#include "SteelSeriesAerox5Controller.h"
67
#include "SteelSeriesAerox9Controller.h"
78
#include "SteelSeriesArctis5Controller.h"
89
#include "SteelSeriesApex8ZoneController.h"
@@ -34,6 +35,7 @@
3435
| Mouse product IDs |
3536
\*-----------------------------------------------------*/
3637
#define STEELSERIES_AEROX_3_PID 0x1836
38+
#define STEELSERIES_AEROX_5_PID 0x1850
3739
#define STEELSERIES_AEROX_9_PID 0x185A
3840
#define STEELSERIES_RIVAL_100_PID 0x1702
3941
#define STEELSERIES_RIVAL_100_DOTA_PID 0x170C
@@ -103,6 +105,18 @@ void DetectSteelSeriesAerox3(hid_device_info* info, const std::string& name)
103105
}
104106
}
105107

108+
void DetectSteelSeriesAerox5(hid_device_info* info, const std::string& name)
109+
{
110+
hid_device* dev = hid_open_path(info->path);
111+
if(dev)
112+
{
113+
SteelSeriesAerox5Controller* controller = new SteelSeriesAerox5Controller(dev, AEROX_3, info->path);
114+
RGBController_SteelSeriesRival3* rgb_controller = new RGBController_SteelSeriesRival3(controller);
115+
rgb_controller->name = name;
116+
ResourceManager::get()->RegisterRGBController(rgb_controller);
117+
}
118+
}
119+
106120
void DetectSteelSeriesAerox9(hid_device_info* info, const std::string& name)
107121
{
108122
hid_device* dev = hid_open_path(info->path);
@@ -302,6 +316,7 @@ void DetectSteelSeriesArctis5(hid_device_info* info, const std::string& name)
302316
| Mice |
303317
\*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
304318
REGISTER_HID_DETECTOR_IPU("SteelSeries Aerox 3 Wired", DetectSteelSeriesAerox3, STEELSERIES_VID, STEELSERIES_AEROX_3_PID, 3, 0xFFC0, 1 );
319+
REGISTER_HID_DETECTOR_IPU("SteelSeries Aerox 5 Wired", DetectSteelSeriesAerox5, STEELSERIES_VID, STEELSERIES_AEROX_5_PID, 3, 0xFFC0, 1 );
305320
REGISTER_HID_DETECTOR_IPU("SteelSeries Aerox 9 Wired", DetectSteelSeriesAerox9, STEELSERIES_VID, STEELSERIES_AEROX_9_PID, 3, 0xFFC0, 1 );
306321
REGISTER_HID_DETECTOR_I("SteelSeries Rival 100", DetectSteelSeriesRival100, STEELSERIES_VID, STEELSERIES_RIVAL_100_PID, 0 );
307322
REGISTER_HID_DETECTOR_I("SteelSeries Rival 100 DotA 2 Edition", DetectSteelSeriesRival100, STEELSERIES_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0 );

0 commit comments

Comments
 (0)