From 692cd448ab64565391797b4fb0d054a1927d9550 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 26 Dec 2023 18:57:30 -0600 Subject: [PATCH] Implement resizable effects-only zones in MSI Mystic Light 185 controller --- .../RGBController_MSIMysticLight185.cpp | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/Controllers/MSIMysticLightController/RGBController_MSIMysticLight185.cpp b/Controllers/MSIMysticLightController/RGBController_MSIMysticLight185.cpp index de1b07edd..ccebdaf52 100644 --- a/Controllers/MSIMysticLightController/RGBController_MSIMysticLight185.cpp +++ b/Controllers/MSIMysticLightController/RGBController_MSIMysticLight185.cpp @@ -148,23 +148,37 @@ void RGBController_MSIMysticLight185::SetupZones() zone new_zone; new_zone.name = zd->name; + new_zone.flags = 0; int maxLeds = (int)controller->GetMaxDirectLeds(zd->zone_type); /*-------------------------------------------------*\ | This is a fixed size zone | - | Either this is a board which only supports zone | - | control or this is not an ARGB header zone | \*-------------------------------------------------*/ - if((controller->GetSupportedDirectMode() == MSIMysticLight185Controller::DIRECT_MODE_ZONE_BASED) - || ((zd->zone_type != MSI_ZONE_J_RAINBOW_1) && (zd->zone_type != MSI_ZONE_J_RAINBOW_2) && (zd->zone_type != MSI_ZONE_J_RAINBOW_3) && (zd->zone_type != MSI_ZONE_J_CORSAIR))) + if(((zd->zone_type != MSI_ZONE_J_RAINBOW_1) + && (zd->zone_type != MSI_ZONE_J_RAINBOW_2) + && (zd->zone_type != MSI_ZONE_J_RAINBOW_3) + && (zd->zone_type != MSI_ZONE_J_CORSAIR))) { new_zone.leds_min = maxLeds; new_zone.leds_max = maxLeds; new_zone.leds_count = maxLeds; } /*--------------------------------------------------\ - | This is a resizable zone on a per-LED board | + | This is a resizable zone on a board that does not | + | support per-LED direct mode | + \*-------------------------------------------------*/ + else if(controller->GetSupportedDirectMode() == MSIMysticLight185Controller::DIRECT_MODE_ZONE_BASED) + { + new_zone.leds_min = 0; + new_zone.leds_max = 30;//maxLeds; + new_zone.leds_count = 0; + last_resizable_zone = zd->zone_type; + new_zone.flags |= ZONE_FLAG_RESIZE_EFFECTS_ONLY; + } + /*--------------------------------------------------\ + | This is a resizable zone on a board that does | + | support per-LED direct mode | \*-------------------------------------------------*/ else { @@ -177,7 +191,7 @@ void RGBController_MSIMysticLight185::SetupZones() /*-------------------------------------------------*\ | Determine zone type based on max number of LEDs | \*-------------------------------------------------*/ - if(new_zone.leds_max == 1) + if((new_zone.leds_max == 1) || (new_zone.flags & ZONE_FLAG_RESIZE_EFFECTS_ONLY)) { new_zone.type = ZONE_TYPE_SINGLE; } @@ -200,16 +214,28 @@ void RGBController_MSIMysticLight185::SetupZones() { controller->SetCycleCount(zone_description[zone_idx]->zone_type, zones[zone_idx].leds_count); - for(std::size_t led_idx = 0; led_idx < zones[zone_idx].leds_count; ++led_idx) + if((zones[zone_idx].flags & ZONE_FLAG_RESIZE_EFFECTS_ONLY) == 0) + { + for(std::size_t led_idx = 0; led_idx < zones[zone_idx].leds_count; ++led_idx) + { + led new_led; + + new_led.name = zones[zone_idx].name; + + if(zones[zone_idx].leds_count > 1) + { + new_led.name.append(" LED " + std::to_string(led_idx + 1)); + } + + new_led.value = zone_description[zone_idx]->zone_type; + leds.push_back(new_led); + } + } + else if(zones[zone_idx].leds_count > 0) { led new_led; - new_led.name = zones[zone_idx].name + " LED "; - - if(zones[zone_idx].leds_count > 1) - { - new_led.name.append(std::to_string(led_idx + 1)); - } + new_led.name = zones[zone_idx].name; new_led.value = zone_description[zone_idx]->zone_type; leds.push_back(new_led);