All of lore.kernel.org
 help / color / mirror / Atom feed
From: "João Paulo Rechi Vita" <jprvita@openbossa.org>
To: linux-bluetooth@vger.kernel.org
Cc: "João Paulo Rechi Vita" <jprvita@openbossa.org>
Subject: [PATCH BlueZ 05/13] hog: Add support for uHID events
Date: Tue, 10 Jul 2012 16:16:57 -0300	[thread overview]
Message-ID: <1341947825-14789-6-git-send-email-jprvita@openbossa.org> (raw)
In-Reply-To: <1341947825-14789-1-git-send-email-jprvita@openbossa.org>

This patch adds the GLib GIOChannel watcher to monitor uhid events.
---
 profiles/input/hog_device.c |   46 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/profiles/input/hog_device.c b/profiles/input/hog_device.c
index 53b4746..b812ed5 100644
--- a/profiles/input/hog_device.c
+++ b/profiles/input/hog_device.c
@@ -53,6 +53,7 @@
 
 #define HOG_REPORT_MAP_UUID	0x2A4B
 #define HOG_REPORT_UUID		0x2A4D
+
 #define UHID_DEVICE_FILE	"/dev/uhid"
 
 #define HOG_REPORT_MAP_MAX_SIZE        512
@@ -67,6 +68,7 @@ struct hog_device {
 	GSList			*reports;
 	int			uhid_fd;
 	gboolean		prepend_id;
+	guint			uhid_watch_id;
 };
 
 struct report {
@@ -331,6 +333,36 @@ static void char_discovered_cb(GSList *chars, guint8 status, gpointer user_data)
 	}
 }
 
+static gboolean uhid_event_cb(GIOChannel *io, GIOCondition cond,
+							gpointer user_data)
+{
+	struct hog_device *hogdev = user_data;
+	struct uhid_event ev;
+	ssize_t bread;
+	int fd;
+
+	if (cond & (G_IO_ERR | G_IO_NVAL))
+		goto failed;
+
+	fd = g_io_channel_unix_get_fd(io);
+	memset(&ev, 0, sizeof(ev));
+
+	bread = read(fd, &ev, sizeof(ev));
+	if (bread < 0) {
+		int err = -errno;
+		DBG("uhid-dev read: %s(%d)", strerror(err), err);
+		goto failed;
+	}
+
+	DBG("uHID event type %d received", ev.type);
+
+	return TRUE;
+
+failed:
+	hogdev->uhid_watch_id = 0;
+	return FALSE;
+}
+
 static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
 {
 	struct hog_device *hogdev = user_data;
@@ -429,6 +461,8 @@ int hog_device_register(struct btd_device *device, const char *path)
 {
 	struct hog_device *hogdev;
 	struct gatt_primary *prim;
+	GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_NVAL;
+	GIOChannel *io;
 
 	hogdev = find_device_by_path(devices, path);
 	if (hogdev)
@@ -449,12 +483,19 @@ int hog_device_register(struct btd_device *device, const char *path)
 		return -errno;
 	}
 
+	io = g_io_channel_unix_new(hogdev->uhid_fd);
+	g_io_channel_set_encoding(io, NULL, NULL);
+	hogdev->uhid_watch_id = g_io_add_watch(io, cond, uhid_event_cb,
+								hogdev);
+	g_io_channel_unref(io);
+
 	hogdev->hog_primary = g_memdup(prim, sizeof(*prim));
 
 	hogdev->attioid = btd_device_add_attio_callback(device,
 							attio_connected_cb,
 							attio_disconnected_cb,
 							hogdev);
+
 	device_set_auto_connect(device, TRUE);
 
 	devices = g_slist_append(devices, hogdev);
@@ -472,6 +513,11 @@ int hog_device_unregister(const char *path)
 
 	btd_device_remove_attio_callback(hogdev->device, hogdev->attioid);
 
+	if (hogdev->uhid_watch_id) {
+		g_source_remove(hogdev->uhid_watch_id);
+		hogdev->uhid_watch_id = 0;
+	}
+
 	close(hogdev->uhid_fd);
 	hogdev->uhid_fd = -1;
 
-- 
1.7.10.4


  parent reply	other threads:[~2012-07-10 19:16 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-10 19:16 [PATCH BlueZ 00/13] Rebased remaining HoG patches João Paulo Rechi Vita
2012-07-10 19:16 ` [PATCH BlueZ 01/13] hog: HID I/O driver João Paulo Rechi Vita
2012-07-10 21:24   ` [PATCH BlueZ] " João Paulo Rechi Vita
2012-07-10 21:26     ` Joao Paulo Rechi Vita
2012-07-10 21:50     ` Johan Hedberg
2012-07-10 19:16 ` [PATCH BlueZ 02/13] hog: Use real values for vendor and product IDs João Paulo Rechi Vita
2012-07-10 19:16 ` [PATCH BlueZ 03/13] hog: Add read Report Reference descriptor João Paulo Rechi Vita
2012-07-10 19:16 ` [PATCH BlueZ 04/13] hog: Prepend Report ID to the HID report João Paulo Rechi Vita
2012-07-10 19:16 ` João Paulo Rechi Vita [this message]
2012-07-10 19:16 ` [PATCH BlueZ 06/13] hog: Handle output reports João Paulo Rechi Vita
2012-07-10 19:16 ` [PATCH BlueZ 07/13] hog: Handle output events João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 08/13] hog: Handle feature reports João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 09/13] hog: Add HID Information Characteristic read João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 10/13] hog: Use hardware country code João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 11/13] hog: Handle HID devices operating in Boot Protocol Mode João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 12/13] hog: Fix re-discovering HoG characteristics when reconnecting João Paulo Rechi Vita
2012-07-10 19:17 ` [PATCH BlueZ 13/13] hog: Fix destroying the uhid device when disconnecting João Paulo Rechi Vita
2012-07-13 14:02 ` [PATCH BlueZ 00/13] Rebased remaining HoG patches Johan Hedberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341947825-14789-6-git-send-email-jprvita@openbossa.org \
    --to=jprvita@openbossa.org \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.