@@ -30,11 +30,19 @@ CorsairCommanderCoreController::CorsairCommanderCoreController(hid_device* dev_h
3030 this ->pid = pid;
3131 guard_manager_ptr = new DeviceGuardManager (new CorsairDeviceGuard ());
3232
33- if (pid == 0x0C32 )
33+ if (pid == CORSAIR_COMMANDER_CORE2_PID )
3434 {
3535 packet_size = CORSAIR_COMMANDER_CORE_PACKET_SIZE_V3;
3636 command_res_size = packet_size - 4 ;
3737 }
38+ else if (pid == CORSAIR_COMMANDER_CORE_XT_PID)
39+ {
40+ /* -----------------------------------------------------*\
41+ | Commander Core XT |
42+ \*-----------------------------------------------------*/
43+ packet_size = CORSAIR_COMMANDER_CORE_XT_PACKET_SIZE;
44+ command_res_size = packet_size - 4 ;
45+ }
3846
3947 /* -----------------------------------------------------*\
4048 | Initialize controller |
@@ -84,7 +92,7 @@ void CorsairCommanderCoreController::InitController()
8492 version[2 ] = res[2 ];
8593 delete[] res;
8694
87- if (pid == 0x0C1C && version[0 ] == 1 )
95+ if (pid == CORSAIR_COMMANDER_CORE_PID && version[0 ] == 1 )
8896 {
8997 packet_size = CORSAIR_COMMANDER_CORE_PACKET_SIZE_V1;
9098 command_res_size = packet_size - 4 ;
@@ -116,6 +124,11 @@ std::string CorsairCommanderCoreController::GetNameString()
116124 return (name);
117125}
118126
127+ int CorsairCommanderCoreController::GetPidInt ()
128+ {
129+ return (this ->pid );
130+ }
131+
119132std::vector<unsigned short int > CorsairCommanderCoreController::GetLedCounts ()
120133{
121134 /* -----------------------------------------------------*\
@@ -336,9 +349,14 @@ void CorsairCommanderCoreController::SetDirectColor
336349 int packet_offset = 0 ;
337350 int led_idx = 0 ;
338351 int channel_idx = 0 ;
339- unsigned char * usb_buf = new unsigned char [ CORSAIR_COMMANDER_CORE_RGB_DATA_LENGTH] ;
352+ int packet_len = CORSAIR_COMMANDER_CORE_RGB_DATA_LENGTH;
340353
341- memset (usb_buf, 0 , CORSAIR_COMMANDER_CORE_RGB_DATA_LENGTH);
354+ if (pid == CORSAIR_COMMANDER_CORE_XT_PID)
355+ {
356+ packet_len = CORSAIR_COMMANDER_CORE_XT_RGB_DATA_LENGTH;
357+ }
358+
359+ unsigned char * usb_buf = new unsigned char [packet_len];
342360
343361 for (unsigned int zone_idx = 0 ; zone_idx < zones.size (); zone_idx++)
344362 {
@@ -355,10 +373,6 @@ void CorsairCommanderCoreController::SetDirectColor
355373
356374 led_idx = led_idx + zones[zone_idx].leds_count ;
357375
358-
359- /* -------------------------------------------------*\
360- | Move offset for fans with less than 34 LEDs |
361- \*-------------------------------------------------*/
362376 if (zone_idx != 0 )
363377 {
364378 packet_offset += 3 * (34 - zones[zone_idx].leds_count );
@@ -382,31 +396,71 @@ void CorsairCommanderCoreController::SetDirectColor
382396
383397void CorsairCommanderCoreController::SetFanMode ()
384398{
399+ controller_ready = 0 ;
400+ DeviceGuardLock _ = guard_manager_ptr->AwaitExclusiveAccess ();
401+
385402 /* --------------------------------------------------------------------------------------------------*\
386403 | Force controller to 6 QL fan mode to expose maximum number of LEDs per rgb port (34 LEDs per port) |
387404 \*--------------------------------------------------------------------------------------------------*/
405+ unsigned char endpoint[2 ] = {0x1E , 0x00 };
406+ unsigned char data_type[2 ] = {0x0D , 0x00 };
388407
389- unsigned char endpoint[2 ] = {0x1E , 0x00 };
390- unsigned char data_type[2 ] = {0x0D , 0x00 };
391408 unsigned char buf[15 ];
392409
393410 /* -----------------------------------------------------*\
394- | Set AIO mode |
411+ | Zero out buffer |
395412 \*-----------------------------------------------------*/
396- buf[0 ] = 0x07 ;
397- buf[1 ] = 0x01 ;
398- buf[2 ] = 0x08 ;
413+ memset (buf, 0x00 , 15 );
414+
415+ buf[0 ] = 0x07 ;
416+ if (pid == CORSAIR_COMMANDER_CORE_XT_PID)
417+ {
418+ /* -----------------------------------------------------*\
419+ | Commander Core XT external RGB port |
420+ \*-----------------------------------------------------*/
421+ buf[1 ] = 0x01 ;
422+ buf[2 ] = 0x01 ;
423+ }
424+ else
425+ {
426+ /* -----------------------------------------------------*\
427+ | Commander Core, Set AIO mode |
428+ \*-----------------------------------------------------*/
429+ buf[1 ] = 0x01 ;
430+ buf[2 ] = 0x08 ;
431+ }
399432
400433 /* -----------------------------------------------------*\
401434 | SET fan modes |
402435 \*-----------------------------------------------------*/
403436 for (unsigned int i = 3 ; i < 15 ; i = i + 2 )
404437 {
405- buf[i] = 0x01 ;
406- buf[i + 1 ] = 0x06 ;
438+ buf[i] = 0x01 ;
439+ buf[i + 1 ] = 0x06 ;
407440 }
408441
409442 WriteData (endpoint, data_type, buf, 15 );
443+ controller_ready = 1 ;
444+ }
445+
446+ void CorsairCommanderCoreController::SetLedAmount (int led_amount)
447+ {
448+ controller_ready = 0 ;
449+ DeviceGuardLock _ = guard_manager_ptr->AwaitExclusiveAccess ();
450+
451+ unsigned char buf[15 ];
410452
453+ /* -----------------------------------------------------*\
454+ | Zero out buffer |
455+ \*-----------------------------------------------------*/
456+ memset (buf, 0x00 , 15 );
457+
458+ unsigned char endpoint[2 ] = {0x1D , 0x00 };
459+ unsigned char data_type[2 ] = {0x0C , 0x00 };
460+
461+ buf[0 ] = 0x07 ;
462+ buf[1 ] = led_amount;
463+
464+ WriteData (endpoint, data_type, buf, 15 );
411465 controller_ready = 1 ;
412466}
0 commit comments