diff --git a/Controllers/CoolerMasterController/CMARGBcontroller.cpp b/Controllers/CoolerMasterController/CMARGBcontroller.cpp index 39581b981..022c9b3b3 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.cpp +++ b/Controllers/CoolerMasterController/CMARGBcontroller.cpp @@ -19,7 +19,7 @@ static unsigned char argb_colour_index_data[2][2][2] = static unsigned char argb_mode_data[2][9] = { - { 0x05, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01 }, //12v RGB Mode values + { 0x05, 0x01, 0x02, 0x03, 0x04, 0x01, 0x01, 0x01, 0x01 }, //12v RGB Mode values { 0x0A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, 0x09 } //5v ARGB Mode values }; @@ -44,6 +44,8 @@ CMARGBController::CMARGBController(hid_device* dev_handle, char *_path, unsigned hid_get_serial_number_string(dev, tmpName, szTemp); wName = std::wstring(tmpName); serial = std::string(wName.begin(), wName.end()); + + GetStatus(); } CMARGBController::~CMARGBController() @@ -51,6 +53,32 @@ CMARGBController::~CMARGBController() hid_close(dev); } +void CMARGBController::GetStatus() +{ + unsigned char buffer[0x40] = { 0x00 }; + int buffer_size = (sizeof(buffer) / sizeof(buffer[0])); + int header = zone_index - 1; + + /*buffer[CM_ARGB_REPORT_BYTE] = 0x80; + buffer[CM_ARGB_COMMAND_BYTE] = 0x01; + buffer[CM_ARGB_FUNCTION_BYTE] = 0x01; + hid_write(dev, buffer, buffer_size); + + buffer[CM_ARGB_COMMAND_BYTE] = 0x0b; + buffer[CM_ARGB_FUNCTION_BYTE] = 0x03; + buffer[CM_ARGB_ZONE_BYTE] = 0xFF; + hid_write(dev, buffer, buffer_size); + + int i = 0; + do{ + hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); + i++; + }while( (i < 4) ); + + current_mode = argb_mode_data[1][buffer[4]]; + current_speed = buffer[5];*/ +} + std::string CMARGBController::GetDeviceName() { return device_name; @@ -146,21 +174,21 @@ void CMARGBController::SendUpdate() { unsigned char buffer[0x40] = { 0x00 }; int buffer_size = (sizeof(buffer) / sizeof(buffer[0])); - bool boolARGB_header = true; + bool boolARGB_header = argb_header_data[zone_index].digital; 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] = boolPassthru ? 0x02 : 0x01; + buffer[CM_ARGB_FUNCTION_BYTE] = boolPassthru ? 0x02 : ( boolARGB_header ? 0x03 : 0x01); hid_write(dev, buffer, buffer_size); - //hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); if ( boolPassthru ) { - //If setting pass thru mode send the init packet again - hid_write(dev, buffer, buffer_size); - hid_write(dev, buffer, buffer_size); + buffer[CM_ARGB_COMMAND_BYTE] = 0x0b; //Testing + buffer[CM_ARGB_FUNCTION_BYTE] = 0x03; //Testing + hid_write(dev, buffer, buffer_size); + hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT); } else if ( boolARGB_header ) { @@ -176,7 +204,13 @@ void CMARGBController::SendUpdate() } else { - //Todo: 12V Analogue Header + buffer[CM_ARGB_COMMAND_BYTE] = 0x04; //ARGB sends 0x0b (1011) RGB sends 0x04 (0100) + buffer[CM_ARGB_MODE_BYTE + CM_RGB_OFFSET] = argb_mode_data[0][current_mode]; + buffer[CM_ARGB_COLOUR_INDEX_BYTE + CM_RGB_OFFSET] = GetColourIndex( current_red, current_green, current_blue ); + buffer[CM_ARGB_SPEED_BYTE + CM_RGB_OFFSET] = current_speed; + + 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 4f39ede50..0fb97187c 100644 --- a/Controllers/CoolerMasterController/CMARGBcontroller.h +++ b/Controllers/CoolerMasterController/CMARGBcontroller.h @@ -6,12 +6,7 @@ | Chris M (Dr_No) 10th Oct 2020 | | | | Simple RGB device with 5 modes | -| BYTE0 = Mode 0x01 thru 0x05 | -| BYTE1 = ?? Must be set to 0x04 for colour modes otherwise ignored | -| BYTE2 = Colour Modes: RED else Cycle SPEED | -| BYTE3 = Colour Modes: GREEN else ignored | -| BYTE4 = Colour Modes: BLUE else ignored | -| BYTE5 = Colour Modes: SPEED else ignored | +| | \*-------------------------------------------------------------------*/ #include @@ -25,6 +20,7 @@ #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_RGB_OFFSET -2 #define HID_MAX_STR 255 enum @@ -42,39 +38,28 @@ struct argb_headers { const char* name; unsigned char header; + bool digital; unsigned int count; }; -static argb_headers argb_header_data[5] = +static argb_headers argb_header_data[6] = { - { "RGB Header", 0xFF, 1 }, - { "Digital ARGB1", 0x01, 12 }, - { "Digital ARGB2", 0x02, 12 }, - { "Digital ARGB3", 0x04, 12 }, - { "Digital ARGB4", 0x08, 12 } + { "RGB Header", 0xFF, false, 1 }, + { "Digital ARGB1", 0x01, true, 12 }, + { "Digital ARGB2", 0x02, true, 12 }, + { "Digital ARGB3", 0x04, true, 12 }, + { "Digital ARGB4", 0x08, true, 12 }, + { "All Digital ARGB", 0xFF, true, 12 } }; -// ARGB Modes -/* - * 01 Spectrum (random) - * 02 Reload - * 03 Recoil - * 04 Breathing - * 05 Refill - * 06 Demo Mode (random) - * 08 Fill Flow (random) - * 09 Rainbow (random) - * 0a Turn Off - */ - -// RGB Modes -/* - * 01 Colour Cycle - * 02 Flash - * 03 Breathing - * 04 Motherboard (Pass Thru) - * 05 Turn Off - */ +enum +{ + CM_RGB_MODE_OFF = 0, //Turn off + CM_RGB_MODE_COLOUR_CYCLE = 1, //Colour Cycle + CM_RGB_MODE_FLASH = 2, //Flash + CM_RGB_MODE_BREATHING = 3, //Breathing + CM_RGB_MODE_PASSTHRU = 4 //Motherboard Pass Thru Mode +}; enum { @@ -87,8 +72,8 @@ enum 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_DIRECT = -1, //Direct Led Control - CM_ARGB_MODE_PASSTHRU = -2 //Motherboard Mode + CM_ARGB_MODE_DIRECT = 0xFE, //Direct Led Control + CM_ARGB_MODE_PASSTHRU = 0xFF //Motherboard Pass Thru Mode }; enum diff --git a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp index 83f6bda73..fe79cc4ae 100644 --- a/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp +++ b/Controllers/CoolerMasterController/RGBController_CMARGBController.cpp @@ -21,109 +21,162 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController serial = cmargb->GetSerial(); location = cmargb->GetLocation(); - mode Off; - Off.name = "Turn Off"; - Off.value = CM_ARGB_MODE_OFF; - Off.color_mode = MODE_COLORS_NONE; - modes.push_back(Off); + if ( argb_header_data[cmargb->GetZoneIndex()].digital) + { + mode Off; + Off.name = "Turn Off"; + Off.value = CM_ARGB_MODE_OFF; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); - mode Reload; - Reload.name = "Reload"; - Reload.value = CM_ARGB_MODE_RELOAD; - 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_MODE_SPECIFIC; - Reload.speed = speed; - modes.push_back(Reload); + mode Reload; + Reload.name = "Reload"; + Reload.value = CM_ARGB_MODE_RELOAD; + Reload.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_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_RANDOM; + 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_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_MODE_SPECIFIC; - Recoil.speed = speed; - modes.push_back(Recoil); + mode Recoil; + Recoil.name = "Recoil"; + Recoil.value = CM_ARGB_MODE_RECOIL; + Recoil.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_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_RANDOM; + 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_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_MODE_SPECIFIC; - Breathing.speed = speed; - modes.push_back(Breathing); + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = CM_ARGB_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_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_RANDOM; + Breathing.speed = speed; + modes.push_back(Breathing); - mode Refill; - Refill.name = "Refill"; - Refill.value = CM_ARGB_MODE_REFILL; - 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_MODE_SPECIFIC; - Refill.speed = speed; - modes.push_back(Refill); + mode Refill; + Refill.name = "Refill"; + Refill.value = CM_ARGB_MODE_REFILL; + Refill.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_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_RANDOM; + 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 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 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 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; - 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 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 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); + mode PassThru; + PassThru.name = "Pass Thru"; + PassThru.value = CM_ARGB_MODE_PASSTHRU; + PassThru.color_mode = MODE_COLORS_NONE; + modes.push_back(PassThru); + } + else + { + mode Off; + Off.name = "Turn Off"; + Off.value = CM_RGB_MODE_OFF; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Breathing; + Breathing.name = "Breathing"; + Breathing.value = CM_RGB_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Breathing.colors_min = 1; + Breathing.colors_max = 1; + Breathing.colors.resize(Breathing.colors_max); + Breathing.speed_min = CM_ARGB_SPEED_SLOWEST; + Breathing.speed_max = CM_ARGB_SPEED_FASTEST; + Breathing.color_mode = MODE_COLORS_RANDOM; + Breathing.speed = speed; + modes.push_back(Breathing); + + mode Flash; + Breathing.name = "Flash"; + Breathing.value = CM_RGB_MODE_FLASH; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Breathing.colors_min = 1; + Breathing.colors_max = 1; + Breathing.colors.resize(Breathing.colors_max); + Breathing.speed_min = CM_ARGB_SPEED_SLOWEST; + Breathing.speed_max = CM_ARGB_SPEED_FASTEST; + Breathing.color_mode = MODE_COLORS_RANDOM; + Breathing.speed = speed; + modes.push_back(Breathing); + + mode ColourCycle; + ColourCycle.name = "Colour Cycle"; + ColourCycle.value = CM_RGB_MODE_COLOUR_CYCLE; + ColourCycle.flags = MODE_FLAG_HAS_SPEED; + ColourCycle.speed_min = CM_ARGB_SPEED_SLOWEST; + ColourCycle.speed_max = CM_ARGB_SPEED_FASTEST; + ColourCycle.color_mode = MODE_COLORS_NONE; + ColourCycle.speed = speed; + modes.push_back(ColourCycle); + + mode PassThru; + PassThru.name = "Pass Thru"; + PassThru.value = CM_RGB_MODE_PASSTHRU; + PassThru.color_mode = MODE_COLORS_NONE; + modes.push_back(PassThru); + } Init_Controller(); //Only processed on first run SetupZones(); @@ -247,6 +300,10 @@ void RGBController_CMARGBController::DeviceUpdateMode() unsigned char blu = RGBGetBValue(modes[active_mode].colors[0]); cmargb->SetColor(red, grn, blu); } + else + { + cmargb->SetColor(0, 0, 0); //If the mode is not colour specific then set colour to black for the random index + } cmargb->SetMode( modes[active_mode].value, modes[active_mode].speed ); } }