From f7ec08497ed6a34220324b2e0f98c52a7e6372b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sat, 21 Jan 2023 14:47:13 +0100 Subject: [PATCH] fbd-dev-led: Turn into a GObject This is just the minimal changes to switch to a derivable GObject --- src/fbd-dev-led.c | 159 +++++++++++++++++++++++++++++++++++---------- src/fbd-dev-led.h | 9 ++- src/fbd-dev-leds.c | 2 +- 3 files changed, 133 insertions(+), 37 deletions(-) diff --git a/src/fbd-dev-led.c b/src/fbd-dev-led.c index 2badd62..e437d6d 100644 --- a/src/fbd-dev-led.c +++ b/src/fbd-dev-led.c @@ -21,8 +21,14 @@ #define LED_MULTI_INTENSITY_ATTR "multi_intensity" #define LED_PATTERN_ATTR "pattern" +enum { + PROP_0, + PROP_DEV, + PROP_LAST_PROP +}; +static GParamSpec *props[PROP_LAST_PROP]; -struct _FbdDevLed { +typedef struct _FbdDevLedPrivate { GUdevDevice *dev; guint max_brightness; guint red_index; @@ -33,22 +39,93 @@ struct _FbdDevLed { * do rgb mixing, etc */ FbdFeedbackLedColor color; -}; +} FbdDevLedPrivate; -void -fbd_dev_led_free (FbdDevLed *led) +G_DEFINE_TYPE_WITH_PRIVATE (FbdDevLed, fbd_dev_led, G_TYPE_OBJECT) + + +static void +fbd_dev_led_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + FbdDevLed *led = FBD_DEV_LED (object); + FbdDevLedPrivate *priv = fbd_dev_led_get_instance_private (led); + + switch (property_id) { + case PROP_DEV: + priv->dev = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +fbd_dev_led_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + FbdDevLed *led = FBD_DEV_LED (object); + FbdDevLedPrivate *priv = fbd_dev_led_get_instance_private (led); + + switch (property_id) { + case PROP_DEV: + g_value_set_object (value, priv->dev); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +fbd_dev_led_finalize (GObject *object) +{ + FbdDevLed *self = FBD_DEV_LED (object); + FbdDevLedPrivate *priv = fbd_dev_led_get_instance_private (self); + + g_clear_object (&priv->dev); + + G_OBJECT_CLASS (fbd_dev_led_parent_class)->finalize (object); +} + + +static void +fbd_dev_led_class_init (FbdDevLedClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = fbd_dev_led_get_property; + object_class->set_property = fbd_dev_led_set_property; + object_class->finalize = fbd_dev_led_finalize; + + props[PROP_DEV] = + g_param_spec_object ("dev", "", "", + G_UDEV_TYPE_DEVICE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, PROP_LAST_PROP, props); +} + + +static void +fbd_dev_led_init (FbdDevLed *self) { - g_object_unref (led->dev); - g_free (led); } FbdDevLed * fbd_dev_led_new (GUdevDevice *dev) { - FbdDevLed *led = NULL; + FbdDevLedPrivate *priv; const gchar *name, *path; name = g_udev_device_get_name (dev); @@ -73,22 +150,23 @@ fbd_dev_led_new (GUdevDevice *dev) if (!brightness) continue; - led = g_malloc0 (sizeof(FbdDevLed)); - led->dev = g_object_ref (dev); - led->color = i; - led->max_brightness = brightness; + led = g_object_new (FBD_TYPE_DEV_LED, NULL); + priv = fbd_dev_led_get_instance_private (led); + priv->dev = g_object_ref (dev); + priv->color = i; + priv->max_brightness = brightness; if (index) { for (int j = 0; j < g_strv_length ((gchar **) index); j++) { g_debug ("Index: %s", index[j]); if (g_strcmp0 (index[j], LED_MULTI_INDEX_RED) == 0) { - led->red_index = counter; + priv->red_index = counter; counter++; } else if (g_strcmp0 (index[j], LED_MULTI_INDEX_GREEN) == 0) { - led->green_index = counter; + priv->green_index = counter; counter++; } else if (g_strcmp0 (index[j], LED_MULTI_INDEX_BLUE) == 0) { - led->blue_index = counter; + priv->blue_index = counter; counter++; } else { g_warning ("Unsupport LED color index: %d %s", counter, index[j]); @@ -109,15 +187,19 @@ fbd_dev_led_new (GUdevDevice *dev) gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness) { + FbdDevLedPrivate *priv; g_autoptr (GError) err = NULL; - if (!fbd_udev_set_sysfs_path_attr_as_int (led->dev, LED_BRIGHTNESS_ATTR, brightness, &err)) { + g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); + priv = fbd_dev_led_get_instance_private (led); + + if (!fbd_udev_set_sysfs_path_attr_as_int (priv->dev, LED_BRIGHTNESS_ATTR, brightness, &err)) { g_warning ("Failed to setup brightness: %s", err->message); return FALSE; } return TRUE; -} +} gboolean @@ -126,55 +208,59 @@ fbd_dev_led_start_periodic (FbdDevLed *led, guint max_brightness_percentage, guint freq) { + FbdDevLedPrivate *priv; g_autoptr (GError) err = NULL; g_autofree gchar *str = NULL; gboolean success = FALSE; gdouble max; gdouble t; - if (led->color == FBD_FEEDBACK_LED_COLOR_RGB) { + g_return_val_if_fail (FBD_IS_DEV_LED (led), FALSE); + priv = fbd_dev_led_get_instance_private (led); + + if (priv->color == FBD_FEEDBACK_LED_COLOR_RGB) { g_autofree char *intensity = NULL; guint colors[] = { 0, 0, 0 }; switch (color) { case FBD_FEEDBACK_LED_COLOR_WHITE: - colors[led->red_index] = led->max_brightness; - colors[led->green_index] = led->max_brightness; - colors[led->blue_index] = led->max_brightness; + colors[priv->red_index] = priv->max_brightness; + colors[priv->green_index] = priv->max_brightness; + colors[priv->blue_index] = priv->max_brightness; break; case FBD_FEEDBACK_LED_COLOR_RED: - colors[led->red_index] = led->max_brightness; - colors[led->green_index] = 0; - colors[led->blue_index] = 0; + colors[priv->red_index] = priv->max_brightness; + colors[priv->green_index] = 0; + colors[priv->blue_index] = 0; break; case FBD_FEEDBACK_LED_COLOR_GREEN: - colors[led->red_index] = 0; - colors[led->green_index] = led->max_brightness; - colors[led->blue_index] = 0; + colors[priv->red_index] = 0; + colors[priv->green_index] = priv->max_brightness; + colors[priv->blue_index] = 0; break; case FBD_FEEDBACK_LED_COLOR_BLUE: - colors[led->red_index] = 0; - colors[led->green_index] = 0; - colors[led->blue_index] = led->max_brightness; + colors[priv->red_index] = 0; + colors[priv->green_index] = 0; + colors[priv->blue_index] = priv->max_brightness; break; default: g_warning("Unhandled color: %d\n", color); return FALSE; } intensity = g_strdup_printf ("%d %d %d\n", colors[0], colors[1], colors[2]); - fbd_dev_led_set_brightness (led, led->max_brightness); - success = fbd_udev_set_sysfs_path_attr_as_string (led->dev, LED_MULTI_INTENSITY_ATTR, intensity, &err); + fbd_dev_led_set_brightness (led, priv->max_brightness); + success = fbd_udev_set_sysfs_path_attr_as_string (priv->dev, LED_MULTI_INTENSITY_ATTR, intensity, &err); if (!success) { g_warning ("Failed to set multi intensity: %s", err->message); g_clear_error (&err); } } - max = led->max_brightness * (max_brightness_percentage / 100.0); + max = priv->max_brightness * (max_brightness_percentage / 100.0); /* ms mHz T/2 */ t = 1000.0 * 1000.0 / freq / 2.0; str = g_strdup_printf ("0 %d %d %d\n", (gint)t, (gint)max, (gint)t); g_debug ("Freq %d mHz, Brightness: %d%%, Blink pattern: %s", freq, max_brightness_percentage, str); - success = fbd_udev_set_sysfs_path_attr_as_string (led->dev, LED_PATTERN_ATTR, str, &err); + success = fbd_udev_set_sysfs_path_attr_as_string (priv->dev, LED_PATTERN_ATTR, str, &err); if (!success) g_warning ("Failed to set led pattern: %s", err->message); @@ -185,5 +271,10 @@ fbd_dev_led_start_periodic (FbdDevLed *led, gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color) { - return (led->color == FBD_FEEDBACK_LED_COLOR_RGB || led->color == 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 == FBD_FEEDBACK_LED_COLOR_RGB || priv->color == color); } diff --git a/src/fbd-dev-led.h b/src/fbd-dev-led.h index c709f75..d1fe99b 100644 --- a/src/fbd-dev-led.h +++ b/src/fbd-dev-led.h @@ -13,9 +13,10 @@ G_BEGIN_DECLS -typedef struct _FbdDevLed FbdDevLed; +#define FBD_TYPE_DEV_LED fbd_dev_led_get_type() + +G_DECLARE_DERIVABLE_TYPE (FbdDevLed, fbd_dev_led, FBD, DEV_LED, GObject) -void fbd_dev_led_free (FbdDevLed *led); gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness); FbdDevLed *fbd_dev_led_new (GUdevDevice *dev); gboolean fbd_dev_led_start_periodic (FbdDevLed *led, @@ -24,4 +25,8 @@ gboolean fbd_dev_led_start_periodic (FbdDevLed *led, guint freq); gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color); +struct _FbdDevLedClass { + GObjectClass parent_class; +}; + G_END_DECLS diff --git a/src/fbd-dev-leds.c b/src/fbd-dev-leds.c index d4f048b..a17ddfe 100644 --- a/src/fbd-dev-leds.c +++ b/src/fbd-dev-leds.c @@ -107,7 +107,7 @@ fbd_dev_leds_dispose (GObject *object) FbdDevLeds *self = FBD_DEV_LEDS (object); g_clear_object (&self->client); - g_slist_free_full (self->leds, (GDestroyNotify)fbd_dev_led_free); + g_slist_free_full (self->leds, (GDestroyNotify)g_object_unref); self->leds = NULL; G_OBJECT_CLASS (fbd_dev_leds_parent_class)->dispose (object);