From f6083c8506fe86b72f3d0072a540e04d6d2237b8 Mon Sep 17 00:00:00 2001 From: edbgon Date: Tue, 13 Oct 2020 23:35:52 +0200 Subject: [PATCH] Logitech G213 Controller (Merge Request !171) Commits merged and minor code style changes by Adam Honse --- .../LogitechControllerDetect.cpp | 82 +++++++++--- .../LogitechG213Controller.cpp | 55 ++++++++ .../LogitechG213Controller.h | 33 +++++ .../RGBController_LogitechG213.cpp | 117 ++++++++++++++++++ .../RGBController_LogitechG213.h | 32 +++++ OpenRGB.pro | 4 + 6 files changed, 304 insertions(+), 19 deletions(-) create mode 100644 Controllers/LogitechController/LogitechG213Controller.cpp create mode 100644 Controllers/LogitechController/LogitechG213Controller.h create mode 100644 Controllers/LogitechController/RGBController_LogitechG213.cpp create mode 100644 Controllers/LogitechController/RGBController_LogitechG213.h diff --git a/Controllers/LogitechController/LogitechControllerDetect.cpp b/Controllers/LogitechController/LogitechControllerDetect.cpp index cd1af48d..4b1b273b 100644 --- a/Controllers/LogitechController/LogitechControllerDetect.cpp +++ b/Controllers/LogitechController/LogitechControllerDetect.cpp @@ -4,6 +4,7 @@ #include "LogitechG403Controller.h" #include "LogitechG502PSController.h" #include "LogitechG810Controller.h" +#include "LogitechG213Controller.h" #include "LogitechGProWirelessController.h" #include "LogitechGPowerPlayController.h" #include "RGBController.h" @@ -12,6 +13,7 @@ #include "RGBController_LogitechG403.h" #include "RGBController_LogitechG502PS.h" #include "RGBController_LogitechG810.h" +#include "RGBController_LogitechG213.h" #include "RGBController_LogitechGProWireless.h" #include "RGBController_LogitechGPowerPlay.h" #include @@ -28,6 +30,7 @@ #define LOGITECH_G810_2_PID 0xC331 #define LOGITECH_G512_PID 0xC342 #define LOGITECH_G512_RGB_PID 0xC33C +#define LOGITECH_G213_PID 0xC336 /*-----------------------------------------------------*\ | Mouse product IDs | \*-----------------------------------------------------*/ @@ -61,6 +64,7 @@ static const logitech_device device_list[] = { 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" }, + { LOGITECH_VID, LOGITECH_G213_PID, 1, DEVICE_TYPE_KEYBOARD, "Logitech G213" }, /*-------------------------------------------------------------------------------------------------------------------------------------------------*\ | Mice | \*-------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -119,37 +123,77 @@ void DetectLogitechControllers(std::vector& rgb_controllers) if(dev_usage_0x0602) { #ifdef USE_HID_USAGE - hid_device_info* tmp_info_0x0604 = info; - - while(tmp_info_0x0604) + switch(device_list[device_idx].usb_pid) { - if((tmp_info_0x0604->vendor_id == device_list[device_idx].usb_vid) - &&(tmp_info_0x0604->product_id == device_list[device_idx].usb_pid) - &&(tmp_info_0x0604->interface_number == device_list[device_idx].usb_interface) - &&(tmp_info_0x0604->usage_page == 0xFF43) - &&(tmp_info_0x0604->usage == 0x0604)) + case LOGITECH_G810_1_PID: + case LOGITECH_G810_2_PID: { - hid_device* dev_usage_0x0604 = hid_open_path(tmp_info_0x0604->path); + hid_device_info* tmp_info_0x0604 = info; - if(dev_usage_0x0604) + while(tmp_info_0x0604) { - LogitechG810Controller* controller = new LogitechG810Controller(dev_usage_0x0602, dev_usage_0x0604); + if((tmp_info_0x0604->vendor_id == device_list[device_idx].usb_vid) + &&(tmp_info_0x0604->product_id == device_list[device_idx].usb_pid) + &&(tmp_info_0x0604->interface_number == device_list[device_idx].usb_interface) + &&(tmp_info_0x0604->usage_page == 0xFF43) + &&(tmp_info_0x0604->usage == 0x0604)) + { + hid_device* dev_usage_0x0604 = hid_open_path(tmp_info_0x0604->path); - RGBController_LogitechG810* rgb_controller = new RGBController_LogitechG810(controller); + if(dev_usage_0x0604) + { + LogitechG810Controller* controller = new LogitechG810Controller(dev_usage_0x0602, dev_usage_0x0604); - rgb_controller->name = device_list[device_idx].name; - rgb_controllers.push_back(rgb_controller); + RGBController_LogitechG810* rgb_controller = new RGBController_LogitechG810(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + } + tmp_info_0x0604 = tmp_info_0x0604->next; } } - tmp_info_0x0604 = tmp_info_0x0604->next; + break; + + case LOGITECH_G213_PID: + { + LogitechG213Controller* controller = new LogitechG213Controller(dev_usage_0x0602); + + RGBController_LogitechG213* rgb_controller = new RGBController_LogitechG213(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + } #else - LogitechG810Controller* controller = new LogitechG810Controller(dev_usage_0x0602, dev_usage_0x0602); + switch(device_list[device_idx].usb_pid) + { + case LOGITECH_G810_1_PID: + case LOGITECH_G810_2_PID: + { + LogitechG810Controller* controller = new LogitechG810Controller(dev_usage_0x0602, dev_usage_0x0602); - RGBController_LogitechG810* rgb_controller = new RGBController_LogitechG810(controller); + RGBController_LogitechG810* rgb_controller = new RGBController_LogitechG810(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + + case LOGITECH_G213_PID: + { + LogitechG213Controller* controller = new LogitechG213Controller(dev_usage_0x0602); + + RGBController_LogitechG213* rgb_controller = new RGBController_LogitechG213(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + } - rgb_controller->name = device_list[device_idx].name; - rgb_controllers.push_back(rgb_controller); #endif } } diff --git a/Controllers/LogitechController/LogitechG213Controller.cpp b/Controllers/LogitechController/LogitechG213Controller.cpp new file mode 100644 index 00000000..348dab10 --- /dev/null +++ b/Controllers/LogitechController/LogitechG213Controller.cpp @@ -0,0 +1,55 @@ +/*-----------------------------------------*\ +| LogitechG213Controller.cpp | +| | +| Generic RGB Interface for Logitech G213 | +| | +| Eric Samuelson (edbgon) 10/06/2020 | +\*-----------------------------------------*/ + +#include "LogitechG213Controller.h" +#include + +LogitechG213Controller::LogitechG213Controller(hid_device* dev_handle) +{ + dev = dev_handle; +} + +LogitechG213Controller::~LogitechG213Controller() +{ + +} + +void LogitechG213Controller::SetDirect + ( + unsigned char zone, + unsigned char r, + unsigned char g, + unsigned char b + ) +{ + 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] = 0x0C; + usb_buf[0x03] = 0x3A; + usb_buf[0x04] = zone; + usb_buf[0x05] = 0x01; + usb_buf[0x06] = r; + usb_buf[0x07] = g; + usb_buf[0x08] = b; + usb_buf[0x09] = 0x02; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, (unsigned char *)usb_buf, 20); +} diff --git a/Controllers/LogitechController/LogitechG213Controller.h b/Controllers/LogitechController/LogitechG213Controller.h new file mode 100644 index 00000000..4c0eb701 --- /dev/null +++ b/Controllers/LogitechController/LogitechG213Controller.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| LogitechG213Controller.h | +| | +| Generic RGB Interface for Logitech G213 | +| | +| Eric Samuelson (edbgon) 10/06/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +class LogitechG213Controller +{ +public: + LogitechG213Controller(hid_device* dev_handle); + ~LogitechG213Controller(); + + void SetDirect + ( + unsigned char zone, + unsigned char r, + unsigned char g, + unsigned char b + ); + +private: + hid_device* dev; + +}; diff --git a/Controllers/LogitechController/RGBController_LogitechG213.cpp b/Controllers/LogitechController/RGBController_LogitechG213.cpp new file mode 100644 index 00000000..789241e8 --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechG213.cpp @@ -0,0 +1,117 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG213.cpp | +| | +| Generic RGB Interface for Logitech G213 | +| | +| Eric Samuelson (edbgon) 10/06/2020 | +\*-----------------------------------------*/ + +#include "RGBController_LogitechG213.h" + +static const char* led_names[] = +{ + "Left Area", + "Middle Area", + "Right Area", + "Arrow and Homekeys", + "Numpad", +}; + +static const unsigned char led_values[] = +{ + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, +}; + +#define LOGITECH_G213_ZONES (sizeof(led_values) / sizeof(led_values[ 0 ])) + +RGBController_LogitechG213::RGBController_LogitechG213(LogitechG213Controller* logitech_ptr) +{ + logitechG213 = logitech_ptr; + + name = "Logitech G213 Keyboard Device"; + type = DEVICE_TYPE_KEYBOARD; + description = "Logitech G213 Keyboard Device"; + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0xFFFF; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); +} + +RGBController_LogitechG213::~RGBController_LogitechG213() +{ + +} + +void RGBController_LogitechG213::SetupZones() +{ + /*---------------------------------------------------------*\ + | Set up zones | + \*---------------------------------------------------------*/ + zone new_zone; + new_zone.name = "Keyboard"; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = 5; + new_zone.leds_max = 5; + new_zone.leds_count = 5; + + new_zone.matrix_map = NULL; + + zones.push_back(new_zone); + + for(unsigned int led_idx = 0; led_idx < LOGITECH_G213_ZONES; led_idx++) + { + led new_led; + new_led.name = led_names[led_idx]; + new_led.value = led_values[led_idx]; + leds.push_back(new_led); + } + + SetupColors(); +} + +void RGBController_LogitechG213::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_LogitechG213::DeviceUpdateLEDs() +{ + for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++) + { + logitechG213->SetDirect((unsigned char)leds[led_idx].value, RGBGetRValue(colors[led_idx]), RGBGetGValue(colors[led_idx]), RGBGetBValue(colors[led_idx])); + } +} + +void RGBController_LogitechG213::UpdateZoneLEDs(int zone) +{ + logitechG213->SetDirect((unsigned char) zone, RGBGetRValue(zones[zone].colors[0]), RGBGetGValue(zones[zone].colors[0]), RGBGetBValue(zones[zone].colors[0])); +} + +void RGBController_LogitechG213::UpdateSingleLED(int led) +{ + logitechG213->SetDirect(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led])); +} + +void RGBController_LogitechG213::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_LogitechG213::DeviceUpdateMode() +{ + /*---------------------------------------------------------*\ + | Direct mode does not send a mode packet | + | Call UpdateLEDs to send direct packet | + \*---------------------------------------------------------*/ +} diff --git a/Controllers/LogitechController/RGBController_LogitechG213.h b/Controllers/LogitechController/RGBController_LogitechG213.h new file mode 100644 index 00000000..171e46ea --- /dev/null +++ b/Controllers/LogitechController/RGBController_LogitechG213.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_LogitechG213.h | +| | +| Generic RGB Interface for Logitech G213 | +| | +| Eric Samuelson (edbgon) 10/06/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "LogitechG213Controller.h" + +class RGBController_LogitechG213 : public RGBController +{ +public: + RGBController_LogitechG213(LogitechG213Controller* logitech_ptr); + ~RGBController_LogitechG213(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + LogitechG213Controller* logitechG213; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 10bd7d30..44a1af6b 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -191,6 +191,7 @@ HEADERS += Controllers/LogitechController/LogitechG403Controller.h \ Controllers/LogitechController/LogitechG502PSController.h \ Controllers/LogitechController/LogitechG810Controller.h \ + Controllers/LogitechController/LogitechG213Controller.h \ Controllers/LogitechController/LogitechGPowerPlayController.h \ Controllers/LogitechController/LogitechGProWirelessController.h \ Controllers/LogitechController/RGBController_LogitechG203.h \ @@ -198,6 +199,7 @@ HEADERS += Controllers/LogitechController/RGBController_LogitechG403.h \ Controllers/LogitechController/RGBController_LogitechG502PS.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 \ @@ -371,6 +373,7 @@ SOURCES += Controllers/LogitechController/LogitechG403Controller.cpp \ Controllers/LogitechController/LogitechG502PSController.cpp \ Controllers/LogitechController/LogitechG810Controller.cpp \ + Controllers/LogitechController/LogitechG213Controller.cpp \ Controllers/LogitechController/LogitechGPowerPlayController.cpp \ Controllers/LogitechController/LogitechGProWirelessController.cpp \ Controllers/LogitechController/RGBController_LogitechG203.cpp \ @@ -378,6 +381,7 @@ SOURCES += Controllers/LogitechController/RGBController_LogitechG403.cpp \ Controllers/LogitechController/RGBController_LogitechG502PS.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 \