From a9fca215446165c7774b5dfa557af013af8b1f57 Mon Sep 17 00:00:00 2001 From: morg Date: Sun, 7 May 2023 00:22:06 +0000 Subject: [PATCH] Add settings to corsair dominator detection to control the RAM model --- .../CorsairDominatorPlatinumController.cpp | 16 ++-- .../CorsairDominatorPlatinumController.h | 14 +-- ...rsairDominatorPlatinumControllerDetect.cpp | 93 ++++++++++++++++--- ...RGBController_CorsairDominatorPlatinum.cpp | 13 ++- 4 files changed, 99 insertions(+), 37 deletions(-) diff --git a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.cpp b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.cpp index af421e374..223b21150 100644 --- a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.cpp +++ b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.cpp @@ -13,22 +13,22 @@ using namespace std::chrono_literals; -CorsairDominatorPlatinumController::CorsairDominatorPlatinumController(i2c_smbus_interface *bus, corsair_dev_id dev) +CorsairDominatorPlatinumController::CorsairDominatorPlatinumController(i2c_smbus_interface *bus, corsair_dev_id dev, unsigned int leds_count) { - this->bus = bus; - this->dev = dev; + this->bus = bus; + this->dev = dev; + this->leds_count = leds_count; led_data[0] = 0xc; } CorsairDominatorPlatinumController::~CorsairDominatorPlatinumController() { - } -std::string CorsairDominatorPlatinumController::GetDeviceName() +unsigned int CorsairDominatorPlatinumController::GetLEDCount() { - return "Corsair Dominator Platinum RGB"; + return leds_count; } std::string CorsairDominatorPlatinumController::GetDeviceLocation() @@ -48,7 +48,7 @@ void CorsairDominatorPlatinumController::SetAllColors unsigned char blue ) { - for(unsigned int led = 0; led < CORSAIR_PLAT_LED_COUNT; led++) + for(unsigned int led = 0; led < leds_count; led++) { SetLEDColor(led, red, green, blue); } @@ -62,7 +62,7 @@ void CorsairDominatorPlatinumController::SetLEDColor unsigned char blue ) { - if(led >= CORSAIR_PLAT_LED_COUNT) + if(led >= leds_count) { return; } diff --git a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.h b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.h index 6119cbfcf..82ee1a5c4 100644 --- a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.h +++ b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumController.h @@ -10,35 +10,31 @@ #include #include "i2c_smbus.h" +#define CORSAIR_DOMINATOR_PLATINUM_DATA_SIZE 38 #pragma once typedef unsigned char corsair_dev_id; -#define CORSAIR_DOMINATOR_PLATINUM_NAME "Corsair Dominator Platinum" - class CorsairDominatorPlatinumController { public: - CorsairDominatorPlatinumController(i2c_smbus_interface *bus, corsair_dev_id dev); + CorsairDominatorPlatinumController(i2c_smbus_interface *bus, corsair_dev_id dev, unsigned int leds_count); ~CorsairDominatorPlatinumController(); - std::string GetDeviceName(); std::string GetDeviceLocation(); + unsigned int GetLEDCount(); - size_t GetLEDCount() { return CORSAIR_PLAT_LED_COUNT; } void SetAllColors(unsigned char red, unsigned char green, unsigned char blue); void SetLEDColor(unsigned int led, unsigned char red, unsigned char green, unsigned char blue); void ApplyColors(); bool WaitReady(); private: - static constexpr size_t CORSAIR_PLAT_LED_COUNT = 12; - - unsigned char led_data[CORSAIR_PLAT_LED_COUNT * 3 + 2]; - + unsigned char led_data[CORSAIR_DOMINATOR_PLATINUM_DATA_SIZE]; i2c_smbus_interface* bus; corsair_dev_id dev; + unsigned int leds_count; static unsigned char crc8(unsigned char init, unsigned char poly, unsigned char *data, unsigned char len); }; diff --git a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumControllerDetect.cpp b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumControllerDetect.cpp index d4c2d95ee..57bf8cb2b 100644 --- a/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumControllerDetect.cpp +++ b/Controllers/CorsairDominatorPlatinumController/CorsairDominatorPlatinumControllerDetect.cpp @@ -11,6 +11,40 @@ using namespace std::chrono_literals; +json corsair_dominator_models = +{ + { + "CMT", + { + {"name", "Corsair Dominator Platinum"}, + {"leds", 12} + } + }, + { + "CMH", + { + {"name", "Corsair Vengeance Pro SL"}, + {"leds", 10} + } + }, + { + "CMN", + { + {"name", "Corsair Vengeance RGB RT"}, + {"leds", 10} + } + }, + { + "CMG", + { + {"name", "Corsair Vengeance RGB RS"}, + {"leds", 6} + } + } +}; + +#define CORSAIR_DOMINATOR_PLATINUM_NAME "Corsair Dominator Platinum" + bool TestForCorsairDominatorPlatinumController(i2c_smbus_interface *bus, unsigned char address) { int res = bus->i2c_smbus_write_quick(address, I2C_SMBUS_WRITE); @@ -55,32 +89,65 @@ bool TestForCorsairDominatorPlatinumController(i2c_smbus_interface *bus, unsigne void DetectCorsairDominatorPlatinumControllers(std::vector &busses) { + SettingsManager* settings_manager = ResourceManager::get()->GetSettingsManager(); + + json corsair_dominator_settings = settings_manager->GetSettings("CorsairDominatorSettings"); + + if(!corsair_dominator_settings.contains("model")) + { + // Set default value + corsair_dominator_settings["model"] = "CMT"; + settings_manager->SetSettings("CorsairDominatorSettings", corsair_dominator_settings); + settings_manager->SaveSettings(); + } + + std::string model = corsair_dominator_settings["model"]; + for(unsigned int bus = 0; bus < busses.size(); bus++) { IF_DRAM_SMBUS(busses[bus]->pci_vendor, busses[bus]->pci_device) { LOG_DEBUG("[%s] Testing bus %d", CORSAIR_DOMINATOR_PLATINUM_NAME, bus); + std::vector addresses; + for(unsigned char addr = 0x58; addr <= 0x5F; addr++) { - if(TestForCorsairDominatorPlatinumController(busses[bus], addr)) - { - CorsairDominatorPlatinumController* new_controller = new CorsairDominatorPlatinumController(busses[bus], addr); - RGBController_CorsairDominatorPlatinum* new_rgbcontroller = new RGBController_CorsairDominatorPlatinum(new_controller); - - ResourceManager::get()->RegisterRGBController(new_rgbcontroller); - } - std::this_thread::sleep_for(10ms); + addresses.push_back(addr); } + for(unsigned char addr = 0x18; addr <= 0x1F; addr++) + { + addresses.push_back(addr); + } + + for(unsigned char addr : addresses) { if(TestForCorsairDominatorPlatinumController(busses[bus], addr)) { - CorsairDominatorPlatinumController* new_controller = new CorsairDominatorPlatinumController(busses[bus], addr); - RGBController_CorsairDominatorPlatinum* new_rgbcontroller = new RGBController_CorsairDominatorPlatinum(new_controller); - - ResourceManager::get()->RegisterRGBController(new_rgbcontroller); + unsigned int leds; + std::string name; + + if(corsair_dominator_models.contains(model)) + { + leds = corsair_dominator_models[model]["leds"]; + name = corsair_dominator_models[model]["name"]; + } + else + { + leds = corsair_dominator_models["CMT"]["leds"]; + name = corsair_dominator_models["CMT"]["name"]; + } + + LOG_DEBUG("[%s] Model: %s, Leds: %d", CORSAIR_DOMINATOR_PLATINUM_NAME, name.c_str(), leds); + + CorsairDominatorPlatinumController* controller = new CorsairDominatorPlatinumController(busses[bus], addr, leds); + RGBController_CorsairDominatorPlatinum* rgbcontroller = new RGBController_CorsairDominatorPlatinum(controller); + rgbcontroller->name = name; + + ResourceManager::get()->RegisterRGBController(rgbcontroller); } + std::this_thread::sleep_for(10ms); } } @@ -91,4 +158,4 @@ void DetectCorsairDominatorPlatinumControllers(std::vectorGetDeviceName(); vendor = "Corsair"; type = DEVICE_TYPE_DRAM; - description = "Corsair Dominator Platinum RGB Device"; + description = "Corsair RAM RGB Device"; location = controller->GetDeviceLocation(); mode Direct; @@ -55,7 +54,7 @@ void RGBController_CorsairDominatorPlatinum::SetupZones() | Set up zone | \*---------------------------------------------------------*/ zone new_zone; - new_zone.name = "Corsair Platinum Zone"; + new_zone.name = "Corsair RAM Zone"; new_zone.type = ZONE_TYPE_LINEAR; new_zone.leds_min = controller->GetLEDCount(); new_zone.leds_max = controller->GetLEDCount(); @@ -68,10 +67,10 @@ void RGBController_CorsairDominatorPlatinum::SetupZones() \*---------------------------------------------------------*/ for(std::size_t led_idx = 0; led_idx < zones[0].leds_count; led_idx++) { - led *new_led = new led(); - new_led->name = "Corsair Platinum LED "; - new_led->name.append(std::to_string(led_idx)); - leds.push_back(*new_led); + led new_led; + new_led.name = "Corsair RAM LED "; + new_led.name.append(std::to_string(led_idx)); + leds.push_back(new_led); } SetupColors();