mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-25 13:14:14 +08:00
hog: Discover descriptors for all characteristics
"Report" characteristic has "Report Reference Characteristic" descriptor and "Client Characteristic Configuration" descriptor.
This commit is contained in:
parent
bc464376d0
commit
8627f8f4df
@ -64,6 +64,55 @@ struct hog_device {
|
||||
|
||||
static GSList *devices = NULL;
|
||||
|
||||
static void discover_descriptor_cb(guint8 status, const guint8 *pdu,
|
||||
guint16 len, gpointer user_data)
|
||||
{
|
||||
struct report *report = user_data;
|
||||
struct att_data_list *list;
|
||||
uint8_t format;
|
||||
int i;
|
||||
|
||||
if (status != 0) {
|
||||
error("Discover all characteristic descriptors failed: %s",
|
||||
att_ecode2str(status));
|
||||
return;
|
||||
}
|
||||
|
||||
list = dec_find_info_resp(pdu, len, &format);
|
||||
if (list == NULL)
|
||||
return;
|
||||
|
||||
if (format != 0x01)
|
||||
goto done;
|
||||
|
||||
for (i = 0; i < list->num; i++) {
|
||||
uint16_t uuid16;
|
||||
uint8_t *value;
|
||||
|
||||
value = list->data[i];
|
||||
uuid16 = att_get_u16(&value[2]);
|
||||
|
||||
DBG("%s descriptor: 0x%04x", report->decl->uuid, uuid16);
|
||||
}
|
||||
|
||||
done:
|
||||
att_data_list_free(list);
|
||||
}
|
||||
|
||||
static void discover_descriptor(GAttrib *attrib, struct gatt_char *chr,
|
||||
struct gatt_char *next, gpointer user_data)
|
||||
{
|
||||
uint16_t start, end;
|
||||
|
||||
start = chr->value_handle + 1;
|
||||
end = (next ? next->handle - 1 : 0xffff);
|
||||
|
||||
if (start > end)
|
||||
return;
|
||||
|
||||
gatt_find_info(attrib, start, end, discover_descriptor_cb, user_data);
|
||||
}
|
||||
|
||||
static void char_discovered_cb(GSList *chars, guint8 status, gpointer user_data)
|
||||
{
|
||||
struct hog_device *hogdev = user_data;
|
||||
@ -80,9 +129,12 @@ static void char_discovered_cb(GSList *chars, guint8 status, gpointer user_data)
|
||||
bt_uuid16_create(&report_uuid, HOG_REPORT_UUID);
|
||||
|
||||
for (l = chars; l; l = g_slist_next(l)) {
|
||||
struct gatt_char *chr = l->data;
|
||||
struct gatt_char *chr, *next;
|
||||
bt_uuid_t uuid;
|
||||
|
||||
chr = l->data;
|
||||
next = l->next ? l->next->data : NULL;
|
||||
|
||||
DBG("0x%04x UUID: %s properties: %02x",
|
||||
chr->handle, chr->uuid, chr->properties);
|
||||
|
||||
@ -94,6 +146,8 @@ static void char_discovered_cb(GSList *chars, guint8 status, gpointer user_data)
|
||||
report = g_new0(struct report, 1);
|
||||
report->decl = g_memdup(chr, sizeof(*chr));
|
||||
hogdev->reports = g_slist_append(hogdev->reports, report);
|
||||
|
||||
discover_descriptor(hogdev->attrib, chr, next, hogdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user