Publish LumaOps source

This commit is contained in:
LumaOps release export
2026-09-03 01:18:36 +02:00
commit 7f1c0e5f71
2363 changed files with 501543 additions and 0 deletions
@@ -0,0 +1,306 @@
/*---------------------------------------------------------*\
| LianLiGAIITrinityController.cpp |
| |
| Driver 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 <algorithm>
#include <cstring>
#include <iomanip>
#include <sstream>
#include "LianLiGAIITrinityController.h"
#include "StringUtils.h"
LianLiGAIITrinityController::LianLiGAIITrinityController(hid_device* dev_handle, char* path)
{
dev = dev_handle;
location = path;
}
LianLiGAIITrinityController::~LianLiGAIITrinityController()
{
if(dev)
{
hid_close(dev);
}
}
std::string LianLiGAIITrinityController::GetLocation()
{
return("HID: " + location);
}
LianLiGAIITrinityController::GAII_Info LianLiGAIITrinityController::GetControllerInfo()
{
GAII_Info controllerInfo;
// get serial number
const uint8_t sz = 255;
wchar_t tmp[sz];
hid_get_serial_number_string(dev, tmp, sz);
controllerInfo.serial = StringUtils::wstring_to_string(tmp);
// get firmware version
unsigned char data[64] = "";
data[0x00] = 0x01;
data[GAII_ByteAddress::BA_PACKET_TYPE] = GAII_PacketType::PT_FIRMWARE_INFO;
hid_write(dev, data, sizeof(data));
memset(data, 0, sizeof(data));
hid_read(dev, data, sizeof(data));
data[sizeof(data) - 1] = 0;
std::string response(reinterpret_cast<char*>(&data[0x06]));
memset(data, 0, sizeof(data));
hid_read(dev, data, sizeof(data));
data[sizeof(data) - 1] = 0;
response += " (" + std::string(reinterpret_cast<char*>(&data[0x06])) + ")";
std::replace( response.begin(), response.end(), ',', ' ');
controllerInfo.version = response.substr(0, 100);
return controllerInfo;
}
unsigned char* LianLiGAIITrinityController::GetRGBControlPacketTemplate()
{
static unsigned char usb_buf[64];
memset(usb_buf, 0, sizeof(usb_buf));
usb_buf[0x00] = 0x01;
usb_buf[GAII_ByteAddress::BA_PACKET_TYPE] = GAII_PacketType::PT_RGB_CONTROL;
usb_buf[0x05] = 0x13;
return usb_buf;
}
void LianLiGAIITrinityController::SetRGB(unsigned char* usb_buf, RGBColor* rgb0, RGBColor* rgb1, RGBColor* rgb2, RGBColor* rgb3)
{
if(rgb0)
{
usb_buf[GAII_ByteAddress::BA_R0] = RGBGetRValue(*rgb0);
usb_buf[GAII_ByteAddress::BA_G0] = RGBGetGValue(*rgb0);
usb_buf[GAII_ByteAddress::BA_B0] = RGBGetBValue(*rgb0);
}
if(rgb1)
{
usb_buf[GAII_ByteAddress::BA_R1] = RGBGetRValue(*rgb1);
usb_buf[GAII_ByteAddress::BA_G1] = RGBGetGValue(*rgb1);
usb_buf[GAII_ByteAddress::BA_B1] = RGBGetBValue(*rgb1);
}
if(rgb2)
{
usb_buf[GAII_ByteAddress::BA_R2] = RGBGetRValue(*rgb2);
usb_buf[GAII_ByteAddress::BA_G2] = RGBGetGValue(*rgb2);
usb_buf[GAII_ByteAddress::BA_B2] = RGBGetBValue(*rgb2);
}
if(rgb3)
{
usb_buf[GAII_ByteAddress::BA_R3] = RGBGetRValue(*rgb3);
usb_buf[GAII_ByteAddress::BA_G3] = RGBGetGValue(*rgb3);
usb_buf[GAII_ByteAddress::BA_B3] = RGBGetBValue(*rgb3);
}
}
void LianLiGAIITrinityController::SetMode_Rainbow(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_RAINBOW;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_RainbowMorph(GAII_Brightness brightness, GAII_Speed speed)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_RAINBOW_MORPH;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_StaticColor(GAII_Brightness brightness, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_STATIC_COLOR;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_BreathingColor(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_BREATHING_COLOR;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_Runway(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_RUNWAY;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_Meteor(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_METEOR;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
SetRGB(usb_buf, rgb0, rgb1, rgb2, rgb3);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_Vortex(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_VORTEX;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
SetRGB(usb_buf, rgb0, rgb1, rgb2, rgb3);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_CrossingOver(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_CROSSING_OVER;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
SetRGB(usb_buf, rgb0, rgb1, rgb2, rgb3);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_TaiChi(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_TAI_CHI;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_ColorfulStarryNight(GAII_Brightness brightness, GAII_Speed speed)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_COLORFUL_STARRY_NIGHT;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_StaticStarryNight(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_STATIC_STARRY_NIGHT;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
SetRGB(usb_buf, rgb0);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_Voice(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_VOICE;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_BigBang(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_BIG_BANG;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
SetRGB(usb_buf, rgb0, rgb1, rgb2, rgb3);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_Pump(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_PUMP;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
SetRGB(usb_buf, rgb0, rgb1);
hid_write(dev, usb_buf, 64);
}
void LianLiGAIITrinityController::SetMode_ColorsMorph(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction)
{
unsigned char *usb_buf = GetRGBControlPacketTemplate();
usb_buf[GAII_ByteAddress::BA_MODE] = GAII_Modes::M_COLORS_MORPH;
usb_buf[GAII_ByteAddress::BA_RING] = GAII_Ring::R_BOTH;
usb_buf[GAII_ByteAddress::BA_BRIGHTNESS] = brightness;
usb_buf[GAII_ByteAddress::BA_SPEED] = speed;
usb_buf[GAII_ByteAddress::BA_DIRECTION] = direction;
hid_write(dev, usb_buf, 64);
}
@@ -0,0 +1,147 @@
/*---------------------------------------------------------*\
| LianLiGAIITrinityController.h |
| |
| Driver 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 |
\*---------------------------------------------------------*/
#pragma once
#include <string>
#include <vector>
#include <hidapi.h>
#include "RGBController.h"
/*----------------------------------------------------------------------------*\
| Definitions related to LED configuration. |
\*----------------------------------------------------------------------------*/
class LianLiGAIITrinityController
{
public:
struct GAII_Info
{
std::string serial;
std::string version;
};
enum GAII_PacketType : unsigned char
{
PT_RGB_CONTROL = 0x83,
PT_FIRMWARE_INFO = 0x86
};
enum GAII_Modes : unsigned char
{
M_RAINBOW = 0x01,
M_RAINBOW_MORPH,
M_STATIC_COLOR,
M_BREATHING_COLOR,
M_RUNWAY,
M_METEOR,
M_VORTEX,
M_CROSSING_OVER,
M_TAI_CHI,
M_COLORFUL_STARRY_NIGHT,
M_STATIC_STARRY_NIGHT,
M_VOICE,
M_BIG_BANG,
M_PUMP,
M_COLORS_MORPH,
/* M_BOUNCE, */ // TODO: requires zone-specific modes
};
enum GAII_Ring : unsigned char
{
R_INNER,
R_OUTER,
R_BOTH,
};
enum GAII_Brightness : unsigned char
{
B_OFF,
B_25,
B_50,
B_75,
B_100,
};
enum GAII_Speed : unsigned char
{
S_VERY_SLOW,
S_SLOW,
S_MODERATE,
S_FAST,
S_VERY_FAST,
};
enum GAII_Direction : unsigned char
{
D_RIGHT,
D_LEFT
};
enum GAII_ByteAddress : unsigned char
{
BA_PACKET_TYPE = 0x01,
BA_RING = 0x06,
BA_MODE,
BA_BRIGHTNESS,
BA_SPEED,
BA_R0 = 0x0A,
BA_G0,
BA_B0,
BA_R1,
BA_G1,
BA_B1,
BA_R2,
BA_G2,
BA_B2,
BA_R3,
BA_G3,
BA_B3,
BA_DIRECTION = 0x16,
};
LianLiGAIITrinityController(hid_device* dev_handle, char* path);
~LianLiGAIITrinityController();
std::string GetLocation();
GAII_Info GetControllerInfo();
void SetMode_Rainbow(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction);
void SetMode_RainbowMorph(GAII_Brightness brightness, GAII_Speed speed);
void SetMode_StaticColor(GAII_Brightness brightness, RGBColor rgb0, RGBColor rgb1);
void SetMode_BreathingColor(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1);
void SetMode_Runway(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1);
void SetMode_Meteor(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3);
void SetMode_Vortex(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3);
void SetMode_CrossingOver(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3);
void SetMode_TaiChi(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1);
void SetMode_ColorfulStarryNight(GAII_Brightness brightness, GAII_Speed speed);
void SetMode_StaticStarryNight(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0);
void SetMode_Voice(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1);
void SetMode_BigBang(GAII_Brightness brightness, GAII_Speed speed, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3);
void SetMode_Pump(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction, RGBColor rgb0, RGBColor rgb1);
void SetMode_ColorsMorph(GAII_Brightness brightness, GAII_Speed speed, GAII_Direction direction);
private:
std::string location;
unsigned char* GetRGBControlPacketTemplate();
void SetRGB(unsigned char* usb_buf, RGBColor rgb0) { SetRGB(usb_buf, &rgb0, nullptr, nullptr, nullptr); };
void SetRGB(unsigned char* usb_buf, RGBColor rgb0, RGBColor rgb1) { SetRGB(usb_buf, &rgb0, &rgb1, nullptr, nullptr); };
void SetRGB(unsigned char* usb_buf, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2) { SetRGB(usb_buf, &rgb0, &rgb1, &rgb2, nullptr); };
void SetRGB(unsigned char* usb_buf, RGBColor rgb0, RGBColor rgb1, RGBColor rgb2, RGBColor rgb3) { SetRGB(usb_buf, &rgb0, &rgb1, &rgb2, &rgb3); };
void SetRGB(unsigned char* usb_buf, RGBColor* rgb0, RGBColor* rgb1, RGBColor* rgb2, RGBColor* rgb3);
hid_device* dev;
};
@@ -0,0 +1,418 @@
/*---------------------------------------------------------*\
| 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();
}
@@ -0,0 +1,43 @@
/*---------------------------------------------------------*\
| RGBController_LianLiGAIITrinity.h |
| |
| 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 |
\*---------------------------------------------------------*/
#pragma once
#include "LianLiGAIITrinityController.h"
#include "RGBController.h"
class RGBController_LianLiGAIITrinity : public RGBController
{
public:
RGBController_LianLiGAIITrinity(LianLiGAIITrinityController* controller_ptr);
~RGBController_LianLiGAIITrinity();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateMode();
LianLiGAIITrinityController::GAII_Direction OpenRGBDirection2GAIIDirection(unsigned int openrgb_direction)
{
if(openrgb_direction == MODE_DIRECTION_LEFT)
return LianLiGAIITrinityController::GAII_Direction::D_LEFT;
return LianLiGAIITrinityController::GAII_Direction::D_RIGHT;
}
private:
LianLiGAIITrinityController* controller;
};