From d520f7aac69d4f9be1c9c894460bd1ab916dbc10 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 29 Jul 2014 11:58:38 +0300 Subject: [PATCH] android/hog: Add support for UHID_FEATURE event --- android/hog.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/android/hog.c b/android/hog.c index 85a698263..09a16d546 100644 --- a/android/hog.c +++ b/android/hog.c @@ -439,6 +439,42 @@ static void forward_report(struct uhid_event *ev, void *user_data) data, size, NULL, NULL); } +static void get_report(struct uhid_event *ev, void *user_data) +{ + struct bt_hog *hog = user_data; + struct report *report; + GSList *l; + struct uhid_event rsp; + int err; + + memset(&rsp, 0, sizeof(rsp)); + rsp.type = UHID_FEATURE_ANSWER; + rsp.u.feature_answer.id = ev->u.feature.id; + + l = g_slist_find_custom(hog->reports, + GUINT_TO_POINTER(ev->u.feature.rtype), + report_type_cmp); + if (!l) { + rsp.u.feature_answer.err = ENOTSUP; + goto done; + } + + report = l->data; + + if (!report->value) { + rsp.u.feature_answer.err = EIO; + goto done; + } + + rsp.u.feature_answer.size = report->len; + memcpy(rsp.u.feature_answer.data, report->value, report->len); + +done: + err = bt_uhid_send(hog->uhid, &rsp); + if (err < 0) + error("bt_uhid_send: %s", strerror(-err)); +} + static bool get_descriptor_item_info(uint8_t *buf, ssize_t blen, ssize_t *len, bool *is_long) { @@ -576,6 +612,7 @@ static void report_map_read_cb(guint8 status, const guint8 *pdu, guint16 plen, } bt_uhid_register(hog->uhid, UHID_OUTPUT, forward_report, hog); + bt_uhid_register(hog->uhid, UHID_FEATURE, get_report, hog); } static void info_read_cb(guint8 status, const guint8 *pdu, guint16 plen, -- 2.47.3