/*---------------------------------------------------------*\ | CorsairICueLinkProtocol.h | | | | Driver for Corsair iCue Link System Hub | | | | Aiden Vigue (acvigue) 02 Mar 2025 | | Nikola Jurkovic (jurkovic.nikola) 11 Aug 2025 | | | | This file is part of the OpenRGB project | | SPDX-License-Identifier: GPL-2.0-only | \*---------------------------------------------------------*/ #pragma once #include typedef struct CorsairICueLinkDevice { unsigned char type = 0x00; unsigned char model = 0x00; std::string display_name = "Unknown"; unsigned char led_channels = 0; bool internal = false; } CorsairICueLinkDevice; static const CorsairICueLinkDevice known_devices[] = { { 0x05, 0x02, "iCUE LINK 5000T RGB", 160 }, { 0x05, 0x01, "iCUE LINK 9000D RGB AIRFLOW", 22 }, { 0x05, 0x00, "iCUE LINK ADAPTER", 0 }, { 0x06, 0x00, "iCUE LINK COOLER PUMP LCD", 24 }, { 0x11, 0x00, "iCUE LINK TITAN 240", 20 }, { 0x11, 0x04, "iCUE LINK TITAN 240", 20 }, { 0x07, 0x00, "iCUE LINK H100i RGB", 20 }, { 0x07, 0x04, "iCUE LINK H100i RGB", 20 }, { 0x11, 0x01, "iCUE LINK TITAN 280", 20 }, { 0x07, 0x01, "iCUE LINK H115i RGB", 20 }, { 0x11, 0x02, "iCUE LINK TITAN 360", 20 }, { 0x11, 0x05, "iCUE LINK TITAN 360", 20 }, { 0x07, 0x02, "iCUE LINK H150i RGB", 20 }, { 0x07, 0x05, "iCUE LINK H150i RGB", 20 }, { 0x11, 0x03, "iCUE LINK TITAN 420", 20 }, { 0x07, 0x03, "iCUE LINK H170i RGB", 20 }, { 0x10, 0x00, "VRM COOLER MODULE", 0 }, { 0x02, 0x00, "iCUE LINK LX RGB", 18 }, { 0x14, 0x00, "ORIGIN OA", 0 }, { 0x01, 0x00, "iCUE LINK QX RGB", 34 }, { 0x13, 0x00, "iCUE LINK RX", 0 }, { 0x04, 0x00, "iCUE LINK RX MAX", 0 }, { 0x0F, 0x00, "iCUE LINK RX RGB", 8 }, { 0x03, 0x00, "iCUE LINK RX RGB MAX", 8 }, { 0x09, 0x00, "iCUE LINK XC7 ELITE", 24 }, { 0x0C, 0x00, "iCUE LINK XD5 ELITE", 22 }, { 0x0E, 0x00, "iCUE LINK XD5 ELITE LCD", 22, true }, { 0x19, 0x00, "iCUE LINK XD6 ELITE", 22 }, { 0x0A, 0x00, "iCUE LINK XG3 HYBRID", 0 }, { 0x0D, 0x00, "iCUE LINK XG7 RGB", 16 } }; //Lengths #define CORSAIR_ICUE_LINK_BUFFER_WRITE_LENGTH 513 #define CORSAIR_ICUE_LINK_BUFFER_READ_LENGTH 512 #define CORSAIR_ICUE_LINK_READ_HEADER_SIZE 3 #define CORSAIR_ICUE_LINK_WRITE_HEADER_SIZE 4 #define CORSAIR_ICUE_LINK_MAXIMUM_BUFFER_PER_REQUEST 508 //Commands #define CORSAIR_ICUE_LINK_CMD_OPEN_ENDPOINT {0x0d, 0x01} #define CORSAIR_ICUE_LINK_CMD_OPEN_COLOR_ENDPOINT {0x0d, 0x00} #define CORSAIR_ICUE_LINK_CMD_CLOSE_ENDPOINT {0x05, 0x01, 0x01} #define CORSAIR_ICUE_LINK_CMD_GET_FIRMWARE {0x02, 0x13} #define CORSAIR_ICUE_LINK_CMD_SOFTWARE_MODE {0x01, 0x03, 0x00, 0x02} #define CORSAIR_ICUE_LINK_CMD_HARDWARE_MODE {0x01, 0x03, 0x00, 0x01} #define CORSAIR_ICUE_LINK_CMD_WRITE {0x06, 0x01} #define CORSAIR_ICUE_LINK_CMD_WRITE_COLOR {0x06, 0x00} #define CORSAIR_ICUE_LINK_CMD_READ {0x08, 0x01} #define CORSAIR_ICUE_LINK_CMD_GET_DEVICE_MODE {0x01, 0x08, 0x01} //Command modes #define CORSAIR_ICUE_LINK_MODE_GET_DEVICES {0x36,} #define CORSAIR_ICUE_LINK_MODE_GET_TEMPERATURES {0x21,} #define CORSAIR_ICUE_LINK_MODE_GET_SPEEDS {0x17,} #define CORSAIR_ICUE_LINK_MODE_SET_SPEED {0x18,} #define CORSAIR_ICUE_LINK_MODE_SET_COLOR {0x22,} //Command data types #define CORSAIR_ICUE_LINK_DATA_TYPE_GET_DEVICES {0x21, 0x00} #define CORSAIR_ICUE_LINK_DATA_TYPE_GET_TEMPERATURES {0x10, 0x00} #define CORSAIR_ICUE_LINK_DATA_TYPE_GET_SPEEDS {0x25, 0x00} #define CORSAIR_ICUE_LINK_DATA_TYPE_SET_SPEED {0x07, 0x00} #define CORSAIR_ICUE_LINK_DATA_TYPE_SET_COLOR {0x12, 0x00} typedef enum CORSAIR_ICUE_ENDPOINT_TYPE { CORSAIR_ICUE_ENDPOINT_TYPE_DEFAULT, CORSAIR_ICUE_ENDPOINT_TYPE_COLOR } CORSAIR_ICUE_ENDPOINT_TYPE; const CorsairICueLinkDevice* FindCorsairICueLinkDevice(unsigned char type, unsigned char model);