Skip to content

Commit 8736f1b

Browse files
edbgonCalcProgrammer1
authored andcommitted
Initial support for Logitech X56 Rhino Hotas
Commit amended for code style by Adam Honse <[email protected]>
1 parent 18939e6 commit 8736f1b

File tree

7 files changed

+284
-0
lines changed

7 files changed

+284
-0
lines changed

60-openrgb.rules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,9 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="0cf2", ATTR{idProduct}=="7750", TAG+="uacces
339339
# Speakers: #
340340
# Logitech G560 #
341341
# #
342+
# Joysticks: #
343+
# Logitech Rhino X56 Hotas (Throttle and Stick) #
344+
# #
342345
#---------------------------------------------------------------#
343346
SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c336", TAG+="uaccess"
344347
SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c342", TAG+="uaccess"
@@ -376,6 +379,9 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c53a", TAG+="uacces
376379

377380
SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0a78", TAG+="uaccess"
378381

382+
SUBSYSTEMS=="usb", ATTR{idVendor}=="0738", ATTR{idProduct}=="2221", TAG+="uaccess"
383+
SUBSYSTEMS=="usb", ATTR{idVendor}=="0738", ATTR{idProduct}=="A221", TAG+="uaccess"
384+
379385
#---------------------------------------------------------------#
380386
# Metadot Das Keyboard 4Q + 5Q #
381387
#---------------------------------------------------------------#

Controllers/LogitechController/LogitechControllerDetect.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "LogitechG815Controller.h"
1010
#include "LogitechGLightsyncController.h"
1111
#include "LogitechLightspeedController.h"
12+
#include "LogitechX56Controller.h"
1213
#include "RGBController.h"
1314
#include "RGBController_LogitechG203L.h"
1415
#include "RGBController_LogitechG213.h"
@@ -20,6 +21,7 @@
2021
#include "RGBController_LogitechGLightsync1zone.h"
2122
#include "RGBController_LogitechLightspeed.h"
2223
#include "RGBController_LogitechGPowerPlay.h"
24+
#include "RGBController_LogitechX56.h"
2325
#include <vector>
2426
#include <hidapi/hidapi.h>
2527

@@ -90,6 +92,13 @@
9092
#define LOGITECH_G903_LIGHTSPEED_VIRTUAL_PID 0x4067
9193
#define LOGITECH_G_PRO_WIRELESS_VIRTUAL_PID 0x4079
9294

95+
/*-----------------------------------------------------*\
96+
| Joystick product IDs |
97+
\*-----------------------------------------------------*/
98+
#define LOGITECH_X56_VID 0x0738
99+
#define LOGITECH_X56_JOYSTICK_PID 0x2221
100+
#define LOGITECH_X56_THROTTLE_PID 0xA221
101+
93102
/*-----------------------------------------------------*\
94103
| Logitech Keyboards |
95104
\*-----------------------------------------------------*/
@@ -470,6 +479,22 @@ void DetectLogitechG560(hid_device_info* info, const std::string& name)
470479
}
471480
}
472481

482+
void DetectLogitechX56(hid_device_info* info, const std::string& name)
483+
{
484+
hid_device* dev = hid_open_path(info->path);
485+
486+
if(dev)
487+
{
488+
/*---------------------------------------------*\
489+
| Add X56 Devices |
490+
\*---------------------------------------------*/
491+
LogitechX56Controller* controller = new LogitechX56Controller(dev, info->path);
492+
RGBController_LogitechX56* rgb_controller = new RGBController_LogitechX56(controller);
493+
rgb_controller->name = name;
494+
ResourceManager::get()->RegisterRGBController(rgb_controller);
495+
}
496+
}
497+
473498
/*-------------------------------------------------------------------------------------------------------------------------------------------------*\
474499
| Keyboards |
475500
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/
@@ -499,6 +524,11 @@ REGISTER_HID_DETECTOR_IP ("Logitech G Pro (HERO) Gaming Mouse", Dete
499524
| Speakers |
500525
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/
501526
REGISTER_HID_DETECTOR_IPU("Logitech G560 Lightsync Speaker", DetectLogitechG560, LOGITECH_VID, LOGITECH_G560_PID, 2, 0xFF43, 514);
527+
/*-------------------------------------------------------------------------------------------------------------------------------------------------*\
528+
| Joysticks |
529+
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/
530+
REGISTER_HID_DETECTOR_IP("Logitech X56 Rhino Hotas Joystick", DetectLogitechX56, LOGITECH_X56_VID, LOGITECH_X56_JOYSTICK_PID, 2, 0xFF00);
531+
REGISTER_HID_DETECTOR_IP("Logitech X56 Rhino Hotas Throttle", DetectLogitechX56, LOGITECH_X56_VID, LOGITECH_X56_THROTTLE_PID, 2, 0xFF00);
502532

503533
/*---------------------------------------------------------------------------------------------------------*\
504534
| Windows and MacOS Lightspeed Detection |
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*-----------------------------------------*\
2+
| LogitechX56Controller.cpp |
3+
| |
4+
| Generic RGB Interface Logitech X56 |
5+
| Class |
6+
| |
7+
| Edbgon 11/06/2021 |
8+
\*-----------------------------------------*/
9+
10+
#include "LogitechX56Controller.h"
11+
#include <cstring>
12+
13+
LogitechX56Controller::LogitechX56Controller(hid_device* dev_handle, const char* path)
14+
{
15+
dev = dev_handle;
16+
location = path;
17+
}
18+
19+
LogitechX56Controller::~LogitechX56Controller()
20+
{
21+
hid_close(dev);
22+
}
23+
24+
std::string LogitechX56Controller::GetDeviceLocation()
25+
{
26+
return("HID: " + location);
27+
}
28+
29+
char* LogitechX56Controller::GetDeviceName()
30+
{
31+
return device_name;
32+
}
33+
34+
std::string LogitechX56Controller::GetSerialString()
35+
{
36+
wchar_t serial_string[128];
37+
int ret = hid_get_serial_number_string(dev, serial_string, 128);
38+
39+
if(ret != 0)
40+
{
41+
return("");
42+
}
43+
44+
std::wstring return_wstring = serial_string;
45+
std::string return_string(return_wstring.begin(), return_wstring.end());
46+
47+
return(return_string);
48+
}
49+
50+
void LogitechX56Controller::SetColor(RGBColor color)
51+
{
52+
unsigned char buf[64];
53+
unsigned char cbuf[64];
54+
55+
/*-----------------------------------------------------*\
56+
| Zero out buffer |
57+
\*-----------------------------------------------------*/
58+
memset(buf, 0x00, sizeof(buf));
59+
memset(cbuf, 0x00, sizeof(cbuf));
60+
61+
/*-----------------------------------------------------*\
62+
| Set up init packet |
63+
\*-----------------------------------------------------*/
64+
buf[0x00] = 0x09;
65+
buf[0x02] = 0x02;
66+
buf[0x03] = 0x64;
67+
68+
/*-----------------------------------------------------*\
69+
| Set up color packet |
70+
\*-----------------------------------------------------*/
71+
cbuf[0x00] = 0x09;
72+
cbuf[0x02] = 0x03;
73+
cbuf[0x03] = RGBGetRValue(color);
74+
cbuf[0x04] = RGBGetGValue(color);
75+
cbuf[0x05] = RGBGetBValue(color);
76+
77+
/*-----------------------------------------------------*\
78+
| Send packets |
79+
\*-----------------------------------------------------*/
80+
hid_send_feature_report(dev, buf, 64);
81+
hid_send_feature_report(dev, cbuf, 64);
82+
83+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*-----------------------------------------*\
2+
| LogitechX56Controller.h |
3+
| |
4+
| Generic RGB Interface Logitech X56 |
5+
| Class |
6+
| |
7+
| Edbgon 11/06/2021 |
8+
\*-----------------------------------------*/
9+
10+
#include "RGBController.h"
11+
#include <string>
12+
#include <hidapi/hidapi.h>
13+
14+
#pragma once
15+
16+
class LogitechX56Controller
17+
{
18+
public:
19+
LogitechX56Controller(hid_device* dev_handle, const char* path);
20+
21+
~LogitechX56Controller();
22+
23+
std::string GetDeviceLocation();
24+
char* GetDeviceName();
25+
std::string GetSerialString();
26+
27+
void SetColor(RGBColor colors);
28+
29+
private:
30+
char device_name[32];
31+
hid_device* dev;
32+
std::string location;
33+
};
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*-----------------------------------------*\
2+
| RGBController_LogitechX56.cpp |
3+
| |
4+
| Generic RGB Interface Logitech X56 |
5+
| Class |
6+
| |
7+
| Edbgon 11/06/2021 |
8+
\*-----------------------------------------*/
9+
10+
#include "RGBController_LogitechX56.h"
11+
12+
RGBController_LogitechX56::RGBController_LogitechX56(LogitechX56Controller* controller_ptr)
13+
{
14+
controller = controller_ptr;
15+
16+
name = controller->GetDeviceName();
17+
vendor = "Logitech";
18+
type = DEVICE_TYPE_GAMEPAD;
19+
description = "Logitech X56 Device";
20+
location = controller->GetDeviceLocation();
21+
serial = controller->GetSerialString();
22+
23+
mode Direct;
24+
Direct.name = "Direct";
25+
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
26+
Direct.color_mode = MODE_COLORS_PER_LED;
27+
modes.push_back(Direct);
28+
29+
SetupZones();
30+
}
31+
32+
RGBController_LogitechX56::~RGBController_LogitechX56()
33+
{
34+
delete controller;
35+
}
36+
37+
void RGBController_LogitechX56::SetupZones()
38+
{
39+
/*---------------------------------------------------------*\
40+
| Each device has only one zone and LED |
41+
\*---------------------------------------------------------*/
42+
zone x56_zone;
43+
x56_zone.name = "X56";
44+
x56_zone.type = ZONE_TYPE_SINGLE;
45+
x56_zone.leds_min = 1;
46+
x56_zone.leds_max = 1;
47+
x56_zone.leds_count = 1;
48+
x56_zone.matrix_map = NULL;
49+
zones.push_back(x56_zone);
50+
51+
led x56_led;
52+
x56_led.name = "X56";
53+
leds.push_back(x56_led);
54+
55+
SetupColors();
56+
}
57+
58+
void RGBController_LogitechX56::ResizeZone(int /*zone*/, int /*new_size*/)
59+
{
60+
/*---------------------------------------------------------*\
61+
| This device does not support resizing zones |
62+
\*---------------------------------------------------------*/
63+
}
64+
65+
void RGBController_LogitechX56::DeviceUpdateLEDs()
66+
{
67+
controller->SetColor(colors[0]);
68+
}
69+
70+
void RGBController_LogitechX56::UpdateZoneLEDs(int /*zone*/)
71+
{
72+
/*---------------------------------------------------------*\
73+
| Packet expects both LEDs |
74+
\*---------------------------------------------------------*/
75+
DeviceUpdateLEDs();
76+
}
77+
78+
void RGBController_LogitechX56::UpdateSingleLED(int /*led*/)
79+
{
80+
/*---------------------------------------------------------*\
81+
| Packet expects both LEDs |
82+
\*---------------------------------------------------------*/
83+
DeviceUpdateLEDs();
84+
}
85+
86+
void RGBController_LogitechX56::SetCustomMode()
87+
{
88+
active_mode = 0;
89+
}
90+
91+
void RGBController_LogitechX56::DeviceUpdateMode()
92+
{
93+
DeviceUpdateLEDs();
94+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*-----------------------------------------*\
2+
| RGBController_LogitechX56.h |
3+
| |
4+
| Generic RGB Interface Logitech X56 |
5+
| Class |
6+
| |
7+
| Edbgon 11/06/2021 |
8+
\*-----------------------------------------*/
9+
10+
#pragma once
11+
12+
#include "RGBController.h"
13+
#include "LogitechX56Controller.h"
14+
15+
class RGBController_LogitechX56 : public RGBController
16+
{
17+
public:
18+
RGBController_LogitechX56(LogitechX56Controller* controller_ptr);
19+
~RGBController_LogitechX56();
20+
21+
void SetupZones();
22+
23+
void ResizeZone(int zone, int new_size);
24+
25+
void DeviceUpdateLEDs();
26+
void UpdateZoneLEDs(int zone);
27+
void UpdateSingleLED(int led);
28+
29+
void SetCustomMode();
30+
void DeviceUpdateMode();
31+
32+
private:
33+
LogitechX56Controller* controller;
34+
};

OpenRGB.pro

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ HEADERS +=
294294
Controllers/LogitechController/LogitechG815Controller.h \
295295
Controllers/LogitechController/LogitechGLightsyncController.h \
296296
Controllers/LogitechController/LogitechLightspeedController.h \
297+
Controllers/LogitechController/LogitechX56Controller.h \
297298
Controllers/LogitechController/RGBController_LogitechG203L.h \
298299
Controllers/LogitechController/RGBController_LogitechG213.h \
299300
Controllers/LogitechController/RGBController_LogitechG560.h \
@@ -304,6 +305,7 @@ HEADERS +=
304305
Controllers/LogitechController/RGBController_LogitechGLightsync1zone.h \
305306
Controllers/LogitechController/RGBController_LogitechGPowerPlay.h \
306307
Controllers/LogitechController/RGBController_LogitechLightspeed.h \
308+
Controllers/LogitechController/RGBController_LogitechX56.h \
307309
Controllers/MSI3ZoneController/MSI3ZoneController.h \
308310
Controllers/MSI3ZoneController/RGBController_MSI3Zone.h \
309311
Controllers/MSIGPUController/MSIGPUController.h \
@@ -615,6 +617,7 @@ SOURCES +=
615617
Controllers/LogitechController/LogitechG815Controller.cpp \
616618
Controllers/LogitechController/LogitechGLightsyncController.cpp \
617619
Controllers/LogitechController/LogitechLightspeedController.cpp \
620+
Controllers/LogitechController/LogitechX56Controller.cpp \
618621
Controllers/LogitechController/RGBController_LogitechG203L.cpp \
619622
Controllers/LogitechController/RGBController_LogitechG213.cpp \
620623
Controllers/LogitechController/RGBController_LogitechG560.cpp \
@@ -625,6 +628,7 @@ SOURCES +=
625628
Controllers/LogitechController/RGBController_LogitechGLightsync1zone.cpp \
626629
Controllers/LogitechController/RGBController_LogitechGPowerPlay.cpp \
627630
Controllers/LogitechController/RGBController_LogitechLightspeed.cpp \
631+
Controllers/LogitechController/RGBController_LogitechX56.cpp \
628632
Controllers/MSI3ZoneController/MSI3ZoneController.cpp \
629633
Controllers/MSI3ZoneController/MSI3ZoneControllerDetect.cpp \
630634
Controllers/MSI3ZoneController/RGBController_MSI3Zone.cpp \

0 commit comments

Comments
 (0)