Skip to content

Commit 0755959

Browse files
committed
Implement modes for Logitech G213 Keyboard
1 parent fe11115 commit 0755959

File tree

3 files changed

+208
-0
lines changed

3 files changed

+208
-0
lines changed

Controllers/LogitechController/LogitechG213Controller.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,78 @@ void LogitechG213Controller::SetDirect
7575
\*-----------------------------------------------------*/
7676
hid_write(dev, (unsigned char *)usb_buf, 20);
7777
}
78+
79+
void LogitechG213Controller::SetMode
80+
(
81+
unsigned char mode,
82+
unsigned short speed,
83+
unsigned char direction,
84+
unsigned char red,
85+
unsigned char green,
86+
unsigned char blue
87+
)
88+
{
89+
SendMode(LOGITECH_G213_ZONE_MODE_KEYBOARD, mode, speed, direction, red, green, blue);
90+
}
91+
92+
void LogitechG213Controller::SendMode
93+
(
94+
unsigned char zone,
95+
unsigned char mode,
96+
unsigned short speed,
97+
unsigned char direction,
98+
unsigned char red,
99+
unsigned char green,
100+
unsigned char blue
101+
)
102+
{
103+
char usb_buf[20];
104+
105+
/*-----------------------------------------------------*\
106+
| Zero out buffer |
107+
\*-----------------------------------------------------*/
108+
memset(usb_buf, 0x00, sizeof(usb_buf));
109+
110+
/*-----------------------------------------------------*\
111+
| Set up Lighting Control packet |
112+
\*-----------------------------------------------------*/
113+
usb_buf[0x00] = 0x11;
114+
usb_buf[0x01] = 0xFF;
115+
usb_buf[0x02] = 0x0C;
116+
usb_buf[0x03] = 0x3C;
117+
usb_buf[0x04] = zone;
118+
119+
usb_buf[0x05] = mode;
120+
121+
usb_buf[0x06] = red;
122+
usb_buf[0x07] = green;
123+
usb_buf[0x08] = blue;
124+
125+
speed = 100 * speed;
126+
127+
if(mode == LOGITECH_G213_MODE_BREATHING)
128+
{
129+
usb_buf[0x09] = speed >> 8;
130+
usb_buf[0x0A] = speed & 0xFF;
131+
usb_buf[0x0C] = 0x64;
132+
}
133+
else if(mode == LOGITECH_G213_MODE_CYCLE)
134+
{
135+
usb_buf[0x0B] = speed >> 8;
136+
usb_buf[0x0C] = speed & 0xFF;
137+
usb_buf[0x0D] = 0x64;
138+
}
139+
else if(mode == LOGITECH_G213_MODE_WAVE)
140+
{
141+
usb_buf[0x0B] = speed >> 8;
142+
usb_buf[0x0C] = speed & 0xFF;
143+
usb_buf[0x0D] = direction & 0xFF;
144+
usb_buf[0x0F] = speed >> 8;
145+
}
146+
147+
/*-----------------------------------------------------*\
148+
| Send packet |
149+
\*-----------------------------------------------------*/
150+
hid_write(dev, (unsigned char *)usb_buf, 20);
151+
hid_read(dev, (unsigned char *)usb_buf, 20);
152+
}

Controllers/LogitechController/LogitechG213Controller.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,39 @@
1313

1414
#pragma once
1515

16+
enum
17+
{
18+
LOGITECH_G213_ZONE_MODE_KEYBOARD = 0x00
19+
};
20+
21+
enum
22+
{
23+
LOGITECH_G213_MODE_OFF = 0x00,
24+
LOGITECH_G213_MODE_STATIC = 0x01,
25+
LOGITECH_G213_MODE_BREATHING = 0x02,
26+
LOGITECH_G213_MODE_CYCLE = 0x03,
27+
LOGITECH_G213_MODE_WAVE = 0x04,
28+
};
29+
30+
enum
31+
{
32+
LOGITECH_G213_WAVE_MODE_LEFT = 0x06,
33+
LOGITECH_G213_WAVE_MODE_RIGHT = 0x01,
34+
LOGITECH_G213_WAVE_MODE_CENTER_EDGE = 0x03,
35+
LOGITECH_G213_WAVE_MODE_EDGE_CENTER = 0x08,
36+
};
37+
38+
/*---------------------------------------------------------------------------------------------*\
39+
| Speed is 1000 for fast and 20000 for slow. |
40+
| Values are multiplied by 100 later to give lots of GUI steps. |
41+
\*---------------------------------------------------------------------------------------------*/
42+
enum
43+
{
44+
LOGITECH_G213_SPEED_SLOWEST = 0xC8, /* Slowest speed */
45+
LOGITECH_G213_SPEED_NORMAL = 0x32, /* Normal speed */
46+
LOGITECH_G213_SPEED_FASTEST = 0x0A, /* Fastest speed */
47+
};
48+
1649
class LogitechG213Controller
1750
{
1851
public:
@@ -30,8 +63,28 @@ class LogitechG213Controller
3063
unsigned char b
3164
);
3265

66+
void SetMode
67+
(
68+
unsigned char mode,
69+
unsigned short speed,
70+
unsigned char direction,
71+
unsigned char red,
72+
unsigned char green,
73+
unsigned char blue
74+
);
75+
3376
private:
3477
hid_device* dev;
3578
std::string location;
3679

80+
void SendMode
81+
(
82+
unsigned char zone,
83+
unsigned char mode,
84+
unsigned short speed,
85+
unsigned char direction,
86+
unsigned char red,
87+
unsigned char green,
88+
unsigned char blue
89+
);
3790
};

Controllers/LogitechController/RGBController_LogitechG213.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,47 @@ RGBController_LogitechG213::RGBController_LogitechG213(LogitechG213Controller* l
4646
Direct.color_mode = MODE_COLORS_PER_LED;
4747
modes.push_back(Direct);
4848

49+
mode Off;
50+
Off.name = "Off";
51+
Off.value = LOGITECH_G213_MODE_OFF;
52+
Off.flags = 0;
53+
Off.color_mode = MODE_COLORS_NONE;
54+
modes.push_back(Off);
55+
56+
mode Cycle;
57+
Cycle.name = "Cycle";
58+
Cycle.value = LOGITECH_G213_MODE_CYCLE;
59+
Cycle.flags = MODE_FLAG_HAS_SPEED;
60+
Cycle.color_mode = MODE_COLORS_NONE;
61+
Cycle.speed_min = LOGITECH_G213_SPEED_SLOWEST;
62+
Cycle.speed_max = LOGITECH_G213_SPEED_FASTEST;
63+
Cycle.speed = LOGITECH_G213_SPEED_NORMAL;
64+
modes.push_back(Cycle);
65+
66+
mode Wave;
67+
Wave.name = "Wave";
68+
Wave.value = LOGITECH_G213_MODE_WAVE;
69+
Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
70+
Wave.color_mode = MODE_COLORS_NONE;
71+
Wave.speed_min = LOGITECH_G213_SPEED_SLOWEST;
72+
Wave.speed_max = LOGITECH_G213_SPEED_FASTEST;
73+
Wave.speed = LOGITECH_G213_SPEED_NORMAL;
74+
Wave.direction = MODE_DIRECTION_LEFT;
75+
modes.push_back(Wave);
76+
77+
mode Breathing;
78+
Breathing.name = "Breathing";
79+
Breathing.value = LOGITECH_G213_MODE_BREATHING;
80+
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
81+
Breathing.colors_min = 1;
82+
Breathing.colors_max = 1;
83+
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
84+
Breathing.colors.resize(1);
85+
Breathing.speed_min = LOGITECH_G213_SPEED_SLOWEST;
86+
Breathing.speed_max = LOGITECH_G213_SPEED_FASTEST;
87+
Breathing.speed = LOGITECH_G213_SPEED_NORMAL;
88+
modes.push_back(Breathing);
89+
4990
SetupZones();
5091
}
5192

@@ -117,4 +158,43 @@ void RGBController_LogitechG213::DeviceUpdateMode()
117158
| Direct mode does not send a mode packet |
118159
| Call UpdateLEDs to send direct packet |
119160
\*---------------------------------------------------------*/
161+
if(active_mode == 0xFFFF)
162+
{
163+
UpdateLEDs();
164+
return;
165+
}
166+
167+
unsigned char red = 0;
168+
unsigned char grn = 0;
169+
unsigned char blu = 0;
170+
unsigned char direction = 0;
171+
172+
if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC)
173+
{
174+
red = RGBGetRValue(modes[active_mode].colors[0]);
175+
grn = RGBGetGValue(modes[active_mode].colors[0]);
176+
blu = RGBGetBValue(modes[active_mode].colors[0]);
177+
}
178+
179+
switch (modes[active_mode].direction)
180+
{
181+
case MODE_DIRECTION_LEFT:
182+
// Right to left
183+
direction = LOGITECH_G213_WAVE_MODE_LEFT;
184+
break;
185+
case MODE_DIRECTION_RIGHT:
186+
// Left to right
187+
direction = LOGITECH_G213_WAVE_MODE_RIGHT;
188+
break;
189+
case MODE_DIRECTION_UP:
190+
// Edge to center
191+
direction = LOGITECH_G213_WAVE_MODE_EDGE_CENTER;
192+
break;
193+
case MODE_DIRECTION_DOWN:
194+
// Center to edge
195+
direction = LOGITECH_G213_WAVE_MODE_CENTER_EDGE;
196+
break;
197+
}
198+
199+
logitechG213->SetMode(modes[active_mode].value, modes[active_mode].speed, direction, red, grn, blu);
120200
}

0 commit comments

Comments
 (0)