From 85fc72232a66931fbf3f93a6543097ce18b6d38b Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 18 May 2020 09:24:17 -0500 Subject: [PATCH] Logitech G203 and Corsair ST100 support --- .../CorsairPeripheralController.cpp | 37 +++++- .../CorsairPeripheralControllerDetect.cpp | 12 +- .../LogitechControllerDetect.cpp | 107 ++++++++++++++++++ .../LogitechG203Controller.cpp | 58 ++++++++++ .../LogitechG203Controller.h | 42 +++++++ OpenRGB.cpp | 2 + OpenRGB.pro | 6 + RGBController/RGBController.h | 1 + .../RGBController_CorsairPeripheral.cpp | 26 +++++ RGBController/RGBController_LogitechG203.cpp | 103 +++++++++++++++++ RGBController/RGBController_LogitechG203.h | 32 ++++++ 11 files changed, 422 insertions(+), 4 deletions(-) create mode 100644 Controllers/LogitechController/LogitechControllerDetect.cpp create mode 100644 Controllers/LogitechController/LogitechG203Controller.cpp create mode 100644 Controllers/LogitechController/LogitechG203Controller.h create mode 100644 RGBController/RGBController_LogitechG203.cpp create mode 100644 RGBController/RGBController_LogitechG203.h diff --git a/Controllers/CorsairPeripheralController/CorsairPeripheralController.cpp b/Controllers/CorsairPeripheralController/CorsairPeripheralController.cpp index d3538607c..f9efd936d 100644 --- a/Controllers/CorsairPeripheralController/CorsairPeripheralController.cpp +++ b/Controllers/CorsairPeripheralController/CorsairPeripheralController.cpp @@ -31,6 +31,8 @@ static unsigned int keys[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x 116, 117, 120, 121, 122, 123, 124, 126, 127, 128, 129, 132, 133, 134, 135, 136, 137, 139, 140, 141}; +static unsigned int st100[] = { 0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x08, 0x04 }; + static void send_usb_msg(hid_device* dev, char * data_pkt) { char usb_pkt[65]; @@ -85,6 +87,26 @@ void CorsairPeripheralController::SetLEDs(std::vectorcolors) case DEVICE_TYPE_MOUSEMAT: SetLEDsMousemat(colors); break; + + case DEVICE_TYPE_HEADSET_STAND: + /*-----------------------------------------------------*\ + | The logo zone of the ST100 is in the middle of the | + | base LED strip, so remap the colors so that the logo | + | is the last LED in the sequence. | + \*-----------------------------------------------------*/ + std::vector remap_colors; + remap_colors.resize(colors.size()); + + for(int i = 0; i < 9; i++) + { + remap_colors[st100[i]] = colors[i]; + } + + /*-----------------------------------------------------*\ + | The ST100 uses the mousemat protocol | + \*-----------------------------------------------------*/ + SetLEDsMousemat(remap_colors); + break; } } @@ -235,8 +257,8 @@ void CorsairPeripheralController::LightingControl() usb_buf[0x02] = CORSAIR_LIGHTING_CONTROL_SOFTWARE; /*-----------------------------------------------------*\ - | Lighting control byte needs to be 3 for keyboards, 1 | - | for mice and mousepads | + | Lighting control byte needs to be 3 for keyboards and | + | headset stand, 1 for mice and mousepads | \*-----------------------------------------------------*/ switch(type) { @@ -252,6 +274,10 @@ void CorsairPeripheralController::LightingControl() case DEVICE_TYPE_MOUSEMAT: usb_buf[0x04] = 0x04; break; + + case DEVICE_TYPE_HEADSET_STAND: + usb_buf[0x04] = 0x03; + break; } /*-----------------------------------------------------*\ @@ -305,12 +331,17 @@ void CorsairPeripheralController::ReadFirmwareInfo() /*-----------------------------------------------------*\ | Get device type | + | 0x00 Device is a headset stand | | 0xC0 Device is a keyboard | | 0xC1 Device is a mouse | | 0xC2 Device is a mousepad | \*-----------------------------------------------------*/ switch((unsigned char)usb_buf[0x14]) { + case 0x00: + type = DEVICE_TYPE_HEADSET_STAND; + break; + case 0xC0: type = DEVICE_TYPE_KEYBOARD; break; @@ -497,4 +528,4 @@ void CorsairPeripheralController::SubmitMousematColors | Send packet | \*-----------------------------------------------------*/ send_usb_msg(dev, usb_buf); -} \ No newline at end of file +} diff --git a/Controllers/CorsairPeripheralController/CorsairPeripheralControllerDetect.cpp b/Controllers/CorsairPeripheralController/CorsairPeripheralControllerDetect.cpp index ac127adbc..9ca900337 100644 --- a/Controllers/CorsairPeripheralController/CorsairPeripheralControllerDetect.cpp +++ b/Controllers/CorsairPeripheralController/CorsairPeripheralControllerDetect.cpp @@ -48,6 +48,12 @@ \*-----------------------------------------------------*/ #define CORSAIR_MM800_RGB_POLARIS_PID 0x1B3B +/*-----------------------------------------------------*\ +| Headset Stand product IDs | +| List taken from ckb-next | +\*-----------------------------------------------------*/ +#define CORSAIR_ST100_PID 0x0A34 + typedef struct { unsigned short usb_vid; @@ -80,7 +86,11 @@ static const corsair_node_device device_list[] = /*-----------------------------------------------------------------------------------------------------*\ | Mousemats | \*-----------------------------------------------------------------------------------------------------*/ - { CORSAIR_VID, CORSAIR_MM800_RGB_POLARIS_PID, 0, "Corsair MM800 RGB Polaris" } + { CORSAIR_VID, CORSAIR_MM800_RGB_POLARIS_PID, 0, "Corsair MM800 RGB Polaris" }, + /*-----------------------------------------------------------------------------------------------------*\ + | Headset Stands | + \*-----------------------------------------------------------------------------------------------------*/ + { CORSAIR_VID, CORSAIR_ST100_PID, 0, "Corsair ST100 RGB" } }; /******************************************************************************************\ diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp new file mode 100644 index 000000000..a68d722f5 --- /dev/null +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -0,0 +1,107 @@ +#include "LogitechG203Controller.h" +#include "RGBController.h" +#include "RGBController_LogitechG203.h" +#include +#include + +/*-----------------------------------------------------*\ +| Keyboard product IDs | +\*-----------------------------------------------------*/ + +/*-----------------------------------------------------*\ +| Mouse product IDs | +\*-----------------------------------------------------*/ +#define LOGITECH_MOUSE_VID 0x046D +#define LOGITECH_G203_PID 0xC084 + +typedef struct +{ + unsigned short usb_vid; + unsigned short usb_pid; + unsigned char usb_interface; + device_type type; + const char * name; +} logitech_device; + +#define LOGITECH_NUM_DEVICES (sizeof(device_list) / sizeof(device_list[ 0 ])) + +static const logitech_device device_list[] = +{ + /*-----------------------------------------------------------------------------------------------------*\ + | Keyboards | + \*-----------------------------------------------------------------------------------------------------*/ + /*-----------------------------------------------------------------------------------------------------*\ + | Mice | + \*-----------------------------------------------------------------------------------------------------*/ + { LOGITECH_MOUSE_VID, LOGITECH_G203_PID, 1, DEVICE_TYPE_MOUSE, "Logitech G203 Prodigy" }, + /*-----------------------------------------------------------------------------------------------------*\ + | Mousemats | + \*-----------------------------------------------------------------------------------------------------*/ +}; + +/******************************************************************************************\ +* * +* DetectLogitechControllers * +* * +* Tests the USB address to see if a Logitech RGB Keyboard controller exists there. * +* * +\******************************************************************************************/ + +void DetectLogitechControllers(std::vector& rgb_controllers) +{ + hid_device_info* info; + hid_device* dev; + + hid_init(); + + for(int device_idx = 0; device_idx < LOGITECH_NUM_DEVICES; device_idx++) + { + dev = NULL; + + info = hid_enumerate(device_list[device_idx].usb_vid, device_list[device_idx].usb_pid); + + //Look for Logitech RGB Peripheral + while(info) + { + if((info->vendor_id == device_list[device_idx].usb_vid) + &&(info->product_id == device_list[device_idx].usb_pid) + &&(info->interface_number == device_list[device_idx].usb_interface)) + { + dev = hid_open_path(info->path); + break; + } + else + { + info = info->next; + } + } + + if( dev ) + { + switch(device_list[device_idx].type) + { + case DEVICE_TYPE_KEYBOARD: + // { + // RedragonK556Controller* controller = new RedragonK556Controller(dev); + + // RGBController_RedragonK556* rgb_controller = new RGBController_RedragonK556(controller); + + // rgb_controller->name = device_list[device_idx].name; + // rgb_controllers.push_back(rgb_controller); + // } + break; + + case DEVICE_TYPE_MOUSE: + { + LogitechG203Controller* controller = new LogitechG203Controller(dev); + + RGBController_LogitechG203* rgb_controller = new RGBController_LogitechG203(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + } + } + } +} diff --git a/Controllers/LogitechController/LogitechG203Controller.cpp b/Controllers/LogitechController/LogitechG203Controller.cpp new file mode 100644 index 000000000..d5785c574 --- /dev/null +++ b/Controllers/LogitechController/LogitechG203Controller.cpp @@ -0,0 +1,58 @@ +/*-----------------------------------------*\ +| LogitechG203Controller.cpp | +| | +| Driver for Logitech G203 Prodigy mouse | +| lighting controller | +| | +| Adam Honse (CalcProgrammer1) 5/17/2020 | +\*-----------------------------------------*/ + +#include "LogitechG203Controller.h" + +#include + +LogitechG203Controller::LogitechG203Controller(hid_device* dev_handle) +{ + dev = dev_handle; +} + +/*-------------------------------------------------------------------------------------------------*\ +| Private packet sending functions. | +\*-------------------------------------------------------------------------------------------------*/ + +void LogitechG203Controller::SendMouseMode + ( + unsigned char mode, + unsigned char speed, + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ + 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] = 0x00; + + usb_buf[0x05] = mode; + + usb_buf[0x06] = red; + usb_buf[0x07] = green; + usb_buf[0x08] = blue; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, (unsigned char *)usb_buf, 20); +} diff --git a/Controllers/LogitechController/LogitechG203Controller.h b/Controllers/LogitechController/LogitechG203Controller.h new file mode 100644 index 000000000..231dd4eee --- /dev/null +++ b/Controllers/LogitechController/LogitechG203Controller.h @@ -0,0 +1,42 @@ +/*-----------------------------------------*\ +| LogitechG203Controller.h | +| | +| Definitions and types for Logitech G203 | +| Prodigy mouse lighting controller | +| | +| Adam Honse (CalcProgrammer1) 5/17/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + LOGITECH_G203_MODE_OFF = 0x00, + LOGITECH_G203_MODE_STATIC = 0x01, + LOGITECH_G203_MODE_CYCLE = 0x02, + LOGITECH_G203_MODE_BREATHING = 0x03, +}; + +class LogitechG203Controller +{ +public: + LogitechG203Controller(hid_device* dev_handle); + ~LogitechG203Controller(); + + void SendMouseMode + ( + unsigned char mode, + unsigned char speed, + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + hid_device* dev; +}; diff --git a/OpenRGB.cpp b/OpenRGB.cpp index 09484b57d..a4b4b262e 100644 --- a/OpenRGB.cpp +++ b/OpenRGB.cpp @@ -312,6 +312,7 @@ void DetectHyperXKeyboardControllers(std::vector& rgb_controller void DetectThermaltakeRiingControllers(std::vector& rgb_controllers); void DetectRGBFusion2USBControllers(std::vector &rgb_controllers); void DetectRedragonControllers(std::vector& rgb_controllers); +void DetectLogitechControllers(std::vector& rgb_controllers); void DetectNZXTKrakenControllers(std::vector& rgb_controllers); /******************************************************************************************\ @@ -359,6 +360,7 @@ void DetectRGBControllers(void) DetectThermaltakeRiingControllers(rgb_controllers); DetectRGBFusion2USBControllers(rgb_controllers); DetectRedragonControllers(rgb_controllers); + DetectLogitechControllers(rgb_controllers); DetectNZXTKrakenControllers(rgb_controllers); DetectE131Controllers(rgb_controllers); diff --git a/OpenRGB.pro b/OpenRGB.pro index 5b86a5950..1d20524ea 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -46,6 +46,7 @@ INCLUDEPATH += \ Controllers/HyperXDRAMController/ \ Controllers/HyperXKeyboardController/ \ Controllers/LEDStripController/ \ + Controllers/LogitechController/ \ Controllers/MSI3ZoneController/ \ Controllers/MSIMysticLightController/ \ Controllers/MSIRGBController/ \ @@ -121,6 +122,8 @@ SOURCES += \ Controllers/HyperXKeyboardController/HyperXKeyboardControllerDetect.cpp \ Controllers/LEDStripController/LEDStripController.cpp \ Controllers/LEDStripController/LEDStripControllerDetect.cpp \ + Controllers/LogitechController/LogitechControllerDetect.cpp \ + Controllers/LogitechController/LogitechG203Controller.cpp \ Controllers/MSI3ZoneController/MSI3ZoneController.cpp \ Controllers/MSI3ZoneController/MSI3ZoneControllerDetect.cpp \ Controllers/MSIMysticLightController/MSIMysticLightController.cpp \ @@ -168,6 +171,7 @@ SOURCES += \ RGBController/RGBController_HyperXKeyboard.cpp \ RGBController/RGBController_E131.cpp \ RGBController/RGBController_LEDStrip.cpp \ + RGBController/RGBController_LogitechG203.cpp \ RGBController/RGBController_MSI3Zone.cpp \ RGBController/RGBController_MSIMysticLight.cpp \ RGBController/RGBController_MSIRGB.cpp \ @@ -223,6 +227,7 @@ HEADERS += \ Controllers/HyperXDRAMController/HyperXDRAMController.h \ Controllers/HyperXKeyboardController/HyperXKeyboardController.h \ Controllers/LEDStripController/LEDStripController.h \ + Controllers/LogitechController/LogitechG203Controller.h \ Controllers/MSI3ZoneController/MSI3ZoneController.h \ Controllers/MSIMysticLightController/MSIMysticLightController.h \ Controllers/MSIRGBController/MSIRGBController.h \ @@ -255,6 +260,7 @@ HEADERS += \ RGBController/RGBController_HyperXDRAM.h \ RGBController/RGBController_HyperXKeyboard.h \ RGBController/RGBController_LEDStrip.h \ + RGBController/RGBController_LogitechG203.h \ RGBController/RGBController_MSI3Zone.h \ RGBController/RGBController_MSIMysticLight.h \ RGBController/RGBController_MSIRGB.h \ diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index 85e636185..bfe71841b 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -112,6 +112,7 @@ enum DEVICE_TYPE_MOUSE, DEVICE_TYPE_MOUSEMAT, DEVICE_TYPE_HEADSET, + DEVICE_TYPE_HEADSET_STAND, DEVICE_TYPE_UNKNOWN }; diff --git a/RGBController/RGBController_CorsairPeripheral.cpp b/RGBController/RGBController_CorsairPeripheral.cpp index 3daa4c56d..29dc7c145 100644 --- a/RGBController/RGBController_CorsairPeripheral.cpp +++ b/RGBController/RGBController_CorsairPeripheral.cpp @@ -192,6 +192,10 @@ void RGBController_CorsairPeripheral::SetupZones() case DEVICE_TYPE_MOUSEMAT: num_zones = 1; break; + + case DEVICE_TYPE_HEADSET_STAND: + num_zones = 2; + break; } /*---------------------------------------------------------*\ @@ -240,6 +244,27 @@ void RGBController_CorsairPeripheral::SetupZones() new_zone.leds_count = 15; new_zone.matrix_map = NULL; break; + + case DEVICE_TYPE_HEADSET_STAND: + if(zone_idx == 0) + { + new_zone.name = "Base LED Strip"; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = 8; + new_zone.leds_max = 8; + new_zone.leds_count = 8; + new_zone.matrix_map = NULL; + } + else + { + new_zone.name = "Logo"; + new_zone.type = ZONE_TYPE_SINGLE; + new_zone.leds_min = 1; + new_zone.leds_max = 1; + new_zone.leds_count = 1; + new_zone.matrix_map = NULL; + } + break; } zones.push_back(new_zone); @@ -259,6 +284,7 @@ void RGBController_CorsairPeripheral::SetupZones() case DEVICE_TYPE_MOUSE: case DEVICE_TYPE_MOUSEMAT: + case DEVICE_TYPE_HEADSET_STAND: new_led.name = "Mousemat LED "; new_led.name.append(std::to_string(led_idx + 1)); break; diff --git a/RGBController/RGBController_LogitechG203.cpp b/RGBController/RGBController_LogitechG203.cpp new file mode 100644 index 000000000..aab58dad1 --- /dev/null +++ b/RGBController/RGBController_LogitechG203.cpp @@ -0,0 +1,103 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG203.cpp | +| | +| Generic RGB Interface for Logitech G203 | +| Prodigy RGB Mouse | +| | +| Adam Honse (CalcProgrammer1) 5/17/2020 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechG203.h" + +RGBController_LogitechG203::RGBController_LogitechG203(LogitechG203Controller* 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_G203_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_G203_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Cycle; + Cycle.name = "Cycle"; + Cycle.value = LOGITECH_G203_MODE_CYCLE; + Cycle.flags = 0; + Cycle.color_mode = MODE_COLORS_NONE; + modes.push_back(Cycle); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = LOGITECH_G203_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Breathing.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Breathing); + + SetupZones(); +} + +void RGBController_LogitechG203::SetupZones() +{ + zone g203_zone; + g203_zone.name = "Mouse Zone"; + g203_zone.type = ZONE_TYPE_SINGLE; + g203_zone.leds_min = 1; + g203_zone.leds_max = 1; + g203_zone.leds_count = 1; + g203_zone.matrix_map = NULL; + zones.push_back(g203_zone); + + led g203_led; + g203_led.name = "Mouse LED"; + leds.push_back(g203_led); + + SetupColors(); +} + +void RGBController_LogitechG203::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechG203::DeviceUpdateLEDs() +{ + unsigned char red = RGBGetRValue(colors[0]); + unsigned char grn = RGBGetGValue(colors[0]); + unsigned char blu = RGBGetBValue(colors[0]); + + logitech->SendMouseMode(modes[active_mode].value, 0, red, grn, blu); +} + +void RGBController_LogitechG203::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechG203::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_LogitechG203::SetCustomMode() +{ + +} + +void RGBController_LogitechG203::UpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/RGBController/RGBController_LogitechG203.h b/RGBController/RGBController_LogitechG203.h new file mode 100644 index 000000000..15cdf8187 --- /dev/null +++ b/RGBController/RGBController_LogitechG203.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG203.h | +| | +| Generic RGB Interface for Logitech G203 | +| Prodigy RGB Mouse | +| | +| Adam Honse (CalcProgrammer1) 5/17/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "LogitechG203Controller.h" + +class RGBController_LogitechG203 : public RGBController +{ +public: + RGBController_LogitechG203(LogitechG203Controller* 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: + LogitechG203Controller* logitech; +}; \ No newline at end of file