From 9be8ab837133a7a146cbb75adb16fd4056cbcad2 Mon Sep 17 00:00:00 2001 From: TheRogueZeta <6479694-TheRogueZeta@users.noreply.gitlab.com> Date: Wed, 5 Aug 2020 16:30:37 -0700 Subject: [PATCH] Add Logitech G Pro Wireless --- 60-openrgb.rules | 4 + .../LogitechControllerDetect.cpp | 79 +++++++---- .../LogitechGProWirelessController.cpp | 82 ++++++++++++ .../LogitechGProWirelessController.h | 53 ++++++++ OpenRGB.pro | 4 + .../RGBController_LogitechGProWireless.cpp | 123 ++++++++++++++++++ .../RGBController_LogitechGProWireless.h | 32 +++++ 7 files changed, 349 insertions(+), 28 deletions(-) create mode 100644 Controllers/LogitechController/LogitechGProWirelessController.cpp create mode 100644 Controllers/LogitechController/LogitechGProWirelessController.h create mode 100644 RGBController/RGBController_LogitechGProWireless.cpp create mode 100644 RGBController/RGBController_LogitechGProWireless.h diff --git a/60-openrgb.rules b/60-openrgb.rules index bccd5aab..ff4044b3 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -132,12 +132,16 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="0951", ATTR{idProduct}=="16be", TAG+="uacces # # # Keyboards: # # Logitech G512 RGB # +# Logitech G Pro Wireless Gaming Mouse Lightspeed # +# Logitech G Pro Wireless Gaming Mouse (Wired) # #---------------------------------------------------------------# SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c084", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c083", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c08f", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c332", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c33c", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c539", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="c088", TAG+="uaccess" #---------------------------------------------------------------# # MSI Mysticlight # diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index 090b291d..0af7cc31 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -4,34 +4,38 @@ #include "LogitechG403Controller.h" #include "LogitechG502PSController.h" #include "LogitechG810Controller.h" +#include "LogitechGProWirelessController.h" #include "RGBController.h" #include "RGBController_LogitechG203.h" #include "RGBController_LogitechG203L.h" #include "RGBController_LogitechG403.h" #include "RGBController_LogitechG502PS.h" #include "RGBController_LogitechG810.h" +#include "RGBController_LogitechGProWireless.h" #include #include /*-----------------------------------------------------*\ | Logitech vendor ID | \*-----------------------------------------------------*/ -#define LOGITECH_VID 0x046D +#define LOGITECH_VID 0x046D /*-----------------------------------------------------*\ | Keyboard product IDs | \*-----------------------------------------------------*/ -#define LOGITECH_G810_1_PID 0xC337 -#define LOGITECH_G810_2_PID 0xC331 -#define LOGITECH_G512_PID 0xC342 -#define LOGITECH_G512_RGB_PID 0xC33C +#define LOGITECH_G810_1_PID 0xC337 +#define LOGITECH_G810_2_PID 0xC331 +#define LOGITECH_G512_PID 0xC342 +#define LOGITECH_G512_RGB_PID 0xC33C /*-----------------------------------------------------*\ | Mouse product IDs | \*-----------------------------------------------------*/ -#define LOGITECH_G203_PID 0xC084 -#define LOGITECH_G203L_PID 0xC092 -#define LOGITECH_G403_PID 0xC083 -#define LOGITECH_G403H_PID 0xC08F -#define LOGITECH_G502_PS_PID 0xC332 +#define LOGITECH_G203_PID 0xC084 +#define LOGITECH_G203L_PID 0xC092 +#define LOGITECH_G403_PID 0xC083 +#define LOGITECH_G403H_PID 0xC08F +#define LOGITECH_G502_PS_PID 0xC332 +#define LOGITECH_GPRO_WIRELESS_LIGHTSPEED_PID 0xC539 +#define LOGITECH_GPRO_WIRELESS_PID 0xC088 typedef struct { @@ -46,24 +50,26 @@ typedef struct static const logitech_device device_list[] = { - /*-------------------------------------------------------------------------------------------------------------*\ - | Keyboards | - \*-------------------------------------------------------------------------------------------------------------*/ - { LOGITECH_VID, LOGITECH_G810_1_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G810 Orion Spectrum" }, - { LOGITECH_VID, LOGITECH_G810_2_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G810 Orion Spectrum" }, - { LOGITECH_VID, LOGITECH_G512_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G512" }, - { LOGITECH_VID, LOGITECH_G512_RGB_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G512 RGB" }, - /*-------------------------------------------------------------------------------------------------------------*\ - | Mice | - \*-------------------------------------------------------------------------------------------------------------*/ - { LOGITECH_VID, LOGITECH_G203_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Prodigy" }, - { LOGITECH_VID, LOGITECH_G203L_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Lightsync" }, - { LOGITECH_VID, LOGITECH_G403_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G403 Prodigy" }, - { LOGITECH_VID, LOGITECH_G403H_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G403 Hero" }, - { LOGITECH_VID, LOGITECH_G502_PS_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G502 Proteus Spectrum"}, - /*-------------------------------------------------------------------------------------------------------------*\ - | Mousemats | - \*-------------------------------------------------------------------------------------------------------------*/ + /*---------------------------------------------------------------------------------------------------------------------------------------------*\ + | Keyboards | + \*---------------------------------------------------------------------------------------------------------------------------------------------*/ + { LOGITECH_VID, LOGITECH_G810_1_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G810 Orion Spectrum" }, + { LOGITECH_VID, LOGITECH_G810_2_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G810 Orion Spectrum" }, + { LOGITECH_VID, LOGITECH_G512_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G512" }, + { LOGITECH_VID, LOGITECH_G512_RGB_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G512 RGB" }, + /*---------------------------------------------------------------------------------------------------------------------------------------------*\ + | Mice | + \*---------------------------------------------------------------------------------------------------------------------------------------------*/ + { LOGITECH_VID, LOGITECH_G203_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Prodigy" }, + { LOGITECH_VID, LOGITECH_G203L_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Lightsync" }, + { LOGITECH_VID, LOGITECH_G403_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G403 Prodigy" }, + { LOGITECH_VID, LOGITECH_G403H_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G403 Hero" }, + { LOGITECH_VID, LOGITECH_G502_PS_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G502 Proteus Spectrum" }, + { LOGITECH_VID, LOGITECH_GPRO_WIRELESS_LIGHTSPEED_PID, 2, DEVICE_TYPE_MOUSE, "Logitech G Pro Wireless Gaming Mouse" }, + { LOGITECH_VID, LOGITECH_GPRO_WIRELESS_PID, 2, DEVICE_TYPE_MOUSE, "Logitech G Pro Wireless Gaming Mouse (Wired)" }, + /*---------------------------------------------------------------------------------------------------------------------------------------------*\ + | Mousemats | + \*---------------------------------------------------------------------------------------------------------------------------------------------*/ }; /******************************************************************************************\ @@ -204,13 +210,30 @@ void DetectLogitechControllers(std::vector& rgb_controllers) rgb_controller->name = device_list[device_idx].name; rgb_controllers.push_back(rgb_controller); } + break; + case LOGITECH_G502_PS_PID: { LogitechG502PSController* controller = new LogitechG502PSController(dev); + RGBController_LogitechG502PS* rgb_controller = new RGBController_LogitechG502PS(controller); + rgb_controller->name = device_list[device_idx].name; rgb_controllers.push_back(rgb_controller); } + break; + + case LOGITECH_GPRO_WIRELESS_LIGHTSPEED_PID: + case LOGITECH_GPRO_WIRELESS_PID: + { + LogitechGProWirelessController* controller = new LogitechGProWirelessController(dev); + + RGBController_LogitechGProWireless* rgb_controller = new RGBController_LogitechGProWireless(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; } } } diff --git a/Controllers/LogitechController/LogitechGProWirelessController.cpp b/Controllers/LogitechController/LogitechGProWirelessController.cpp new file mode 100644 index 00000000..7e4e306f --- /dev/null +++ b/Controllers/LogitechController/LogitechGProWirelessController.cpp @@ -0,0 +1,82 @@ +/*-----------------------------------------*\ +| LogitechGProWirelessController.cpp | +| | +| Driver for Logitech G Pro Wireless Gaming| +| Mouse lighting controller | +| | +| TheRogueZeta 8/5/2020 | +\*-----------------------------------------*/ + +#include "LogitechGProWirelessController.h" + +#include + +LogitechGProWirelessController::LogitechGProWirelessController(hid_device* dev_handle) +{ + dev = dev_handle; +} + +LogitechGProWirelessController::~LogitechGProWirelessController() +{ + hid_close(dev); +} + +void LogitechGProWirelessController::SendMouseMode + ( + unsigned char mode, + std::uint16_t speed, + unsigned char zone, + unsigned char red, + unsigned char green, + unsigned char blue + // unsigned char brightness + ) +{ + unsigned char usb_buf[20]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(usb_buf, 0x00, sizeof(usb_buf)); + + /*-----------------------------------------------------*\ + | Set up Lighting Control packet | + \*-----------------------------------------------------*/ + usb_buf[0x00] = 0x11; + usb_buf[0x01] = 0x01; + usb_buf[0x02] = 0x07; + usb_buf[0x03] = 0x03; + + usb_buf[0x04] = zone; + usb_buf[0x05] = mode; + + usb_buf[0x06] = red; + usb_buf[0x07] = green; + usb_buf[0x08] = blue; + + speed = 1000 + 4750 * (LOGITECH_G_PRO_WIRELESS_SPEED_FASTEST - speed); + if(mode == LOGITECH_G_PRO_WIRELESS_MODE_STATIC) + { + usb_buf[0x09] = 0x02; + } + if(mode == LOGITECH_G_PRO_WIRELESS_MODE_CYCLE) + { + usb_buf[0x0B] = speed >> 8; + usb_buf[0x0C] = speed & 0xFF; + //usb_buf[0x0D] = brightness; + usb_buf[0x0D] = 0x64; + } + else if(mode == LOGITECH_G_PRO_WIRELESS_MODE_BREATHING) + { + usb_buf[0x09] = speed >> 8; + usb_buf[0x0A] = speed & 0xFF; + //usb_buf[0x0C] = brightness; + usb_buf[0x0C] = 0x64; + } + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, usb_buf, 20); + hid_read(dev, usb_buf, 20); +} diff --git a/Controllers/LogitechController/LogitechGProWirelessController.h b/Controllers/LogitechController/LogitechGProWirelessController.h new file mode 100644 index 00000000..d549f5ce --- /dev/null +++ b/Controllers/LogitechController/LogitechGProWirelessController.h @@ -0,0 +1,53 @@ +/*-----------------------------------------*\ +| LogitechGProWirelessController.h | +| | +| Definitions and types for Logitech G Pro | +| Wireless Gaming Mouse lighting controller| +| | +| TheRogueZeta 8/5/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + LOGITECH_G_PRO_WIRELESS_MODE_OFF = 0x00, + LOGITECH_G_PRO_WIRELESS_MODE_STATIC = 0x01, + LOGITECH_G_PRO_WIRELESS_MODE_CYCLE = 0x02, + LOGITECH_G_PRO_WIRELESS_MODE_BREATHING = 0x03, +}; + +enum +{ + LOGITECH_G_PRO_WIRELESS_SPEED_SLOWEST = 0x00, /* Slowest speed */ + LOGITECH_G_PRO_WIRELESS_SPEED_SLOW = 0x01, /* Slow speed */ + LOGITECH_G_PRO_WIRELESS_SPEED_NORMAL = 0x02, /* Normal speed */ + LOGITECH_G_PRO_WIRELESS_SPEED_FAST = 0x03, /* Fast speed */ + LOGITECH_G_PRO_WIRELESS_SPEED_FASTEST = 0x04, /* Fastest speed */ +}; + +class LogitechGProWirelessController +{ +public: + LogitechGProWirelessController(hid_device* dev_handle); + ~LogitechGProWirelessController(); + + void SendMouseMode + ( + unsigned char mode, + unsigned short speed, + unsigned char zone, + unsigned char red, + unsigned char green, + unsigned char blue +// unsigned char brightness + ); + +private: + hid_device* dev; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 48882fe7..309af90d 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -144,6 +144,7 @@ HEADERS += \ Controllers/LogitechController/LogitechG403Controller.h \ Controllers/LogitechController/LogitechG502PSController.h \ Controllers/LogitechController/LogitechG810Controller.h \ + Controllers/LogitechController/LogitechGProWirelessController.h \ Controllers/MSI3ZoneController/MSI3ZoneController.h \ Controllers/MSIGPUController/MSIGPUController.h \ Controllers/MSIMysticLightController/MSIMysticLightController.h \ @@ -196,6 +197,7 @@ HEADERS += \ RGBController/RGBController_LogitechG403.h \ RGBController/RGBController_LogitechG502PS.h \ RGBController/RGBController_LogitechG810.h \ + RGBController/RGBController_LogitechGProWireless.h \ RGBController/RGBController_MSI3Zone.h \ RGBController/RGBController_MSIGPU.h \ RGBController/RGBController_MSIGPU.h \ @@ -299,6 +301,7 @@ SOURCES += \ Controllers/LogitechController/LogitechG403Controller.cpp \ Controllers/LogitechController/LogitechG502PSController.cpp \ Controllers/LogitechController/LogitechG810Controller.cpp \ + Controllers/LogitechController/LogitechGProWirelessController.cpp \ Controllers/MSI3ZoneController/MSI3ZoneController.cpp \ Controllers/MSI3ZoneController/MSI3ZoneControllerDetect.cpp \ Controllers/MSIGPUController/MSIGPUController.cpp \ @@ -371,6 +374,7 @@ SOURCES += \ RGBController/RGBController_LogitechG403.cpp \ RGBController/RGBController_LogitechG502PS.cpp \ RGBController/RGBController_LogitechG810.cpp \ + RGBController/RGBController_LogitechGProWireless.cpp \ RGBController/RGBController_MSI3Zone.cpp \ RGBController/RGBController_MSIGPU.cpp \ RGBController/RGBController_MSIMysticLight.cpp \ diff --git a/RGBController/RGBController_LogitechGProWireless.cpp b/RGBController/RGBController_LogitechGProWireless.cpp new file mode 100644 index 00000000..a01b06c1 --- /dev/null +++ b/RGBController/RGBController_LogitechGProWireless.cpp @@ -0,0 +1,123 @@ +/*-----------------------------------------*\ +| RGBController_LogitechGProWireless.cpp | +| | +| Generic RGB Interface for | +| Logitech G Pro Wireless Gaming Mouse | +| | +| TheRogueZeta 8/5/2020 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechGProWireless.h" + +RGBController_LogitechGProWireless::RGBController_LogitechGProWireless(LogitechGProWirelessController* logitech_ptr) +{ + logitech = logitech_ptr; + + name = "Logitech Mouse Device"; + type = DEVICE_TYPE_MOUSE; + description = "Logitech Mouse Device"; + + mode Off; + Off.name = "Off"; + Off.value = LOGITECH_G_PRO_WIRELESS_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Static; + Static.name = "Static"; + Static.value = LOGITECH_G_PRO_WIRELESS_MODE_STATIC; + Static.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Static.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Static); + + mode Cycle; + Cycle.name = "Cycle"; + Cycle.value = LOGITECH_G_PRO_WIRELESS_MODE_CYCLE; + Cycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; + Cycle.color_mode = MODE_COLORS_NONE; + Cycle.speed_min = LOGITECH_G_PRO_WIRELESS_SPEED_SLOWEST; + Cycle.speed_max = LOGITECH_G_PRO_WIRELESS_SPEED_FASTEST; + Cycle.speed = LOGITECH_G_PRO_WIRELESS_SPEED_NORMAL; + modes.push_back(Cycle); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = LOGITECH_G_PRO_WIRELESS_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; + Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.speed_min = LOGITECH_G_PRO_WIRELESS_SPEED_SLOWEST; + Breathing.speed_max = LOGITECH_G_PRO_WIRELESS_SPEED_FASTEST; + Breathing.speed = LOGITECH_G_PRO_WIRELESS_SPEED_NORMAL; + modes.push_back(Breathing); + + SetupZones(); +} + +void RGBController_LogitechGProWireless::SetupZones() +{ + zone GProWireless_primary_zone; + GProWireless_primary_zone.name = "Primary Zone"; + GProWireless_primary_zone.type = ZONE_TYPE_SINGLE; + GProWireless_primary_zone.leds_min = 1; + GProWireless_primary_zone.leds_max = 1; + GProWireless_primary_zone.leds_count = 1; + GProWireless_primary_zone.matrix_map = NULL; + zones.push_back(GProWireless_primary_zone); + + led GProWireless_primary_led; + GProWireless_primary_led.name = "Primary LED"; + leds.push_back(GProWireless_primary_led); + + zone GProWireless_logo_zone; + GProWireless_logo_zone.name = "Logo Zone"; + GProWireless_logo_zone.type = ZONE_TYPE_SINGLE; + GProWireless_logo_zone.leds_min = 1; + GProWireless_logo_zone.leds_max = 1; + GProWireless_logo_zone.leds_count = 1; + GProWireless_logo_zone.matrix_map = NULL; + zones.push_back(GProWireless_logo_zone); + + led GProWireless_logo_led; + GProWireless_logo_led.name = "Logo LED"; + leds.push_back(GProWireless_logo_led); + + SetupColors(); +} + +void RGBController_LogitechGProWireless::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechGProWireless::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); + UpdateZoneLEDs(1); +} + +void RGBController_LogitechGProWireless::UpdateZoneLEDs(int zone) +{ + unsigned char red = RGBGetRValue(colors[zone]); + unsigned char grn = RGBGetGValue(colors[zone]); + unsigned char blu = RGBGetBValue(colors[zone]); + + logitech->SendMouseMode(modes[active_mode].value, modes[active_mode].speed, zone, red, grn, blu); +} + +void RGBController_LogitechGProWireless::UpdateSingleLED(int led) +{ + UpdateZoneLEDs(led); +} + +void RGBController_LogitechGProWireless::SetCustomMode() +{ + +} + +void RGBController_LogitechGProWireless::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/RGBController/RGBController_LogitechGProWireless.h b/RGBController/RGBController_LogitechGProWireless.h new file mode 100644 index 00000000..6ac6e2f6 --- /dev/null +++ b/RGBController/RGBController_LogitechGProWireless.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_LogitechGProWireless.h | +| | +| Generic RGB Interface for | +| Logitech G Pro Wireless Gaming Mouse | +| | +| TheRogueZeta 8/5/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "LogitechGProWirelessController.h" + +class RGBController_LogitechGProWireless : public RGBController +{ +public: + RGBController_LogitechGProWireless(LogitechGProWirelessController* logitech_ptr); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + LogitechGProWirelessController* logitech; +};