Skip to content

Commit 1d208c1

Browse files
DawidK1CalcProgrammer1
authored andcommitted
Add support for Redragon M914. Create generic Areson driver
1 parent 1a6d68d commit 1d208c1

6 files changed

Lines changed: 277 additions & 215 deletions

File tree

Controllers/ZETEdgeAirProController/ZETEdgeAirProController.cpp renamed to Controllers/AresonController/AresonController.cpp

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*---------------------------------------------------------*\
2-
| ZETEdgeAirProController.cpp |
2+
| AresonController.cpp |
33
| |
4-
| Driver for ZET Edge Air Pro |
4+
| Driver for Areson mice |
55
| |
66
| Morgan Guimard (morg) 29 Jan 2022 |
77
| |
@@ -11,31 +11,31 @@
1111

1212
#include <string.h>
1313
#include "StringUtils.h"
14-
#include "ZETEdgeAirProController.h"
14+
#include "AresonController.h"
1515

16-
ZETEdgeAirProController::ZETEdgeAirProController(hid_device* dev_handle, const hid_device_info& info, std::string dev_name)
16+
AresonController::AresonController(hid_device* dev_handle, const hid_device_info& info, std::string dev_name)
1717
{
1818
dev = dev_handle;
1919
location = info.path;
2020
name = dev_name;
2121
}
2222

23-
ZETEdgeAirProController::~ZETEdgeAirProController()
23+
AresonController::~AresonController()
2424
{
2525
hid_close(dev);
2626
}
2727

28-
std::string ZETEdgeAirProController::GetDeviceLocation()
28+
std::string AresonController::GetDeviceLocation()
2929
{
3030
return("HID: " + location);
3131
}
3232

33-
std::string ZETEdgeAirProController::GetNameString()
33+
std::string AresonController::GetNameString()
3434
{
3535
return(name);
3636
}
3737

38-
std::string ZETEdgeAirProController::GetSerialString()
38+
std::string AresonController::GetSerialString()
3939
{
4040
wchar_t serial_string[128];
4141
int ret = hid_get_serial_number_string(dev, serial_string, 128);
@@ -48,19 +48,47 @@ std::string ZETEdgeAirProController::GetSerialString()
4848
return(StringUtils::wstring_to_string(serial_string));
4949
}
5050

51-
void ZETEdgeAirProController::SetMode(RGBColor color, unsigned char brightness, unsigned char speed, unsigned char mode_value)
51+
unsigned char AresonController::GetSpeedValue(unsigned char speed, unsigned char mode_value)
52+
{
53+
unsigned char speed_values_lookup_high[ARESON_SPEED_MAX] =
54+
{
55+
0xFF, 0xE6, 0xD2, 0xBe, 0xAA, 0x96, 0x82, 0x6E, 0x46, 0x28
56+
};
57+
58+
unsigned char speed_values_lookup_low[ARESON_SPEED_MAX] =
59+
{
60+
0x2D, 0x28, 0x23, 0x1E, 0x19, 0x13, 0x0F, 0x0A, 0x05, 0x03
61+
};
62+
63+
switch (mode_value)
64+
{
65+
case BREATHING_MODE_VALUE:
66+
case SPECRTUM_CYCLE_MODE_VALUE:
67+
case SINGLE_COLOR_WAVE_MODE_VALUE:
68+
case BREATHING_COLORFUL_MODE_VALUE:
69+
return speed_values_lookup_high[speed -1];
70+
71+
case RAINBOW_WAVE_MODE_VALUE:
72+
return speed_values_lookup_low[speed -1];
73+
74+
default:
75+
return 0;
76+
}
77+
}
78+
79+
void AresonController::SetMode(RGBColor color, unsigned char brightness, unsigned char speed, unsigned char mode_value)
5280
{
5381
/*---------------------------------------------------------*\
5482
| Init the packet buffer |
5583
\*---------------------------------------------------------*/
56-
unsigned char usb_buf[ZET_EDGE_AIR_PRO_PACKET_SIZE];
84+
unsigned char usb_buf[ARESON_PACKET_SIZE];
5785

5886
memset(usb_buf, 0x00, sizeof(usb_buf));
5987

6088
/*---------------------------------------------------------*\œ
6189
| Constant data |
6290
\*---------------------------------------------------------*/
63-
usb_buf[0x00] = ZET_EDGE_AIR_PRO_REPORT_ID;
91+
usb_buf[0x00] = ARESON_REPORT_ID;
6492
usb_buf[0x01] = 0x07;
6593
usb_buf[0x04] = 0xA0;
6694
usb_buf[0x05] = 0x07;
@@ -80,30 +108,14 @@ void ZETEdgeAirProController::SetMode(RGBColor color, unsigned char brightness,
80108
/*---------------------------------------------------------*\
81109
| Set speed if needed |
82110
\*---------------------------------------------------------*/
83-
if(mode_value == BREATHING_MODE_VALUE)
84-
{
85-
unsigned char speed_values[ZET_EDGE_AIR_PRO_SPEED_MAX] =
86-
{
87-
0xFF, 0xE6, 0xD2, 0xBe, 0xAA, 0x96, 0x82, 0x6E, 0x46, 0x28
88-
};
89-
90-
usb_buf[0x0A] = speed_values[speed - 1];
91-
}
92-
else if(mode_value == RAINBOW_MODE_VALUE)
93-
{
94-
unsigned char speed_values[ZET_EDGE_AIR_PRO_SPEED_MAX] =
95-
{
96-
0x2D, 0x28, 0x23, 0x1E, 0x19, 0x13, 0x0F, 0x0A, 0x05, 0x03
97-
};
111+
usb_buf[0x0A] = GetSpeedValue(speed, mode_value);
98112

99-
usb_buf[0x0A] = speed_values[speed - 1];
100-
}
101113
/*---------------------------------------------------------*\
102114
| Set brightness if needed |
103115
\*---------------------------------------------------------*/
104116
if(mode_value != OFF_MODE_VALUE)
105117
{
106-
unsigned char brightness_values[ZET_EDGE_AIR_PRO_BRIGHTNESS_MAX] =
118+
unsigned char brightness_values[ARESON_BRIGHTNESS_MAX] =
107119
{
108120
0x19, 0x32, 0x4B, 0x64, 0x7D, 0x96, 0xAF, 0xC8, 0xE1, 0xFF
109121
};
@@ -119,10 +131,10 @@ void ZETEdgeAirProController::SetMode(RGBColor color, unsigned char brightness,
119131
/*---------------------------------------------------------*\
120132
| Constant data |
121133
\*---------------------------------------------------------*/
122-
usb_buf[0x10] = ZET_EDGE_AIR_PRO_PACKET_END;
134+
usb_buf[0x10] = ARESON_PACKET_END;
123135

124136
/*---------------------------------------------------------*\
125137
| Send the report |
126138
\*---------------------------------------------------------*/
127-
hid_send_feature_report(dev, usb_buf, ZET_EDGE_AIR_PRO_PACKET_SIZE);
139+
hid_send_feature_report(dev, usb_buf, ARESON_PACKET_SIZE);
128140
}

Controllers/ZETEdgeAirProController/ZETEdgeAirProController.h renamed to Controllers/AresonController/AresonController.h

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*---------------------------------------------------------*\
2-
| ZETEdgeAirProController.h |
2+
| AresonController.h |
33
| |
4-
| Driver for ZET Edge Air Pro |
4+
| Driver for Areson mice |
55
| |
66
| Morgan Guimard (morg) 29 Jan 2022 |
77
| |
@@ -15,31 +15,35 @@
1515
#include <hidapi.h>
1616
#include "RGBController.h"
1717

18-
#define ZET_EDGE_AIR_PRO_PACKET_SIZE 17
19-
#define ZET_EDGE_AIR_PRO_REPORT_ID 0x08
20-
#define ZET_EDGE_AIR_PRO_PACKET_END 0x4a
18+
#define ARESON_PACKET_SIZE 17
19+
#define ARESON_REPORT_ID 0x08
20+
#define ARESON_PACKET_END 0x4A
2121

2222
enum
2323
{
24-
STATIC_MODE_VALUE = 0x02,
25-
OFF_MODE_VALUE = 0x04,
26-
RAINBOW_MODE_VALUE = 0x00,
27-
BREATHING_MODE_VALUE = 0x01
24+
RAINBOW_WAVE_MODE_VALUE = 0x00,
25+
BREATHING_MODE_VALUE = 0x01,
26+
STATIC_MODE_VALUE = 0x02,
27+
SPECRTUM_CYCLE_MODE_VALUE = 0x03,
28+
OFF_MODE_VALUE = 0x04,
29+
SINGLE_COLOR_WAVE_MODE_VALUE = 0x05,
30+
BREATHING_COLORFUL_MODE_VALUE = 0x07,
2831
};
2932

33+
3034
enum
3135
{
32-
ZET_EDGE_AIR_PRO_BRIGHTNESS_MIN = 1,
33-
ZET_EDGE_AIR_PRO_BRIGHTNESS_MAX = 10,
34-
ZET_EDGE_AIR_PRO_SPEED_MIN = 1,
35-
ZET_EDGE_AIR_PRO_SPEED_MAX = 10
36+
ARESON_BRIGHTNESS_MIN = 1,
37+
ARESON_BRIGHTNESS_MAX = 10,
38+
ARESON_SPEED_MIN = 1,
39+
ARESON_SPEED_MAX = 10
3640
};
3741

38-
class ZETEdgeAirProController
42+
class AresonController
3943
{
4044
public:
41-
ZETEdgeAirProController(hid_device* dev_handle, const hid_device_info& info, std::string dev_name);
42-
~ZETEdgeAirProController();
45+
AresonController(hid_device* dev_handle, const hid_device_info& info, std::string dev_name);
46+
~AresonController();
4347

4448
std::string GetDeviceLocation();
4549
std::string GetNameString();
@@ -53,4 +57,5 @@ class ZETEdgeAirProController
5357
private:
5458
std::string location;
5559
std::string name;
60+
unsigned char GetSpeedValue(unsigned char speed, unsigned char mode_value);
5661
};

Controllers/ZETEdgeAirProController/ZETEdgeAirProControllerDetect.cpp renamed to Controllers/AresonController/AresonControllerDetect.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*---------------------------------------------------------*\
2-
| ZETEdgeAirProControllerDetect.cpp |
2+
| AresonControllerDetect.cpp |
33
| |
4-
| Detector for ZET Edge Air Pro |
4+
| Detector for Areson mice |
55
| |
66
| Morgan Guimard (morg) 29 Jan 2022 |
77
| |
@@ -10,13 +10,13 @@
1010
\*---------------------------------------------------------*/
1111

1212
#include "Detector.h"
13-
#include "ZETEdgeAirProController.h"
14-
#include "RGBController_ZETEdgeAirPro.h"
13+
#include "AresonController.h"
14+
#include "RGBController_Areson.h"
1515

1616
/*---------------------------------------------------------*\
17-
| ZET GAMING vendor ID |
17+
| Areson vendor ID |
1818
\*---------------------------------------------------------*/
19-
#define ZET_GAMING_VID 0x25A7
19+
#define ARESON_VID 0x25A7
2020

2121
/*---------------------------------------------------------*\
2222
| Product ID |
@@ -25,21 +25,25 @@
2525
#define ZET_GAMING_EDGE_AIR_PRO_PID 0xFA40
2626
#define ZET_GAMING_EDGE_AIR_ELIT_WIRELESS_PID 0xFA48
2727
#define ZET_GAMING_EDGE_AIR_ELIT_PID 0xFA49
28+
#define REDRAGON_M914_PID 0xFA7B
29+
#define REDRAGON_M914_WIRELESS_PID 0xFA7C
2830

29-
void DetectZETGAMINGEdgeAirProControllers(hid_device_info* info, const std::string& name)
31+
void DetectAresonControllers(hid_device_info* info, const std::string& name)
3032
{
3133
hid_device* dev = hid_open_path(info->path);
3234

3335
if(dev)
3436
{
35-
ZETEdgeAirProController* controller = new ZETEdgeAirProController(dev, *info, name);
36-
RGBController_ZETEdgeAirPro* rgb_controller = new RGBController_ZETEdgeAirPro(controller);
37+
AresonController* controller = new AresonController(dev, *info, name);
38+
RGBController_Areson* rgb_controller = new RGBController_Areson(controller);
3739

3840
ResourceManager::get()->RegisterRGBController(rgb_controller);
3941
}
4042
}
4143

42-
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Pro (Wireless)", DetectZETGAMINGEdgeAirProControllers, ZET_GAMING_VID, ZET_GAMING_EDGE_AIR_PRO_WIRELESS_PID, 1, 0xFF02, 2);
43-
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Pro", DetectZETGAMINGEdgeAirProControllers, ZET_GAMING_VID, ZET_GAMING_EDGE_AIR_PRO_PID, 1, 0xFF02, 2);
44-
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Elit (Wireless)", DetectZETGAMINGEdgeAirProControllers, ZET_GAMING_VID, ZET_GAMING_EDGE_AIR_ELIT_WIRELESS_PID, 1, 0xFF02, 2);
45-
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Elit", DetectZETGAMINGEdgeAirProControllers, ZET_GAMING_VID, ZET_GAMING_EDGE_AIR_ELIT_PID, 1, 0xFF02, 2);
44+
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Pro (Wireless)", DetectAresonControllers, ARESON_VID, ZET_GAMING_EDGE_AIR_PRO_WIRELESS_PID, 1, 0xFF02, 2);
45+
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Pro", DetectAresonControllers, ARESON_VID, ZET_GAMING_EDGE_AIR_PRO_PID, 1, 0xFF02, 2);
46+
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Elit (Wireless)", DetectAresonControllers, ARESON_VID, ZET_GAMING_EDGE_AIR_ELIT_WIRELESS_PID, 1, 0xFF02, 2);
47+
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Elit", DetectAresonControllers, ARESON_VID, ZET_GAMING_EDGE_AIR_ELIT_PID, 1, 0xFF02, 2);
48+
REGISTER_HID_DETECTOR_IPU("Redragon M914 NIX (Wireless)", DetectAresonControllers, ARESON_VID, REDRAGON_M914_WIRELESS_PID, 1, 0xFF02, 2);
49+
REGISTER_HID_DETECTOR_IPU("Redragon M914 NIX", DetectAresonControllers, ARESON_VID, REDRAGON_M914_PID, 1, 0xFF02, 2);

0 commit comments

Comments
 (0)