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.
This commit is contained in:
committed by
Guido Günther
parent
bcd37b0aa5
commit
e43126b007
@@ -65,7 +65,7 @@ fbd_dev_led_multicolor_probe (FbdDevLed *led, GError **error)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
fbd_dev_led_set_max_brightness (led, max_brightness);
|
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++) {
|
for (int i = 0; index[i] != NULL; i++) {
|
||||||
g_debug ("Index: %s", index[i]);
|
g_debug ("Index: %s", index[i]);
|
||||||
@@ -90,10 +90,8 @@ fbd_dev_led_multicolor_probe (FbdDevLed *led, GError **error)
|
|||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fbd_dev_led_multicolor_start_periodic (FbdDevLed *led,
|
fbd_dev_led_multicolor_set_color (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color,
|
FbdFeedbackLedColor color)
|
||||||
guint max_brightness_percentage,
|
|
||||||
guint freq)
|
|
||||||
{
|
{
|
||||||
FbdDevLedMulticolor *self = FBD_DEV_LED_MULTICOLOR (led);
|
FbdDevLedMulticolor *self = FBD_DEV_LED_MULTICOLOR (led);
|
||||||
FbdDevLedMulticolorPrivate *priv = fbd_dev_led_multicolor_get_instance_private (self);
|
FbdDevLedMulticolorPrivate *priv = fbd_dev_led_multicolor_get_instance_private (self);
|
||||||
@@ -142,16 +140,7 @@ fbd_dev_led_multicolor_start_periodic (FbdDevLed *led,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Chain up to parent class to set the pattern */
|
return TRUE;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -161,8 +150,7 @@ fbd_dev_led_multicolor_class_init (FbdDevLedMulticolorClass *klass)
|
|||||||
FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_CLASS (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->probe = fbd_dev_led_multicolor_probe;
|
||||||
fbd_dev_led_class->start_periodic = fbd_dev_led_multicolor_start_periodic;
|
fbd_dev_led_class->set_color = fbd_dev_led_multicolor_set_color;
|
||||||
fbd_dev_led_class->has_color = fbd_dev_led_has_color_multicolor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
GUdevDevice *fbd_dev_led_get_device (FbdDevLed *led);
|
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_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
|
G_END_DECLS
|
||||||
|
|||||||
+43
-27
@@ -16,11 +16,6 @@
|
|||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
|
||||||
#define LED_BRIGHTNESS_ATTR "brightness"
|
#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"
|
#define LED_PATTERN_ATTR "pattern"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -98,10 +93,31 @@ fbd_dev_led_probe_default (FbdDevLed *led, GError **error)
|
|||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fbd_dev_led_start_periodic_default (FbdDevLed *led,
|
fbd_dev_led_set_color_default (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color,
|
FbdFeedbackLedColor color)
|
||||||
guint max_brightness_percentage,
|
{
|
||||||
guint freq)
|
/* 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;
|
FbdDevLedPrivate *priv;
|
||||||
g_autoptr (GError) err = NULL;
|
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
|
static void
|
||||||
fbd_dev_led_set_property (GObject *object,
|
fbd_dev_led_set_property (GObject *object,
|
||||||
guint property_id,
|
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->probe = fbd_dev_led_probe_default;
|
||||||
fbd_dev_led_class->start_periodic = fbd_dev_led_start_periodic_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] =
|
props[PROP_DEV] =
|
||||||
g_param_spec_object ("dev", "", "",
|
g_param_spec_object ("dev", "", "",
|
||||||
@@ -265,7 +270,6 @@ fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness)
|
|||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fbd_dev_led_start_periodic (FbdDevLed *led,
|
fbd_dev_led_start_periodic (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color,
|
|
||||||
guint max_brightness_percentage,
|
guint max_brightness_percentage,
|
||||||
guint freq)
|
guint freq)
|
||||||
{
|
{
|
||||||
@@ -273,18 +277,30 @@ fbd_dev_led_start_periodic (FbdDevLed *led,
|
|||||||
|
|
||||||
g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE);
|
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
|
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);
|
FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_GET_CLASS (led);
|
||||||
|
|
||||||
g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE);
|
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
|
void
|
||||||
fbd_dev_led_set_color (FbdDevLed *led, FbdFeedbackLedColor color)
|
fbd_dev_led_set_supported_color (FbdDevLed *led, FbdFeedbackLedColor color)
|
||||||
{
|
{
|
||||||
FbdDevLedPrivate *priv;
|
FbdDevLedPrivate *priv;
|
||||||
|
|
||||||
|
|||||||
+7
-6
@@ -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);
|
FbdDevLed *fbd_dev_led_new (GUdevDevice *dev, GError **err);
|
||||||
gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness);
|
gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness);
|
||||||
guint fbd_dev_led_get_max_brightness (FbdDevLed *led);
|
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,
|
gboolean fbd_dev_led_start_periodic (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color,
|
|
||||||
guint max_brightness_percentage,
|
guint max_brightness_percentage,
|
||||||
guint freq);
|
guint freq);
|
||||||
gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color);
|
gboolean fbd_dev_led_supports_color (FbdDevLed *led, FbdFeedbackLedColor color);
|
||||||
|
|
||||||
struct _FbdDevLedClass {
|
struct _FbdDevLedClass {
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
gboolean (*probe) (FbdDevLed *led, GError **error);
|
gboolean (*probe) (FbdDevLed *led, GError **error);
|
||||||
gboolean (*start_periodic) (FbdDevLed *led,
|
gboolean (*start_periodic) (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color,
|
|
||||||
guint max_brightness_percentage,
|
guint max_brightness_percentage,
|
||||||
guint freq);
|
guint freq);
|
||||||
gboolean (*has_color) (FbdDevLed *led,
|
gboolean (*set_color) (FbdDevLed *led,
|
||||||
FbdFeedbackLedColor color);
|
FbdFeedbackLedColor color);
|
||||||
|
gboolean (*supports_color) (FbdDevLed *led,
|
||||||
|
FbdFeedbackLedColor color);
|
||||||
};
|
};
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
+4
-2
@@ -47,7 +47,7 @@ find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color)
|
|||||||
|
|
||||||
for (GSList *l = self->leds; l != NULL; l = l->next) {
|
for (GSList *l = self->leds; l != NULL; l = l->next) {
|
||||||
FbdDevLed *led = l->data;
|
FbdDevLed *led = l->data;
|
||||||
if (fbd_dev_led_has_color (led, color))
|
if (fbd_dev_led_supports_color (led, color))
|
||||||
return led;
|
return led;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,9 @@ fbd_dev_leds_start_periodic (FbdDevLeds *self, FbdFeedbackLedColor color,
|
|||||||
led = find_led_by_color (self, color);
|
led = find_led_by_color (self, color);
|
||||||
g_return_val_if_fail (led, FALSE);
|
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
|
gboolean
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ test_fbd_dev_led_simple (FbdUmockdevFixture *fixture, gconstpointer unused)
|
|||||||
led = fbd_dev_led_new (dev, &err);
|
led = fbd_dev_led_new (dev, &err);
|
||||||
g_assert_no_error (err);
|
g_assert_no_error (err);
|
||||||
g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 255);
|
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_supports_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_start_periodic (led, 50, 50));
|
||||||
g_assert_finalize_object (led);
|
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);
|
led = fbd_dev_led_multicolor_new (dev, &err);
|
||||||
g_assert_no_error (err);
|
g_assert_no_error (err);
|
||||||
g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 248);
|
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_supports_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_start_periodic (led, 50, 50));
|
||||||
|
|
||||||
g_assert_finalize_object (led);
|
g_assert_finalize_object (led);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user