From b5fd21ede4909a6099fd3da11038065f20a8a331 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Thu, 9 Jan 2020 20:09:11 -0600 Subject: [PATCH] Driver for Corsair K70/K95 RGB keyboards --- .../CorsairKbdV1Controller.cpp | 113 ++++++++++++++++++ .../CorsairKbdV1Controller.h | 31 +++++ .../CorsairKbdV1ControllerDetect.cpp | 36 ++++++ OpenRGB.cpp | 4 +- OpenRGB.pro | 5 + RGBController/RGBController_CorsairKbdV1.cpp | 58 +++++++++ RGBController/RGBController_CorsairKbdV1.h | 28 +++++ 7 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.cpp create mode 100644 Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.h create mode 100644 Controllers/CorsairKbdV1Controller/CorsairKbdV1ControllerDetect.cpp create mode 100644 RGBController/RGBController_CorsairKbdV1.cpp create mode 100644 RGBController/RGBController_CorsairKbdV1.h diff --git a/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.cpp b/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.cpp new file mode 100644 index 000000000..ce2057aff --- /dev/null +++ b/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.cpp @@ -0,0 +1,113 @@ +/*-----------------------------------------*\ +| CorsairKbdV1Controller.cpp | +| | +| Driver for first-generation Corsair Kxx | +| RGB keyboard lighting controller | +| | +| Adam Honse (CalcProgrammer1) 1/9/2020 | +\*-----------------------------------------*/ + +#include "CorsairKbdV1Controller.h" + +CorsairKbdV1Controller::CorsairKbdV1Controller(hid_device* dev_handle) +{ + dev = dev_handle; +} + +CorsairKbdV1Controller::~CorsairKbdV1Controller() +{ + +} + +char* CorsairKbdV1Controller::GetDeviceName() +{ + return device_name; +} + +void CorsairKbdV1Controller::SetLEDs(std::vector colors) +{ + char data_pkt[5][64] = { 0 }; + char red_val[144]; + char grn_val[144]; + char blu_val[144]; + + for(int color_idx = 0; color_idx < colors.size(); color_idx++) + { + RGBColor color = colors[color_idx]; + unsigned char red = RGBGetRValue(color); + unsigned char grn = RGBGetGValue(color); + unsigned char blu = RGBGetBValue(color); + + if( red > 7 ) red = 7; + if( grn > 7 ) grn = 7; + if( blu > 7 ) blu = 7; + + red_val[color_idx] = red; + grn_val[color_idx] = grn; + blu_val[color_idx] = blu; + } + + // Perform USB control message to keyboard + // + // Request Type: 0x21 + // Request: 0x09 + // Value 0x0300 + // Index: 0x03 + // Size: 64 + + data_pkt[0][0] = 0x7F; + data_pkt[0][1] = 0x01; + data_pkt[0][2] = 0x3C; + + data_pkt[1][0] = 0x7F; + data_pkt[1][1] = 0x02; + data_pkt[1][2] = 0x3C; + + data_pkt[2][0] = 0x7F; + data_pkt[2][1] = 0x03; + data_pkt[2][2] = 0x3C; + + data_pkt[3][0] = 0x7F; + data_pkt[3][1] = 0x04; + data_pkt[3][2] = 0x24; + + data_pkt[4][0] = 0x07; + data_pkt[4][1] = 0x27; + data_pkt[4][4] = 0xD8; + + for(int i = 0; i < 60; i++) + { + data_pkt[0][i+4] = red_val[i*2+1] << 4 | red_val[i*2]; + } + + for(int i = 0; i < 12; i++) + { + data_pkt[1][i+4] = red_val[i*2+121] << 4 | red_val[i*2+120]; + } + + for(int i = 0; i < 48; i++) + { + data_pkt[1][i+16] = grn_val[i*2+1] << 4 | grn_val[i*2]; + } + + for(int i = 0; i < 24; i++) + { + data_pkt[2][i+4] = grn_val[i*2+97] << 4 | grn_val[i*2+96]; + } + + for(int i = 0; i < 36; i++) + { + data_pkt[2][i+28] = blu_val[i*2+1] << 4 | blu_val[i*2]; + } + + for(int i = 0; i < 36; i++) + { + data_pkt[3][i+4] = blu_val[i*2+73] << 4 | blu_val[i*2+72]; + } + + hid_send_feature_report(dev, (const unsigned char *)data_pkt[0], 64); + hid_send_feature_report(dev, (const unsigned char *)data_pkt[1], 64); + hid_send_feature_report(dev, (const unsigned char *)data_pkt[2], 64); + hid_send_feature_report(dev, (const unsigned char *)data_pkt[3], 64); + hid_send_feature_report(dev, (const unsigned char *)data_pkt[4], 64); +} diff --git a/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.h b/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.h new file mode 100644 index 000000000..8389774a8 --- /dev/null +++ b/Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.h @@ -0,0 +1,31 @@ +/*-----------------------------------------*\ +| CorsairKbdV1Controller.h | +| | +| Definitions and types for first-gene | +| Corsair Kxx keyboard lighting controller | +| | +| Adam Honse (CalcProgrammer1) 1/9/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +class CorsairKbdV1Controller +{ +public: + CorsairKbdV1Controller(hid_device* dev_handle); + ~CorsairKbdV1Controller(); + + char* GetDeviceName(); + + void SetLEDsDirect(std::vector colors); + void SetLEDs(std::vector colors); + +private: + char device_name[32]; + hid_device* dev; +}; diff --git a/Controllers/CorsairKbdV1Controller/CorsairKbdV1ControllerDetect.cpp b/Controllers/CorsairKbdV1Controller/CorsairKbdV1ControllerDetect.cpp new file mode 100644 index 000000000..f45c80daf --- /dev/null +++ b/Controllers/CorsairKbdV1Controller/CorsairKbdV1ControllerDetect.cpp @@ -0,0 +1,36 @@ +#include "CorsairKbdV1Controller.h" +#include "RGBController.h" +#include "RGBController_CorsairKbdV1.h" +#include +#include + +#define CORSAIR_RGB_KEYBOARD_VID 0x1B1C +#define CORSAIR_RGB_KEYBOARD_K70_PID 0x1B13 +#define CORSAIR_RGB_KEYBOARD_K95_PID 0x1B11 + +/******************************************************************************************\ +* * +* DetectCorsairKbdV1Controllers * +* * +* Tests the USB address to see if a Corsair RGB Keyboard controller exists there. * +* * +\******************************************************************************************/ + +void DetectCorsairKbdV1Controllers(std::vector& rgb_controllers) +{ + hid_device* dev; + + //Look for Corsair RGB Keyboard + hid_init(); + + dev = hid_open(CORSAIR_RGB_KEYBOARD_VID, CORSAIR_RGB_KEYBOARD_K70_PID, 0); + + if( dev ) + { + CorsairKbdV1Controller* controller = new CorsairKbdV1Controller(dev); + + RGBController_CorsairKbdV1* rgb_controller = new RGBController_CorsairKbdV1(controller); + + rgb_controllers.push_back(rgb_controller); + } +} diff --git a/OpenRGB.cpp b/OpenRGB.cpp index 282a3c944..b05ca5c48 100644 --- a/OpenRGB.cpp +++ b/OpenRGB.cpp @@ -334,6 +334,7 @@ void DetectAMDWraithPrismControllers(std::vector& rgb_controller void DetectAorusGPUControllers(std::vector &rgb_controllers); void DetectMSI3ZoneControllers(std::vector& rgb_controllers); void DetectPoseidonZRGBControllers(std::vector& rgb_controllers); +void DetectCorsairKbdV1Controllers(std::vector& rgb_controllers); /******************************************************************************************\ * * @@ -362,7 +363,8 @@ void DetectRGBControllers(void) DetectAMDWraithPrismControllers(rgb_controllers); DetectMSI3ZoneControllers(rgb_controllers); DetectPoseidonZRGBControllers(rgb_controllers); - + DetectCorsairKbdV1Controllers(rgb_controllers); + DetectE131Controllers(rgb_controllers); /*-------------------------------------*\ diff --git a/OpenRGB.pro b/OpenRGB.pro index bd5848824..41c141e11 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -14,6 +14,7 @@ INCLUDEPATH += \ Controllers/AMDWraithPrismController/ \ Controllers/AuraController/ \ Controllers/CorsairController/ \ + Controllers/CorsairKbdV1Controller/ \ Controllers/CorsairProController/ \ Controllers/Hue2Controller/ \ Controllers/HuePlusController/ \ @@ -46,6 +47,8 @@ SOURCES += \ Controllers/AuraController/AuraController.cpp \ Controllers/AuraController/AuraControllerDetect.cpp \ Controllers/CorsairController/CorsairController.cpp \ + Controllers/CorsairKbdV1Controller/CorsairKbdV1Controller.cpp \ + Controllers/CorsairKbdV1Controller/CorsairKbdV1ControllerDetect.cpp \ Controllers/CorsairController/CorsairControllerDetect.cpp \ Controllers/CorsairProController/CorsairProController.cpp \ Controllers/CorsairProController/CorsairProControllerDetect.cpp \ @@ -72,6 +75,7 @@ SOURCES += \ RGBController/RGBController_AMDWraithPrism.cpp \ RGBController/RGBController_Aura.cpp \ RGBController/RGBController_Corsair.cpp \ + RGBController/RGBController_CorsairKbdV1.cpp \ RGBController/RGBController_CorsairPro.cpp \ RGBController/RGBController_Hue2.cpp \ RGBController/RGBController_HuePlus.cpp \ @@ -112,6 +116,7 @@ HEADERS += \ RGBController/RGBController_AMDWraithPrism.h \ RGBController/RGBController_Aura.h \ RGBController/RGBController_Corsair.h \ + RGBController/RGBController_CorsairKbdV1.h \ RGBController/RGBController_CorsairPro.h \ RGBController/RGBController_E131.h \ RGBController/RGBController_Hue2.h \ diff --git a/RGBController/RGBController_CorsairKbdV1.cpp b/RGBController/RGBController_CorsairKbdV1.cpp new file mode 100644 index 000000000..da3423d16 --- /dev/null +++ b/RGBController/RGBController_CorsairKbdV1.cpp @@ -0,0 +1,58 @@ +/*-----------------------------------------*\ +| RGBController_CorsairKbdV1.cpp | +| | +| Generic RGB Interface for first-gen | +| Corsair RGB keyboard | +| | +| Adam Honse (CalcProgrammer1) 1/9/2020 | +\*-----------------------------------------*/ + +#include "RGBController_CorsairKbdV1.h" + +RGBController_CorsairKbdV1::RGBController_CorsairKbdV1(CorsairKbdV1Controller* corsair_ptr) +{ + corsair = corsair_ptr; + + name = "Corsair RGB Keyboard"; + type = DEVICE_TYPE_KEYBOARD; + + for(int i = 0; i < 144; i++) + { + colors.push_back(0x00000000); + } +} + +RGBController_CorsairKbdV1::~RGBController_CorsairKbdV1() +{ + +} + +int RGBController_CorsairKbdV1::GetMode() +{ + return 0; +} + +void RGBController_CorsairKbdV1::SetMode(int mode) +{ + +} + +void RGBController_CorsairKbdV1::SetCustomMode() +{ + +} + +void RGBController_CorsairKbdV1::UpdateLEDs() +{ + corsair->SetLEDs(colors); +} + +void RGBController_CorsairKbdV1::UpdateZoneLEDs(int zone) +{ + corsair->SetLEDs(colors); +} + +void RGBController_CorsairKbdV1::UpdateSingleLED(int led) +{ + corsair->SetLEDs(colors); +} \ No newline at end of file diff --git a/RGBController/RGBController_CorsairKbdV1.h b/RGBController/RGBController_CorsairKbdV1.h new file mode 100644 index 000000000..9a55cede3 --- /dev/null +++ b/RGBController/RGBController_CorsairKbdV1.h @@ -0,0 +1,28 @@ +/*-----------------------------------------*\ +| RGBController_CorsairKbdV1.h | +| | +| Generic RGB Interface for first-gen | +| Corsair RGB keyboard | +| | +| Adam Honse (CalcProgrammer1) 1/9/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "CorsairKbdV1Controller.h" + +class RGBController_CorsairKbdV1 : public RGBController +{ +public: + RGBController_CorsairKbdV1(CorsairKbdV1Controller* corsair_ptr); + ~RGBController_CorsairKbdV1(); + int GetMode(); + void SetMode(int mode); + void SetCustomMode(); + void UpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + +private: + CorsairKbdV1Controller* corsair; +}; \ No newline at end of file