mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-28 22:54:14 +08:00
hog: Discover all characteristics declaration
HID service supports multiple report characteristic. Each report characteristic has a reference descriptor containing ID and type.
This commit is contained in:
parent
563f970a56
commit
bc464376d0
@ -47,21 +47,65 @@
|
|||||||
#include "attio.h"
|
#include "attio.h"
|
||||||
#include "gatt.h"
|
#include "gatt.h"
|
||||||
|
|
||||||
|
#define HOG_REPORT_UUID 0x2A4D
|
||||||
|
|
||||||
|
struct report {
|
||||||
|
struct gatt_char *decl;
|
||||||
|
};
|
||||||
|
|
||||||
struct hog_device {
|
struct hog_device {
|
||||||
char *path;
|
char *path;
|
||||||
struct btd_device *device;
|
struct btd_device *device;
|
||||||
GAttrib *attrib;
|
GAttrib *attrib;
|
||||||
guint attioid;
|
guint attioid;
|
||||||
struct gatt_primary *hog_primary;
|
struct gatt_primary *hog_primary;
|
||||||
|
GSList *reports;
|
||||||
};
|
};
|
||||||
|
|
||||||
static GSList *devices = NULL;
|
static GSList *devices = NULL;
|
||||||
|
|
||||||
|
static void char_discovered_cb(GSList *chars, guint8 status, gpointer user_data)
|
||||||
|
{
|
||||||
|
struct hog_device *hogdev = user_data;
|
||||||
|
bt_uuid_t report_uuid;
|
||||||
|
struct report *report;
|
||||||
|
GSList *l;
|
||||||
|
|
||||||
|
if (status != 0) {
|
||||||
|
const char *str = att_ecode2str(status);
|
||||||
|
DBG("Discover all characteristics failed: %s", str);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bt_uuid16_create(&report_uuid, HOG_REPORT_UUID);
|
||||||
|
|
||||||
|
for (l = chars; l; l = g_slist_next(l)) {
|
||||||
|
struct gatt_char *chr = l->data;
|
||||||
|
bt_uuid_t uuid;
|
||||||
|
|
||||||
|
DBG("0x%04x UUID: %s properties: %02x",
|
||||||
|
chr->handle, chr->uuid, chr->properties);
|
||||||
|
|
||||||
|
bt_string_to_uuid(&uuid, chr->uuid);
|
||||||
|
|
||||||
|
if (bt_uuid_cmp(&uuid, &report_uuid) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
report = g_new0(struct report, 1);
|
||||||
|
report->decl = g_memdup(chr, sizeof(*chr));
|
||||||
|
hogdev->reports = g_slist_append(hogdev->reports, report);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
|
static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct hog_device *hogdev = user_data;
|
struct hog_device *hogdev = user_data;
|
||||||
|
struct gatt_primary *prim = hogdev->hog_primary;
|
||||||
|
|
||||||
hogdev->attrib = g_attrib_ref(attrib);
|
hogdev->attrib = g_attrib_ref(attrib);
|
||||||
|
|
||||||
|
gatt_discover_char(hogdev->attrib, prim->range.start, prim->range.end,
|
||||||
|
NULL, char_discovered_cb, hogdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void attio_disconnected_cb(gpointer user_data)
|
static void attio_disconnected_cb(gpointer user_data)
|
||||||
@ -148,9 +192,17 @@ int hog_device_register(struct btd_device *device, const char *path)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void report_free(void *data)
|
||||||
|
{
|
||||||
|
struct report *report = data;
|
||||||
|
g_free(report->decl);
|
||||||
|
g_free(report);
|
||||||
|
}
|
||||||
|
|
||||||
static void hog_device_free(struct hog_device *hogdev)
|
static void hog_device_free(struct hog_device *hogdev)
|
||||||
{
|
{
|
||||||
btd_device_unref(hogdev->device);
|
btd_device_unref(hogdev->device);
|
||||||
|
g_slist_free_full(hogdev->reports, report_free);
|
||||||
g_free(hogdev->path);
|
g_free(hogdev->path);
|
||||||
g_free(hogdev->hog_primary);
|
g_free(hogdev->hog_primary);
|
||||||
g_free(hogdev);
|
g_free(hogdev);
|
||||||
|
Loading…
Reference in New Issue
Block a user