diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.cpp b/Controllers/CoolerMasterController/CMARGBcontroller.cpp index a527dbcc..01d8e2cc 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.cpp +++ b/Controllers/CoolerMasterController/CMARGBcontroller.cpp @@ -10,11 +10,11 @@ #include "CMARGBcontroller.h" static unsigned char argb_colour_index_data[2][2][2] = -{ //R0 R1 - { { 0x00, 0x01 }, //G0 B0 - { 0x02, 0x04 }, }, //G1 B0 - { { 0x03, 0x05 }, //G0 B1 - { 0x06, 0x07 }, } //G1 B1 +{ //B0 B1 + { { 0x00, 0x03 }, //G0 R0 + { 0x02, 0x06 }, }, //G1 R0 + { { 0x01, 0x05 }, //G0 R1 + { 0x04, 0x07 }, } //G1 R1 }; static unsigned char argb_mode_data[2][9] = @@ -31,6 +31,7 @@ CMARGBController::CMARGBController(hid_device* dev_handle, char *_path, unsigned dev = dev_handle; location = _path; zone_index = _zone_idx; + current_speed = CM_ARGB_SPEED_NORMAL; hid_get_manufacturer_string(dev, tmpName, szTemp); std::wstring wName = std::wstring(tmpName); @@ -117,10 +118,11 @@ unsigned char CMARGBController::GetColourIndex(unsigned char red, unsigned char //The index can be calculated by normalising the input colour, rounding those values //and using them as the indicies of a 3d array containing the correct index unsigned int divisor = GetLargestColour( red, green, blue); - unsigned int r = round( red / divisor )+1; - unsigned int g = round( green / divisor )+1; - unsigned int b = round( blue / divisor )+1; - return argb_colour_index_data[r][g][b]; + unsigned int r = round( red / divisor ); + unsigned int g = round( green / divisor ); + unsigned int b = round( blue / divisor ); + unsigned char idx = argb_colour_index_data[r][g][b]; + return idx; } void CMARGBController::SetMode(unsigned char mode, unsigned char speed) @@ -145,14 +147,15 @@ void CMARGBController::SendUpdate() unsigned char buffer[0x40] = { 0x00 }; int buffer_size = (sizeof(buffer) / sizeof(buffer[0])); bool boolARGB_header = true; + bool boolPassthru = ( current_mode == CM_ARGB_MODE_PASSTHRU ); buffer[CM_ARGB_REPORT_BYTE] = 0x80; buffer[CM_ARGB_COMMAND_BYTE] = 0x01; - buffer[CM_ARGB_FUNCTION_BYTE] = 0x01; + 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); - if ( boolARGB_header ) + if ( boolARGB_header & !boolPassthru ) { 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 @@ -160,12 +163,13 @@ void CMARGBController::SendUpdate() 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; + + hid_write(dev, buffer, buffer_size); + hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); } else { //Todo: 12V Analogue Header } - hid_write(dev, buffer, buffer_size); - hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); } diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.h b/Controllers/CoolerMasterController/CMARGBcontroller.h index 9aa1fdb2..d7a7100f 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.h +++ b/Controllers/CoolerMasterController/CMARGBcontroller.h @@ -49,10 +49,10 @@ struct argb_headers static argb_headers argb_header_data[5] = { { "RGB Header", 0xFF, 1 }, - { "Digital ARGB1", 0x01, 0 }, - { "Digital ARGB2", 0x02, 0 }, - { "Digital ARGB3", 0x04, 0 }, - { "Digital ARGB4", 0x08, 0 } + { "Digital ARGB1", 0x01, 12 }, + { "Digital ARGB2", 0x02, 12 }, + { "Digital ARGB3", 0x04, 12 }, + { "Digital ARGB4", 0x08, 12 } }; // ARGB Modes @@ -87,7 +87,9 @@ enum 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 + CM_ARGB_MODE_RAINBOW = 8, //Rainbow Mode + CM_ARGB_MODE_DIRECT = -1, //Direct Led Control + CM_ARGB_MODE_PASSTHRU = -2 //Motherboard Mode }; enum diff --git a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp index 1ff425f2..b0be5871 100644 --- a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp +++ b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp @@ -24,7 +24,6 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController mode Off; Off.name = "Turn Off"; Off.value = CM_ARGB_MODE_OFF; - Off.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; Off.color_mode = MODE_COLORS_NONE; modes.push_back(Off); @@ -41,43 +40,91 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController mode Reload; Reload.name = "Reload"; Reload.value = CM_ARGB_MODE_RELOAD; - Reload.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Reload.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Reload.colors_min = 1; + Reload.colors_max = 1; + Reload.colors.resize(Reload.colors_max); Reload.speed_min = CM_ARGB_SPEED_SLOWEST; Reload.speed_max = CM_ARGB_SPEED_FASTEST; - Reload.color_mode = MODE_COLORS_PER_LED; + Reload.color_mode = MODE_COLORS_MODE_SPECIFIC; Reload.speed = speed; modes.push_back(Reload); mode Recoil; Recoil.name = "Recoil"; Recoil.value = CM_ARGB_MODE_RECOIL; - Recoil.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Recoil.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Recoil.colors_min = 1; + Recoil.colors_max = 1; + Recoil.colors.resize(Reload.colors_max); Recoil.speed_min = CM_ARGB_SPEED_SLOWEST; Recoil.speed_max = CM_ARGB_SPEED_FASTEST; - Recoil.color_mode = MODE_COLORS_PER_LED; + Recoil.color_mode = MODE_COLORS_MODE_SPECIFIC; Recoil.speed = speed; modes.push_back(Recoil); mode Breathing; Breathing.name = "Breathing"; Breathing.value = CM_ARGB_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Breathing.colors_min = 1; + Breathing.colors_max = 1; + Breathing.colors.resize(Reload.colors_max); Breathing.speed_min = CM_ARGB_SPEED_SLOWEST; Breathing.speed_max = CM_ARGB_SPEED_FASTEST; - Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; Breathing.speed = speed; modes.push_back(Breathing); mode Refill; Refill.name = "Refill"; Refill.value = CM_ARGB_MODE_REFILL; - Refill.flags = MODE_FLAG_HAS_SPEED; + Refill.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Refill.colors_min = 1; + Refill.colors_max = 1; + Refill.colors.resize(Reload.colors_max); Refill.speed_min = CM_ARGB_SPEED_SLOWEST; Refill.speed_max = CM_ARGB_SPEED_FASTEST; - Refill.color_mode = MODE_COLORS_NONE; + Refill.color_mode = MODE_COLORS_MODE_SPECIFIC; Refill.speed = speed; modes.push_back(Refill); + mode Demo; + Demo.name = "Demo"; + Demo.value = CM_ARGB_MODE_DEMO; + Demo.flags = MODE_FLAG_HAS_SPEED; + Demo.speed_min = CM_ARGB_SPEED_SLOWEST; + Demo.speed_max = CM_ARGB_SPEED_FASTEST; + Demo.color_mode = MODE_COLORS_NONE; + Demo.speed = speed; + modes.push_back(Demo); + + mode FillFlow; + FillFlow.name = "Fill Flow"; + FillFlow.value = CM_ARGB_MODE_FILLFLOW; + FillFlow.flags = MODE_FLAG_HAS_SPEED; + FillFlow.speed_min = CM_ARGB_SPEED_SLOWEST; + FillFlow.speed_max = CM_ARGB_SPEED_FASTEST; + FillFlow.color_mode = MODE_COLORS_NONE; + FillFlow.speed = speed; + modes.push_back(FillFlow); + + mode Rainbow; + Rainbow.name = "Rainbow"; + Rainbow.value = CM_ARGB_MODE_RAINBOW; + Rainbow.flags = MODE_FLAG_HAS_SPEED; + Rainbow.speed_min = CM_ARGB_SPEED_SLOWEST; + Rainbow.speed_max = CM_ARGB_SPEED_FASTEST; + Rainbow.color_mode = MODE_COLORS_NONE; + Rainbow.speed = speed; + modes.push_back(Rainbow); + + mode PassThru; + PassThru.name = "Pass Thru"; + PassThru.value = CM_ARGB_MODE_PASSTHRU; + PassThru.color_mode = MODE_COLORS_NONE; + modes.push_back(PassThru); + Init_Controller(); //Only processed on first run SetupZones(); //active_mode = cmargb->GetMode(); @@ -187,5 +234,19 @@ void RGBController_CMARGBController::SetCustomMode() void RGBController_CMARGBController::DeviceUpdateMode() { - cmargb->SetMode( modes[active_mode].value, modes[active_mode].speed ); + if ( active_mode == CM_ARGB_MODE_DIRECT ) + { + //TODO + } + else + { + if( modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC ) + { + unsigned char red = RGBGetRValue(modes[active_mode].colors[0]); + unsigned char grn = RGBGetGValue(modes[active_mode].colors[0]); + unsigned char blu = RGBGetBValue(modes[active_mode].colors[0]); + cmargb->SetColor(red, grn, blu); + } + cmargb->SetMode( modes[active_mode].value, modes[active_mode].speed ); + } }