diff --git a/android/hog.c b/android/hog.c
index 55a3ee4..aae1f83 100644
--- a/android/hog.c
+++ b/android/hog.c
#include "btio/btio.h"
#include "android/scpp.h"
+#include "android/dis.h"
#include "android/hog.h"
#define HOG_UUID "00001812-0000-1000-8000-00805f9b34fb"
uint16_t ctrlpt_handle;
uint8_t flags;
struct bt_scpp *scpp;
+ struct bt_dis *dis;
};
struct report {
static void hog_free(struct bt_hog *hog)
{
bt_scpp_unref(hog->scpp);
+ bt_dis_unref(hog->dis);
bt_uhid_unref(hog->uhid);
g_slist_free_full(hog->reports, report_free);
g_attrib_unref(hog->attrib);
bt_scpp_attach(hog->scpp, hog->attrib);
}
+static void dis_notify(uint8_t source, uint16_t vendor, uint16_t product,
+ uint16_t version, void *user_data)
+{
+ struct bt_hog *hog = user_data;
+
+ hog->vendor = vendor;
+ hog->product = product;
+ hog->version = version;
+}
+
+static void hog_attach_dis(struct bt_hog *hog, struct gatt_primary *primary)
+{
+ if (hog->dis) {
+ bt_dis_attach(hog->dis, hog->attrib);
+ return;
+ }
+
+ hog->dis = bt_dis_new(primary);
+ if (hog->dis) {
+ bt_dis_set_notification(hog->dis, dis_notify, hog);
+ bt_dis_attach(hog->dis, hog->attrib);
+ }
+}
+
static void primary_cb(uint8_t status, GSList *services, void *user_data)
{
struct bt_hog *hog = user_data;
continue;
}
+ if (strcmp(primary->uuid, DEVICE_INFORMATION_UUID) == 0) {
+ hog_attach_dis(hog, primary);
+ continue;
+ }
+
if (strcmp(primary->uuid, HOG_UUID) == 0)
- break;
+ hog->primary = g_memdup(primary, sizeof(*primary));
}
- if (!l) {
- for (l = services; l; l = l->next) {
- primary = l->data;
+ if (hog->primary) {
+ gatt_discover_char(hog->attrib, hog->primary->range.start,
+ hog->primary->range.end, NULL,
+ char_discovered_cb, hog);
- gatt_find_included(hog->attrib, primary->range.start,
- primary->range.end, find_included_cb,
- hog);
- }
return;
}
- hog->primary = g_memdup(primary, sizeof(*primary));
+ for (l = services; l; l = l->next) {
+ primary = l->data;
- gatt_discover_char(hog->attrib, hog->primary->range.start,
- hog->primary->range.end, NULL,
- char_discovered_cb, hog);
+ gatt_find_included(hog->attrib, primary->range.start,
+ primary->range.end, find_included_cb,
+ hog);
+ }
}
bool bt_hog_attach(struct bt_hog *hog, void *gatt)
if (hog->scpp)
bt_scpp_attach(hog->scpp, gatt);
+ if (hog->dis)
+ bt_dis_attach(hog->dis, gatt);
+
if (hog->reports == NULL) {
gatt_discover_char(hog->attrib, primary->range.start,
primary->range.end, NULL,
g_attrib_unregister(hog->attrib, r->notifyid);
}
-
if (hog->scpp)
bt_scpp_detach(hog->scpp);
+
+ if (hog->dis)
+ bt_dis_detach(hog->dis);
+
g_attrib_unref(hog->attrib);
hog->attrib = NULL;
}