mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-27 01:07:49 -05:00
87 lines
2.9 KiB
C++
87 lines
2.9 KiB
C++
/*---------------------------------------------------------------------*\
|
|
| CorsairPeripheralV2HardwareController.cpp |
|
|
| |
|
|
| Driver for the newer Corsair peripherals that use the '08' |
|
|
| based USB protocol and support hardware lighting modes. |
|
|
| |
|
|
| Chris M (Dr_No) 07 Dec 2022 |
|
|
\*---------------------------------------------------------------------*/
|
|
|
|
#include "LogManager.h"
|
|
#include "CorsairPeripheralV2HardwareController.h"
|
|
|
|
CorsairPeripheralV2HWController::CorsairPeripheralV2HWController(hid_device* dev_handle, const char* path, std::string name) : CorsairPeripheralV2Controller(dev_handle, path, name)
|
|
{
|
|
SetRenderMode(CORSAIR_V2_MODE_SW);
|
|
LightingControl(0x5F);
|
|
}
|
|
|
|
CorsairPeripheralV2HWController::~CorsairPeripheralV2HWController()
|
|
{
|
|
|
|
}
|
|
|
|
void CorsairPeripheralV2HWController::SetLedsDirect(std::vector<RGBColor *>colors)
|
|
{
|
|
switch(light_ctrl)
|
|
{
|
|
case CORSAIR_V2_LIGHT_CTRL1:
|
|
SetLedsDirectColourBlocks(colors);
|
|
break;
|
|
case CORSAIR_V2_LIGHT_CTRL2:
|
|
SetLedsDirectTriplets(colors);
|
|
break;
|
|
default:
|
|
LOG_ERROR("[%s] Error setting Direct mode: Device supportes returned %i",
|
|
device_name.c_str(), light_ctrl);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CorsairPeripheralV2HWController::SetLedsDirectColourBlocks(std::vector<RGBColor *>colors)
|
|
{
|
|
uint16_t count = (uint16_t)colors.size();
|
|
uint16_t green = count;
|
|
uint16_t blue = (count * 2);
|
|
uint16_t length = (count * 3);
|
|
uint8_t* buffer = new uint8_t[length];
|
|
|
|
memset(buffer, 0, length);
|
|
|
|
for(std::size_t i = 0; i < count; i++)
|
|
{
|
|
RGBColor color = *colors[i];
|
|
|
|
buffer[i] = RGBGetRValue(color);
|
|
buffer[i + green] = RGBGetGValue(color);
|
|
buffer[i + blue] = RGBGetBValue(color);
|
|
}
|
|
|
|
SetLEDs(buffer, length);
|
|
delete[] buffer;
|
|
}
|
|
|
|
void CorsairPeripheralV2HWController::SetLedsDirectTriplets(std::vector<RGBColor *>colors)
|
|
{
|
|
uint16_t count = (uint16_t)colors.size();
|
|
uint16_t length = (count * 3) + CORSAIR_V2HW_DATA_OFFSET;
|
|
uint8_t* buffer = new uint8_t[length];
|
|
|
|
memset(buffer, 0, length);
|
|
|
|
buffer[0] = CORSAIR_V2_MODE_DIRECT & 0xFF;
|
|
buffer[1] = CORSAIR_V2_MODE_DIRECT >> 8;
|
|
for(std::size_t i = 0; i < count; i++)
|
|
{
|
|
RGBColor color = *colors[i];
|
|
std::size_t idx = (i * 3) + CORSAIR_V2HW_DATA_OFFSET;
|
|
|
|
buffer[idx] = RGBGetRValue(color);
|
|
buffer[idx + 1] = RGBGetGValue(color);
|
|
buffer[idx + 2] = RGBGetBValue(color);
|
|
}
|
|
|
|
SetLEDs(buffer, length);
|
|
delete[] buffer;
|
|
}
|