From 90002d9eed38271673ef87bec8304ab1786ed614 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 28 Oct 2020 16:34:50 +1100 Subject: [PATCH] CM ARGB Controller now working for some modes * Code SegFaults after a few change packets are sent --- .../CMARGBcontroller.cpp | 24 ++++++++++++------- .../CoolerMasterController/CMARGBcontroller.h | 21 ++++++++-------- .../CoolerMasterControllerDetect.cpp | 2 +- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.cpp b/Controllers/CoolerMasterController/CMARGBcontroller.cpp index 82835c80..a527dbcc 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.cpp +++ b/Controllers/CoolerMasterController/CMARGBcontroller.cpp @@ -147,17 +147,25 @@ void CMARGBController::SendUpdate() bool boolARGB_header = true; buffer[CM_ARGB_REPORT_BYTE] = 0x80; buffer[CM_ARGB_COMMAND_BYTE] = 0x01; - buffer[CM_ARGB_MODE_BYTE] = 0x01; + buffer[CM_ARGB_FUNCTION_BYTE] = 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); - buffer[CM_ARGB_COMMAND_BYTE] = (boolARGB_header) ? 0x0b : 0x04; //ARGB sends 0x0b (1011) RGB sends 0x04 (0100) - buffer[CM_ARGB_MODE_BYTE] = current_mode; - buffer[CM_ARGB_ZONE_BYTE] = argb_header_data[zone_index].header; - buffer[CM_ARGB_COLOUR_INDEX_BYTE] = GetColourIndex( current_red, current_green, current_blue ); - buffer[CM_ARGB_SPEED_BYTE] = current_speed; + 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 + buffer[CM_ARGB_ZONE_BYTE] = argb_header_data[zone_index].header; + buffer[CM_ARGB_MODE_BYTE] = argb_mode_data[1][current_mode]; + buffer[CM_ARGB_COLOUR_INDEX_BYTE] = GetColourIndex( current_red, current_green, current_blue ); + buffer[CM_ARGB_SPEED_BYTE] = current_speed; + } + else + { + //Todo: 12V Analogue Header + } 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); } diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.h b/Controllers/CoolerMasterController/CMARGBcontroller.h index 84d52033..9aa1fdb2 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.h +++ b/Controllers/CoolerMasterController/CMARGBcontroller.h @@ -32,8 +32,9 @@ enum { CM_ARGB_REPORT_BYTE = 0, CM_ARGB_COMMAND_BYTE = 1, - CM_ARGB_MODE_BYTE = 2, + 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 }; @@ -78,15 +79,15 @@ static argb_headers argb_header_data[5] = enum { - CM_ARGB_MODE_OFF = 1, //Turn off - CM_ARGB_MODE_SPECTRUM = 2, //Spectrum Mode - CM_ARGB_MODE_RELOAD = 3, //Reload Mode - CM_ARGB_MODE_RECOIL = 4, //Recoil Mode - CM_ARGB_MODE_BREATHING = 5, //Breathing Mode - CM_ARGB_MODE_REFILL = 6, //Refill Mode - CM_ARGB_MODE_DEMO = 7, //Demo Mode - CM_ARGB_MODE_FILLFLOW = 8, //Fill Flow Mode - CM_ARGB_MODE_RAINBOW = 9 //Rainbow Mode + CM_ARGB_MODE_OFF = 0, //Turn off + CM_ARGB_MODE_SPECTRUM = 1, //Spectrum Mode + CM_ARGB_MODE_RELOAD = 2, //Reload Mode + CM_ARGB_MODE_RECOIL = 3, //Recoil Mode + CM_ARGB_MODE_BREATHING = 4, //Breathing Mode + CM_ARGB_MODE_REFILL = 5, //Refill Mode + CM_ARGB_MODE_DEMO = 6, //Demo Mode + CM_ARGB_MODE_FILLFLOW = 7, //Fill Flow Mode + CM_ARGB_MODE_RAINBOW = 8 //Rainbow Mode }; enum diff --git a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp index 96b24765..c21888dc 100644 --- a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp +++ b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp @@ -24,7 +24,7 @@ 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, 0x01, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller + { COOLERMASTER_ARGB_PID, 0x00, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller }; /******************************************************************************************\