/*---------------------------------------------------------*\
| RGBController_LianLiGAIITrinity.cpp                       |
|                                                           |
|   RGBController for Lian Li GAII Trinity                  |
|                                                           |
|   Michael Losert                              27 Oct 2023 |
|                                                           |
|   This file is part of the OpenRGB project                |
|   SPDX-License-Identifier: GPL-2.0-or-later               |
\*---------------------------------------------------------*/

#include <string>
#include "RGBController_LianLiGAIITrinity.h"

/**------------------------------------------------------------------*\
    @name Lian Li GAII Trinity
    @type USB
    @save :x:
    @direct :white_check_mark:
    @effects :white_check_mark:
    @detectors DetectLianLiGAIITrinity
    @comment
\*-------------------------------------------------------------------*/

RGBController_LianLiGAIITrinity::RGBController_LianLiGAIITrinity(LianLiGAIITrinityController* controller_ptr)
{
    controller  = controller_ptr;

    name        = "Lian Li GAII Trinity";
    vendor      = "Lian Li";
    type        = DEVICE_TYPE_COOLER;
    description = "Lian Li Galahad II Trinity AIO";
    location    = controller->GetLocation();

    LianLiGAIITrinityController::GAII_Info controllerInfo = controller->GetControllerInfo();
    version     = controllerInfo.version;
    serial      = controllerInfo.serial;

    mode Rainbow;
    Rainbow.name                 = "Rainbow";
    Rainbow.value                = LianLiGAIITrinityController::GAII_Modes::M_RAINBOW;
    Rainbow.flags                = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    Rainbow.color_mode           = MODE_COLORS_RANDOM;
    Rainbow.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Rainbow.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Rainbow.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    Rainbow.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Rainbow.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Rainbow.speed                = LianLiGAIITrinityController::GAII_Speed::S_FAST;
    Rainbow.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(Rainbow);

    mode RainbowMorph;
    RainbowMorph.name                 = "Rainbow Morph";
    RainbowMorph.value                = LianLiGAIITrinityController::GAII_Modes::M_RAINBOW_MORPH;
    RainbowMorph.flags                = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    RainbowMorph.color_mode           = MODE_COLORS_RANDOM;
    RainbowMorph.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    RainbowMorph.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    RainbowMorph.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    RainbowMorph.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    RainbowMorph.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    RainbowMorph.speed                = LianLiGAIITrinityController::GAII_Speed::S_SLOW;
    modes.push_back(RainbowMorph);

    mode Direct;
    Direct.name                 = "Direct";
    Direct.value                = LianLiGAIITrinityController::GAII_Modes::M_STATIC_COLOR;
    Direct.flags                = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
    Direct.color_mode           = MODE_COLORS_PER_LED;
    Direct.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Direct.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Direct.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_50;
    modes.push_back(Direct);

    mode BreathingColor;
    BreathingColor.name                 = "Breathing Color";
    BreathingColor.value                = LianLiGAIITrinityController::GAII_Modes::M_BREATHING_COLOR;
    BreathingColor.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    BreathingColor.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    BreathingColor.colors.resize(2);
    BreathingColor.colors[0]            = ToRGBColor(255, 255, 255);
    BreathingColor.colors[1]            = ToRGBColor(255, 0, 0);
    BreathingColor.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    BreathingColor.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    BreathingColor.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_100;
    BreathingColor.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    BreathingColor.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    BreathingColor.speed                = LianLiGAIITrinityController::GAII_Speed::S_MODERATE;
    modes.push_back(BreathingColor);

    mode Runway;
    Runway.name                 = "Runway";
    Runway.value                = LianLiGAIITrinityController::GAII_Modes::M_RUNWAY;
    Runway.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    Runway.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    Runway.colors.resize(2);
    Runway.colors[0]            = ToRGBColor(0, 0, 0);
    Runway.colors[1]            = ToRGBColor(255, 255, 255);
    Runway.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Runway.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Runway.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_50;
    Runway.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Runway.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Runway.speed                = LianLiGAIITrinityController::GAII_Speed::S_FAST;
    modes.push_back(Runway);

    mode Meteor;
    Meteor.name                 = "Meteor";
    Meteor.value                = LianLiGAIITrinityController::GAII_Modes::M_METEOR;
    Meteor.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    Meteor.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    Meteor.colors.resize(4);
    Meteor.colors[0]            = ToRGBColor(50, 50, 50);
    Meteor.colors[1]            = ToRGBColor(100, 100, 100);
    Meteor.colors[2]            = ToRGBColor(180, 180, 180);
    Meteor.colors[3]            = ToRGBColor(255, 0, 0);
    Meteor.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Meteor.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Meteor.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Meteor.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Meteor.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Meteor.speed                = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Meteor.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(Meteor);

    mode Vortex;
    Vortex.name                 = "Vortex";
    Vortex.value                = LianLiGAIITrinityController::GAII_Modes::M_VORTEX;
    Vortex.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    Vortex.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    Vortex.colors.resize(4);
    Vortex.colors[0]            = ToRGBColor(100, 100, 100);
    Vortex.colors[1]            = ToRGBColor(0, 100, 0);
    Vortex.colors[2]            = ToRGBColor(255, 255, 255);
    Vortex.colors[3]            = ToRGBColor(255, 0, 0);
    Vortex.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Vortex.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Vortex.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    Vortex.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Vortex.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Vortex.speed                = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Vortex.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(Vortex);

    mode CrossingOver;
    CrossingOver.name                 = "Crossing Over";
    CrossingOver.value                = LianLiGAIITrinityController::GAII_Modes::M_CROSSING_OVER;
    CrossingOver.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    CrossingOver.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    CrossingOver.colors.resize(4);
    CrossingOver.colors[0]            = ToRGBColor(255, 0, 0);
    CrossingOver.colors[1]            = ToRGBColor(0, 255, 0);
    CrossingOver.colors[2]            = ToRGBColor(0, 0, 255);
    CrossingOver.colors[3]            = ToRGBColor(255, 255, 0);
    CrossingOver.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    CrossingOver.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    CrossingOver.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    CrossingOver.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    CrossingOver.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    CrossingOver.speed                = LianLiGAIITrinityController::GAII_Speed::S_FAST;
    CrossingOver.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(CrossingOver);

    mode TaiChi;
    TaiChi.name                 = "Tai Chi";
    TaiChi.value                = LianLiGAIITrinityController::GAII_Modes::M_TAI_CHI;
    TaiChi.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    TaiChi.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    TaiChi.colors.resize(2);
    TaiChi.colors[0]            = ToRGBColor(255, 0, 0);
    TaiChi.colors[1]            = ToRGBColor(0, 255, 0);
    TaiChi.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    TaiChi.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    TaiChi.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    TaiChi.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    TaiChi.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    TaiChi.speed                = LianLiGAIITrinityController::GAII_Speed::S_MODERATE;
    TaiChi.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(TaiChi);

    mode ColorfulStarryNight;
    ColorfulStarryNight.name                 = "Colorful Starry Night";
    ColorfulStarryNight.value                = LianLiGAIITrinityController::GAII_Modes::M_COLORFUL_STARRY_NIGHT;
    ColorfulStarryNight.flags                = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    ColorfulStarryNight.color_mode           = MODE_COLORS_RANDOM;
    ColorfulStarryNight.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    ColorfulStarryNight.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    ColorfulStarryNight.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_50;
    ColorfulStarryNight.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    ColorfulStarryNight.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    ColorfulStarryNight.speed                = LianLiGAIITrinityController::GAII_Speed::S_SLOW;
    modes.push_back(ColorfulStarryNight);

    mode StaticStarryNight;
    StaticStarryNight.name                 = "Static Starry Night";
    StaticStarryNight.value                = LianLiGAIITrinityController::GAII_Modes::M_STATIC_STARRY_NIGHT;
    StaticStarryNight.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    StaticStarryNight.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    StaticStarryNight.colors.resize(1);
    StaticStarryNight.colors[0]            = ToRGBColor(255, 255, 0);
    StaticStarryNight.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    StaticStarryNight.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    StaticStarryNight.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_50;
    StaticStarryNight.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    StaticStarryNight.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    StaticStarryNight.speed                = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    modes.push_back(StaticStarryNight);

    mode Voice;
    Voice.name                 = "Voice";
    Voice.value                = LianLiGAIITrinityController::GAII_Modes::M_VOICE;
    Voice.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    Voice.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    Voice.colors.resize(2);
    Voice.colors[0]            = ToRGBColor(255, 255, 255);
    Voice.colors[1]            = ToRGBColor(130, 130, 130);
    Voice.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Voice.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Voice.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Voice.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Voice.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Voice.speed                = LianLiGAIITrinityController::GAII_Speed::S_SLOW;
    modes.push_back(Voice);


    mode BigBang;
    BigBang.name                 = "Big Bang";
    BigBang.value                = LianLiGAIITrinityController::GAII_Modes::M_BIG_BANG;
    BigBang.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
    BigBang.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    BigBang.colors.resize(4);
    BigBang.colors[0]            = ToRGBColor(255, 255, 255);
    BigBang.colors[1]            = ToRGBColor(255, 0, 0);
    BigBang.colors[2]            = ToRGBColor(255, 255, 255);
    BigBang.colors[3]            = ToRGBColor(0, 255, 0);
    BigBang.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    BigBang.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    BigBang.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    BigBang.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    BigBang.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    BigBang.speed                = LianLiGAIITrinityController::GAII_Speed::S_FAST;
    modes.push_back(BigBang);

    mode Pump;
    Pump.name                 = "Pump";
    Pump.value                = LianLiGAIITrinityController::GAII_Modes::M_PUMP;
    Pump.flags                = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    Pump.color_mode           = MODE_COLORS_MODE_SPECIFIC;
    Pump.colors.resize(2);
    Pump.colors[0]            = ToRGBColor(0, 255, 0);
    Pump.colors[1]            = ToRGBColor(150, 150, 150);
    Pump.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    Pump.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    Pump.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_75;
    Pump.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    Pump.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    Pump.speed                = LianLiGAIITrinityController::GAII_Speed::S_FAST;
    Pump.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(Pump);

    mode ColorsMorph;
    ColorsMorph.name                 = "Colors Morph";
    ColorsMorph.value                = LianLiGAIITrinityController::GAII_Modes::M_COLORS_MORPH;
    ColorsMorph.flags                = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
    ColorsMorph.color_mode           = MODE_COLORS_RANDOM;
    ColorsMorph.brightness_min       = LianLiGAIITrinityController::GAII_Brightness::B_OFF;
    ColorsMorph.brightness_max       = LianLiGAIITrinityController::GAII_Brightness::B_100;
    ColorsMorph.brightness           = LianLiGAIITrinityController::GAII_Brightness::B_100;
    ColorsMorph.speed_min            = LianLiGAIITrinityController::GAII_Speed::S_VERY_SLOW;
    ColorsMorph.speed_max            = LianLiGAIITrinityController::GAII_Speed::S_VERY_FAST;
    ColorsMorph.speed                = LianLiGAIITrinityController::GAII_Speed::S_MODERATE;
    ColorsMorph.direction            = MODE_DIRECTION_RIGHT;
    modes.push_back(ColorsMorph);

    SetupZones();
}

RGBController_LianLiGAIITrinity::~RGBController_LianLiGAIITrinity()
{
    delete controller;
}

void RGBController_LianLiGAIITrinity::SetupZones()
{
    /*-------------------------------------------------*\
    | Set zones and leds                                |
    \*-------------------------------------------------*/

    zone gaii_trinity;
    gaii_trinity.name          = "GAII Trinity";
    gaii_trinity.type          = ZONE_TYPE_SINGLE;
    gaii_trinity.leds_min      = 2;
    gaii_trinity.leds_max      = 2;
    gaii_trinity.leds_count    = 2;
    gaii_trinity.matrix_map    = NULL;
    zones.push_back(gaii_trinity);

    led inner_led;
    inner_led.name = "Inner Ring LEDs";
    leds.push_back(inner_led);

    led outer_led;
    outer_led.name = "Outer Ring LEDs";
    leds.push_back(outer_led);

    SetupColors();

    // set default color values
    zones[0].colors[0] = ToRGBColor(255, 255, 255);
    zones[0].colors[1] = ToRGBColor(0, 0, 255);
}

void RGBController_LianLiGAIITrinity::ResizeZone(int /* zone */, int /* new_size */)
{
    /*---------------------------------------------------------*\
    | This device does not support resizing zones               |
    \*---------------------------------------------------------*/
}

void RGBController_LianLiGAIITrinity::DeviceUpdateLEDs()
{
    switch(modes[active_mode].value)
    {
        case LianLiGAIITrinityController::GAII_Modes::M_RAINBOW:
        controller->SetMode_Rainbow(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                    static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                    OpenRGBDirection2GAIIDirection(modes[active_mode].direction));
        break;
        case LianLiGAIITrinityController::GAII_Modes::M_RAINBOW_MORPH:
        controller->SetMode_RainbowMorph(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                         static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed));
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_STATIC_COLOR:
        controller->SetMode_StaticColor(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                        zones[0].colors[0], zones[0].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_BREATHING_COLOR:
        controller->SetMode_BreathingColor(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                           static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                           modes[active_mode].colors[0], modes[active_mode].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_RUNWAY:
        controller->SetMode_Runway(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                   static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                   modes[active_mode].colors[0], modes[active_mode].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_METEOR:
        controller->SetMode_Meteor(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                   static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                   OpenRGBDirection2GAIIDirection(modes[active_mode].direction),
                                   modes[active_mode].colors[0], modes[active_mode].colors[1], modes[active_mode].colors[2], modes[active_mode].colors[3]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_VORTEX:
        controller->SetMode_Vortex(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                   static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                   OpenRGBDirection2GAIIDirection(modes[active_mode].direction),
                                   modes[active_mode].colors[0], modes[active_mode].colors[1], modes[active_mode].colors[2], modes[active_mode].colors[3]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_CROSSING_OVER:
        controller->SetMode_CrossingOver(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                         static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                         OpenRGBDirection2GAIIDirection(modes[active_mode].direction),
                                         modes[active_mode].colors[0], modes[active_mode].colors[1], modes[active_mode].colors[2], modes[active_mode].colors[3]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_TAI_CHI:
        controller->SetMode_TaiChi(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                   static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                   OpenRGBDirection2GAIIDirection(modes[active_mode].direction),
                                   modes[active_mode].colors[0], modes[active_mode].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_COLORFUL_STARRY_NIGHT:
        controller->SetMode_ColorfulStarryNight(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                                static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed));
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_STATIC_STARRY_NIGHT:
        controller->SetMode_StaticStarryNight(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                              static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                              modes[active_mode].colors[0]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_VOICE:
        controller->SetMode_Voice(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                  static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                  modes[active_mode].colors[0], modes[active_mode].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_BIG_BANG:
        controller->SetMode_BigBang(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                    static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                    modes[active_mode].colors[0], modes[active_mode].colors[1], modes[active_mode].colors[2], modes[active_mode].colors[3]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_PUMP:
        controller->SetMode_Pump(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                 static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                 OpenRGBDirection2GAIIDirection(modes[active_mode].direction),
                                 modes[active_mode].colors[0], modes[active_mode].colors[1]);
        break;
    case LianLiGAIITrinityController::GAII_Modes::M_COLORS_MORPH:
        controller->SetMode_ColorsMorph(static_cast<LianLiGAIITrinityController::GAII_Brightness>(modes[active_mode].brightness),
                                        static_cast<LianLiGAIITrinityController::GAII_Speed>(modes[active_mode].speed),
                                        OpenRGBDirection2GAIIDirection(modes[active_mode].direction));
        break;
    }
}

void RGBController_LianLiGAIITrinity::UpdateZoneLEDs(int /* zone */)
{
    DeviceUpdateLEDs();
}

void RGBController_LianLiGAIITrinity::UpdateSingleLED(int /* led */)
{
    DeviceUpdateLEDs();
}

void RGBController_LianLiGAIITrinity::DeviceUpdateMode()
{
    DeviceUpdateLEDs();
}
