diff --git a/60-openrgb.rules b/60-openrgb.rules index a6d45a1c..cc1a77c3 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -339,6 +339,9 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="0cf2", ATTR{idProduct}=="7750", TAG+="uacces # Speakers: # # Logitech G560 # # # +# Joysticks: # +# Logitech Rhino X56 Hotas (Throttle and Stick) # +# # #---------------------------------------------------------------# SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c336", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c342", TAG+="uaccess" @@ -376,6 +379,9 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c53a", TAG+="uacces SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0a78", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="0738", ATTR{idProduct}=="2221", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="0738", ATTR{idProduct}=="A221", TAG+="uaccess" + #---------------------------------------------------------------# # Metadot Das Keyboard 4Q + 5Q # #---------------------------------------------------------------# diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index da184365..4151ef6b 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -9,6 +9,7 @@ #include "LogitechG815Controller.h" #include "LogitechGLightsyncController.h" #include "LogitechLightspeedController.h" +#include "LogitechX56Controller.h" #include "RGBController.h" #include "RGBController_LogitechG203L.h" #include "RGBController_LogitechG213.h" @@ -20,6 +21,7 @@ #include "RGBController_LogitechGLightsync1zone.h" #include "RGBController_LogitechLightspeed.h" #include "RGBController_LogitechGPowerPlay.h" +#include "RGBController_LogitechX56.h" #include #include @@ -90,6 +92,13 @@ #define LOGITECH_G903_LIGHTSPEED_VIRTUAL_PID 0x4067 #define LOGITECH_G_PRO_WIRELESS_VIRTUAL_PID 0x4079 +/*-----------------------------------------------------*\ +| Joystick product IDs | +\*-----------------------------------------------------*/ +#define LOGITECH_X56_VID 0x0738 +#define LOGITECH_X56_JOYSTICK_PID 0x2221 +#define LOGITECH_X56_THROTTLE_PID 0xA221 + /*-----------------------------------------------------*\ | Logitech Keyboards | \*-----------------------------------------------------*/ @@ -470,6 +479,22 @@ void DetectLogitechG560(hid_device_info* info, const std::string& name) } } +void DetectLogitechX56(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + /*---------------------------------------------*\ + | Add X56 Devices | + \*---------------------------------------------*/ + LogitechX56Controller* controller = new LogitechX56Controller(dev, info->path); + RGBController_LogitechX56* rgb_controller = new RGBController_LogitechX56(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + /*-------------------------------------------------------------------------------------------------------------------------------------------------*\ | Keyboards | \*-------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -499,6 +524,11 @@ REGISTER_HID_DETECTOR_IP ("Logitech G Pro (HERO) Gaming Mouse", Dete | Speakers | \*-------------------------------------------------------------------------------------------------------------------------------------------------*/ REGISTER_HID_DETECTOR_IPU("Logitech G560 Lightsync Speaker", DetectLogitechG560, LOGITECH_VID, LOGITECH_G560_PID, 2, 0xFF43, 514); +/*-------------------------------------------------------------------------------------------------------------------------------------------------*\ +| Joysticks | +\*-------------------------------------------------------------------------------------------------------------------------------------------------*/ +REGISTER_HID_DETECTOR_IP("Logitech X56 Rhino Hotas Joystick", DetectLogitechX56, LOGITECH_X56_VID, LOGITECH_X56_JOYSTICK_PID, 2, 0xFF00); +REGISTER_HID_DETECTOR_IP("Logitech X56 Rhino Hotas Throttle", DetectLogitechX56, LOGITECH_X56_VID, LOGITECH_X56_THROTTLE_PID, 2, 0xFF00); /*---------------------------------------------------------------------------------------------------------*\ | Windows and MacOS Lightspeed Detection | diff --git a/Controllers/LogitechController/LogitechX56Controller.cpp b/Controllers/LogitechController/LogitechX56Controller.cpp new file mode 100644 index 00000000..6f4453b5 --- /dev/null +++ b/Controllers/LogitechController/LogitechX56Controller.cpp @@ -0,0 +1,83 @@ +/*-----------------------------------------*\ +| LogitechX56Controller.cpp | +| | +| Generic RGB Interface Logitech X56 | +| Class | +| | +| Edbgon 11/06/2021 | +\*-----------------------------------------*/ + +#include "LogitechX56Controller.h" +#include + +LogitechX56Controller::LogitechX56Controller(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +LogitechX56Controller::~LogitechX56Controller() +{ + hid_close(dev); +} + +std::string LogitechX56Controller::GetDeviceLocation() +{ + return("HID: " + location); +} + +char* LogitechX56Controller::GetDeviceName() +{ + return device_name; +} + +std::string LogitechX56Controller::GetSerialString() +{ + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + return(""); + } + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +void LogitechX56Controller::SetColor(RGBColor color) +{ + unsigned char buf[64]; + unsigned char cbuf[64]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + memset(cbuf, 0x00, sizeof(cbuf)); + + /*-----------------------------------------------------*\ + | Set up init packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x09; + buf[0x02] = 0x02; + buf[0x03] = 0x64; + + /*-----------------------------------------------------*\ + | Set up color packet | + \*-----------------------------------------------------*/ + cbuf[0x00] = 0x09; + cbuf[0x02] = 0x03; + cbuf[0x03] = RGBGetRValue(color); + cbuf[0x04] = RGBGetGValue(color); + cbuf[0x05] = RGBGetBValue(color); + + /*-----------------------------------------------------*\ + | Send packets | + \*-----------------------------------------------------*/ + hid_send_feature_report(dev, buf, 64); + hid_send_feature_report(dev, cbuf, 64); + +} diff --git a/Controllers/LogitechController/LogitechX56Controller.h b/Controllers/LogitechController/LogitechX56Controller.h new file mode 100644 index 00000000..9a42e12a --- /dev/null +++ b/Controllers/LogitechController/LogitechX56Controller.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| LogitechX56Controller.h | +| | +| Generic RGB Interface Logitech X56 | +| Class | +| | +| Edbgon 11/06/2021 | +\*-----------------------------------------*/ + +#include "RGBController.h" +#include +#include + +#pragma once + +class LogitechX56Controller +{ +public: + LogitechX56Controller(hid_device* dev_handle, const char* path); + + ~LogitechX56Controller(); + + std::string GetDeviceLocation(); + char* GetDeviceName(); + std::string GetSerialString(); + + void SetColor(RGBColor colors); + +private: + char device_name[32]; + hid_device* dev; + std::string location; +}; diff --git a/Controllers/LogitechController/RGBController_LogitechX56.cpp b/Controllers/LogitechController/RGBController_LogitechX56.cpp new file mode 100644 index 00000000..3c41beba --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechX56.cpp @@ -0,0 +1,94 @@ +/*-----------------------------------------*\ +| RGBController_LogitechX56.cpp | +| | +| Generic RGB Interface Logitech X56 | +| Class | +| | +| Edbgon 11/06/2021 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechX56.h" + +RGBController_LogitechX56::RGBController_LogitechX56(LogitechX56Controller* controller_ptr) +{ + controller = controller_ptr; + + name = controller->GetDeviceName(); + vendor = "Logitech"; + type = DEVICE_TYPE_GAMEPAD; + description = "Logitech X56 Device"; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + + mode Direct; + Direct.name = "Direct"; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); +} + +RGBController_LogitechX56::~RGBController_LogitechX56() +{ + delete controller; +} + +void RGBController_LogitechX56::SetupZones() +{ + /*---------------------------------------------------------*\ + | Each device has only one zone and LED | + \*---------------------------------------------------------*/ + zone x56_zone; + x56_zone.name = "X56"; + x56_zone.type = ZONE_TYPE_SINGLE; + x56_zone.leds_min = 1; + x56_zone.leds_max = 1; + x56_zone.leds_count = 1; + x56_zone.matrix_map = NULL; + zones.push_back(x56_zone); + + led x56_led; + x56_led.name = "X56"; + leds.push_back(x56_led); + + SetupColors(); +} + +void RGBController_LogitechX56::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechX56::DeviceUpdateLEDs() +{ + controller->SetColor(colors[0]); +} + +void RGBController_LogitechX56::UpdateZoneLEDs(int /*zone*/) +{ + /*---------------------------------------------------------*\ + | Packet expects both LEDs | + \*---------------------------------------------------------*/ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechX56::UpdateSingleLED(int /*led*/) +{ + /*---------------------------------------------------------*\ + | Packet expects both LEDs | + \*---------------------------------------------------------*/ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechX56::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_LogitechX56::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/Controllers/LogitechController/RGBController_LogitechX56.h b/Controllers/LogitechController/RGBController_LogitechX56.h new file mode 100644 index 00000000..74eaab91 --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechX56.h @@ -0,0 +1,34 @@ +/*-----------------------------------------*\ +| RGBController_LogitechX56.h | +| | +| Generic RGB Interface Logitech X56 | +| Class | +| | +| Edbgon 11/06/2021 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "LogitechX56Controller.h" + +class RGBController_LogitechX56 : public RGBController +{ +public: + RGBController_LogitechX56(LogitechX56Controller* controller_ptr); + ~RGBController_LogitechX56(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + LogitechX56Controller* controller; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index be626c78..cbacfbf1 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -294,6 +294,7 @@ HEADERS += Controllers/LogitechController/LogitechG815Controller.h \ Controllers/LogitechController/LogitechGLightsyncController.h \ Controllers/LogitechController/LogitechLightspeedController.h \ + Controllers/LogitechController/LogitechX56Controller.h \ Controllers/LogitechController/RGBController_LogitechG203L.h \ Controllers/LogitechController/RGBController_LogitechG213.h \ Controllers/LogitechController/RGBController_LogitechG560.h \ @@ -304,6 +305,7 @@ HEADERS += Controllers/LogitechController/RGBController_LogitechGLightsync1zone.h \ Controllers/LogitechController/RGBController_LogitechGPowerPlay.h \ Controllers/LogitechController/RGBController_LogitechLightspeed.h \ + Controllers/LogitechController/RGBController_LogitechX56.h \ Controllers/MSI3ZoneController/MSI3ZoneController.h \ Controllers/MSI3ZoneController/RGBController_MSI3Zone.h \ Controllers/MSIGPUController/MSIGPUController.h \ @@ -615,6 +617,7 @@ SOURCES += Controllers/LogitechController/LogitechG815Controller.cpp \ Controllers/LogitechController/LogitechGLightsyncController.cpp \ Controllers/LogitechController/LogitechLightspeedController.cpp \ + Controllers/LogitechController/LogitechX56Controller.cpp \ Controllers/LogitechController/RGBController_LogitechG203L.cpp \ Controllers/LogitechController/RGBController_LogitechG213.cpp \ Controllers/LogitechController/RGBController_LogitechG560.cpp \ @@ -625,6 +628,7 @@ SOURCES += Controllers/LogitechController/RGBController_LogitechGLightsync1zone.cpp \ Controllers/LogitechController/RGBController_LogitechGPowerPlay.cpp \ Controllers/LogitechController/RGBController_LogitechLightspeed.cpp \ + Controllers/LogitechController/RGBController_LogitechX56.cpp \ Controllers/MSI3ZoneController/MSI3ZoneController.cpp \ Controllers/MSI3ZoneController/MSI3ZoneControllerDetect.cpp \ Controllers/MSI3ZoneController/RGBController_MSI3Zone.cpp \