Files
OpenRGB/Controllers/LianLiController/LianLiUniHubSLController/LianLiUniHubSLController.h
Adam Honse 4ba7faa7a3 RGBController API Overhaul
* Reorganize and clean up RGBController API functions
    * Add functions to get protected RGBController member values
    * Make NetworkClient, ProfileManager, and ResourceManager friend classes so they can access protected members
    * Protected previously-public RGBController members
        * Information strings (name, vendor, description, version, serial location)
        * Device type
        * Active mode
        * Flags
        * LEDs vector
        * LED alternate names vector
        * Modes vector
        * Colors vector
        * Zones vector
    * Add CONTROLLER_FLAG_HIDDEN to allow plugins to hide controllers from control GUI
    * Add update reason codes to RGBController update callback and signal updates on more RGBController events
    * Add loop zone types and segmented zone type
    * Add matrix map field to segments
    * Rework matrix_map_type from using pointers to vector to prevent memory leaks
    * Rework KeyboardLayoutManager to return new matrix_map_type
    * Add access mutex to RGBController API
    * Add per-zone modes ot RGBController API
    * Add JSON description functions to RGBController API
2026-02-07 01:50:52 -06:00

120 lines
4.3 KiB
C++

/*---------------------------------------------------------*\
| LianLiUniHubSLController.h |
| |
| Driver for Lian Li Uni Hub - SL |
| |
| Muhamad Visat 26 Jul 2025 |
| Original work by Luca Lovisa & Oliver P |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-only |
\*---------------------------------------------------------*/
#pragma once
#include <string>
#include <vector>
#include <hidapi.h>
#include "RGBController.h"
enum
{
UNIHUB_SL_REPORT_ID = 0xE0,
};
enum
{
UNIHUB_SL_MAX_CHANNEL = 4,
UNIHUB_SL_MAX_FAN_PER_CHANNEL = 4,
UNIHUB_SL_LED_PER_FAN = 16,
UNIHUB_SL_MAX_LED_PER_CHANNEL = 64,
};
enum
{
UNIHUB_SL_LED_BRIGHTNESS_MIN = 0x00, // 0%
UNIHUB_SL_LED_BRIGHTNESS_MAX = 0x04, // 100%
UNIHUB_SL_LED_BRIGHTNESS_DEFAULT = 0x04, // 100%
UNIHUB_SL_LED_BRIGHTNESS_000 = 0x08, // Black (turned off)
UNIHUB_SL_LED_BRIGHTNESS_025 = 0x03, // Dark
UNIHUB_SL_LED_BRIGHTNESS_050 = 0x02, // Medium
UNIHUB_SL_LED_BRIGHTNESS_075 = 0x01, // Bright
UNIHUB_SL_LED_BRIGHTNESS_100 = 0x00, // Brightest
};
enum
{
UNIHUB_SL_LED_SPEED_MIN = 0x00, // Slowest
UNIHUB_SL_LED_SPEED_MAX = 0x04, // Fastest
UNIHUB_SL_LED_SPEED_DEFAULT = 0x00, // Slowest
UNIHUB_SL_LED_SPEED_000 = 0x02, // Slowest
UNIHUB_SL_LED_SPEED_025 = 0x01, // Slow
UNIHUB_SL_LED_SPEED_050 = 0x00, // Medium
UNIHUB_SL_LED_SPEED_075 = 0xff, // Fast
UNIHUB_SL_LED_SPEED_100 = 0xfe, // Fastest
};
enum
{
UNIHUB_SL_LED_DIRECTION_LTR = 0x00, // Left to right
UNIHUB_SL_LED_DIRECTION_RTL = 0x01, // Right to left
};
enum
{
UNIHUB_SL_LED_MODE_RAINBOW = 0x05,
UNIHUB_SL_LED_MODE_RAINBOW_MORPH = 0x04,
UNIHUB_SL_LED_MODE_STATIC = 0x01,
UNIHUB_SL_LED_MODE_BREATHING = 0x02,
UNIHUB_SL_LED_MODE_COLOR_CYCLE = 0x23,
UNIHUB_SL_LED_MODE_RUNWAY = 0x1c,
UNIHUB_SL_LED_MODE_RUNWAY_MERGED = 0x1c,
UNIHUB_SL_LED_MODE_STAGGERED = 0x18,
UNIHUB_SL_LED_MODE_TIDE = 0x1a,
UNIHUB_SL_LED_MODE_METEOR = 0x24,
UNIHUB_SL_LED_MODE_METEOR_MERGED = 0x24,
UNIHUB_SL_LED_MODE_MIXING = 0x1e,
UNIHUB_SL_LED_MODE_STACK = 0x20,
UNIHUB_SL_LED_MODE_STACK_MULTI_COLOR = 0x21,
UNIHUB_SL_LED_MODE_NEON = 0x22,
};
class LianLiUniHubSLController
{
public:
LianLiUniHubSLController(hid_device *device, const char *path);
~LianLiUniHubSLController();
std::string ReadVersion();
std::string ReadSerial();
std::string GetLocation() { return this->location; };
void UpdateMode(const std::vector<zone> &zones, const mode &active);
void DeviceUpdateZoneLEDs(size_t channel, const zone &z, const mode &active);
private:
hid_device *device;
std::string location;
bool is_merged_mode;
void SetPerLEDColor(size_t channel, const zone &z, const mode &active);
void SetModeSpecificColor(size_t channel, const mode &active);
void FillStaticColorBuffer(unsigned char *color_buf, const RGBColor *colors, size_t num_colors, float brightness_scale);
void FillDynamicColorBuffer(unsigned char *color_buf, const RGBColor *colors, size_t num_colors, float brightness_scale);
unsigned char ConvertBrightness(unsigned int brightness);
unsigned char ConvertSpeed(unsigned int speed);
unsigned char ConvertDirection(unsigned int direction);
void SendActivate(size_t channel, unsigned char num_fans);
void SendMerge();
void SendColor(size_t channel, const unsigned char *color_buf, size_t color_buf_len);
void SendMode(size_t channel, const mode &active);
void LogBuffer(const char *operation, const unsigned char *buf, size_t len);
};