From 8487b5c89d7aaa32a00256a4451be719ede13ddb Mon Sep 17 00:00:00 2001 From: austinleroy Date: Sun, 14 Sep 2025 18:15:55 +0000 Subject: [PATCH] Adding support for Logitech G600 Mouse --- .../LogitechControllerDetect.cpp | 17 +++ .../LogitechG600Controller.cpp | 68 +++++++++++ .../LogitechG600Controller.h | 56 +++++++++ .../RGBController_LogitechG600.cpp | 114 ++++++++++++++++++ .../RGBController_LogitechG600.h | 35 ++++++ 5 files changed, 290 insertions(+) create mode 100644 Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.cpp create mode 100644 Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.h create mode 100644 Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.cpp create mode 100644 Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.h diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index 9b0aee365..0922e8548 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -15,6 +15,7 @@ #include "LogitechG203LController.h" #include "LogitechG213Controller.h" #include "LogitechG560Controller.h" +#include "LogitechG600Controller.h" #include "LogitechG933Controller.h" #include "LogitechG810Controller.h" #include "LogitechGProKeyboardController.h" @@ -27,6 +28,7 @@ #include "RGBController_LogitechG203L.h" #include "RGBController_LogitechG213.h" #include "RGBController_LogitechG560.h" +#include "RGBController_LogitechG600.h" #include "RGBController_LogitechG933.h" #include "RGBController_LogitechG810.h" #include "RGBController_LogitechGProKeyboard.h" @@ -81,6 +83,7 @@ using namespace std::chrono_literals; #define LOGITECH_G502_PROTEUS_SPECTRUM_PID 0xC332 #define LOGITECH_G502_HERO_PID 0xC08B #define LOGITECH_G502_LIGHTSPEED_PID 0xC08D +#define LOGITECH_G600_PID 0xC24A #define LOGITECH_G703_LIGHTSPEED_PID 0xC087 #define LOGITECH_G703_HERO_LIGHTSPEED_PID 0xC090 #define LOGITECH_G900_LIGHTSPEED_PID 0xC081 @@ -577,6 +580,19 @@ void DetectLogitechMouseG403(hid_device_info* info, const std::string& name) addLogitechLightsyncMouse2zone(info, name, 0xFF, 0x0E, 0x3A); } +void DetectLogitechMouseG600(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + LogitechG600Controller* controller = new LogitechG600Controller(dev, info->path, name); + RGBController_LogitechG600* rgb_controller = new RGBController_LogitechG600(controller); + + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectLogitechMouseGPRO(hid_device_info* info, const std::string& name) { addLogitechLightsyncMouse1zone(info, name, 0xFF, 0x0E, 0x3C); @@ -662,6 +678,7 @@ REGISTER_HID_DETECTOR_IPU("Logitech G203 Lightsync", Dete REGISTER_HID_DETECTOR_IPU("Logitech G203 Lightsync", DetectLogitechMouseG203L, LOGITECH_VID, LOGITECH_G203_LIGHTSYNC_PID_2, 1, 0xFF00, 2); REGISTER_HID_DETECTOR_IP ("Logitech G303 Daedalus Apex", DetectLogitechMouseG303, LOGITECH_VID, LOGITECH_G303_PID, 1, 0xFF00); REGISTER_HID_DETECTOR_IP ("Logitech G403 HERO", DetectLogitechMouseG403, LOGITECH_VID, LOGITECH_G403_HERO_PID, 1, 0xFF00); +REGISTER_HID_DETECTOR_IP ("Logitech G600 Gaming Mouse", DetectLogitechMouseG600, LOGITECH_VID, LOGITECH_G600_PID, 1, 0xFF80); REGISTER_HID_DETECTOR_IP ("Logitech G Pro Gaming Mouse", DetectLogitechMouseGPRO, LOGITECH_VID, LOGITECH_G_PRO_PID, 1, 0xFF00); REGISTER_HID_DETECTOR_IP ("Logitech G Pro HERO Gaming Mouse", DetectLogitechMouseGPRO, LOGITECH_VID, LOGITECH_G_PRO_HERO_PID, 1, 0xFF00); /*-------------------------------------------------------------------------------------------------------------------------------------------------*\ diff --git a/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.cpp b/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.cpp new file mode 100644 index 000000000..cc2f19ee7 --- /dev/null +++ b/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.cpp @@ -0,0 +1,68 @@ +/*---------------------------------------------------------*\ +| LogitechG600Controller.cpp | +| | +| Driver for Logitech G600 Gaming Mouse | +| | +| Austin B (austinleroy) 11 Sep 2025 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#include +#include "LogitechG600Controller.h" +#include "StringUtils.h" + +LogitechG600Controller::LogitechG600Controller(hid_device* dev_handle, const char* path, std::string dev_name) +{ + dev = dev_handle; + location = path; + name = dev_name; +} + +LogitechG600Controller::~LogitechG600Controller() +{ + if(dev != nullptr) + { + hid_close(dev); + } +} + +std::string LogitechG600Controller::GetNameString() +{ + return(name); +} + +std::string LogitechG600Controller::GetSerialString() +{ + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + return(""); + } + + return(StringUtils::wstring_to_string(serial_string)); +} + +void LogitechG600Controller::SetMode + ( + unsigned char mode, + unsigned short speed, + RGBColor color + ) +{ + unsigned char usb_buf[8]; + + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0xF1; + usb_buf[0x01] = RGBGetRValue(color); + usb_buf[0x02] = RGBGetGValue(color); + usb_buf[0x03] = RGBGetBValue(color); + usb_buf[0x04] = mode; + usb_buf[0x05] = speed & 0xFF; + + hid_send_feature_report(dev, usb_buf, sizeof(usb_buf)); +} diff --git a/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.h b/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.h new file mode 100644 index 000000000..17612677b --- /dev/null +++ b/Controllers/LogitechController/LogitechG600Controller/LogitechG600Controller.h @@ -0,0 +1,56 @@ +/*---------------------------------------------------------*\ +| LogitechG600Controller.h | +| | +| Driver for Logitech G600 Gaming Mouse | +| | +| Austin B (austinleroy) 11 Sep 2025 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#pragma once + +#include +#include +#include "RGBController.h" + + +enum +{ + LOGITECH_G600_MODE_DIRECT = 0x00, + LOGITECH_G600_MODE_BREATHING = 0x01, + LOGITECH_G600_MODE_CYCLE = 0x02 +}; + +/*---------------------------------------------------------------------------------------------*\ +| Speed is number of seconds for cycle to complete. | +\*---------------------------------------------------------------------------------------------*/ +enum +{ + LOGITECH_G600_SPEED_SLOWEST = 0x0F, /* Slowest speed */ + LOGITECH_G600_SPEED_NORMAL = 0x03, /* Normal speed */ + LOGITECH_G600_SPEED_FASTEST = 0x01, /* Fastest speed */ +}; + +class LogitechG600Controller +{ +public: + LogitechG600Controller(hid_device* dev, const char* path, std::string dev_name); + ~LogitechG600Controller(); + + std::string GetNameString(); + std::string GetSerialString(); + + void SetMode + ( + unsigned char mode, + unsigned short speed, + RGBColor color + ); + +private: + hid_device* dev; + std::string location; + std::string name; +}; \ No newline at end of file diff --git a/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.cpp b/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.cpp new file mode 100644 index 000000000..af39aebad --- /dev/null +++ b/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.cpp @@ -0,0 +1,114 @@ +/*---------------------------------------------------------*\ +| RGBController_LogitechG600.cpp | +| | +| RGBController for Logitech G600 Gaming Mouse | +| | +| Austin B (austinleroy) 11 Sep 2025 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#include "RGBController_LogitechG600.h" + +/**------------------------------------------------------------------*\ + @name Logitech G600 + @category Mouse + @type USB + @save :o: + @direct :white_check_mark: + @effects :white_check_mark: + @detectors DetectLogitechMouseG600 + @comment +\*-------------------------------------------------------------------*/ + +RGBController_LogitechG600::RGBController_LogitechG600(LogitechG600Controller* controller_ptr) +{ + controller = controller_ptr; + + name = controller->GetNameString(); + vendor = "Logitech"; + type = DEVICE_TYPE_MOUSE; + description = "Logitech Mouse Device"; + serial = controller->GetSerialString(); + + mode Direct; + Direct.name = "Direct"; + Direct.value = LOGITECH_G600_MODE_DIRECT; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = LOGITECH_G600_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED; + Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.speed_min = LOGITECH_G600_SPEED_SLOWEST; + Breathing.speed_max = LOGITECH_G600_SPEED_FASTEST; + Breathing.speed = LOGITECH_G600_SPEED_NORMAL; + modes.push_back(Breathing); + + mode Cycle; + Cycle.name = "Spectrum Cycle"; + Cycle.value = LOGITECH_G600_MODE_CYCLE; + Cycle.flags = MODE_FLAG_HAS_SPEED; + Cycle.color_mode = MODE_COLORS_NONE; + Cycle.speed_min = LOGITECH_G600_SPEED_SLOWEST; + Cycle.speed_max = LOGITECH_G600_SPEED_FASTEST; + Cycle.speed = LOGITECH_G600_SPEED_NORMAL; + modes.push_back(Cycle); + + SetupZones(); +} + +RGBController_LogitechG600::~RGBController_LogitechG600() +{ + delete controller; +} + +void RGBController_LogitechG600::SetupZones() +{ + zone side_lights_zone; + side_lights_zone.name = "Side Lights"; + side_lights_zone.type = ZONE_TYPE_SINGLE; + side_lights_zone.leds_min = 1; + side_lights_zone.leds_max = 1; + side_lights_zone.leds_count = 1; + side_lights_zone.matrix_map = NULL; + zones.push_back(side_lights_zone); + + // Set up LED + led g600_led; + g600_led.name = "All"; + leds.push_back(g600_led); + + SetupColors(); +} + +void RGBController_LogitechG600::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | Currently does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechG600::DeviceUpdateLEDs() +{ + controller->SetMode(modes[active_mode].value, modes[active_mode].speed, GetLED(0)); +} + +void RGBController_LogitechG600::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechG600::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechG600::DeviceUpdateMode() +{ + controller->SetMode(modes[active_mode].value, modes[active_mode].speed, GetLED(0)); +} diff --git a/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.h b/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.h new file mode 100644 index 000000000..e753fee82 --- /dev/null +++ b/Controllers/LogitechController/LogitechG600Controller/RGBController_LogitechG600.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------*\ +| RGBController_LogitechG600.h | +| | +| RGBController for Logitech G600 Gaming Mouse | +| | +| Austin B (austinleroy) 11 Sep 2025 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "LogitechG600Controller.h" + +class RGBController_LogitechG600 : public RGBController +{ +public: + RGBController_LogitechG600(LogitechG600Controller* controller_ptr); + ~RGBController_LogitechG600(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void DeviceUpdateMode(); + +private: + LogitechG600Controller* controller; +};