diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.cpp b/Controllers/CoolerMasterController/CMARGBcontroller.cpp index 01d8e2cc..39581b98 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.cpp +++ b/Controllers/CoolerMasterController/CMARGBcontroller.cpp @@ -153,9 +153,16 @@ void CMARGBController::SendUpdate() buffer[CM_ARGB_FUNCTION_BYTE] = boolPassthru ? 0x02 : 0x01; hid_write(dev, buffer, buffer_size); - hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); + //hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); - if ( boolARGB_header & !boolPassthru ) + if ( boolPassthru ) + { + //If setting pass thru mode send the init packet again + hid_write(dev, buffer, buffer_size); + hid_write(dev, buffer, buffer_size); + hid_write(dev, buffer, buffer_size); + } + else if ( boolARGB_header ) { buffer[CM_ARGB_COMMAND_BYTE] = 0x0b; //ARGB sends 0x0b (1011) RGB sends 0x04 (0100) buffer[CM_ARGB_FUNCTION_BYTE] = (false) ? 0x01 : 0x02; //This controls custom mode TODO diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.h b/Controllers/CoolerMasterController/CMARGBcontroller.h index d7a7100f..4f39ede5 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.h +++ b/Controllers/CoolerMasterController/CMARGBcontroller.h @@ -25,18 +25,17 @@ #define CM_ARGB_HEADER_DATA_SIZE (sizeof(argb_header_data) / sizeof(argb_headers) ) #define CM_ARGB_INTERRUPT_TIMEOUT 250 #define CM_ARGB_DEVICE_NAME_SIZE (sizeof(device_name) / sizeof(device_name[ 0 ])) -//#define CM_ARGB_SERIAL_SIZE (sizeof(serial) / sizeof(serial[ 0 ])) #define HID_MAX_STR 255 enum { - CM_ARGB_REPORT_BYTE = 0, - CM_ARGB_COMMAND_BYTE = 1, - CM_ARGB_FUNCTION_BYTE = 2, - CM_ARGB_ZONE_BYTE = 3, - CM_ARGB_MODE_BYTE = 4, - CM_ARGB_COLOUR_INDEX_BYTE = 5, - CM_ARGB_SPEED_BYTE = 6 + CM_ARGB_REPORT_BYTE = 1, + CM_ARGB_COMMAND_BYTE = 2, + CM_ARGB_FUNCTION_BYTE = 3, + CM_ARGB_ZONE_BYTE = 4, + CM_ARGB_MODE_BYTE = 5, + CM_ARGB_COLOUR_INDEX_BYTE = 6, + CM_ARGB_SPEED_BYTE = 7 }; struct argb_headers diff --git a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp index c21888dc..53ac2355 100644 --- a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp +++ b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp @@ -14,17 +14,20 @@ #define COOLERMASTER_NUM_DEVICES (sizeof(cm_pids) / sizeof(cm_pids[ 0 ])) -enum +struct coolermaster_device { - CM_PID = 0, - CM_INTERFACE = 1 + unsigned int product_id; + unsigned short interface; + unsigned int usage_page; + unsigned int usage; + device_type type; }; -static const unsigned int cm_pids[][4] = -{ // PID, Interface Type - { COOLERMASTER_MP750_XL_PID, 0x00, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Extra Large) - { COOLERMASTER_MP750_MEDIUM_PID, 0x00, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Medium) - { COOLERMASTER_ARGB_PID, 0x00, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller +static const coolermaster_device cm_pids[] = +{ // PID, Interface, Usage_Page, Usage, Device_Type + { COOLERMASTER_MP750_XL_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Extra Large) + { COOLERMASTER_MP750_MEDIUM_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Medium) + { COOLERMASTER_ARGB_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller }; /******************************************************************************************\ @@ -46,14 +49,22 @@ void DetectCoolerMasterControllers(std::vector& rgb_controllers) while(info) { hid_device* dev = NULL; + device_type dev_type; + if(info->vendor_id == COOLERMASTER_VID) { for(unsigned int cm_pid_idx = 0; cm_pid_idx < COOLERMASTER_NUM_DEVICES; cm_pid_idx++) { - if((info->product_id == cm_pids[cm_pid_idx][CM_PID]) - &&(info->interface_number == cm_pids[cm_pid_idx][CM_INTERFACE])) + if((info->product_id == cm_pids[cm_pid_idx].product_id) +#ifdef USE_HID_USAGE + &&(info->usage == cm_pids[cm_pid_idx].usage) //Usage and usage page required to get the correct interface + &&(info->usage_page == cm_pids[cm_pid_idx].usage_page)) +#else + &&(info->interface_number == cm_pids[cm_pid_idx].interface)) +#endif //USE_HID_USAGE { - dev = hid_open_path(info->path); + dev = hid_open_path(info->path); + dev_type = cm_pids[cm_pid_idx].type; break; } } diff --git a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp index b0be5871..83f6bda7 100644 --- a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp +++ b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp @@ -27,16 +27,6 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController Off.color_mode = MODE_COLORS_NONE; modes.push_back(Off); - mode Spectrum; - Spectrum.name = "Spectrum"; - Spectrum.value = CM_ARGB_MODE_SPECTRUM; - Spectrum.flags = MODE_FLAG_HAS_SPEED; - Spectrum.speed_min = CM_ARGB_SPEED_SLOWEST; - Spectrum.speed_max = CM_ARGB_SPEED_FASTEST; - Spectrum.color_mode = MODE_COLORS_NONE; - Spectrum.speed = speed; - modes.push_back(Spectrum); - mode Reload; Reload.name = "Reload"; Reload.value = CM_ARGB_MODE_RELOAD; @@ -99,6 +89,16 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController Demo.speed = speed; modes.push_back(Demo); + mode Spectrum; + Spectrum.name = "Spectrum"; + Spectrum.value = CM_ARGB_MODE_SPECTRUM; + Spectrum.flags = MODE_FLAG_HAS_SPEED; + Spectrum.speed_min = CM_ARGB_SPEED_SLOWEST; + Spectrum.speed_max = CM_ARGB_SPEED_FASTEST; + Spectrum.color_mode = MODE_COLORS_NONE; + Spectrum.speed = speed; + modes.push_back(Spectrum); + mode FillFlow; FillFlow.name = "Fill Flow"; FillFlow.value = CM_ARGB_MODE_FILLFLOW;