diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index a68d722f..bb13c8fb 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -1,6 +1,8 @@ #include "LogitechG203Controller.h" +#include "LogitechG403Controller.h" #include "RGBController.h" #include "RGBController_LogitechG203.h" +#include "RGBController_LogitechG403.h" #include #include @@ -13,6 +15,7 @@ \*-----------------------------------------------------*/ #define LOGITECH_MOUSE_VID 0x046D #define LOGITECH_G203_PID 0xC084 +#define LOGITECH_G403_PID 0xC083 typedef struct { @@ -34,6 +37,7 @@ static const logitech_device device_list[] = | Mice | \*-----------------------------------------------------------------------------------------------------*/ { LOGITECH_MOUSE_VID, LOGITECH_G203_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Prodigy" }, + { LOGITECH_MOUSE_VID, LOGITECH_G403_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G403 Prodigy" }, /*-----------------------------------------------------------------------------------------------------*\ | Mousemats | \*-----------------------------------------------------------------------------------------------------*/ @@ -93,15 +97,33 @@ void DetectLogitechControllers(std::vector& rgb_controllers) case DEVICE_TYPE_MOUSE: { - LogitechG203Controller* controller = new LogitechG203Controller(dev); + switch(device_list[device_idx].usb_pid) + { + case LOGITECH_G203_PID: + { + LogitechG203Controller* controller = new LogitechG203Controller(dev); - RGBController_LogitechG203* rgb_controller = new RGBController_LogitechG203(controller); + RGBController_LogitechG203* rgb_controller = new RGBController_LogitechG203(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + case LOGITECH_G403_PID: + { + LogitechG403Controller* controller = new LogitechG403Controller(dev); + + RGBController_LogitechG403* rgb_controller = new RGBController_LogitechG403(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + } - rgb_controller->name = device_list[device_idx].name; - rgb_controllers.push_back(rgb_controller); } break; } } + hid_free_enumeration(info); } } diff --git a/Controllers/LogitechController/LogitechG403Controller.cpp b/Controllers/LogitechController/LogitechG403Controller.cpp new file mode 100644 index 00000000..730bbdf1 --- /dev/null +++ b/Controllers/LogitechController/LogitechG403Controller.cpp @@ -0,0 +1,75 @@ +/*-----------------------------------------*\ +| LogitechG403Controller.cpp | +| | +| Driver for Logitech G403 Prodigy mouse | +| lighting controller | +| | +| Martin Hartl (inlart) 5/19/2020 | +\*-----------------------------------------*/ + +#include "LogitechG403Controller.h" + +#include + +LogitechG403Controller::LogitechG403Controller(hid_device* dev_handle) +{ + dev = dev_handle; +} + +LogitechG403Controller::~LogitechG403Controller() +{ + hid_close(dev); +} + +void LogitechG403Controller::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 = 1000 + 4750 * (LOGITECH_G403_SPEED_FASTEST - speed); + if(mode == LOGITECH_G403_MODE_CYCLE) + { + usb_buf[0x0B] = speed >> 8; + usb_buf[0x0C] = speed & 0xFF; + usb_buf[0x0D] = 0x64; + } + else if(mode == LOGITECH_G403_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/LogitechG403Controller.h b/Controllers/LogitechController/LogitechG403Controller.h new file mode 100644 index 00000000..9f930791 --- /dev/null +++ b/Controllers/LogitechController/LogitechG403Controller.h @@ -0,0 +1,52 @@ +/*-----------------------------------------*\ +| LogitechG403Controller.h | +| | +| Definitions and types for Logitech G403 | +| Prodigy mouse lighting controller | +| | +| Martin Hartl (inlart) 5/19/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + LOGITECH_G403_MODE_OFF = 0x00, + LOGITECH_G403_MODE_STATIC = 0x01, + LOGITECH_G403_MODE_CYCLE = 0x02, + LOGITECH_G403_MODE_BREATHING = 0x03, +}; + +enum +{ + LOGITECH_G403_SPEED_SLOWEST = 0x00, /* Slowest speed */ + LOGITECH_G403_SPEED_SLOW = 0x01, /* Slow speed */ + LOGITECH_G403_SPEED_NORMAL = 0x02, /* Normal speed */ + LOGITECH_G403_SPEED_FAST = 0x03, /* Fast speed */ + LOGITECH_G403_SPEED_FASTEST = 0x04, /* Fastest speed */ +}; + +class LogitechG403Controller +{ +public: + LogitechG403Controller(hid_device* dev_handle); + ~LogitechG403Controller(); + + void SendMouseMode + ( + unsigned char mode, + std::uint16_t speed, + unsigned char channel, + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + hid_device* dev; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 1d20524e..7a641c2b 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -124,6 +124,7 @@ SOURCES += \ Controllers/LEDStripController/LEDStripControllerDetect.cpp \ Controllers/LogitechController/LogitechControllerDetect.cpp \ Controllers/LogitechController/LogitechG203Controller.cpp \ + Controllers/LogitechController/LogitechG403Controller.cpp \ Controllers/MSI3ZoneController/MSI3ZoneController.cpp \ Controllers/MSI3ZoneController/MSI3ZoneControllerDetect.cpp \ Controllers/MSIMysticLightController/MSIMysticLightController.cpp \ @@ -172,6 +173,7 @@ SOURCES += \ RGBController/RGBController_E131.cpp \ RGBController/RGBController_LEDStrip.cpp \ RGBController/RGBController_LogitechG203.cpp \ + RGBController/RGBController_LogitechG403.cpp \ RGBController/RGBController_MSI3Zone.cpp \ RGBController/RGBController_MSIMysticLight.cpp \ RGBController/RGBController_MSIRGB.cpp \ @@ -228,6 +230,7 @@ HEADERS += \ Controllers/HyperXKeyboardController/HyperXKeyboardController.h \ Controllers/LEDStripController/LEDStripController.h \ Controllers/LogitechController/LogitechG203Controller.h \ + Controllers/LogitechController/LogitechG403Controller.h \ Controllers/MSI3ZoneController/MSI3ZoneController.h \ Controllers/MSIMysticLightController/MSIMysticLightController.h \ Controllers/MSIRGBController/MSIRGBController.h \ @@ -261,6 +264,7 @@ HEADERS += \ RGBController/RGBController_HyperXKeyboard.h \ RGBController/RGBController_LEDStrip.h \ RGBController/RGBController_LogitechG203.h \ + RGBController/RGBController_LogitechG403.h \ RGBController/RGBController_MSI3Zone.h \ RGBController/RGBController_MSIMysticLight.h \ RGBController/RGBController_MSIRGB.h \ diff --git a/RGBController/RGBController_LogitechG403.cpp b/RGBController/RGBController_LogitechG403.cpp new file mode 100644 index 00000000..6480557b --- /dev/null +++ b/RGBController/RGBController_LogitechG403.cpp @@ -0,0 +1,123 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG403.cpp | +| | +| Generic RGB Interface for Logitech G403 | +| Prodigy RGB Mouse | +| | +| Martin Hartl (inlar) 5/19/2020 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechG403.h" + +RGBController_LogitechG403::RGBController_LogitechG403(LogitechG403Controller* logitech_ptr) +{ + logitech = logitech_ptr; + + name = "Logitech Mouse Device"; + type = DEVICE_TYPE_MOUSE; + description = "Logitech Mouse Device"; + + mode Static; + Static.name = "Static"; + Static.value = LOGITECH_G403_MODE_STATIC; + Static.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Static.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Static); + + mode Off; + Off.name = "Off"; + Off.value = LOGITECH_G403_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Cycle; + Cycle.name = "Cycle"; + Cycle.value = LOGITECH_G403_MODE_CYCLE; + Cycle.flags = MODE_FLAG_HAS_SPEED; + Cycle.color_mode = MODE_COLORS_NONE; + Cycle.speed_min = LOGITECH_G403_SPEED_SLOWEST; + Cycle.speed_max = LOGITECH_G403_SPEED_FASTEST; + Cycle.speed = LOGITECH_G403_SPEED_NORMAL; + modes.push_back(Cycle); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = LOGITECH_G403_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_G403_SPEED_SLOWEST; + Breathing.speed_max = LOGITECH_G403_SPEED_FASTEST; + Breathing.speed = LOGITECH_G403_SPEED_NORMAL; + modes.push_back(Breathing); + + SetupZones(); +} + +void RGBController_LogitechG403::SetupZones() +{ + zone G403_wheel_zone; + G403_wheel_zone.name = "Mouse Wheel Zone"; + G403_wheel_zone.type = ZONE_TYPE_SINGLE; + G403_wheel_zone.leds_min = 1; + G403_wheel_zone.leds_max = 1; + G403_wheel_zone.leds_count = 1; + G403_wheel_zone.matrix_map = NULL; + zones.push_back(G403_wheel_zone); + + led G403_wheel_led; + G403_wheel_led.name = "Mouse Wheel LED"; + leds.push_back(G403_wheel_led); + + zone G403_logo_zone; + G403_logo_zone.name = "Logo Zone"; + G403_logo_zone.type = ZONE_TYPE_SINGLE; + G403_logo_zone.leds_min = 1; + G403_logo_zone.leds_max = 1; + G403_logo_zone.leds_count = 1; + G403_logo_zone.matrix_map = NULL; + zones.push_back(G403_logo_zone); + + led G403_logo_led; + G403_logo_led.name = "Logo LED"; + leds.push_back(G403_logo_led); + + SetupColors(); +} + +void RGBController_LogitechG403::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechG403::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); + UpdateZoneLEDs(1); +} + +void RGBController_LogitechG403::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_LogitechG403::UpdateSingleLED(int led) +{ + UpdateZoneLEDs(led); +} + +void RGBController_LogitechG403::SetCustomMode() +{ + +} + +void RGBController_LogitechG403::UpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/RGBController/RGBController_LogitechG403.h b/RGBController/RGBController_LogitechG403.h new file mode 100644 index 00000000..f42f3616 --- /dev/null +++ b/RGBController/RGBController_LogitechG403.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG403.h | +| | +| Generic RGB Interface for Logitech G403 | +| Prodigy RGB Mouse | +| | +| Martin Hartl (inlar) 5/19/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "LogitechG403Controller.h" + +class RGBController_LogitechG403 : public RGBController +{ +public: + RGBController_LogitechG403(LogitechG403Controller* logitech_ptr); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void UpdateMode(); + +private: + LogitechG403Controller* logitech; +};