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(); }