Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5c4d0c7f2 | ||
|
|
fd87fde796 | ||
|
|
1594ca0966 | ||
|
|
86704bf312 | ||
|
|
b5fd21ede4 |
@@ -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
@@ -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);
|
||||
|
||||
/*-------------------------------------*\
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user