diff --git a/profiles/input/hog_device.c b/profiles/input/hog_device.c
index 7882a29..53a90ee 100644
--- a/profiles/input/hog_device.c
+++ b/profiles/input/hog_device.c
#define HOG_REPORT_MAP_UUID 0x2A4B
#define HOG_REPORT_UUID 0x2A4D
+
#define UHID_DEVICE_FILE "/dev/uhid"
#define HOG_REPORT_MAP_MAX_SIZE 512
GSList *reports;
int uhid_fd;
gboolean prepend_id;
+ guint uhid_watch_id;
};
struct report {
}
}
+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;
{
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)
return err;
}
+ 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);
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;