Fix Commander Core XT when configuring RGB header zone to zero and when switching between zero and nonzero modes

This commit is contained in:
Adam Honse 2025-08-21 22:43:32 -05:00
parent e21d29fa27
commit be9fe7bb2d
3 changed files with 51 additions and 24 deletions

View file

@ -98,15 +98,7 @@ void CorsairCommanderCoreController::InitController()
command_res_size = packet_size - 4;
}
/*-----------------------------------------------------*\
| Wake up device |
\*-----------------------------------------------------*/
command[0] = 0x01;
command[1] = 0x03;
unsigned char cmd_data[2] = {0x00, 0x02};
SendCommand(command, cmd_data, 2, NULL);
SetFanMode();
SetFanMode(false);
}
std::string CorsairCommanderCoreController::GetFirmwareString()
@ -394,14 +386,17 @@ void CorsairCommanderCoreController::SetDirectColor
}
}
void CorsairCommanderCoreController::SetFanMode()
void CorsairCommanderCoreController::SetFanMode(bool external_rgb_port)
{
controller_ready = 0;
DeviceGuardLock _ = guard_manager_ptr->AwaitExclusiveAccess();
/*--------------------------------------------------------------------------------------------------*\
| Force controller to 6 QL fan mode to expose maximum number of LEDs per rgb port (34 LEDs per port) |
\*--------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------*\
| Force controller to 6 QL fan mode to expose maximum |
| number of LEDs per rgb port (34 LEDs per port) |
\*-----------------------------------------------------*/
unsigned int index = 3;
unsigned int max_index = 15;
unsigned char endpoint[2] = {0x1E, 0x00};
unsigned char data_type[2] = {0x0D, 0x00};
@ -415,17 +410,33 @@ void CorsairCommanderCoreController::SetFanMode()
buf[0] = 0x07;
if(pid == CORSAIR_COMMANDER_CORE_XT_PID)
{
/*-----------------------------------------------------*\
/*-------------------------------------------------*\
| Commander Core XT external RGB port |
\*-----------------------------------------------------*/
\*-------------------------------------------------*/
if(external_rgb_port)
{
/*---------------------------------------------*\
| Enable external port |
\*---------------------------------------------*/
buf[1] = 0x01;
buf[2] = 0x01;
}
else
{
/*-----------------------------------------------------*\
/*---------------------------------------------*\
| Shift packet start position and maximum index |
\*---------------------------------------------*/
buf[1] = 0x00;
buf[2] = 0x00;
index = 2;
max_index = 14;
}
}
else
{
/*-------------------------------------------------*\
| Commander Core, Set AIO mode |
\*-----------------------------------------------------*/
\*-------------------------------------------------*/
buf[1] = 0x01;
buf[2] = 0x08;
}
@ -433,7 +444,7 @@ void CorsairCommanderCoreController::SetFanMode()
/*-----------------------------------------------------*\
| SET fan modes |
\*-----------------------------------------------------*/
for(unsigned int i = 3; i < 15; i = i + 2)
for(unsigned int i = index; i < max_index; i = i + 2)
{
buf[i] = 0x01;
buf[i + 1] = 0x06;
@ -441,6 +452,14 @@ void CorsairCommanderCoreController::SetFanMode()
WriteData(endpoint, data_type, buf, 15);
controller_ready = 1;
/*-----------------------------------------------------*\
| Wake up device, needs to be done after setting fan |
| mode to reinitialize device if fan mode has changed |
\*-----------------------------------------------------*/
unsigned char command[2] = {0x01, 0x03};
unsigned char cmd_data[2] = {0x00, 0x02};
SendCommand(command, cmd_data, 2, NULL);
}
void CorsairCommanderCoreController::SetLedAmount(int led_amount)

View file

@ -64,7 +64,7 @@ public:
);
void KeepaliveThread();
void SetFanMode();
void SetFanMode(bool external_rgb_port);
void SetLedAmount(int led_amount);
private:

View file

@ -158,8 +158,16 @@ void RGBController_CorsairCommanderCore::ResizeZone(int zone, int new_size)
zones[zone].leds_count = new_size;
if(zone == 0 && controller->GetPidInt() == CORSAIR_COMMANDER_CORE_XT_PID)
{
if(new_size > 0)
{
controller->SetFanMode(true);
controller->SetLedAmount(new_size);
}
else
{
controller->SetFanMode(false);
}
}
SetupZones();
}
}