feedback-led: Check if at least one LED is available

So far we didn't create any FbdDevLeds if there wasn't at least one
usable LED. Once we introduce flash LEDs we might probe the LED but the
LED might not be usable as the user hasn't enabled using it. Prepare for
that scenario.
This commit is contained in:
Guido Günther
2024-06-15 11:14:40 +02:00
parent 417b34be89
commit e16dc3cdab
3 changed files with 32 additions and 6 deletions
+26 -3
View File
@@ -48,7 +48,7 @@ find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color)
g_return_val_if_fail (self->leds, NULL); g_return_val_if_fail (self->leds, NULL);
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 = FBD_DEV_LED (l->data);
if (fbd_dev_led_supports_color (led, color)) if (fbd_dev_led_supports_color (led, color))
return led; return led;
} }
@@ -199,7 +199,10 @@ fbd_dev_leds_start_periodic (FbdDevLeds *self,
g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE); g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE);
g_return_val_if_fail (max_brightness_percentage <= 100.0, FALSE); g_return_val_if_fail (max_brightness_percentage <= 100.0, FALSE);
led = find_led_by_color (self, color); led = find_led_by_color (self, color);
g_return_val_if_fail (led, FALSE); if (!led) {
g_warning_once ("No usable led found");
return FALSE;
}
fbd_dev_led_set_color (led, color, rgb); fbd_dev_led_set_color (led, color, rgb);
@@ -214,7 +217,27 @@ fbd_dev_leds_stop (FbdDevLeds *self, FbdFeedbackLedColor color)
g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE); g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE);
led = find_led_by_color (self, color); led = find_led_by_color (self, color);
g_return_val_if_fail (led, FALSE); if (!led) {
g_warning_once ("No usable led found");
return FALSE;
}
return fbd_dev_led_set_brightness (led, 0); return fbd_dev_led_set_brightness (led, 0);
} }
/**
* fbd_dev_leds_has_led:
* @self: The FbdDevLeds
* @color: The color type to check
*
* Whether there's a usable LED of the given type
*
* Returns: `TRUE` if there's a at least one usable LED, otherwise `FALSE`
*/
gboolean
fbd_dev_leds_has_led (FbdDevLeds *self, FbdFeedbackLedColor color)
{
g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE);
return !!find_led_by_color (self, color);
}
+2 -2
View File
@@ -22,7 +22,7 @@ gboolean fbd_dev_leds_start_periodic (FbdDevLeds *self,
FbdLedRgbColor *rgb, FbdLedRgbColor *rgb,
guint max_brighness, guint max_brighness,
guint freq); guint freq);
gboolean fbd_dev_leds_stop (FbdDevLeds *self, gboolean fbd_dev_leds_stop (FbdDevLeds *self, FbdFeedbackLedColor color);
FbdFeedbackLedColor color); gboolean fbd_dev_leds_has_led (FbdDevLeds *self, FbdFeedbackLedColor color);
G_END_DECLS G_END_DECLS
+4 -1
View File
@@ -250,7 +250,10 @@ fbd_feedback_led_is_available (FbdFeedbackBase *base)
FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); FbdFeedbackManager *manager = fbd_feedback_manager_get_default ();
FbdDevLeds *dev = fbd_feedback_manager_get_dev_leds (manager); FbdDevLeds *dev = fbd_feedback_manager_get_dev_leds (manager);
return FBD_IS_DEV_LEDS (dev); if (!FBD_IS_DEV_LEDS (dev))
return FALSE;
return fbd_dev_leds_has_led (dev, FBD_FEEDBACK_LED_COLOR_WHITE);
} }