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:
Peter Hutterer
2017-09-01 14:11:17 +10:00
parent f56df6b1d0
commit b951d83a64
10 changed files with 117 additions and 0 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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
*

View File

@@ -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',

View File

@@ -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

View File

@@ -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,