Skip to content

Commit 7c22141

Browse files
Redragon M709 and K556 development
1 parent 9ba1b2f commit 7c22141

File tree

6 files changed

+440
-2
lines changed

6 files changed

+440
-2
lines changed
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
#include "RedragonController.h"
2+
3+
#include <cstring>
4+
5+
static void send_usb_msg(hid_device* dev, char * data_pkt, unsigned int size)
6+
{
7+
char* usb_pkt = new char[size + 1];
8+
9+
usb_pkt[0] = 0x04;
10+
for(int i = 1; i < size + 1; i++)
11+
{
12+
usb_pkt[i] = data_pkt[i-1];
13+
}
14+
15+
hid_write(dev, (unsigned char *)usb_pkt, size + 1);
16+
17+
delete usb_pkt;
18+
}
19+
20+
static void get_usb_msg(hid_device* dev, char* data_pkt, unsigned int size)
21+
{
22+
char usb_pkt[65];
23+
usb_pkt[0] = 0x00;
24+
for(int i = 1; i < 65; i++)
25+
{
26+
usb_pkt[i] = data_pkt[i-1];
27+
}
28+
int bytes = hid_get_feature_report(dev, (unsigned char*)data_pkt, size);
29+
}
30+
31+
RedragonController::RedragonController(hid_device* dev_handle)
32+
{
33+
dev = dev_handle;
34+
35+
//SendMouseMode(REDRAGON_MODE_STATIC, 0x01, 0x00, 0xFF, 0xFF);
36+
//SendMouseApply();
37+
38+
unsigned char color_data[0x36];
39+
40+
for(int i = 0; i < 0x36; i += 3)
41+
{
42+
color_data[i] = 0xFF;
43+
color_data[i+1] = 0x00;
44+
color_data[i+2] = 0x00;
45+
}
46+
47+
color_data[51] = 0xFF;
48+
color_data[52] = 0xFF;
49+
color_data[53] = 0xFF;
50+
51+
SendKeyboardBegin();
52+
SendKeyboardMode(REDRAGON_K556_MODE_CUSTOM);
53+
54+
SendKeyboardData
55+
(
56+
color_data,
57+
0x36,
58+
0x36 + 0x36 + 0x36 + 0x36 + 0x36 + 0x36
59+
);
60+
SendKeyboardEnd();
61+
}
62+
63+
/*-------------------------------------------------------------------------------------------------*\
64+
| Private packet sending functions. |
65+
\*-------------------------------------------------------------------------------------------------*/
66+
67+
/*-----------------------------------------------------------------------------------------*\
68+
| Keyboard functions |
69+
\*-----------------------------------------------------------------------------------------*/
70+
71+
void RedragonController::SendKeyboardBegin()
72+
{
73+
char usb_buf[64];
74+
75+
/*-----------------------------------------------------*\
76+
| Zero out buffer |
77+
\*-----------------------------------------------------*/
78+
memset(usb_buf, 0x00, sizeof(usb_buf));
79+
80+
/*-----------------------------------------------------*\
81+
| Set up Keyboard Begin packet |
82+
\*-----------------------------------------------------*/
83+
usb_buf[0x00] = 0x04;
84+
usb_buf[0x01] = 0x01;
85+
usb_buf[0x02] = 0x00;
86+
usb_buf[0x03] = 0x01;
87+
88+
/*-----------------------------------------------------*\
89+
| Send packet |
90+
\*-----------------------------------------------------*/
91+
hid_write(dev, (unsigned char *)usb_buf, 64);
92+
hid_read(dev, (unsigned char *)usb_buf, 64);
93+
}
94+
95+
void RedragonController::SendKeyboardData
96+
(
97+
unsigned char * data,
98+
unsigned char data_size,
99+
unsigned short data_offset
100+
)
101+
{
102+
char usb_buf[64];
103+
104+
/*-----------------------------------------------------*\
105+
| Zero out buffer |
106+
\*-----------------------------------------------------*/
107+
memset(usb_buf, 0x00, sizeof(usb_buf));
108+
109+
/*-----------------------------------------------------*\
110+
| Set up Keyboard End packet |
111+
\*-----------------------------------------------------*/
112+
usb_buf[0x00] = 0x04;
113+
usb_buf[0x01] = 0x11 + data_offset;
114+
usb_buf[0x02] = data_size;
115+
usb_buf[0x03] = ( data_size / 3 ) - 1;
116+
usb_buf[0x04] = data_size;
117+
usb_buf[0x05] = data_offset & 0x00FF;
118+
usb_buf[0x06] = data_offset >> 8;
119+
120+
/*-----------------------------------------------------*\
121+
| Copy in data bytes |
122+
\*-----------------------------------------------------*/
123+
memcpy(&usb_buf[0x08], data, data_size);
124+
125+
/*-----------------------------------------------------*\
126+
| Send packet |
127+
\*-----------------------------------------------------*/
128+
hid_write(dev, (unsigned char *)usb_buf, 64);
129+
hid_read(dev, (unsigned char *)usb_buf, 64);
130+
}
131+
132+
void RedragonController::SendKeyboardMode
133+
(
134+
unsigned char mode
135+
)
136+
{
137+
char usb_buf[64];
138+
139+
/*-----------------------------------------------------*\
140+
| Zero out buffer |
141+
\*-----------------------------------------------------*/
142+
memset(usb_buf, 0x00, sizeof(usb_buf));
143+
144+
/*-----------------------------------------------------*\
145+
| Set up Keyboard End packet |
146+
\*-----------------------------------------------------*/
147+
usb_buf[0x00] = 0x04;
148+
usb_buf[0x01] = 0x08 + mode;
149+
usb_buf[0x02] = 0x00;
150+
usb_buf[0x03] = 0x06;
151+
usb_buf[0x04] = 0x01;
152+
153+
usb_buf[0x08] = mode;
154+
155+
/*-----------------------------------------------------*\
156+
| Send packet |
157+
\*-----------------------------------------------------*/
158+
hid_write(dev, (unsigned char *)usb_buf, 64);
159+
hid_read(dev, (unsigned char *)usb_buf, 64);
160+
}
161+
162+
void RedragonController::SendKeyboardEnd()
163+
{
164+
char usb_buf[64];
165+
166+
/*-----------------------------------------------------*\
167+
| Zero out buffer |
168+
\*-----------------------------------------------------*/
169+
memset(usb_buf, 0x00, sizeof(usb_buf));
170+
171+
/*-----------------------------------------------------*\
172+
| Set up Keyboard End packet |
173+
\*-----------------------------------------------------*/
174+
usb_buf[0x00] = 0x04;
175+
usb_buf[0x01] = 0x02;
176+
usb_buf[0x02] = 0x00;
177+
usb_buf[0x03] = 0x02;
178+
179+
/*-----------------------------------------------------*\
180+
| Send packet |
181+
\*-----------------------------------------------------*/
182+
hid_write(dev, (unsigned char *)usb_buf, 64);
183+
hid_read(dev, (unsigned char *)usb_buf, 64);
184+
}
185+
186+
/*-----------------------------------------------------------------------------------------*\
187+
| Mouse functions |
188+
\*-----------------------------------------------------------------------------------------*/
189+
190+
void RedragonController::SendMouseApply()
191+
{
192+
char usb_buf[16];
193+
194+
/*-----------------------------------------------------*\
195+
| Zero out buffer |
196+
\*-----------------------------------------------------*/
197+
memset(usb_buf, 0x00, sizeof(usb_buf));
198+
199+
/*-----------------------------------------------------*\
200+
| Set up Apply packet |
201+
\*-----------------------------------------------------*/
202+
usb_buf[0x00] = 0x02;
203+
usb_buf[0x01] = 0xF1;
204+
usb_buf[0x02] = 0x02;
205+
usb_buf[0x03] = 0x04;
206+
207+
/*-----------------------------------------------------*\
208+
| Send packet |
209+
\*-----------------------------------------------------*/
210+
send_usb_msg(dev, usb_buf, 16);
211+
}
212+
213+
void RedragonController::SendMouseMode
214+
(
215+
unsigned char mode,
216+
unsigned char speed,
217+
unsigned char red,
218+
unsigned char green,
219+
unsigned char blue
220+
)
221+
{
222+
char usb_buf[16];
223+
224+
/*-----------------------------------------------------*\
225+
| Zero out buffer |
226+
\*-----------------------------------------------------*/
227+
memset(usb_buf, 0x00, sizeof(usb_buf));
228+
229+
/*-----------------------------------------------------*\
230+
| Set up Lighting Control packet |
231+
\*-----------------------------------------------------*/
232+
usb_buf[0x00] = 0x02;
233+
usb_buf[0x01] = 0xF3;
234+
usb_buf[0x02] = 0x49;
235+
usb_buf[0x03] = 0x04;
236+
usb_buf[0x04] = 0x06;
237+
238+
usb_buf[0x08] = red;
239+
usb_buf[0x09] = green;
240+
usb_buf[0x0A] = blue;
241+
242+
usb_buf[0x0B] = 0x01; //on
243+
244+
usb_buf[0x0C] = speed;
245+
usb_buf[0x0D] = mode;
246+
247+
/*-----------------------------------------------------*\
248+
| Send packet |
249+
\*-----------------------------------------------------*/
250+
send_usb_msg(dev, usb_buf, 16);
251+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*-----------------------------------------*\
2+
| RedragonController.h |
3+
| |
4+
| Definitions and types for Redragon RGB |
5+
| keyboard, mouse, and mousemat lighting |
6+
| controller |
7+
| |
8+
| Adam Honse (CalcProgrammer1) 3/15/2020 |
9+
\*-----------------------------------------*/
10+
11+
#include "RGBController.h"
12+
13+
#include <string>
14+
#include <hidapi/hidapi.h>
15+
16+
#pragma once
17+
18+
enum
19+
{
20+
REDRAGON_K556_MODE_RAINBOW_WAVE_SHORT = 0x01, /* "Go with the stream" */
21+
REDRAGON_K556_MODE_RAINBOW_WAVE_LONG = 0x02, /* "Clouds fly" */
22+
REDRAGON_K556_MODE_COLOR_WHEEL = 0x03, /* "Winding paths" */
23+
REDRAGON_K556_MODE_SPECTRUM_CYCLE = 0x04, /* "The trial of light" */
24+
REDRAGON_K556_MODE_BREATHING = 0x05, /* "Breathing" */
25+
REDRAGON_K556_MODE_STATIC = 0x06, /* "Normally on" */
26+
REDRAGON_K556_MODE_REACTIVE = 0x07, /* "Pass without trace" */
27+
REDRAGON_K556_MODE_REACTIVE_RIPPLE = 0x08, /* "Ripple graff" */
28+
REDRAGON_K556_MODE_REACTIVE_LINE = 0x09, /* "Fast run without trace" */
29+
REDRAGON_K556_MODE_STARLIGHT_FAST = 0x0A, /* "Swift action" */
30+
REDRAGON_K556_MODE_BLOOMING = 0x0B, /* "Flowers blooming" */
31+
REDRAGON_K556_MODE_RAINBOW_WAVE_VERTICAL = 0x0C, /* "Snow winter jasmine" */
32+
REDRAGON_K556_MODE_HURRICANE = 0x0D, /* "Hurricane" */
33+
REDRAGON_K556_MODE_ACCUMULATE = 0x0E, /* "Accumulate" */
34+
REDRAGON_K556_MODE_STARLIGHT_SLOW = 0x0F, /* "Digital times" */
35+
REDRAGON_K556_MODE_VISOR = 0x10, /* "Both ways" */
36+
REDRAGON_K556_MODE_RAINBOW_WAVE_CIRCLE = 0x12, /* "Fast and the Furious" */
37+
REDRAGON_K556_MODE_CUSTOM = 0x14, /* "Coastal" */
38+
};
39+
40+
enum
41+
{
42+
REDRAGON_M117_MODE_WAVE = 0x00,
43+
REDRAGON_M117_MODE_RANDOM_BREATHING = 0x01,
44+
REDRAGON_M117_MODE_STATIC = 0x02,
45+
REDRAGON_M117_MODE_BREATHING = 0x04,
46+
REDRAGON_M117_MODE_RAINBOW = 0x08,
47+
REDRAGON_M117_MODE_FLASHING = 0x10,
48+
};
49+
50+
class RedragonController
51+
{
52+
public:
53+
RedragonController(hid_device* dev_handle);
54+
~RedragonController();
55+
56+
private:
57+
hid_device* dev;
58+
59+
void SendKeyboardBegin();
60+
61+
void SendKeyboardMode
62+
(
63+
unsigned char mode
64+
);
65+
66+
void SendKeyboardData
67+
(
68+
unsigned char * data,
69+
unsigned char data_size,
70+
unsigned short data_offset
71+
);
72+
73+
void SendKeyboardEnd();
74+
75+
void SendMouseApply();
76+
77+
void SendMouseMode
78+
(
79+
unsigned char mode,
80+
unsigned char speed,
81+
unsigned char red,
82+
unsigned char green,
83+
unsigned char blue
84+
);
85+
};

0 commit comments

Comments
 (0)