From cf0a420c3f26864993a1831c76bc58aa96e55299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:36 +0100 Subject: [PATCH 1/7] doc: Mention theme reload on SIGHUP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- doc/feedbackd.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/feedbackd.rst b/doc/feedbackd.rst index d7713d1..5894c65 100644 --- a/doc/feedbackd.rst +++ b/doc/feedbackd.rst @@ -30,6 +30,8 @@ app that triggered it crashes. For details refer to the event and feedback theme specs at ``__ +Feedbackd reloads the feedback theme on `SIGHUP` (i.e. `pkill -HUP feedbackd`). + Options ======= From f94de01a85543c5a50be2172529ced500e6c3c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:37 +0100 Subject: [PATCH 2/7] vibra-periodic: Modernize doc comment and property definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also untabify. No functional change. Gpb-Dch: Ignore Signed-off-by: Guido Günther --- src/fbd-feedback-vibra-periodic.c | 47 +++++++++++++------------------ 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index bb7c69f..d89138e 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -11,10 +11,12 @@ #include "fbd-feedback-vibra-periodic.h" #include "fbd-feedback-manager.h" +#include + /** - * SECTION:fbd-feedback-vibra-periodic - * @short_description: Describes a periodic feedback via a haptic motor - * @Title: FbdFeedbackVibraPeriodic + * FbdFeedbackVibraPeriodic: + * + * Describes a periodic feedback via a haptic motor * * The #FbdVibraVibraPeriodic describes the properties of a haptic feedback * event. It knows nothing about the hardware itself but calls @@ -44,9 +46,9 @@ G_DEFINE_TYPE (FbdFeedbackVibraPeriodic, fbd_feedback_vibra_periodic, FBD_TYPE_F static void fbd_feedback_vibra_periodic_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) + guint property_id, + const GValue *value, + GParamSpec *pspec) { FbdFeedbackVibraPeriodic *self = FBD_FEEDBACK_VIBRA_PERIODIC (object); @@ -68,9 +70,9 @@ fbd_feedback_vibra_periodic_set_property (GObject *object, static void fbd_feedback_vibra_periodic_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) + guint property_id, + GValue *value, + GParamSpec *pspec) { FbdFeedbackVibraPeriodic *self = FBD_FEEDBACK_VIBRA_PERIODIC (object); @@ -145,28 +147,19 @@ fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) vibra_class->end_vibra = fbd_feedback_vibra_periodic_end_vibra; props[PROP_MAGNITUDE] = - g_param_spec_uint ( - "magnitude", - "Magnitude", - "total magnitude", - 0, MAX_MAGNITUDE, 0x7FFF, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_uint ("magnitude", "", "", + 0, MAX_MAGNITUDE, 0x7FFF, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); props[PROP_FADE_IN_TIME] = - g_param_spec_uint ( - "fade-in-time", - "Fade in time", - "Fade in time until full strength", - 0, G_MAXINT, 0, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_uint ("fade-in-time", "", "", + 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); props[PROP_FADE_IN_LEVEL] = - g_param_spec_uint ( - "fade-in-level", - "Fade in level", - "Fade in start level", - 0, MAX_MAGNITUDE, 0x7FFF, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_uint ("fade-in-level", "", "", + 0, MAX_MAGNITUDE, 0x7FFF, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, PROP_LAST_PROP, props); } From 89b33dcbab21ed9c012b2018fbe8daf969acbcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:38 +0100 Subject: [PATCH 3/7] vibra-periodic: Use same range as in rumble and periodic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We use [0.0, 1.0] in the other haptic feedbacks so let's make periodic do the same. We adjust dev-vibra to match that. Closes: https://source.puri.sm/Librem5/feedbackd/-/issues/86 Signed-off-by: Guido Günther --- src/fbd-dev-vibra.c | 13 ++++++----- src/fbd-dev-vibra.h | 7 ++++-- src/fbd-feedback-vibra-periodic.c | 36 +++++++++++++++---------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/fbd-dev-vibra.c b/src/fbd-dev-vibra.c index 85368a4..62dc824 100644 --- a/src/fbd-dev-vibra.c +++ b/src/fbd-dev-vibra.c @@ -272,8 +272,11 @@ fbd_dev_vibra_rumble (FbdDevVibra *self, double magnitude, guint duration, gbool /* TODO: fall back to multiple rumbles when sine not supported */ gboolean -fbd_dev_vibra_periodic (FbdDevVibra *self, guint duration, guint magnitude, - guint fade_in_level, guint fade_in_time) +fbd_dev_vibra_periodic (FbdDevVibra *self, + guint duration, + double magnitude, + double fade_in_level, + guint fade_in_time) { struct input_event event; struct ff_effect effect = { 0 }; @@ -281,7 +284,7 @@ fbd_dev_vibra_periodic (FbdDevVibra *self, guint duration, guint magnitude, g_return_val_if_fail (FBD_IS_DEV_VIBRA (self), FALSE); if (!magnitude) - magnitude = 0x7FFF; + magnitude = 0.5; if (!fade_in_level) fade_in_level = magnitude; @@ -293,12 +296,12 @@ fbd_dev_vibra_periodic (FbdDevVibra *self, guint duration, guint magnitude, effect.id = -1; effect.u.periodic.waveform = FF_SINE; effect.u.periodic.period = 10; - effect.u.periodic.magnitude = magnitude; + effect.u.periodic.magnitude = 0x7FFF * magnitude; effect.u.periodic.offset = 0; effect.u.periodic.phase = 0; effect.direction = 0x4000; effect.u.periodic.envelope.attack_length = fade_in_time; - effect.u.periodic.envelope.attack_level = fade_in_level;; + effect.u.periodic.envelope.attack_level = 0x7FFF * fade_in_level; effect.u.periodic.envelope.fade_length = 0; effect.u.periodic.envelope.fade_level = 0; effect.trigger.button = 0; diff --git a/src/fbd-dev-vibra.h b/src/fbd-dev-vibra.h index ef5891b..3cf3e3b 100644 --- a/src/fbd-dev-vibra.h +++ b/src/fbd-dev-vibra.h @@ -19,8 +19,11 @@ gboolean fbd_dev_vibra_rumble (FbdDevVibra *device, double magnitude, guint duration, gboolean upload); -gboolean fbd_dev_vibra_periodic (FbdDevVibra *self, guint duration, guint magnitude, - guint fade_in_level, guint fade_in_time); +gboolean fbd_dev_vibra_periodic (FbdDevVibra *self, + guint duration, + double magnitude, + double fade_in_level, + guint fade_in_time); gboolean fbd_dev_vibra_stop (FbdDevVibra *self); gboolean fbd_dev_vibra_remove_effect (FbdDevVibra *self); GUdevDevice *fbd_dev_vibra_get_device(FbdDevVibra *self); diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index d89138e..733c219 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -23,8 +23,6 @@ * #FbdDevVibra for that. */ -#define MAX_MAGNITUDE 0xFFFF - enum { PROP_0, PROP_MAGNITUDE, @@ -37,8 +35,8 @@ static GParamSpec *props[PROP_LAST_PROP]; typedef struct _FbdFeedbackVibraPeriodic { FbdFeedbackVibra parent; - guint magnitude; - guint fade_in_level; + double magnitude; + double fade_in_level; guint fade_in_time; } FbdFeedbackVibraPeriodic; @@ -54,10 +52,10 @@ fbd_feedback_vibra_periodic_set_property (GObject *object, switch (property_id) { case PROP_MAGNITUDE: - self->magnitude = g_value_get_uint (value); + self->magnitude = g_value_get_double (value); break; case PROP_FADE_IN_LEVEL: - self->fade_in_level = g_value_get_uint (value); + self->fade_in_level = g_value_get_double (value); break; case PROP_FADE_IN_TIME: self->fade_in_time = g_value_get_uint (value); @@ -78,10 +76,10 @@ fbd_feedback_vibra_periodic_get_property (GObject *object, switch (property_id) { case PROP_MAGNITUDE: - g_value_set_uint (value, self->magnitude); + g_value_set_double (value, self->magnitude); break; case PROP_FADE_IN_LEVEL: - g_value_set_uint (value, self->fade_in_level); + g_value_set_double (value, self->fade_in_level); break; case PROP_FADE_IN_TIME: g_value_set_uint (value, self->fade_in_time); @@ -109,15 +107,15 @@ fbd_feedback_vibra_periodic_start_vibra (FbdFeedbackVibra *vibra) FbdDevVibra *dev = fbd_feedback_manager_get_dev_vibra (manager); guint duration = fbd_feedback_vibra_get_duration (vibra); double max_strength = fbd_feedback_vibra_get_max_strength (FBD_FEEDBACK_VIBRA (self)); - double fade_in_ratio = (double)self->fade_in_level / self->magnitude; - guint max_magnitude, fade_in_level; + double fade_in_ratio = self->fade_in_level / self->magnitude; + double max_magnitude, fade_in_level; g_return_if_fail (FBD_IS_DEV_VIBRA (dev)); - max_magnitude = MIN (MAX_MAGNITUDE * max_strength, self->magnitude); + max_magnitude = MIN (max_strength, self->magnitude); fade_in_level = MIN (max_magnitude * fade_in_ratio, self->fade_in_level); - g_debug ("Periodic Vibra: %d %d %d %d", - duration, max_magnitude, fade_in_level, self->fade_in_time); + g_debug ("Periodic Vibra: (%f,%d) (%f,%d)", + max_magnitude, duration, fade_in_level, self->fade_in_time); fbd_dev_vibra_periodic (dev, duration, max_magnitude, fade_in_level, self->fade_in_time); } @@ -147,9 +145,9 @@ fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) vibra_class->end_vibra = fbd_feedback_vibra_periodic_end_vibra; props[PROP_MAGNITUDE] = - g_param_spec_uint ("magnitude", "", "", - 0, MAX_MAGNITUDE, 0x7FFF, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_double ("magnitude", "", "", + 0.0, 1.0, 0.5, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); props[PROP_FADE_IN_TIME] = g_param_spec_uint ("fade-in-time", "", "", @@ -157,9 +155,9 @@ fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); props[PROP_FADE_IN_LEVEL] = - g_param_spec_uint ("fade-in-level", "", "", - 0, MAX_MAGNITUDE, 0x7FFF, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_double ("fade-in-level", "", "", + 0.0, 1.0, 0.5, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, PROP_LAST_PROP, props); } From 91c34f409928e77f7e482467cb36228993d16fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:41 +0100 Subject: [PATCH 4/7] vibra-periodic: Use better defaults for fade-in-* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lets start at zero when not specified otherwise and also set an arbitrary fade-in-time as setting it to the duration isn't very helpful. While at that move the defaults to the feedback rather than the device so we ensure consistency over different device implementations. Signed-off-by: Guido Günther --- src/fbd-dev-vibra.c | 9 --------- src/fbd-feedback-vibra-periodic.c | 13 ++++++++----- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/fbd-dev-vibra.c b/src/fbd-dev-vibra.c index 62dc824..f764a6c 100644 --- a/src/fbd-dev-vibra.c +++ b/src/fbd-dev-vibra.c @@ -283,15 +283,6 @@ fbd_dev_vibra_periodic (FbdDevVibra *self, g_return_val_if_fail (FBD_IS_DEV_VIBRA (self), FALSE); - if (!magnitude) - magnitude = 0.5; - - if (!fade_in_level) - fade_in_level = magnitude; - - if (!fade_in_time) - fade_in_time = duration; - effect.type = FF_PERIODIC; effect.id = -1; effect.u.periodic.waveform = FF_SINE; diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index 733c219..2af95fd 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -35,9 +35,9 @@ static GParamSpec *props[PROP_LAST_PROP]; typedef struct _FbdFeedbackVibraPeriodic { FbdFeedbackVibra parent; - double magnitude; - double fade_in_level; - guint fade_in_time; + double magnitude; + double fade_in_level; + guint fade_in_time; } FbdFeedbackVibraPeriodic; G_DEFINE_TYPE (FbdFeedbackVibraPeriodic, fbd_feedback_vibra_periodic, FBD_TYPE_FEEDBACK_VIBRA); @@ -151,12 +151,12 @@ fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) props[PROP_FADE_IN_TIME] = g_param_spec_uint ("fade-in-time", "", "", - 0, G_MAXINT, 0, + 0, G_MAXINT, 500, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); props[PROP_FADE_IN_LEVEL] = g_param_spec_double ("fade-in-level", "", "", - 0.0, 1.0, 0.5, + 0.0, 1.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, PROP_LAST_PROP, props); @@ -165,4 +165,7 @@ fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) static void fbd_feedback_vibra_periodic_init (FbdFeedbackVibraPeriodic *self) { + self->magnitude = 0.5; + self->fade_in_level = 0.0; + self->fade_in_time = 500; } From da93a16cda89a5badafc88822205ffedaeb2f90f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:38 +0100 Subject: [PATCH 5/7] vibra-periodic: Deserialize magnitude and fade-in-level manually MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows us to add proper fallbacks Signed-off-by: Guido Günther --- src/fbd-feedback-vibra-periodic.c | 42 ++++++++++++++++++++++++++++++- tests/test-fbd-feedback-vibra.c | 38 ++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index 2af95fd..3e0b15b 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -40,7 +40,39 @@ typedef struct _FbdFeedbackVibraPeriodic { guint fade_in_time; } FbdFeedbackVibraPeriodic; -G_DEFINE_TYPE (FbdFeedbackVibraPeriodic, fbd_feedback_vibra_periodic, FBD_TYPE_FEEDBACK_VIBRA); +static void json_serializable_iface_init (JsonSerializableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (FbdFeedbackVibraPeriodic, fbd_feedback_vibra_periodic, + FBD_TYPE_FEEDBACK_VIBRA, + G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, + json_serializable_iface_init)); + +static gboolean +fbd_feedback_vibra_periodic_serializable_deserialize_property (JsonSerializable *serializable, + const gchar *property_name, + GValue *value, + GParamSpec *pspec, + JsonNode *property_node) +{ + if (g_strcmp0 (property_name, "magnitude") == 0) { + if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { + double magnitude = json_node_get_double (property_node); + + g_value_set_double (value, magnitude); + return TRUE; + } + } else if (g_strcmp0 (property_name, "fade-in-level") == 0) { + if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { + double fade_in_level = json_node_get_double (property_node); + + g_value_set_double (value, fade_in_level); + return TRUE; + } + } + + return FALSE; +} + static void fbd_feedback_vibra_periodic_set_property (GObject *object, @@ -129,6 +161,14 @@ fbd_feedback_vibra_periodic_is_available (FbdFeedbackBase *base) return FBD_IS_DEV_VIBRA (dev); } + +static void +json_serializable_iface_init (JsonSerializableIface *iface) +{ + iface->deserialize_property = fbd_feedback_vibra_periodic_serializable_deserialize_property; +} + + static void fbd_feedback_vibra_periodic_class_init (FbdFeedbackVibraPeriodicClass *klass) { diff --git a/tests/test-fbd-feedback-vibra.c b/tests/test-fbd-feedback-vibra.c index 73e4dac..af13a43 100644 --- a/tests/test-fbd-feedback-vibra.c +++ b/tests/test-fbd-feedback-vibra.c @@ -9,6 +9,7 @@ #define GMOBILE_USE_UNSTABLE_API #include "fbd-feedback-manager.h" #include "fbd-feedback-vibra-pattern.h" +#include "fbd-feedback-vibra-periodic.h" #include "fbd-feedback-vibra-rumble.h" #include @@ -95,6 +96,42 @@ test_fbd_feedback_vibra_pattern (void) } +static void +test_fbd_feedback_vibra_periodic (void) +{ + /* Create manager upfront so we can dispose it, otherwise creating + * any feedback would create it implicitly */ + FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); + g_autoptr (GError) err = NULL; + g_autoptr (JsonNode) node = NULL; + GObject *object; + double magnitude, fade_in_level; + guint fade_in_time; + + node = json_from_string("{" + " \"event-name\" : \"button-pressed\"," + " \"type\" : \"VibraPeriodic\"," + " \"magnitude\" : 0.7," + " \"fade-in-level\" : 0.3" + "}", &err); + g_assert_no_error (err); + + object = json_gobject_deserialize (FBD_TYPE_FEEDBACK_VIBRA_PERIODIC, node); + g_object_get (object, + "magnitude", &magnitude, + "fade-in-level", &fade_in_level, + "fade-in-time", &fade_in_time, + NULL); + + g_assert_cmpfloat_with_epsilon (magnitude, 0.7, FLT_EPSILON); + g_assert_cmpfloat_with_epsilon (fade_in_level, 0.3, FLT_EPSILON); + g_assert_cmpint (fade_in_time, ==, 500); + + g_assert_finalize_object (object); + g_assert_finalize_object (manager); +} + + gint main (gint argc, gchar *argv[]) { @@ -102,6 +139,7 @@ main (gint argc, gchar *argv[]) g_test_add_func("/feedbackd/fbd/feedback-vibra/rumble", test_fbd_feedback_vibra_rumble); g_test_add_func("/feedbackd/fbd/feedback-vibra/pattern", test_fbd_feedback_vibra_pattern); + g_test_add_func("/feedbackd/fbd/feedback-vibra/periodic", test_fbd_feedback_vibra_periodic); return g_test_run(); } From c37bfecbe0f825059c5e4ba9dbfb2b3fbddc15db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:40 +0100 Subject: [PATCH 6/7] vibra-periodic: Add a fallback for the previous [0, 0xFFFF] range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This keeps old themes working Signed-off-by: Guido Günther --- src/fbd-feedback-vibra-periodic.c | 14 ++++++++++ tests/test-fbd-feedback-vibra.c | 46 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index 3e0b15b..f1b81ff 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -58,6 +58,13 @@ fbd_feedback_vibra_periodic_serializable_deserialize_property (JsonSerializable if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { double magnitude = json_node_get_double (property_node); + /* Backward compat handling: Initially magnitude was given as [0, 0xFFFF] */ + if (magnitude > 1.0) { + g_warning_once ("Too large magnitude %.2f detected, please update the theme", magnitude); + magnitude = magnitude / 0xFFFF; + } + + g_value_set_double (value, magnitude); return TRUE; } @@ -65,6 +72,13 @@ fbd_feedback_vibra_periodic_serializable_deserialize_property (JsonSerializable if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { double fade_in_level = json_node_get_double (property_node); + /* Backward compat handling: Initially duration was given as [0, 0xFFFF] */ + if (fade_in_level > 1.0) { + g_warning_once ("Too large fade-in-level %.2f detected, please update the theme", + fade_in_level); + fade_in_level = fade_in_level / 0xFFFF; + } + g_value_set_double (value, fade_in_level); return TRUE; } diff --git a/tests/test-fbd-feedback-vibra.c b/tests/test-fbd-feedback-vibra.c index af13a43..d0c14b8 100644 --- a/tests/test-fbd-feedback-vibra.c +++ b/tests/test-fbd-feedback-vibra.c @@ -132,6 +132,50 @@ test_fbd_feedback_vibra_periodic (void) } +static void +test_fbd_feedback_vibra_periodic_fallback (void) +{ + /* Create manager upfront so we can dispose it, otherwise creating + * any feedback would create it implicitly */ + FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); + g_autoptr (GError) err = NULL; + g_autoptr (JsonNode) node = NULL; + GObject *object; + double magnitude, fade_in_level; + guint fade_in_time; + + node = json_from_string("{" + " \"event-name\" : \"button-pressed\"," + " \"type\" : \"VibraPeriodic\"," + " \"magnitude\" : 65535," + " \"fade-in-level\" : 13107" + "}", &err); + g_assert_no_error (err); + + g_test_expect_message ("fbd-feedback-vibra-periodic", + G_LOG_LEVEL_WARNING, + "Too large magnitude 65535.00 detected*"); + g_test_expect_message ("fbd-feedback-vibra-periodic", + G_LOG_LEVEL_WARNING, + "Too large fade-in-level 13107.00 detected*"); + object = json_gobject_deserialize (FBD_TYPE_FEEDBACK_VIBRA_PERIODIC, node); + g_test_assert_expected_messages (); + + g_object_get (object, + "magnitude", &magnitude, + "fade-in-level", &fade_in_level, + "fade-in-time", &fade_in_time, + NULL); + + g_assert_cmpfloat_with_epsilon (magnitude, 1.0, FLT_EPSILON); + g_assert_cmpfloat_with_epsilon (fade_in_level, 0.2, FLT_EPSILON); + g_assert_cmpint (fade_in_time, ==, 500); + + g_assert_finalize_object (object); + g_assert_finalize_object (manager); +} + + gint main (gint argc, gchar *argv[]) { @@ -140,6 +184,8 @@ main (gint argc, gchar *argv[]) g_test_add_func("/feedbackd/fbd/feedback-vibra/rumble", test_fbd_feedback_vibra_rumble); g_test_add_func("/feedbackd/fbd/feedback-vibra/pattern", test_fbd_feedback_vibra_pattern); g_test_add_func("/feedbackd/fbd/feedback-vibra/periodic", test_fbd_feedback_vibra_periodic); + g_test_add_func("/feedbackd/fbd/feedback-vibra/periodic/fallback", + test_fbd_feedback_vibra_periodic_fallback); return g_test_run(); } From 3d062c0952608070857631eedef33a3301babe02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:41 +0100 Subject: [PATCH 7/7] default/theme: Use [0.0, 1.0] for vibra-periodic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We switch `message-new-cellbroadcast` to VibraPeriodic as that is better recognizable than the periodic pattern. Signed-off-by: Guido Günther --- data/default.json | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/data/default.json b/data/default.json index 4be8cec..f1a4c40 100644 --- a/data/default.json +++ b/data/default.json @@ -97,10 +97,8 @@ { "event-name" : "alarm-clock-elapsed", "type" : "VibraPeriodic", - "magnitude" : 32767, - "duration" : 10000, - "fade-in-time" : 10000, - "fade-in-level": 4096 + "magnitude" : 0.5, + "duration" : 1000 }, { "event-name" : "bell-terminal", @@ -120,9 +118,9 @@ }, { "event-name" : "message-new-cellbroadcast", - "type" : "VibraPeriodic", - "magnitude" : 10000, - "duration" : 3000 + "type" : "VibraPattern", + "magnitudes" : [1.0, 0.0], + "durations" : [200, 200] }, { "event-name" : "message-new-email", @@ -157,7 +155,8 @@ { "event-name" : "phone-incoming-call", "type" : "VibraPeriodic", - "duration" : 10000 + "magnitude" : 0.5, + "duration" : 1000 }, { "event-name" : "timeout-completed", @@ -167,8 +166,8 @@ { "event-name" : "theme-demo", "type" : "VibraPeriodic", - "magnitude" : 32767, - "duration" : 5000 + "magnitude" : 0.5, + "duration" : 1000 }, { "event-name" : "window-close",