fbd-dev-led: Turn into a GObject

This is just the minimal changes to switch to a derivable GObject
This commit is contained in:
Guido Günther
2023-02-10 15:15:12 +00:00
committed by Guido Gunther
parent f17ca72c1b
commit f7ec08497e
3 changed files with 133 additions and 37 deletions
+125 -34
View File
@@ -21,8 +21,14 @@
#define LED_MULTI_INTENSITY_ATTR "multi_intensity" #define LED_MULTI_INTENSITY_ATTR "multi_intensity"
#define LED_PATTERN_ATTR "pattern" #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; GUdevDevice *dev;
guint max_brightness; guint max_brightness;
guint red_index; guint red_index;
@@ -33,22 +39,93 @@ struct _FbdDevLed {
* do rgb mixing, etc * do rgb mixing, etc
*/ */
FbdFeedbackLedColor color; FbdFeedbackLedColor color;
}; } FbdDevLedPrivate;
void G_DEFINE_TYPE_WITH_PRIVATE (FbdDevLed, fbd_dev_led, G_TYPE_OBJECT)
fbd_dev_led_free (FbdDevLed *led)
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 * FbdDevLed *
fbd_dev_led_new (GUdevDevice *dev) fbd_dev_led_new (GUdevDevice *dev)
{ {
FbdDevLed *led = NULL; FbdDevLed *led = NULL;
FbdDevLedPrivate *priv;
const gchar *name, *path; const gchar *name, *path;
name = g_udev_device_get_name (dev); name = g_udev_device_get_name (dev);
@@ -73,22 +150,23 @@ fbd_dev_led_new (GUdevDevice *dev)
if (!brightness) if (!brightness)
continue; continue;
led = g_malloc0 (sizeof(FbdDevLed)); led = g_object_new (FBD_TYPE_DEV_LED, NULL);
led->dev = g_object_ref (dev); priv = fbd_dev_led_get_instance_private (led);
led->color = i; priv->dev = g_object_ref (dev);
led->max_brightness = brightness; priv->color = i;
priv->max_brightness = brightness;
if (index) { if (index) {
for (int j = 0; j < g_strv_length ((gchar **) index); j++) { for (int j = 0; j < g_strv_length ((gchar **) index); j++) {
g_debug ("Index: %s", index[j]); g_debug ("Index: %s", index[j]);
if (g_strcmp0 (index[j], LED_MULTI_INDEX_RED) == 0) { if (g_strcmp0 (index[j], LED_MULTI_INDEX_RED) == 0) {
led->red_index = counter; priv->red_index = counter;
counter++; counter++;
} else if (g_strcmp0 (index[j], LED_MULTI_INDEX_GREEN) == 0) { } else if (g_strcmp0 (index[j], LED_MULTI_INDEX_GREEN) == 0) {
led->green_index = counter; priv->green_index = counter;
counter++; counter++;
} else if (g_strcmp0 (index[j], LED_MULTI_INDEX_BLUE) == 0) { } else if (g_strcmp0 (index[j], LED_MULTI_INDEX_BLUE) == 0) {
led->blue_index = counter; priv->blue_index = counter;
counter++; counter++;
} else { } else {
g_warning ("Unsupport LED color index: %d %s", counter, index[j]); g_warning ("Unsupport LED color index: %d %s", counter, index[j]);
@@ -109,15 +187,19 @@ fbd_dev_led_new (GUdevDevice *dev)
gboolean gboolean
fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness) fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness)
{ {
FbdDevLedPrivate *priv;
g_autoptr (GError) err = NULL; 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); g_warning ("Failed to setup brightness: %s", err->message);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
gboolean gboolean
@@ -126,55 +208,59 @@ fbd_dev_led_start_periodic (FbdDevLed *led,
guint max_brightness_percentage, guint max_brightness_percentage,
guint freq) guint freq)
{ {
FbdDevLedPrivate *priv;
g_autoptr (GError) err = NULL; g_autoptr (GError) err = NULL;
g_autofree gchar *str = NULL; g_autofree gchar *str = NULL;
gboolean success = FALSE; gboolean success = FALSE;
gdouble max; gdouble max;
gdouble t; 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; g_autofree char *intensity = NULL;
guint colors[] = { 0, 0, 0 }; guint colors[] = { 0, 0, 0 };
switch (color) { switch (color) {
case FBD_FEEDBACK_LED_COLOR_WHITE: case FBD_FEEDBACK_LED_COLOR_WHITE:
colors[led->red_index] = led->max_brightness; colors[priv->red_index] = priv->max_brightness;
colors[led->green_index] = led->max_brightness; colors[priv->green_index] = priv->max_brightness;
colors[led->blue_index] = led->max_brightness; colors[priv->blue_index] = priv->max_brightness;
break; break;
case FBD_FEEDBACK_LED_COLOR_RED: case FBD_FEEDBACK_LED_COLOR_RED:
colors[led->red_index] = led->max_brightness; colors[priv->red_index] = priv->max_brightness;
colors[led->green_index] = 0; colors[priv->green_index] = 0;
colors[led->blue_index] = 0; colors[priv->blue_index] = 0;
break; break;
case FBD_FEEDBACK_LED_COLOR_GREEN: case FBD_FEEDBACK_LED_COLOR_GREEN:
colors[led->red_index] = 0; colors[priv->red_index] = 0;
colors[led->green_index] = led->max_brightness; colors[priv->green_index] = priv->max_brightness;
colors[led->blue_index] = 0; colors[priv->blue_index] = 0;
break; break;
case FBD_FEEDBACK_LED_COLOR_BLUE: case FBD_FEEDBACK_LED_COLOR_BLUE:
colors[led->red_index] = 0; colors[priv->red_index] = 0;
colors[led->green_index] = 0; colors[priv->green_index] = 0;
colors[led->blue_index] = led->max_brightness; colors[priv->blue_index] = priv->max_brightness;
break; break;
default: default:
g_warning("Unhandled color: %d\n", color); g_warning("Unhandled color: %d\n", color);
return FALSE; return FALSE;
} }
intensity = g_strdup_printf ("%d %d %d\n", colors[0], colors[1], colors[2]); intensity = g_strdup_printf ("%d %d %d\n", colors[0], colors[1], colors[2]);
fbd_dev_led_set_brightness (led, led->max_brightness); fbd_dev_led_set_brightness (led, priv->max_brightness);
success = fbd_udev_set_sysfs_path_attr_as_string (led->dev, LED_MULTI_INTENSITY_ATTR, intensity, &err); success = fbd_udev_set_sysfs_path_attr_as_string (priv->dev, LED_MULTI_INTENSITY_ATTR, intensity, &err);
if (!success) { if (!success) {
g_warning ("Failed to set multi intensity: %s", err->message); g_warning ("Failed to set multi intensity: %s", err->message);
g_clear_error (&err); 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 */ /* ms mHz T/2 */
t = 1000.0 * 1000.0 / freq / 2.0; t = 1000.0 * 1000.0 / freq / 2.0;
str = g_strdup_printf ("0 %d %d %d\n", (gint)t, (gint)max, (gint)t); 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); 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) if (!success)
g_warning ("Failed to set led pattern: %s", err->message); g_warning ("Failed to set led pattern: %s", err->message);
@@ -185,5 +271,10 @@ fbd_dev_led_start_periodic (FbdDevLed *led,
gboolean gboolean
fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color) 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);
} }
+7 -2
View File
@@ -13,9 +13,10 @@
G_BEGIN_DECLS 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); gboolean fbd_dev_led_set_brightness (FbdDevLed *led, guint brightness);
FbdDevLed *fbd_dev_led_new (GUdevDevice *dev); FbdDevLed *fbd_dev_led_new (GUdevDevice *dev);
gboolean fbd_dev_led_start_periodic (FbdDevLed *led, gboolean fbd_dev_led_start_periodic (FbdDevLed *led,
@@ -24,4 +25,8 @@ gboolean fbd_dev_led_start_periodic (FbdDevLed *led,
guint freq); guint freq);
gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color); gboolean fbd_dev_led_has_color (FbdDevLed *led, FbdFeedbackLedColor color);
struct _FbdDevLedClass {
GObjectClass parent_class;
};
G_END_DECLS G_END_DECLS
+1 -1
View File
@@ -107,7 +107,7 @@ fbd_dev_leds_dispose (GObject *object)
FbdDevLeds *self = FBD_DEV_LEDS (object); FbdDevLeds *self = FBD_DEV_LEDS (object);
g_clear_object (&self->client); 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; self->leds = NULL;
G_OBJECT_CLASS (fbd_dev_leds_parent_class)->dispose (object); G_OBJECT_CLASS (fbd_dev_leds_parent_class)->dispose (object);