Files
OpenRGB/Controllers/LinuxLEDController/LinuxLEDControllerDetect_Linux.cpp
Chris Morgan c1781bc4cb Add support for led_classdev_mc via sysfs
Update the LinuxLEDController to support multicolor LEDs defined by
the Linux kernel. For multicolor LEDs Linux exposes a single
brightness which allows a range of 0 (off) to 255 (max) and a multi_intensity
value that accepts multiple channels of colors. This current implementation
assumes that there are 3 multi_intensity channels between 0 and 255.

https://docs.kernel.org/leds/leds-class-multicolor.html

Note that for now in Linux the brightness value doesn't so much affect
the brightness of the LED as it does apply a coefficient to the individual
channel intensities. For now hard code the brightness to 255 and simply
adjust the intensities to alter the color.

This change should keep the existing sysfs code path as-is and only attempt
to use this new method when a led_rgb_path is present in the config file.

For reference, my OpenRGB.json has the following lines:
`    "LinuxLEDDevices" : {
        "devices": [
            {
                "name": "Fan LED 1",
                "rgb_path": "/sys/class/leds/rgb:programming-0/"
            }
        ]
    }`

Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
2025-10-20 12:13:50 -05:00

87 lines
3.8 KiB
C++

/*---------------------------------------------------------*\
| LinuxLEDControllerDetect_Linux.cpp |
| |
| Detector for Linux sysfs LEDs |
| |
| Adam Honse (calcprogrammer1@gmail.com) 25 Sep 2020 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <string>
#include "Detector.h"
#include "RGBController_LinuxLED_Linux.h"
#include "SettingsManager.h"
/******************************************************************************************\
* *
* DetectLinuxLEDControllers *
* *
* Detect devices supported by the LinuxLED driver *
* *
\******************************************************************************************/
void DetectLinuxLEDControllers()
{
json linux_led_settings;
/*-------------------------------------------------*\
| Get Linux LED settings from settings manager |
\*-------------------------------------------------*/
linux_led_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("LinuxLEDDevices");
/*-------------------------------------------------*\
| If the LinuxLED settings contains devices, process|
\*-------------------------------------------------*/
if(linux_led_settings.contains("devices"))
{
for(unsigned int device_idx = 0; device_idx < linux_led_settings["devices"].size(); device_idx++)
{
std::string name;
std::string red_path;
std::string green_path;
std::string blue_path;
std::string rgb_path;
if(linux_led_settings["devices"][device_idx].contains("name"))
{
name = linux_led_settings["devices"][device_idx]["name"];
}
if(linux_led_settings["devices"][device_idx].contains("red_path"))
{
red_path = linux_led_settings["devices"][device_idx]["red_path"];
}
if(linux_led_settings["devices"][device_idx].contains("green_path"))
{
green_path = linux_led_settings["devices"][device_idx]["green_path"];
}
if(linux_led_settings["devices"][device_idx].contains("blue_path"))
{
blue_path = linux_led_settings["devices"][device_idx]["blue_path"];
}
if(linux_led_settings["devices"][device_idx].contains("rgb_path"))
{
rgb_path = linux_led_settings["devices"][device_idx]["rgb_path"];
}
LinuxLEDController* controller = new LinuxLEDController(name);
controller->OpenRedPath(red_path);
controller->OpenGreenPath(green_path);
controller->OpenBluePath(blue_path);
controller->OpenRgbPath(rgb_path);
RGBController_LinuxLED* rgb_controller = new RGBController_LinuxLED(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
} /* DetectLinuxLEDControllers() */
REGISTER_DETECTOR("Linux LED", DetectLinuxLEDControllers);