From e43126b0072e8af742beeb1048995a3c32205351 Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Sat, 11 Feb 2023 12:45:00 +0100 Subject: [PATCH] fbd-dev-led: Rework color API Drop has_color API since supported colors are set during probing and can be handled completely separately from the classes for each type of hardware. Rename set_color to set_supported_color because the usage of this API is to check if the color is supported, but not setting it. Setting the color is also separated from start_periodic API to re-use multicolor across multiple LED types with a set_color API. Multicolor LEDs are actually the same as regular LEDs but they require a few additional sysfs entries to actually set the color. Single color LEDs only have a single color so the set_color method just returns TRUE for these LEDs. Supported colors are advertised through the supports_color API now. This way, each LED driver define which colors are supported through supports_color API. RGB multicolor LEDs will report only fixed colors like red, blue, green and white until the kernel can expose if a diffusor is present to mix these colors. --- src/fbd-dev-led-multicolor.c | 22 +++--------- src/fbd-dev-led-priv.h | 2 +- src/fbd-dev-led.c | 70 ++++++++++++++++++++++-------------- src/fbd-dev-led.h | 13 +++---- src/fbd-dev-leds.c | 6 ++-- tests/test-fbd-dev-led.c | 8 ++--- 6 files changed, 64 insertions(+), 57 deletions(-) diff --git a/src/fbd-dev-led-multicolor.c b/src/fbd-dev-led-multicolor.c index 5d1d692..bcb5d17 100644 --- a/src/fbd-dev-led-multicolor.c +++ b/src/fbd-dev-led-multicolor.c @@ -65,7 +65,7 @@ fbd_dev_led_multicolor_probe (FbdDevLed *led, GError **error) return FALSE; } fbd_dev_led_set_max_brightness (led, max_brightness); - fbd_dev_led_set_color (led, FBD_FEEDBACK_LED_COLOR_RGB); + fbd_dev_led_set_supported_color (led, FBD_FEEDBACK_LED_COLOR_RGB); for (int i = 0; index[i] != NULL; i++) { g_debug ("Index: %s", index[i]); @@ -90,10 +90,8 @@ fbd_dev_led_multicolor_probe (FbdDevLed *led, GError **error) static gboolean -fbd_dev_led_multicolor_start_periodic (FbdDevLed *led, - FbdFeedbackLedColor color, - guint max_brightness_percentage, - guint freq) +fbd_dev_led_multicolor_set_color (FbdDevLed *led, + FbdFeedbackLedColor color) { FbdDevLedMulticolor *self = FBD_DEV_LED_MULTICOLOR (led); FbdDevLedMulticolorPrivate *priv = fbd_dev_led_multicolor_get_instance_private (self); @@ -142,16 +140,7 @@ fbd_dev_led_multicolor_start_periodic (FbdDevLed *led, return FALSE; } - /* Chain up to parent class to set the pattern */ - return FBD_DEV_LED_CLASS (fbd_dev_led_multicolor_parent_class)->start_periodic ( - led, color, max_brightness_percentage, freq); -} - - -static gboolean -fbd_dev_led_has_color_multicolor (FbdDevLed *led, FbdFeedbackLedColor color) -{ - return color == FBD_FEEDBACK_LED_COLOR_RGB; + return TRUE; } @@ -161,8 +150,7 @@ fbd_dev_led_multicolor_class_init (FbdDevLedMulticolorClass *klass) FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_CLASS (klass); fbd_dev_led_class->probe = fbd_dev_led_multicolor_probe; - fbd_dev_led_class->start_periodic = fbd_dev_led_multicolor_start_periodic; - fbd_dev_led_class->has_color = fbd_dev_led_has_color_multicolor; + fbd_dev_led_class->set_color = fbd_dev_led_multicolor_set_color; } diff --git a/src/fbd-dev-led-priv.h b/src/fbd-dev-led-priv.h index 32b34e1..b2300b2 100644 --- a/src/fbd-dev-led-priv.h +++ b/src/fbd-dev-led-priv.h @@ -17,6 +17,6 @@ G_BEGIN_DECLS GUdevDevice *fbd_dev_led_get_device (FbdDevLed *led); void fbd_dev_led_set_max_brightness (FbdDevLed *led, guint max_brightness); -void fbd_dev_led_set_color (FbdDevLed *led, FbdFeedbackLedColor color); +void fbd_dev_led_set_supported_color (FbdDevLed *led, FbdFeedbackLedColor color); G_END_DECLS diff --git a/src/fbd-dev-led.c b/src/fbd-dev-led.c index f577229..cf6b9ed 100644 --- a/src/fbd-dev-led.c +++ b/src/fbd-dev-led.c @@ -16,11 +16,6 @@ #include #define LED_BRIGHTNESS_ATTR "brightness" -#define LED_MULTI_INDEX_ATTR "multi_index" -#define LED_MULTI_INDEX_RED "red" -#define LED_MULTI_INDEX_GREEN "green" -#define LED_MULTI_INDEX_BLUE "blue" -#define LED_MULTI_INTENSITY_ATTR "multi_intensity" #define LED_PATTERN_ATTR "pattern" enum { @@ -98,10 +93,31 @@ fbd_dev_led_probe_default (FbdDevLed *led, GError **error) static gboolean -fbd_dev_led_start_periodic_default (FbdDevLed *led, - FbdFeedbackLedColor color, - guint max_brightness_percentage, - guint freq) +fbd_dev_led_set_color_default (FbdDevLed *led, + FbdFeedbackLedColor color) +{ + /* Ignore setting color as we have a single color only */ + return TRUE; +} + + +static gboolean +fbd_dev_led_supports_color_default (FbdDevLed *led, + FbdFeedbackLedColor color) +{ + FbdDevLedPrivate *priv; + + g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); + priv = fbd_dev_led_get_instance_private (led); + + return priv->color == color; +} + + +static gboolean +fbd_dev_led_start_periodic_default (FbdDevLed *led, + guint max_brightness_percentage, + guint freq) { FbdDevLedPrivate *priv; g_autoptr (GError) err = NULL; @@ -127,18 +143,6 @@ fbd_dev_led_start_periodic_default (FbdDevLed *led, } -static gboolean -fbd_dev_led_has_color_default (FbdDevLed *led, FbdFeedbackLedColor color) -{ - FbdDevLedPrivate *priv; - - g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); - priv = fbd_dev_led_get_instance_private (led); - - return priv->color == color; -} - - static void fbd_dev_led_set_property (GObject *object, guint property_id, @@ -221,7 +225,8 @@ fbd_dev_led_class_init (FbdDevLedClass *klass) fbd_dev_led_class->probe = fbd_dev_led_probe_default; fbd_dev_led_class->start_periodic = fbd_dev_led_start_periodic_default; - fbd_dev_led_class->has_color = fbd_dev_led_has_color_default; + fbd_dev_led_class->set_color = fbd_dev_led_set_color_default; + fbd_dev_led_class->supports_color = fbd_dev_led_supports_color_default; props[PROP_DEV] = g_param_spec_object ("dev", "", "", @@ -265,7 +270,6 @@ fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness) gboolean fbd_dev_led_start_periodic (FbdDevLed *led, - FbdFeedbackLedColor color, guint max_brightness_percentage, guint freq) { @@ -273,18 +277,30 @@ fbd_dev_led_start_periodic (FbdDevLed *led, g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); - return fbd_dev_led_class->start_periodic (led, color, max_brightness_percentage, freq); + return fbd_dev_led_class->start_periodic (led, max_brightness_percentage, freq); } gboolean -fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color) +fbd_dev_led_set_color (FbdDevLed *led, + FbdFeedbackLedColor color) { FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_GET_CLASS (led); g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); - return fbd_dev_led_class->has_color (led, color); + return fbd_dev_led_class->set_color (led, color); +} + + +gboolean +fbd_dev_led_supports_color (FbdDevLed *led, FbdFeedbackLedColor color) +{ + FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_GET_CLASS (led); + + g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); + + return fbd_dev_led_class->supports_color (led, color); } @@ -314,7 +330,7 @@ fbd_dev_led_get_device (FbdDevLed *led) void -fbd_dev_led_set_color (FbdDevLed *led, FbdFeedbackLedColor color) +fbd_dev_led_set_supported_color (FbdDevLed *led, FbdFeedbackLedColor color) { FbdDevLedPrivate *priv; diff --git a/src/fbd-dev-led.h b/src/fbd-dev-led.h index 139deec..0aba548 100644 --- a/src/fbd-dev-led.h +++ b/src/fbd-dev-led.h @@ -20,22 +20,23 @@ G_DECLARE_DERIVABLE_TYPE (FbdDevLed, fbd_dev_led, FBD, DEV_LED, GObject) FbdDevLed *fbd_dev_led_new (GUdevDevice *dev, GError **err); gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness); guint fbd_dev_led_get_max_brightness (FbdDevLed *led); +gboolean fbd_dev_led_set_color (FbdDevLed *led, FbdFeedbackLedColor color); gboolean fbd_dev_led_start_periodic (FbdDevLed *led, - FbdFeedbackLedColor color, guint max_brightness_percentage, guint freq); -gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color); +gboolean fbd_dev_led_supports_color (FbdDevLed *led, FbdFeedbackLedColor color); struct _FbdDevLedClass { GObjectClass parent_class; - gboolean (*probe) (FbdDevLed *led, GError **error); + gboolean (*probe) (FbdDevLed *led, GError **error); gboolean (*start_periodic) (FbdDevLed *led, - FbdFeedbackLedColor color, guint max_brightness_percentage, guint freq); - gboolean (*has_color) (FbdDevLed *led, - FbdFeedbackLedColor color); + gboolean (*set_color) (FbdDevLed *led, + FbdFeedbackLedColor color); + gboolean (*supports_color) (FbdDevLed *led, + FbdFeedbackLedColor color); }; G_END_DECLS diff --git a/src/fbd-dev-leds.c b/src/fbd-dev-leds.c index 34b4314..a1e77c0 100644 --- a/src/fbd-dev-leds.c +++ b/src/fbd-dev-leds.c @@ -47,7 +47,7 @@ find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color) for (GSList *l = self->leds; l != NULL; l = l->next) { FbdDevLed *led = l->data; - if (fbd_dev_led_has_color (led, color)) + if (fbd_dev_led_supports_color (led, color)) return led; } @@ -165,7 +165,9 @@ fbd_dev_leds_start_periodic (FbdDevLeds *self, FbdFeedbackLedColor color, led = find_led_by_color (self, color); g_return_val_if_fail (led, FALSE); - return fbd_dev_led_start_periodic (led, color, max_brightness_percentage, freq); + fbd_dev_led_set_color (led, color); + + return fbd_dev_led_start_periodic (led, max_brightness_percentage, freq); } gboolean diff --git a/tests/test-fbd-dev-led.c b/tests/test-fbd-dev-led.c index c541218..9b5fe8d 100644 --- a/tests/test-fbd-dev-led.c +++ b/tests/test-fbd-dev-led.c @@ -33,8 +33,8 @@ test_fbd_dev_led_simple (FbdUmockdevFixture *fixture, gconstpointer unused) led = fbd_dev_led_new (dev, &err); g_assert_no_error (err); g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 255); - g_assert_true (fbd_dev_led_has_color (led, FBD_FEEDBACK_LED_COLOR_BLUE)); - g_assert_true (fbd_dev_led_start_periodic (led, FBD_FEEDBACK_LED_COLOR_BLUE, 50, 50)); + g_assert_true (fbd_dev_led_supports_color (led, FBD_FEEDBACK_LED_COLOR_BLUE)); + g_assert_true (fbd_dev_led_start_periodic (led, 50, 50)); g_assert_finalize_object (led); } @@ -60,8 +60,8 @@ test_fbd_dev_led_multicolor (FbdUmockdevFixture *fixture, gconstpointer unused) led = fbd_dev_led_multicolor_new (dev, &err); g_assert_no_error (err); g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 248); - g_assert_true (fbd_dev_led_has_color (led, FBD_FEEDBACK_LED_COLOR_RGB)); - g_assert_true (fbd_dev_led_start_periodic (led, FBD_FEEDBACK_LED_COLOR_BLUE, 50, 50)); + g_assert_true (fbd_dev_led_supports_color (led, FBD_FEEDBACK_LED_COLOR_RGB)); + g_assert_true (fbd_dev_led_start_periodic (led, 50, 50)); g_assert_finalize_object (led); }