Skip to content
Snippets Groups Projects
Commit f639f7d1 authored by Guido Gunther's avatar Guido Gunther :zzz:
Browse files

feedback-manager: Instantiate .Haptic DBus interface

Make the haptic interface available on the Bus when a haptic
motor is found at daemon startup.

Closes: #80



Signed-off-by: default avatarGuido Günther <agx@sigxcpu.org>
parent 31c7bf7d
No related branches found
No related tags found
1 merge request!147Add org.sigxcup.org.Feedback.Haptic interface
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
#include "fbd-dev-leds.h" #include "fbd-dev-leds.h"
#include "fbd-event.h" #include "fbd-event.h"
#include "fbd-feedback-vibra.h" #include "fbd-feedback-vibra.h"
#include "fbd-feedback-vibra-pattern.h"
#include "fbd-feedback-manager.h" #include "fbd-feedback-manager.h"
#include "fbd-feedback-theme.h" #include "fbd-feedback-theme.h"
#include "fbd-haptic-manager.h"
#include "fbd-theme-expander.h" #include "fbd-theme-expander.h"
#include <gmobile.h> #include <gmobile.h>
...@@ -40,6 +42,9 @@ ...@@ -40,6 +42,9 @@
* based on the incoming events. * based on the incoming events.
*/ */
FbdDebugFlags fbd_debug_flags;
typedef struct _FbdFeedbackManager { typedef struct _FbdFeedbackManager {
LfbGdbusFeedbackSkeleton parent; LfbGdbusFeedbackSkeleton parent;
...@@ -54,6 +59,9 @@ typedef struct _FbdFeedbackManager { ...@@ -54,6 +59,9 @@ typedef struct _FbdFeedbackManager {
/* Key: DBus name, value: watch_id */ /* Key: DBus name, value: watch_id */
GHashTable *clients; GHashTable *clients;
/* org.sigxcpu.Feedbackd.Haptic */
FbdHapticManager *haptic_manager;
/* Hardware interaction */ /* Hardware interaction */
GUdevClient *client; GUdevClient *client;
FbdDevVibra *vibra; FbdDevVibra *vibra;
...@@ -410,15 +418,27 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, ...@@ -410,15 +418,27 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event); feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event);
if (feedbacks) { if (feedbacks) {
gboolean has_vibra = FALSE;
for (l = feedbacks; l; l = l->next) { for (l = feedbacks; l; l = l->next) {
FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data); FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data);
if (fbd_feedback_is_available (FBD_FEEDBACK_BASE (fb))) { if (fbd_feedback_is_available (FBD_FEEDBACK_BASE (fb))) {
/* Handle one haptic feedback at a time */ /* Handle one haptic feedback at a time. In practice haptics can handle multiple
/* TODO: should use priorities */ * patterns but none of the devices supports this atm */
if (FBD_IS_FEEDBACK_VIBRA (fb) && fbd_dev_vibra_is_busy (self->vibra)) /* TODO: should respect priorities */
continue; if (FBD_IS_FEEDBACK_VIBRA (fb)) {
if (fbd_dev_vibra_is_busy (self->vibra))
continue;
has_vibra = TRUE;
}
fbd_event_add_feedback (event, fb); fbd_event_add_feedback (event, fb);
/* Events take priority over the haptic interface */
if (has_vibra)
fbd_haptic_manager_end_feedback (self->haptic_manager);
found_fb = TRUE; found_fb = TRUE;
} }
} }
...@@ -494,6 +514,9 @@ fbd_feedback_manager_constructed (GObject *object) ...@@ -494,6 +514,9 @@ fbd_feedback_manager_constructed (GObject *object)
g_signal_connect_swapped (self->settings, "changed::" FEEDBACKD_KEY_ALLOW_IMPORTANT, g_signal_connect_swapped (self->settings, "changed::" FEEDBACKD_KEY_ALLOW_IMPORTANT,
G_CALLBACK (on_feedbackd_allow_important_changed), self); G_CALLBACK (on_feedbackd_allow_important_changed), self);
on_feedbackd_allow_important_changed (self, FEEDBACKD_KEY_ALLOW_IMPORTANT, self->settings); on_feedbackd_allow_important_changed (self, FEEDBACKD_KEY_ALLOW_IMPORTANT, self->settings);
if (self->vibra || fbd_debug_flags & FBD_DEBUG_FLAG_FORCE_HAPTIC)
self->haptic_manager = fbd_haptic_manager_new ();
} }
...@@ -502,6 +525,8 @@ fbd_feedback_manager_dispose (GObject *object) ...@@ -502,6 +525,8 @@ fbd_feedback_manager_dispose (GObject *object)
{ {
FbdFeedbackManager *self = FBD_FEEDBACK_MANAGER (object); FbdFeedbackManager *self = FBD_FEEDBACK_MANAGER (object);
g_clear_object (&self->haptic_manager);
g_clear_object (&self->settings); g_clear_object (&self->settings);
g_clear_object (&self->theme); g_clear_object (&self->theme);
g_clear_object (&self->sound); g_clear_object (&self->sound);
...@@ -662,6 +687,15 @@ fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile ...@@ -662,6 +687,15 @@ fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile
return TRUE; return TRUE;
} }
FbdHapticManager *
fbd_feedback_manager_get_haptic_manager (FbdFeedbackManager *self)
{
g_assert (FBD_IS_FEEDBACK_MANAGER (self));
return self->haptic_manager;
}
/** /**
* fbd_feedback_manager_get_effective_level: * fbd_feedback_manager_get_effective_level:
* @self: The feedback manager * @self: The feedback manager
......
...@@ -9,17 +9,25 @@ ...@@ -9,17 +9,25 @@
#include "fbd-dev-leds.h" #include "fbd-dev-leds.h"
#include "fbd-dev-sound.h" #include "fbd-dev-sound.h"
#include "fbd-feedback-profile.h" #include "fbd-feedback-profile.h"
#include "fbd-haptic-manager.h"
#include "lfb-gdbus.h" #include "lfb-gdbus.h"
#include <glib-object.h> #include <glib-object.h>
G_BEGIN_DECLS G_BEGIN_DECLS
typedef enum {
FBD_DEBUG_FLAG_FORCE_HAPTIC = 1 << 0,
} FbdDebugFlags;
extern FbdDebugFlags fbd_debug_flags;
#define FBD_TYPE_FEEDBACK_MANAGER (fbd_feedback_manager_get_type()) #define FBD_TYPE_FEEDBACK_MANAGER (fbd_feedback_manager_get_type())
G_DECLARE_FINAL_TYPE (FbdFeedbackManager, fbd_feedback_manager, FBD, FEEDBACK_MANAGER, LfbGdbusFeedbackSkeleton); G_DECLARE_FINAL_TYPE (FbdFeedbackManager, fbd_feedback_manager, FBD, FEEDBACK_MANAGER, LfbGdbusFeedbackSkeleton);
FbdFeedbackManager *fbd_feedback_manager_get_default (void); FbdFeedbackManager *fbd_feedback_manager_get_default (void);
FbdHapticManager *fbd_feedback_manager_get_haptic_manager (FbdFeedbackManager *self);
FbdDevVibra *fbd_feedback_manager_get_dev_vibra (FbdFeedbackManager *self); FbdDevVibra *fbd_feedback_manager_get_dev_vibra (FbdFeedbackManager *self);
FbdDevSound *fbd_feedback_manager_get_dev_sound (FbdFeedbackManager *self); FbdDevSound *fbd_feedback_manager_get_dev_sound (FbdFeedbackManager *self);
FbdDevLeds *fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self); FbdDevLeds *fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self);
......
...@@ -8,15 +8,24 @@ ...@@ -8,15 +8,24 @@
#include "fbd.h" #include "fbd.h"
#include "fbd-feedback-manager.h" #include "fbd-feedback-manager.h"
#include "fbd-haptic-manager.h"
#include "lfb-names.h" #include "lfb-names.h"
#include "lfb-gdbus.h" #include "lfb-gdbus.h"
#include <gio/gio.h> #include <gio/gio.h>
#include <glib-unix.h> #include <glib-unix.h>
static GMainLoop *loop; static GMainLoop *loop;
static GDebugKey debug_keys[] =
{
{ .key = "force-haptic",
.value = FBD_DEBUG_FLAG_FORCE_HAPTIC,
},
};
static gboolean static gboolean
quit_cb (gpointer user_data) quit_cb (gpointer user_data)
{ {
...@@ -45,17 +54,29 @@ reload_cb (gpointer user_data) ...@@ -45,17 +54,29 @@ reload_cb (gpointer user_data)
static void static void
bus_acquired_cb (GDBusConnection *connection, bus_acquired_cb (GDBusConnection *connection,
const gchar *name, const gchar *name,
gpointer user_data) gpointer user_data)
{ {
FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); FbdFeedbackManager *manager = fbd_feedback_manager_get_default ();
FbdHapticManager *haptic_manager;
g_debug ("Bus acquired, creating manager..."); g_assert (FBD_IS_FEEDBACK_MANAGER (manager));
g_debug ("Bus acquired, exporting manager...");
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (manager), g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (manager),
connection, connection,
FB_DBUS_PATH, FB_DBUS_PATH,
NULL); NULL);
haptic_manager = fbd_feedback_manager_get_haptic_manager (manager);
if (haptic_manager) {
g_debug ("Exporting haptic manager...");
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (haptic_manager),
connection,
FB_DBUS_PATH,
NULL);
}
} }
...@@ -88,11 +109,13 @@ name_lost_cb (GDBusConnection *connection, ...@@ -88,11 +109,13 @@ name_lost_cb (GDBusConnection *connection,
} }
int main(int argc, char *argv[]) int
main (int argc, char *argv[])
{ {
g_autoptr(GError) err = NULL; g_autoptr(GError) err = NULL;
g_autoptr(GOptionContext) opt_context = NULL; g_autoptr(GOptionContext) opt_context = NULL;
g_autoptr (FbdFeedbackManager) manager = NULL; g_autoptr (FbdFeedbackManager) manager = NULL;
const char *debugenv;
opt_context = g_option_context_new ("- A daemon to trigger event feedback"); opt_context = g_option_context_new ("- A daemon to trigger event feedback");
if (!g_option_context_parse (opt_context, &argc, &argv, &err)) { if (!g_option_context_parse (opt_context, &argc, &argv, &err)) {
...@@ -101,6 +124,11 @@ int main(int argc, char *argv[]) ...@@ -101,6 +124,11 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
debugenv = g_getenv ("FEEDBACKD_DEBUG");
fbd_debug_flags = g_parse_debug_string (debugenv,
debug_keys,
G_N_ELEMENTS (debug_keys));
manager = fbd_feedback_manager_get_default (); manager = fbd_feedback_manager_get_default ();
fbd_feedback_manager_load_theme (manager); fbd_feedback_manager_load_theme (manager);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment