Skip to content

Commit 186d8a5

Browse files
mzietlowCalcProgrammer1
authored andcommitted
Add support for Logitech G915TKL
1 parent 9a12042 commit 186d8a5

File tree

3 files changed

+82
-43
lines changed

3 files changed

+82
-43
lines changed

Controllers/LogitechController/LogitechControllerDetect.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ using namespace std::chrono_literals;
5555
#define LOGITECH_G815_PID 0xC33F
5656
#define LOGITECH_G915_WIRED_PID 0xC33E
5757
#define LOGITECH_G915_RECEIVER_PID 0xC541
58+
#define LOGITECH_G915TKL_WIRED_PID 0xC343
59+
#define LOGITECH_G915TKL_RECEIVER_PID 0xC545
5860
#define LOGITECH_G910_ORION_SPARK_PID 0xC32B
5961
#define LOGITECH_G910_PID 0xC335
6062
#define LOGITECH_GPRO_KEYBOARD_1_PID 0xC339
@@ -328,11 +330,12 @@ void DetectLogitechKeyboardG815(hid_device_info* info, const std::string& name)
328330
void DetectLogitechKeyboardG915(hid_device_info* info, const std::string& name)
329331
{
330332
hid_device* dev = hid_open_path(info->path);
333+
bool is_tkl = info->product_id == LOGITECH_G915TKL_RECEIVER_PID;
331334

332335
if(dev)
333336
{
334337
LogitechG915Controller* controller = new LogitechG915Controller(dev, false);
335-
RGBController_LogitechG915* rgb_controller = new RGBController_LogitechG915(controller);
338+
RGBController_LogitechG915* rgb_controller = new RGBController_LogitechG915(controller, is_tkl);
336339
rgb_controller->name = name;
337340
ResourceManager::get()->RegisterRGBController(rgb_controller);
338341
}
@@ -341,11 +344,12 @@ void DetectLogitechKeyboardG915(hid_device_info* info, const std::string& name)
341344
void DetectLogitechKeyboardG915Wired(hid_device_info* info, const std::string& name)
342345
{
343346
hid_device* dev = hid_open_path(info->path);
347+
bool is_tkl = info->product_id == LOGITECH_G915TKL_WIRED_PID;
344348

345349
if(dev)
346350
{
347351
LogitechG915Controller* controller = new LogitechG915Controller(dev, true);
348-
RGBController_LogitechG915* rgb_controller = new RGBController_LogitechG915(controller);
352+
RGBController_LogitechG915* rgb_controller = new RGBController_LogitechG915(controller, is_tkl);
349353
rgb_controller->name = name;
350354
ResourceManager::get()->RegisterRGBController(rgb_controller);
351355
}
@@ -520,7 +524,7 @@ static void addLogitechLightsyncMouse2zone(hid_device_info* info, const std::str
520524
#else
521525
{
522526
hid_device* dev = hid_open_path(info->path);
523-
527+
524528
if(dev)
525529
{
526530
LogitechGLightsyncController* controller = new LogitechGLightsyncController(dev, dev, info->path, hid_dev_index, hid_feature_index, hid_fctn_ase_id);
@@ -633,6 +637,8 @@ REGISTER_HID_DETECTOR_IP ("Logitech G910 Orion Spectrum", Dete
633637
REGISTER_HID_DETECTOR_IP ("Logitech G Pro RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardGPro, LOGITECH_VID, LOGITECH_GPRO_KEYBOARD_1_PID, 1, 0xFF43);
634638
REGISTER_HID_DETECTOR_IPU("Logitech G915 Wireless RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG915, LOGITECH_VID, LOGITECH_G915_RECEIVER_PID, 2, 0xFF00, 2);
635639
REGISTER_HID_DETECTOR_IPU("Logitech G915 Wireless RGB Mechanical Gaming Keyboard (Wired)", DetectLogitechKeyboardG915Wired, LOGITECH_VID, LOGITECH_G915_WIRED_PID, 2, 0xFF00, 2);
640+
REGISTER_HID_DETECTOR_IPU("Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG915, LOGITECH_VID, LOGITECH_G915TKL_RECEIVER_PID, 2, 0xFF00, 2);
641+
REGISTER_HID_DETECTOR_IPU("Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard (Wired)", DetectLogitechKeyboardG915Wired, LOGITECH_VID, LOGITECH_G915TKL_WIRED_PID, 2, 0xFF00, 2);
636642
/*-------------------------------------------------------------------------------------------------------------------------------------------------*\
637643
| Mice |
638644
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/

Controllers/LogitechController/RGBController_LogitechG915.cpp

Lines changed: 69 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,22 @@ const size_t max_key_per_color = 13;
1717
const size_t data_size = 16;
1818

1919
static unsigned int matrix_map[7][27] =
20-
{ { 110, NA, NA, NA, NA, NA, NA, NA, NA, NA, 111, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA },
21-
{ NA, NA, 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, NA, 66, 67, 68, NA, 106, 107, 108, 109 },
22-
{ 112, NA, 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, NA, 69, 70, 71, NA, 79, 80, 81, 82 },
23-
{ 113, NA, 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, NA, 72, 73, 74, NA, 91, 92, 93, 83 },
24-
{ 114, NA, 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA, NA, NA, 88, 89, 90, NA },
25-
{ 115, NA, 99, 96, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 103, NA, NA, NA, 78, NA, NA, 85, 86, 87, 84 },
26-
{ 116, NA, 98, 101, 100, NA, NA, NA, NA, 40, NA, NA, NA, NA, 104, 105, 97, 102, NA, 76, 77, 75, NA, 94, NA, 95, NA } };
20+
{ { 93, NA, NA, NA, NA, NA, NA, NA, NA, NA, 94, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA },
21+
{ NA, NA, 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, NA, 66, 67, 68, NA, 89, 90, 91, 92 },
22+
{ 112, NA, 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, NA, 69, 70, 71, NA, 95, 96, 97, 98 },
23+
{ 113, NA, 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, NA, 72, 73, 74, NA, 107, 108, 109, 99 },
24+
{ 114, NA, 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA, NA, NA, 104, 105, 106, NA },
25+
{ 115, NA, 82, 79, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 86, NA, NA, NA, 78, NA, NA, 101, 102, 103, 100 },
26+
{ 116, NA, 81, 84, 83, NA, NA, NA, NA, 40, NA, NA, NA, NA, 87, 88, 80, 85, NA, 76, 77, 75, NA, 110, NA, 111, NA } };
27+
28+
static unsigned int matrix_map_tkl[7][20] =
29+
{ { 93, NA, NA, NA, NA, 94, NA, NA, NA, NA, NA, NA, 89, 90, 91, 92, NA, NA, NA, NA },
30+
{ 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, NA, 66, 67, 68 },
31+
{ 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, NA, 69, 70, 71 },
32+
{ 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, NA, 72, 73, 74 },
33+
{ 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA, NA },
34+
{ 82, 79, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 86, NA, NA, NA, 78, NA },
35+
{ 81, 84, 83, NA, NA, NA, NA, 40, NA, NA, NA, NA, 87, 88, 80, 85, NA, 76, 77, 75 } };
2736

2837
static const char* zone_names[] =
2938
{
@@ -35,6 +44,9 @@ static zone_type zone_types[] =
3544
ZONE_TYPE_MATRIX,
3645
};
3746

47+
static const unsigned int tkl_led_count = 95;
48+
static const unsigned int full_led_count = 117;
49+
3850
static const unsigned int zone_sizes[] =
3951
{
4052
117,
@@ -129,7 +141,23 @@ static const led_type led_names[] =
129141
{ "Key: Left Arrow", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x50 },
130142
{ "Key: Down Arrow", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x51 },
131143
{ "Key: Up Arrow", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x52 },
132-
{ "Key: Num Lock", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x53 },
144+
{ "Key: \\ (ISO)", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x64 },//ISO only
145+
{ "Key: Menu", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x65 },
146+
{ "Key: Left Control", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE0 },
147+
{ "Key: Left Shift", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE1 },
148+
{ "Key: Left Alt", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE2 },
149+
{ "Key: Left Windows", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE3 },
150+
{ "Key: Right Control", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE4 },
151+
{ "Key: Right Shift", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE5 },
152+
{ "Key: Right Alt", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE6 },
153+
{ "Key: Right Windows", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE7 },
154+
{ "Key: Media Previous", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9E },
155+
{ "Key: Media Play/Pause", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9B },
156+
{ "Key: Media Next", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9D },
157+
{ "Key: Media Mute", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9C },
158+
{ "Logo", LOGITECH_G915_ZONE_DIRECT_LOGO, 0x01 },
159+
{ "Key: Brightness", LOGITECH_G915_ZONE_DIRECT_INDICATORS, 0x99 },
160+
{ "Key: Num Lock", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x53 }, // First Non-TKL Key
133161
{ "Key: Number Pad /", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x54 },
134162
{ "Key: Number Pad *", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x55 },
135163
{ "Key: Number Pad -", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x56 },
@@ -146,38 +174,31 @@ static const led_type led_names[] =
146174
{ "Key: Number Pad 9", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x61 },
147175
{ "Key: Number Pad 0", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x62 },
148176
{ "Key: Number Pad .", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x63 },
149-
{ "Key: \\ (ISO)", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x64 },//ISO only
150-
{ "Key: Menu", LOGITECH_G915_ZONE_DIRECT_KEYBOARD, 0x65 },
151-
{ "Key: Left Control", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE0 },
152-
{ "Key: Left Shift", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE1 },
153-
{ "Key: Left Alt", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE2 },
154-
{ "Key: Left Windows", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE3 },
155-
{ "Key: Right Control", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE4 },
156-
{ "Key: Right Shift", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE5 },
157-
{ "Key: Right Alt", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE6 },
158-
{ "Key: Right Windows", LOGITECH_G915_ZONE_MODE_MODIFIERS, 0xE7 },
159-
{ "Key: Media Previous", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9E },
160-
{ "Key: Media Play/Pause", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9B },
161-
{ "Key: Media Next", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9D },
162-
{ "Key: Media Mute", LOGITECH_G915_ZONE_DIRECT_MEDIA, 0x9C },
163-
{ "Logo", LOGITECH_G915_ZONE_DIRECT_LOGO, 0x01 },
164-
{ "Lighting", LOGITECH_G915_ZONE_DIRECT_INDICATORS, 0x99 },
165177
{ "Key: G1", LOGITECH_G915_ZONE_MODE_GKEYS, 0x01 },
166178
{ "Key: G2", LOGITECH_G915_ZONE_MODE_GKEYS, 0x02 },
167179
{ "Key: G3", LOGITECH_G915_ZONE_MODE_GKEYS, 0x03 },
168180
{ "Key: G4", LOGITECH_G915_ZONE_MODE_GKEYS, 0x04 },
169181
{ "Key: G5", LOGITECH_G915_ZONE_MODE_GKEYS, 0x05 },
170182
};
171183

172-
RGBController_LogitechG915::RGBController_LogitechG915(LogitechG915Controller* logitech_ptr)
184+
RGBController_LogitechG915::RGBController_LogitechG915(LogitechG915Controller* logitech_ptr, bool tkl)
173185
{
174-
logitech = logitech_ptr;
186+
is_tkl = tkl;
175187

176-
name = "Logitech G915 Keyboard Device";
177-
vendor = "Logitech";
178-
type = DEVICE_TYPE_KEYBOARD;
179-
description = "Logitech G915 Keyboard Device";
180-
serial = logitech->GetSerialString();
188+
if(is_tkl)
189+
{
190+
name = "Logitech G915TKL Keyboard Device";
191+
}
192+
else
193+
{
194+
name = "Logitech G915 Keyboard Device";
195+
}
196+
197+
description = name;
198+
logitech = logitech_ptr;
199+
vendor = "Logitech";
200+
type = DEVICE_TYPE_KEYBOARD;
201+
serial = logitech->GetSerialString();
181202

182203
mode Direct;
183204
Direct.name = "Direct";
@@ -249,22 +270,32 @@ void RGBController_LogitechG915::SetupZones()
249270
/*---------------------------------------------------------*\
250271
| Set up zones |
251272
\*---------------------------------------------------------*/
273+
252274
unsigned int total_led_count = 0;
253275
for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++)
254276
{
255277
zone new_zone;
256278
new_zone.name = zone_names[zone_idx];
257279
new_zone.type = zone_types[zone_idx];
258-
new_zone.leds_min = zone_sizes[zone_idx];
259-
new_zone.leds_max = zone_sizes[zone_idx];
260-
new_zone.leds_count = zone_sizes[zone_idx];
280+
new_zone.leds_count = (is_tkl) ? tkl_led_count : full_led_count;
281+
new_zone.leds_min = new_zone.leds_count;
282+
new_zone.leds_max = new_zone.leds_count;
261283

262284
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
263285
{
264286
new_zone.matrix_map = new matrix_map_type;
265-
new_zone.matrix_map->height = 7;
266-
new_zone.matrix_map->width = 27;
267-
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
287+
if(is_tkl)
288+
{
289+
new_zone.matrix_map->map = (unsigned int *)&matrix_map_tkl;
290+
new_zone.matrix_map->height = 7;
291+
new_zone.matrix_map->width = 20;
292+
}
293+
else
294+
{
295+
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
296+
new_zone.matrix_map->height = 7;
297+
new_zone.matrix_map->width = 27;
298+
}
268299
}
269300
else
270301
{
@@ -273,7 +304,7 @@ void RGBController_LogitechG915::SetupZones()
273304

274305
zones.push_back(new_zone);
275306

276-
total_led_count += zone_sizes[zone_idx];
307+
total_led_count += new_zone.leds_count;
277308
}
278309

279310
for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++)

Controllers/LogitechController/RGBController_LogitechG915.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
class RGBController_LogitechG915 : public RGBController
1515
{
1616
public:
17-
RGBController_LogitechG915(LogitechG915Controller* logitech_ptr);
17+
RGBController_LogitechG915(LogitechG915Controller* logitech_ptr, bool tkl);
1818
~RGBController_LogitechG915();
1919

2020
void SetupZones();
2121

2222
void ResizeZone(int zone, int new_size);
23-
23+
2424
void DeviceUpdateLEDs();
2525
void UpdateZoneLEDs(int zone);
2626
void UpdateSingleLED(int led);
@@ -29,6 +29,8 @@ class RGBController_LogitechG915 : public RGBController
2929
void DeviceUpdateMode();
3030

3131
private:
32+
bool is_tkl;
33+
3234
LogitechG915Controller* logitech;
3335
std::vector<RGBColor> current_colors;
3436
};

0 commit comments

Comments
 (0)