Compare commits

...
7 changed files with 318 additions and 1 deletions
@@ -0,0 +1,141 @@
/*-----------------------------------------*\
| CorsairKbdV1Controller.cpp |
| |
| Driver for first-generation Corsair Kxx |
| RGB keyboard lighting controller |
| |
| Adam Honse (CalcProgrammer1) 1/9/2020 |
\*-----------------------------------------*/
#include "CorsairKbdV1Controller.h"
static void send_usb_msg(hid_device* dev, char * data_pkt)
{
char usb_pkt[65];
usb_pkt[0] = 0x00;
for(int i = 1; i < 65; i++)
{
usb_pkt[i] = data_pkt[i-1];
}
int bytes = hid_send_feature_report(dev, (unsigned char *)usb_pkt, 65);
bytes++;
}
CorsairKbdV1Controller::CorsairKbdV1Controller(hid_device* dev_handle)
{
dev = dev_handle;
char data_pkt[64] = { 0 };
data_pkt[0] = 0x07;
data_pkt[1] = 0x05;
data_pkt[2] = 0x02;
data_pkt[3] = 0x00;
data_pkt[4] = 0x03;
send_usb_msg(dev, data_pkt);
}
CorsairKbdV1Controller::~CorsairKbdV1Controller()
{
}
char* CorsairKbdV1Controller::GetDeviceName()
{
return device_name;
}
void CorsairKbdV1Controller::SetLEDs(std::vector<RGBColor> 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 = 7 - red;
grn = 7 - grn;
blu = 7 - blu;
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][2] = 0x00;
data_pkt[4][2] = 0x00;
data_pkt[4][4] = 0xD8; //Number of payload bytes
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];
}
send_usb_msg(dev, data_pkt[0]);
send_usb_msg(dev, data_pkt[1]);
send_usb_msg(dev, data_pkt[2]);
send_usb_msg(dev, data_pkt[3]);
send_usb_msg(dev, data_pkt[4]);
}
@@ -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 <string>
#include <hidapi/hidapi.h>
#pragma once
class CorsairKbdV1Controller
{
public:
CorsairKbdV1Controller(hid_device* dev_handle);
~CorsairKbdV1Controller();
char* GetDeviceName();
void SetLEDsDirect(std::vector<RGBColor> colors);
void SetLEDs(std::vector<RGBColor> colors);
private:
char device_name[32];
hid_device* dev;
};
@@ -0,0 +1,52 @@
#include "CorsairKbdV1Controller.h"
#include "RGBController.h"
#include "RGBController_CorsairKbdV1.h"
#include <vector>
#include <hidapi/hidapi.h>
#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<RGBController*>& rgb_controllers)
{
hid_device_info* info;
hid_device* dev;
hid_init();
info = hid_enumerate(CORSAIR_RGB_KEYBOARD_VID, CORSAIR_RGB_KEYBOARD_K70_PID);
//Look for Corsair RGB Keyboard, interface 1
while(info)
{
if((info->vendor_id == CORSAIR_RGB_KEYBOARD_VID)
&&(info->product_id == CORSAIR_RGB_KEYBOARD_K70_PID)
&&(info->interface_number == 1))
{
dev = hid_open_path(info->path);
break;
}
else
{
info = info->next;
}
}
if( dev )
{
CorsairKbdV1Controller* controller = new CorsairKbdV1Controller(dev);
RGBController_CorsairKbdV1* rgb_controller = new RGBController_CorsairKbdV1(controller);
rgb_controllers.push_back(rgb_controller);
}
}
+3 -1
View File
@@ -334,6 +334,7 @@ void DetectAMDWraithPrismControllers(std::vector<RGBController*>& rgb_controller
void DetectAorusGPUControllers(std::vector<RGBController*> &rgb_controllers);
void DetectMSI3ZoneControllers(std::vector<RGBController*>& rgb_controllers);
void DetectPoseidonZRGBControllers(std::vector<RGBController*>& rgb_controllers);
void DetectCorsairKbdV1Controllers(std::vector<RGBController*>& rgb_controllers);
/******************************************************************************************\
* *
@@ -362,7 +363,8 @@ void DetectRGBControllers(void)
DetectAMDWraithPrismControllers(rgb_controllers);
DetectMSI3ZoneControllers(rgb_controllers);
DetectPoseidonZRGBControllers(rgb_controllers);
DetectCorsairKbdV1Controllers(rgb_controllers);
DetectE131Controllers(rgb_controllers);
/*-------------------------------------*\
+5
View File
@@ -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 \
@@ -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);
}
@@ -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;
};