OpenRGB/Controllers/LianLiController/LianLiUniHubSLV2Controller/LianLiUniHubSLV2Controller.h
2024-07-08 23:00:55 -05:00

211 lines
8 KiB
C++

/*---------------------------------------------------------*\
| LianLiUniHubSLV2Controller.h |
| |
| Driver for Lian Li SLV2 Uni Hub |
| |
| Will Kennedy 17 Jan 2023 |
| Oliver P 26 Apr 2022 |
| Credit to Luca Lovisa for original work. |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-only |
\*---------------------------------------------------------*/
#pragma once
#include <string>
#include <hidapi/hidapi.h>
#include "RGBController.h"
/*----------------------------------------------------------------------------*\
| Global definitions. |
\*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*\
| Definitions related to zone Sizes |
\*----------------------------------------------------------------------------*/
enum
{
UNIHUB_SLV2_CHANNEL_COUNT = 0x04, /* Channel count */
UNIHUB_SLV2_CHAN_LED_COUNT = 0x10 * 6, /* Max-LED per channel count - 96 */
};
/*----------------------------------------------------------------------------*\
| Definitions related to LED configuration. |
\*----------------------------------------------------------------------------*/
// Used for sync'd mode between Fan and Edge
enum
{
UNIHUB_SLV2_LED_MODE_STATIC_COLOR = 0x01, // full data array
UNIHUB_SLV2_LED_MODE_BREATHING = 0x02, // full data array
UNIHUB_SLV2_LED_MODE_RAINBOW_MORPH = 0x04, // no array
UNIHUB_SLV2_LED_MODE_RAINBOW = 0x05, // no array
UNIHUB_SLV2_LED_MODE_STAGGERED = 0x18, // size 2
UNIHUB_SLV2_LED_MODE_TIDE = 0x1A, // size 2
UNIHUB_SLV2_LED_MODE_RUNWAY = 0x1C, // size 2
UNIHUB_SLV2_LED_MODE_MIXING = 0x1E, // size 2
UNIHUB_SLV2_LED_MODE_STACK = 0x20, // size 1
UNIHUB_SLV2_LED_MODE_STACK_MULTI_COLOR = 0x21, // no array
UNIHUB_SLV2_LED_MODE_NEON = 0x22, // no array
UNIHUB_SLV2_LED_MODE_COLOR_CYCLE = 0x23, // size 3
UNIHUB_SLV2_LED_MODE_METEOR = 0x24, // size 2
UNIHUB_SLV2_LED_MODE_VOICE = 0x26, // no array
UNIHUB_SLV2_LED_MODE_GROOVE = 0x27, // size 2
UNIHUB_SLV2_LED_MODE_RENDER = 0x28, // size 4
UNIHUB_SLV2_LED_MODE_TUNNEL = 0x29, // size 4
// merged modes
UNIHUB_SLV2_LED_MODE_METEOR_MERGED = 0x2A,
UNIHUB_SLV2_LED_MODE_RUNWAY_MERGED = 0x2B,
UNIHUB_SLV2_LED_MODE_TIDE_MERGED = 0x2C,
UNIHUB_SLV2_LED_MODE_MIXING_MERGED = 0x2D,
UNIHUB_SLV2_LED_MODE_STACK_MULTI_COLOR_MERGED = 0x2E
};
enum
{
UNIHUB_SLV2_LED_SPEED_000 = 0x02, /* Very slow speed */
UNIHUB_SLV2_LED_SPEED_025 = 0x01, /* Rather slow speed */
UNIHUB_SLV2_LED_SPEED_050 = 0x00, /* Medium speed */
UNIHUB_SLV2_LED_SPEED_075 = 0xFF, /* Rather fast speed */
UNIHUB_SLV2_LED_SPEED_100 = 0xFE, /* Very fast speed */
};
enum
{
UNIHUB_SLV2_LED_DIRECTION_LTR = 0x00, /* Left-to-Right direction */
UNIHUB_SLV2_LED_DIRECTION_RTL = 0x01, /* Right-to-Left direction */
};
enum
{
UNIHUB_SLV2_LED_BRIGHTNESS_000 = 0x08, /* Very dark (off) */
UNIHUB_SLV2_LED_BRIGHTNESS_025 = 0x03, /* Rather dark */
UNIHUB_SLV2_LED_BRIGHTNESS_050 = 0x02, /* Medium bright */
UNIHUB_SLV2_LED_BRIGHTNESS_075 = 0x01, /* Rather bright */
UNIHUB_SLV2_LED_BRIGHTNESS_100 = 0x00, /* Very bright */
};
enum
{
UNIHUB_SLV2_LED_LIMITER = 0x01 /* Limit the color white to 999999 as per manufacturer limits */
};
/*----------------------------------------------------------------------------*\
| Definitions related to packet configuration. |
\*----------------------------------------------------------------------------*/
enum
{
UNIHUB_SLV2_TRANSACTION_ID = 0xE0, /* Command value to start all packets */
};
/*----------------------------------------------------------------------------*\
| Uni Hub SLV2 controller. |
\*----------------------------------------------------------------------------*/
class LianLiUniHubSLV2Controller
{
public:
LianLiUniHubSLV2Controller(hid_device* dev_handle, const char* path, std::string dev_name);
~LianLiUniHubSLV2Controller();
std::string GetDeviceLocation();
std::string GetFirmwareVersionString();
std::string GetName();
std::string GetSerialString();
void SetChannelMode
(
unsigned char channel,
const mode active_mode,
unsigned int num_fans
);
void SetChannelLEDs
(
unsigned char channel,
RGBColor * colors,
unsigned int num_colors,
float brightness
);
void SendStartAction
(
unsigned char channel,
unsigned int num_fans
);
void SendColorData
(
unsigned char channel, // Zone index
unsigned int num_leds,
unsigned char* led_data // Color data payload
);
void SendCommitAction
(
unsigned char channel, // Zone index
unsigned char effect,
unsigned char speed,
unsigned int direction,
unsigned int brightness
);
private:
/* The Uni Hub requires colors in RBG order */
struct Color
{
uint8_t r;
uint8_t b;
uint8_t g;
};
/* The values correspond to the definitions above */
struct Channel
{
uint8_t index;
uint8_t anyFanCountOffset;
uint8_t anyFanCount;
uint16_t ledActionAddress;
uint16_t ledCommitAddress;
uint16_t ledModeAddress;
uint16_t ledSpeedAddress;
uint16_t ledDirectionAddress;
uint16_t ledBrightnessAddress;
Color colors[UNIHUB_SLV2_CHAN_LED_COUNT];
uint8_t ledMode;
uint8_t ledSpeed;
uint8_t ledDirection;
uint8_t ledBrightness;
uint16_t fanHubActionAddress;
uint16_t fanHubCommitAddress;
uint16_t fanPwmActionAddress;
uint16_t fanPwmCommitAddress;
uint16_t fanRpmActionAddress;
uint16_t fanSpeed;
};
private:
hid_device* dev;
/*---------------------------------------------------------*\
| Device information strings |
\*---------------------------------------------------------*/
std::string firmware_version;
std::string location;
std::string name;
};