Merge branch 'led-prio' into 'main'
dev-led: Sort leds by priority See merge request agx/feedbackd!173
This commit is contained in:
@@ -71,6 +71,7 @@ fbd_dev_led_flash_class_init (FbdDevLedFlashClass *klass)
|
||||
static void
|
||||
fbd_dev_led_flash_init (FbdDevLedFlash *self)
|
||||
{
|
||||
fbd_dev_led_set_priority (FBD_DEV_LED (self), 5);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -195,6 +195,7 @@ fbd_dev_led_multicolor_class_init (FbdDevLedMulticolorClass *klass)
|
||||
static void
|
||||
fbd_dev_led_multicolor_init (FbdDevLedMulticolor *self)
|
||||
{
|
||||
fbd_dev_led_set_priority (FBD_DEV_LED (self), 50);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,5 +18,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_supported_color (FbdDevLed *led, FbdFeedbackLedColor color);
|
||||
void fbd_dev_led_set_priority (FbdDevLed *self, int priority);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -75,6 +75,7 @@ fbd_dev_led_qcom_multicolor_class_init (FbdDevLedQcomMulticolorClass *klass)
|
||||
static void
|
||||
fbd_dev_led_qcom_multicolor_init (FbdDevLedQcomMulticolor *self)
|
||||
{
|
||||
fbd_dev_led_set_priority (FBD_DEV_LED (self), 60);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -141,6 +141,7 @@ fbd_dev_led_qcom_class_init (FbdDevLedQcomClass *klass)
|
||||
static void
|
||||
fbd_dev_led_qcom_init (FbdDevLedQcom *self)
|
||||
{
|
||||
fbd_dev_led_set_priority (FBD_DEV_LED (self), 20);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Purism SPC
|
||||
* 2025 The Phosh Developers
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0+
|
||||
* Author: Guido Günther <agx@sigxcpu.org>
|
||||
*
|
||||
@@ -34,6 +36,7 @@ typedef struct _FbdDevLedPrivate {
|
||||
GUdevDevice *dev;
|
||||
guint max_brightness;
|
||||
|
||||
int priority;
|
||||
FbdFeedbackLedColor color;
|
||||
} FbdDevLedPrivate;
|
||||
|
||||
@@ -50,8 +53,17 @@ fbd_dev_led_probe_default (FbdDevLed *led, GError **error)
|
||||
FbdDevLedPrivate *priv = fbd_dev_led_get_instance_private (led);
|
||||
const gchar *name, *path;
|
||||
gboolean success = FALSE;
|
||||
const char *pattern;
|
||||
|
||||
name = g_udev_device_get_name (priv->dev);
|
||||
pattern = g_udev_device_get_sysfs_attr (priv->dev, LED_PATTERN_ATTR);
|
||||
if (!pattern) {
|
||||
g_set_error (error,
|
||||
G_FILE_ERROR, G_FILE_ERROR_FAILED,
|
||||
"LED %s can't use patterns", name);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (int i = 0; i <= FBD_FEEDBACK_LED_COLOR_RGB; i++) {
|
||||
g_autofree char *color = NULL;
|
||||
g_autofree char *enum_name = NULL;
|
||||
@@ -242,6 +254,7 @@ fbd_dev_led_class_init (FbdDevLedClass *klass)
|
||||
static void
|
||||
fbd_dev_led_init (FbdDevLed *self)
|
||||
{
|
||||
fbd_dev_led_set_priority (self, 10);
|
||||
}
|
||||
|
||||
|
||||
@@ -354,3 +367,27 @@ fbd_dev_led_set_max_brightness (FbdDevLed *led, guint max_brightness)
|
||||
|
||||
priv->max_brightness = max_brightness;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
fbd_dev_led_get_priority (FbdDevLed *self)
|
||||
{
|
||||
FbdDevLedPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (FBD_IS_DEV_LED (self), 0);
|
||||
priv = fbd_dev_led_get_instance_private (self);
|
||||
|
||||
return priv->priority;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
fbd_dev_led_set_priority (FbdDevLed *self, int priority)
|
||||
{
|
||||
FbdDevLedPrivate *priv;
|
||||
|
||||
g_return_if_fail (FBD_IS_DEV_LED (self));
|
||||
priv = fbd_dev_led_get_instance_private (self);
|
||||
|
||||
priv->priority = priority;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ gboolean fbd_dev_led_start_periodic (FbdDevLed *led,
|
||||
guint max_brightness_percentage,
|
||||
guint freq);
|
||||
gboolean fbd_dev_led_supports_color (FbdDevLed *led, FbdFeedbackLedColor color);
|
||||
int fbd_dev_led_get_priority (FbdDevLed *self);
|
||||
|
||||
struct _FbdDevLedClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
+18
-7
@@ -43,6 +43,7 @@ static void initable_iface_init (GInitableIface *iface);
|
||||
G_DEFINE_TYPE_WITH_CODE (FbdDevLeds, fbd_dev_leds, G_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init));
|
||||
|
||||
|
||||
static FbdDevLed *
|
||||
find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color)
|
||||
{
|
||||
@@ -109,6 +110,16 @@ probe_led (GUdevDevice *dev, GError **error) {
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
priority_cmp (gconstpointer a, gconstpointer b)
|
||||
{
|
||||
int prio_a = fbd_dev_led_get_priority ((FbdDevLed *)a);
|
||||
int prio_b = fbd_dev_led_get_priority ((FbdDevLed *)b);
|
||||
|
||||
return prio_b - prio_a;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
initable_init (GInitable *initable,
|
||||
GCancellable *cancellable,
|
||||
@@ -117,7 +128,7 @@ initable_init (GInitable *initable,
|
||||
const gchar * const subsystems[] = { LED_SUBSYSTEM, NULL };
|
||||
FbdDevLeds *self = FBD_DEV_LEDS (initable);
|
||||
g_autolist (GUdevDevice) leds = NULL;
|
||||
gboolean found = FALSE;
|
||||
GSList *usable_leds = NULL;
|
||||
|
||||
self->client = g_udev_client_new (subsystems);
|
||||
|
||||
@@ -135,21 +146,21 @@ initable_init (GInitable *initable,
|
||||
|
||||
led = probe_led (dev, &err);
|
||||
|
||||
if (led) {
|
||||
self->leds = g_slist_append (self->leds, led);
|
||||
found = TRUE;
|
||||
}
|
||||
if (led)
|
||||
usable_leds = g_slist_append (usable_leds, led);
|
||||
}
|
||||
|
||||
/* TODO: listen for new leds via udev events */
|
||||
|
||||
if (!found) {
|
||||
if (usable_leds) {
|
||||
self->leds = g_slist_sort (usable_leds, priority_cmp);
|
||||
} else {
|
||||
g_set_error (error,
|
||||
G_FILE_ERROR, G_FILE_ERROR_FAILED,
|
||||
"No usable LEDs found");
|
||||
}
|
||||
|
||||
return found;
|
||||
return !!usable_leds;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -36,6 +36,7 @@ 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_cmpint (fbd_dev_led_get_priority (led), ==, 10);
|
||||
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);
|
||||
@@ -63,6 +64,7 @@ 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_cmpint (fbd_dev_led_get_priority (led), ==, 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));
|
||||
|
||||
@@ -91,6 +93,7 @@ test_fbd_dev_led_flash (FbdUmockdevFixture *fixture, gconstpointer unused)
|
||||
led = fbd_dev_led_flash_new (dev, &err);
|
||||
g_assert_no_error (err);
|
||||
g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 255);
|
||||
g_assert_cmpint (fbd_dev_led_get_priority (led), ==, 5);
|
||||
g_assert_true (fbd_dev_led_supports_color (led, FBD_FEEDBACK_LED_COLOR_FLASH));
|
||||
g_assert_true (fbd_dev_led_start_periodic (led, 50, 50));
|
||||
g_assert_true (fbd_dev_led_start_periodic (led, 50, 0));
|
||||
@@ -120,6 +123,7 @@ test_fbd_dev_led_qcom_simple (FbdUmockdevFixture *fixture, gconstpointer unused)
|
||||
led = fbd_dev_led_qcom_new (dev, &err);
|
||||
g_assert_no_error (err);
|
||||
g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 511);
|
||||
g_assert_cmpint (fbd_dev_led_get_priority (led), ==, 20);
|
||||
g_assert_true (fbd_dev_led_supports_color (led, FBD_FEEDBACK_LED_COLOR_WHITE));
|
||||
g_assert_true (fbd_dev_led_start_periodic (led, 50, 50));
|
||||
g_assert_finalize_object (led);
|
||||
@@ -147,6 +151,7 @@ test_fbd_dev_led_qcom_multicolor (FbdUmockdevFixture *fixture, gconstpointer unu
|
||||
led = fbd_dev_led_qcom_multicolor_new (dev, &err);
|
||||
g_assert_no_error (err);
|
||||
g_assert_cmpint (fbd_dev_led_get_max_brightness (led), ==, 511);
|
||||
g_assert_cmpint (fbd_dev_led_get_priority (led), ==, 60);
|
||||
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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user