From e4e2f8d73ede51440c67e8304fd077eab834280a Mon Sep 17 00:00:00 2001 From: TheRogueZeta <6479694-TheRogueZeta@users.noreply.gitlab.com> Date: Mon, 15 Feb 2021 14:37:41 -0800 Subject: [PATCH] Add Logitch G303 based on G403 --- .../LogitechControllerDetect.cpp | 24 +++- .../LogitechG303Controller.cpp | 81 +++++++++++ .../LogitechG303Controller.h | 57 ++++++++ .../RGBController_LogitechG303.cpp | 129 ++++++++++++++++++ .../RGBController_LogitechG303.h | 33 +++++ OpenRGB.pro | 12 +- 6 files changed, 328 insertions(+), 8 deletions(-) create mode 100644 Controllers/LogitechController/LogitechG303Controller.cpp create mode 100644 Controllers/LogitechController/LogitechG303Controller.h create mode 100644 Controllers/LogitechController/RGBController_LogitechG303.cpp create mode 100644 Controllers/LogitechController/RGBController_LogitechG303.h diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index fa18e680..fe14b648 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -1,23 +1,25 @@ #include "Detector.h" #include "LogitechG203Controller.h" #include "LogitechG203LController.h" +#include "LogitechG213Controller.h" +#include "LogitechG303Controller.h" #include "LogitechG403Controller.h" #include "LogitechG502PSController.h" +#include "LogitechG560Controller.h" #include "LogitechG810Controller.h" -#include "LogitechG213Controller.h" #include "LogitechGProWirelessController.h" #include "LogitechGPowerPlayController.h" -#include "LogitechG560Controller.h" #include "RGBController.h" #include "RGBController_LogitechG203.h" #include "RGBController_LogitechG203L.h" +#include "RGBController_LogitechG213.h" +#include "RGBController_LogitechG303.h" #include "RGBController_LogitechG403.h" #include "RGBController_LogitechG502PS.h" +#include "RGBController_LogitechG560.h" #include "RGBController_LogitechG810.h" -#include "RGBController_LogitechG213.h" #include "RGBController_LogitechGProWireless.h" #include "RGBController_LogitechGPowerPlay.h" -#include "RGBController_LogitechG560.h" #include #include @@ -40,6 +42,7 @@ \*-----------------------------------------------------*/ #define LOGITECH_G203_PID 0xC084 #define LOGITECH_G203L_PID 0xC092 +#define LOGITECH_G303_PID 0xC080 #define LOGITECH_G403_PID 0xC083 #define LOGITECH_G403H_PID 0xC08F #define LOGITECH_G502_PS_PID 0xC332 @@ -150,6 +153,18 @@ void DetectLogitechMouseG203L(hid_device_info* info, const std::string& name) } } +void DetectLogitechMouseG303(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + if(dev) + { + LogitechG303Controller* controller = new LogitechG303Controller(dev, info->path); + RGBController_LogitechG303* rgb_controller = new RGBController_LogitechG303(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectLogitechMouseG403(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); @@ -233,6 +248,7 @@ REGISTER_HID_DETECTOR_IP ("Logitech G810 Orion Spectrum", Detec \*-------------------------------------------------------------------------------------------------------------------------------------------------*/ REGISTER_HID_DETECTOR_IPU("Logitech G203 Prodigy", DetectLogitechMouseG203, LOGITECH_VID, LOGITECH_G203_PID, 1, 0xFF00, 2); REGISTER_HID_DETECTOR_IPU("Logitech G203 Lightsync", DetectLogitechMouseG203L, LOGITECH_VID, LOGITECH_G203L_PID, 1, 0xFF00, 2); +REGISTER_HID_DETECTOR_IPU("Logitech G303 Daedalus Apex", DetectLogitechMouseG303, LOGITECH_VID, LOGITECH_G303_PID, 1, 0xFF00, 2); REGISTER_HID_DETECTOR_IPU("Logitech G403 Prodigy", DetectLogitechMouseG403, LOGITECH_VID, LOGITECH_G403_PID, 1, 0xFF00, 2); REGISTER_HID_DETECTOR_IPU("Logitech G403 Hero", DetectLogitechMouseG403, LOGITECH_VID, LOGITECH_G403H_PID, 1, 0xFF00, 2); REGISTER_HID_DETECTOR_IPU("Logitech G502 Proteus Spectrum", DetectLogitechMouseG502PS, LOGITECH_VID, LOGITECH_G502_PS_PID, 1, 0xFF00, 2); diff --git a/Controllers/LogitechController/LogitechG303Controller.cpp b/Controllers/LogitechController/LogitechG303Controller.cpp new file mode 100644 index 00000000..c6c8fce2 --- /dev/null +++ b/Controllers/LogitechController/LogitechG303Controller.cpp @@ -0,0 +1,81 @@ +/*-----------------------------------------*\ +| LogitechG303Controller.cpp | +| | +| Driver for Logitech G303 Daedalus Apex | +| mouse lighting controller | +| | +| TheRogueZeta 02/14/2021 | +\*-----------------------------------------*/ + +#include "LogitechG303Controller.h" + +#include + +LogitechG303Controller::LogitechG303Controller(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +LogitechG303Controller::~LogitechG303Controller() +{ + hid_close(dev); +} + +std::string LogitechG303Controller::GetDeviceLocation() +{ + return(location); +} + +void LogitechG303Controller::SendMouseMode + ( + unsigned char mode, + std::uint16_t speed, + unsigned char channel, + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ + 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] = 0xFF; + usb_buf[0x02] = 0x0E; + usb_buf[0x03] = 0x3C; + usb_buf[0x04] = channel; + + usb_buf[0x05] = mode; + + usb_buf[0x06] = red; + usb_buf[0x07] = green; + usb_buf[0x08] = blue; + + speed = 100 * speed; + if(mode == LOGITECH_G303_MODE_CYCLE) + { + usb_buf[0x0B] = speed >> 8; + usb_buf[0x0C] = speed & 0xFF; + usb_buf[0x0D] = 0x64; + } + else if(mode == LOGITECH_G303_MODE_BREATHING) + { + usb_buf[0x09] = speed >> 8; + usb_buf[0x0A] = speed & 0xFF; + usb_buf[0x0C] = 0x64; + } + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, usb_buf, 20); + hid_read(dev, usb_buf, 20); +} diff --git a/Controllers/LogitechController/LogitechG303Controller.h b/Controllers/LogitechController/LogitechG303Controller.h new file mode 100644 index 00000000..b7b5e0e7 --- /dev/null +++ b/Controllers/LogitechController/LogitechG303Controller.h @@ -0,0 +1,57 @@ +/*-----------------------------------------*\ +| LogitechG303Controller.h | +| | +| Definitions and types for Logitech G303 | +| Daedalus Apex mouse lighting controller | +| | +| TheRogueZeta 02/14/2021 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + LOGITECH_G303_MODE_OFF = 0x00, + LOGITECH_G303_MODE_STATIC = 0x01, + LOGITECH_G303_MODE_CYCLE = 0x02, + LOGITECH_G303_MODE_BREATHING = 0x03, +}; + +/*---------------------------------------------------------------------------------------------*\ +| Speed is 1000 for fast and 20000 for slow. | +| Values are mutipled by 100 later to give lots of GUI steps. | +\*---------------------------------------------------------------------------------------------*/ +enum +{ + LOGITECH_G303_SPEED_SLOWEST = 0xC8, /* Slowest speed */ + LOGITECH_G303_SPEED_NORMAL = 0x32, /* Normal speed */ + LOGITECH_G303_SPEED_FASTEST = 0x0A, /* Fastest speed */ +}; + +class LogitechG303Controller +{ +public: + LogitechG303Controller(hid_device* dev_handle, const char* path); + ~LogitechG303Controller(); + + std::string GetDeviceLocation(); + + void SendMouseMode + ( + unsigned char mode, + unsigned short speed, + unsigned char channel, + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + hid_device* dev; + std::string location; +}; diff --git a/Controllers/LogitechController/RGBController_LogitechG303.cpp b/Controllers/LogitechController/RGBController_LogitechG303.cpp new file mode 100644 index 00000000..eafc9b60 --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechG303.cpp @@ -0,0 +1,129 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG303.cpp | +| | +| Generic RGB Interface for Logitech G303 | +| Daedalus Apex Mouse | +| | +| TheRogueZeta 02/14/2021 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechG303.h" + +RGBController_LogitechG303::RGBController_LogitechG303(LogitechG303Controller* logitech_ptr) +{ + logitech = logitech_ptr; + + name = "Logitech Mouse Device"; + type = DEVICE_TYPE_MOUSE; + description = "Logitech Mouse Device"; + location = logitech->GetDeviceLocation(); + + mode Off; + Off.name = "Off"; + Off.value = LOGITECH_G303_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Static; + Static.name = "Static"; + Static.value = LOGITECH_G303_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_G303_MODE_CYCLE; + Cycle.flags = MODE_FLAG_HAS_SPEED; + Cycle.color_mode = MODE_COLORS_NONE; + Cycle.speed_min = LOGITECH_G303_SPEED_SLOWEST; + Cycle.speed_max = LOGITECH_G303_SPEED_FASTEST; + Cycle.speed = LOGITECH_G303_SPEED_NORMAL; + modes.push_back(Cycle); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = LOGITECH_G303_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_G303_SPEED_SLOWEST; + Breathing.speed_max = LOGITECH_G303_SPEED_FASTEST; + Breathing.speed = LOGITECH_G303_SPEED_NORMAL; + modes.push_back(Breathing); + + SetupZones(); +} + +RGBController_LogitechG303::~RGBController_LogitechG303() +{ + delete logitech; +} + +void RGBController_LogitechG303::SetupZones() +{ + zone G303_primary_zone; + G303_primary_zone.name = "Primary"; + G303_primary_zone.type = ZONE_TYPE_SINGLE; + G303_primary_zone.leds_min = 1; + G303_primary_zone.leds_max = 1; + G303_primary_zone.leds_count = 1; + G303_primary_zone.matrix_map = NULL; + zones.push_back(G303_primary_zone); + + led G303_primary_led; + G303_primary_led.name = "Primary"; + leds.push_back(G303_primary_led); + + zone G303_logo_zone; + G303_logo_zone.name = "Logo"; + G303_logo_zone.type = ZONE_TYPE_SINGLE; + G303_logo_zone.leds_min = 1; + G303_logo_zone.leds_max = 1; + G303_logo_zone.leds_count = 1; + G303_logo_zone.matrix_map = NULL; + zones.push_back(G303_logo_zone); + + led G303_logo_led; + G303_logo_led.name = "Logo"; + leds.push_back(G303_logo_led); + + SetupColors(); +} + +void RGBController_LogitechG303::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechG303::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); + UpdateZoneLEDs(1); +} + +void RGBController_LogitechG303::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_LogitechG303::UpdateSingleLED(int led) +{ + UpdateZoneLEDs(led); +} + +void RGBController_LogitechG303::SetCustomMode() +{ + +} + +void RGBController_LogitechG303::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/Controllers/LogitechController/RGBController_LogitechG303.h b/Controllers/LogitechController/RGBController_LogitechG303.h new file mode 100644 index 00000000..8b48024c --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechG303.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG303.h | +| | +| Generic RGB Interface for Logitech G303 | +| Daedalus Apex Mouse | +| | +| TheRogueZeta 02/14/2021 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "LogitechG303Controller.h" + +class RGBController_LogitechG303 : public RGBController +{ +public: + RGBController_LogitechG303(LogitechG303Controller* logitech_ptr); + ~RGBController_LogitechG303(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + LogitechG303Controller* logitech; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 4c24e08c..9fdaa235 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -241,20 +241,22 @@ HEADERS += Controllers/LEDStripController/RGBController_LEDStrip.h \ Controllers/LogitechController/LogitechG203Controller.h \ Controllers/LogitechController/LogitechG203LController.h \ + Controllers/LogitechController/LogitechG213Controller.h \ + Controllers/LogitechController/LogitechG303Controller.h \ Controllers/LogitechController/LogitechG403Controller.h \ Controllers/LogitechController/LogitechG502PSController.h \ Controllers/LogitechController/LogitechG560Controller.h \ Controllers/LogitechController/LogitechG810Controller.h \ - Controllers/LogitechController/LogitechG213Controller.h \ Controllers/LogitechController/LogitechGPowerPlayController.h \ Controllers/LogitechController/LogitechGProWirelessController.h \ Controllers/LogitechController/RGBController_LogitechG203.h \ Controllers/LogitechController/RGBController_LogitechG203L.h \ + Controllers/LogitechController/RGBController_LogitechG213.h \ + Controllers/LogitechController/RGBController_LogitechG303.h \ Controllers/LogitechController/RGBController_LogitechG403.h \ Controllers/LogitechController/RGBController_LogitechG502PS.h \ Controllers/LogitechController/RGBController_LogitechG560.h \ Controllers/LogitechController/RGBController_LogitechG810.h \ - Controllers/LogitechController/RGBController_LogitechG213.h \ Controllers/LogitechController/RGBController_LogitechGPowerPlay.h \ Controllers/LogitechController/RGBController_LogitechGProWireless.h \ Controllers/MSI3ZoneController/MSI3ZoneController.h \ @@ -483,20 +485,22 @@ SOURCES += Controllers/LogitechController/LogitechControllerDetect.cpp \ Controllers/LogitechController/LogitechG203Controller.cpp \ Controllers/LogitechController/LogitechG203LController.cpp \ + Controllers/LogitechController/LogitechG213Controller.cpp \ + Controllers/LogitechController/LogitechG303Controller.cpp \ Controllers/LogitechController/LogitechG403Controller.cpp \ Controllers/LogitechController/LogitechG502PSController.cpp \ Controllers/LogitechController/LogitechG560Controller.cpp \ Controllers/LogitechController/LogitechG810Controller.cpp \ - Controllers/LogitechController/LogitechG213Controller.cpp \ Controllers/LogitechController/LogitechGPowerPlayController.cpp \ Controllers/LogitechController/LogitechGProWirelessController.cpp \ Controllers/LogitechController/RGBController_LogitechG203.cpp \ Controllers/LogitechController/RGBController_LogitechG203L.cpp \ + Controllers/LogitechController/RGBController_LogitechG213.cpp \ + Controllers/LogitechController/RGBController_LogitechG303.cpp \ Controllers/LogitechController/RGBController_LogitechG403.cpp \ Controllers/LogitechController/RGBController_LogitechG502PS.cpp \ Controllers/LogitechController/RGBController_LogitechG560.cpp \ Controllers/LogitechController/RGBController_LogitechG810.cpp \ - Controllers/LogitechController/RGBController_LogitechG213.cpp \ Controllers/LogitechController/RGBController_LogitechGPowerPlay.cpp \ Controllers/LogitechController/RGBController_LogitechGProWireless.cpp \ Controllers/MSI3ZoneController/MSI3ZoneController.cpp \