mirror of
https://github.com/libratbag/libratbag.git
synced 2026-11-07 23:23:52 +01:00
Add ratbagd_led_has_mode() and the required dbus additions
To be able to query which modes are available. Exposed via ratbagctl as ./build/ratbagctl.devel led 0 capabilities event4 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
@@ -383,6 +383,13 @@ org.freedesktop.ratbag1.Led
|
||||
|
||||
uint mapping to the mode enum from libratbag
|
||||
|
||||
.. js:attribute:: Modes
|
||||
|
||||
:type: au
|
||||
:flags: read-only, constant
|
||||
|
||||
A list of modes supported by this LED
|
||||
|
||||
.. js:attribute:: Type
|
||||
|
||||
:type: u
|
||||
|
||||
@@ -40,6 +40,32 @@ struct ratbagd_led {
|
||||
enum ratbag_led_colordepth colordepth;
|
||||
};
|
||||
|
||||
static int ratbagd_led_get_modes(sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error)
|
||||
{
|
||||
struct ratbagd_led *led = userdata;
|
||||
enum ratbag_led_mode mode = 0;
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_open_container(reply, 'a', "u");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
while (mode <= RATBAG_LED_BREATHING) {
|
||||
if (ratbag_led_has_mode(led->lib_led, mode))
|
||||
sd_bus_message_append(reply, "u", mode);
|
||||
mode++;
|
||||
}
|
||||
|
||||
return sd_bus_message_close_container(reply);
|
||||
}
|
||||
|
||||
static int ratbagd_led_get_mode(sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
@@ -254,6 +280,7 @@ static int ratbagd_led_set_brightness(sd_bus *bus,
|
||||
const sd_bus_vtable ratbagd_led_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_PROPERTY("Index", "u", NULL, offsetof(struct ratbagd_led, index), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Modes", "au", ratbagd_led_get_modes, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_WRITABLE_PROPERTY("Mode", "u",
|
||||
ratbagd_led_get_mode,
|
||||
ratbagd_led_set_mode, 0,
|
||||
|
||||
@@ -295,6 +295,10 @@ hidpp20drv_read_led_1300(struct ratbag_led *led, struct hidpp20drv_data* data)
|
||||
default:
|
||||
led->mode = RATBAG_LED_ON;
|
||||
}
|
||||
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_ON);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_BREATHING);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_OFF);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -332,6 +336,11 @@ hidpp20drv_read_led_8070(struct ratbag_led *led, struct hidpp20drv_data* drv_dat
|
||||
led->hz = h_led->period; /* FIXME: should be ceil(1000.0 / h_led->period), but that would be very small */
|
||||
led->brightness = h_led->brightness * 255 / 100;
|
||||
led->colordepth = RATBAG_LED_COLORDEPTH_RGB_888;
|
||||
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_ON);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_CYCLE);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_BREATHING);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_OFF);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -106,6 +106,11 @@ test_read_led(struct ratbag_led *led)
|
||||
struct ratbag_test_profile *p = &d->profiles[led->profile->index];
|
||||
struct ratbag_test_led t_led = p->leds[led->index];
|
||||
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_ON);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_CYCLE);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_BREATHING);
|
||||
ratbag_led_set_mode_capability(led, RATBAG_LED_OFF);
|
||||
|
||||
switch (t_led.mode) {
|
||||
case RATBAG_LED_ON:
|
||||
led->mode = RATBAG_LED_ON;
|
||||
|
||||
@@ -274,6 +274,7 @@ struct ratbag_led {
|
||||
unsigned index;
|
||||
enum ratbag_led_type type;
|
||||
enum ratbag_led_mode mode;
|
||||
uint32_t modes; /**< supported modes */
|
||||
struct ratbag_color color;
|
||||
enum ratbag_led_colordepth colordepth;
|
||||
unsigned int hz; /**< rate of action in hz */
|
||||
@@ -535,6 +536,16 @@ ratbag_resolution_set_cap(struct ratbag_resolution *res,
|
||||
res->capabilities = (1 << cap);
|
||||
}
|
||||
|
||||
static inline void
|
||||
ratbag_led_set_mode_capability(struct ratbag_led *led,
|
||||
enum ratbag_led_mode mode)
|
||||
{
|
||||
assert(mode <= RATBAG_LED_BREATHING);
|
||||
assert(mode < sizeof(led->modes) * 8);
|
||||
|
||||
led->modes |= (1 << mode);
|
||||
}
|
||||
|
||||
/* list of all supported drivers */
|
||||
struct ratbag_driver etekcity_driver;
|
||||
struct ratbag_driver hidpp20_driver;
|
||||
|
||||
@@ -1458,6 +1458,18 @@ ratbag_led_get_type(struct ratbag_led *led)
|
||||
return led->type;
|
||||
}
|
||||
|
||||
LIBRATBAG_EXPORT int
|
||||
ratbag_led_has_mode(struct ratbag_led *led,
|
||||
enum ratbag_led_mode mode)
|
||||
{
|
||||
assert(mode <= RATBAG_LED_BREATHING);
|
||||
|
||||
if (mode == RATBAG_LED_OFF)
|
||||
return 1;
|
||||
|
||||
return (led->modes & (1 << mode));
|
||||
}
|
||||
|
||||
LIBRATBAG_EXPORT struct ratbag_color
|
||||
ratbag_led_get_color(struct ratbag_led *led)
|
||||
{
|
||||
|
||||
@@ -1182,6 +1182,23 @@ ratbag_profile_get_led(struct ratbag_profile *profile, unsigned int index);
|
||||
*/
|
||||
enum ratbag_led_type
|
||||
ratbag_led_get_type(struct ratbag_led *led);
|
||||
|
||||
/**
|
||||
* @ingroup led
|
||||
*
|
||||
* This function returns true if the given mode is supported by the LED, or
|
||||
* false otherwise.
|
||||
*
|
||||
* @param led A previously initialized ratbag LED
|
||||
* @param mode The LED mode @ref ratbag_led_mode to check for
|
||||
* @return True if supported, false otherwise
|
||||
*
|
||||
* @see ratbag_led_set_mode
|
||||
*/
|
||||
int
|
||||
ratbag_led_has_mode(struct ratbag_led *led,
|
||||
enum ratbag_led_mode mode);
|
||||
|
||||
/**
|
||||
* @ingroup led
|
||||
*
|
||||
|
||||
@@ -167,6 +167,16 @@ def print_led(d, p, l, level):
|
||||
l.effect_rate,
|
||||
l.brightness))
|
||||
|
||||
def print_led_caps(d, p, l, level):
|
||||
leds = {
|
||||
RatbagdLed.MODE_BREATHING: "breathing",
|
||||
RatbagdLed.MODE_CYCLE: "cycle",
|
||||
RatbagdLed.MODE_OFF: "off",
|
||||
RatbagdLed.MODE_ON: "on",
|
||||
}
|
||||
supported = sorted([ v for k, v in leds.items() if k in l.modes ])
|
||||
print(" " * level + "Modes: {}".format(", ".join(supported)))
|
||||
|
||||
|
||||
def print_button(d, p, b, level):
|
||||
types = {
|
||||
@@ -305,6 +315,9 @@ def func_led_get(r, args):
|
||||
l, p, d = find_led(r, args)
|
||||
print_led(d, p, l, 0)
|
||||
|
||||
def func_led_caps(r, args):
|
||||
l, p, d = find_led(r, args)
|
||||
print_led_caps(d, p, l, 0)
|
||||
|
||||
def func_led_set(r, args):
|
||||
l, p, d = find_led(r, args)
|
||||
@@ -1074,6 +1087,12 @@ active profile if none is given.""",
|
||||
help_str: 'Show current LED value',
|
||||
func: func_led_get,
|
||||
},
|
||||
{
|
||||
of_type: command,
|
||||
name: 'capabilities',
|
||||
help_str: 'Show LED capabilities',
|
||||
func: func_led_caps,
|
||||
},
|
||||
{
|
||||
of_type: set,
|
||||
name: 'set',
|
||||
|
||||
@@ -567,6 +567,11 @@ class TestRatbagCtlLED(TestRatbagCtl):
|
||||
self.launch_fail_test("Profile 1 Profile 2 Led 1 get test_device")
|
||||
self.launch_fail_test("Profile 1 Resolution 2 Led 1 get test_device")
|
||||
|
||||
def test_led_capabilities(self):
|
||||
r = self.launch_good_test("led 0 capabilities test_device")
|
||||
self.assertEqual(r, "Modes: breathing, cycle, off, on")
|
||||
r = self.launch_good_test("led 1 capabilities test_device")
|
||||
self.assertEqual(r, "Modes: breathing, cycle, off, on")
|
||||
|
||||
def setUpModule():
|
||||
global ratbagd_process, ratbagd, parser
|
||||
|
||||
@@ -924,6 +924,11 @@ class RatbagdLed(_RatbagdDBus):
|
||||
"""
|
||||
self._set_dbus_property("Mode", "u", mode)
|
||||
|
||||
@GObject.Property
|
||||
def modes(self):
|
||||
"""The supported modes as a list"""
|
||||
return self._get_dbus_property("Modes")
|
||||
|
||||
@GObject.Property
|
||||
def type(self):
|
||||
"""An enum describing this led's type,
|
||||
|
||||
Reference in New Issue
Block a user