linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/4] Add DeviceInformationService plugin
@ 2012-04-04  8:28 chen.ganir
  2012-04-04  8:28 ` [PATCH v6 1/4] Add DeviceInformation GATT Client chen.ganir
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: chen.ganir @ 2012-04-04  8:28 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Chen Ganir

From: Chen Ganir <chen.ganir@ti.com>

Add Device Information Service GATT Client for reading peer
device PNP_ID and store it.

Chen Ganir (4):
  Add DeviceInformation GATT Client
  DeviceInfo: Add connection logic
  DeviceInfo: Discover Characteristics
  DeviceInfo: Read PNP ID

 Makefile.am             |    8 ++-
 deviceinfo/deviceinfo.c |  193 +++++++++++++++++++++++++++++++++++++++++++++++
 deviceinfo/deviceinfo.h |   24 ++++++
 deviceinfo/main.c       |   52 +++++++++++++
 deviceinfo/manager.c    |   82 ++++++++++++++++++++
 deviceinfo/manager.h    |   24 ++++++
 doc/device-api.txt      |    4 +
 src/device.c            |   34 ++++++++
 src/device.h            |    4 +
 9 files changed, 423 insertions(+), 2 deletions(-)
 create mode 100644 deviceinfo/deviceinfo.c
 create mode 100644 deviceinfo/deviceinfo.h
 create mode 100644 deviceinfo/main.c
 create mode 100644 deviceinfo/manager.c
 create mode 100644 deviceinfo/manager.h

-- 
1.7.4.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v6 1/4] Add DeviceInformation GATT Client
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
@ 2012-04-04  8:28 ` chen.ganir
  2012-04-04  8:28 ` [PATCH v6 2/4] DeviceInfo: Add connection logic chen.ganir
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: chen.ganir @ 2012-04-04  8:28 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Chen Ganir

From: Chen Ganir <chen.ganir@ti.com>

Add the DeviceInformation GATT Client plugin skeleton.
---
 Makefile.am             |    8 +++-
 deviceinfo/deviceinfo.c |   86 +++++++++++++++++++++++++++++++++++++++++++++++
 deviceinfo/deviceinfo.h |   24 +++++++++++++
 deviceinfo/main.c       |   52 ++++++++++++++++++++++++++++
 deviceinfo/manager.c    |   62 ++++++++++++++++++++++++++++++++++
 deviceinfo/manager.h    |   24 +++++++++++++
 6 files changed, 254 insertions(+), 2 deletions(-)
 create mode 100644 deviceinfo/deviceinfo.c
 create mode 100644 deviceinfo/deviceinfo.h
 create mode 100644 deviceinfo/main.c
 create mode 100644 deviceinfo/manager.c
 create mode 100644 deviceinfo/manager.h

diff --git a/Makefile.am b/Makefile.am
index d475555..8b375dc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -213,7 +213,8 @@ builtin_sources += health/hdp_main.c health/hdp_types.h \
 endif
 
 if GATTMODULES
-builtin_modules += thermometer alert time gatt_example proximity
+builtin_modules += thermometer alert time gatt_example proximity \
+			deviceinfo
 builtin_sources += thermometer/main.c \
 			thermometer/manager.h thermometer/manager.c \
 			thermometer/thermometer.h thermometer/thermometer.c \
@@ -224,7 +225,10 @@ builtin_sources += thermometer/main.c \
 			proximity/monitor.h proximity/monitor.c \
 			proximity/reporter.h proximity/reporter.c \
 			proximity/linkloss.h proximity/linkloss.c \
-			proximity/immalert.h proximity/immalert.c
+			proximity/immalert.h proximity/immalert.c \
+			deviceinfo/main.c \
+			deviceinfo/manager.h deviceinfo/manager.c \
+			deviceinfo/deviceinfo.h deviceinfo/deviceinfo.c
 endif
 
 
diff --git a/deviceinfo/deviceinfo.c b/deviceinfo/deviceinfo.c
new file mode 100644
index 0000000..fed0cc8
--- /dev/null
+++ b/deviceinfo/deviceinfo.c
@@ -0,0 +1,86 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2012 Texas Instruments, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <bluetooth/uuid.h>
+#include "adapter.h"
+#include "device.h"
+#include "att.h"
+#include "gattrib.h"
+#include "gatt.h"
+#include "deviceinfo.h"
+
+struct deviceinfo {
+	struct btd_device	*dev;		/* Device reference */
+};
+
+static GSList *servers = NULL;
+
+static void deviceinfo_free(gpointer user_data)
+{
+	struct deviceinfo *d = user_data;
+
+	btd_device_unref(d->dev);
+	g_free(d);
+}
+
+static gint cmp_device(gconstpointer a, gconstpointer b)
+{
+	const struct deviceinfo *d = a;
+	const struct btd_device *dev = b;
+
+	if (dev == d->dev)
+		return 0;
+
+	return -1;
+}
+
+int deviceinfo_register(struct btd_device *device)
+{
+	struct deviceinfo *d;
+
+	d = g_new0(struct deviceinfo, 1);
+	d->dev = btd_device_ref(device);
+
+	servers = g_slist_prepend(servers, d);
+
+	return 0;
+}
+
+void deviceinfo_unregister(struct btd_device *device)
+{
+	struct deviceinfo *d;
+	GSList *l;
+
+	l = g_slist_find_custom(servers, device, cmp_device);
+	if (l == NULL)
+		return;
+
+	d = l->data;
+	servers = g_slist_remove(servers, d);
+
+	deviceinfo_free(d);
+}
diff --git a/deviceinfo/deviceinfo.h b/deviceinfo/deviceinfo.h
new file mode 100644
index 0000000..0ea6ff5
--- /dev/null
+++ b/deviceinfo/deviceinfo.h
@@ -0,0 +1,24 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2012 Texas Instruments, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+int deviceinfo_register(struct btd_device *device);
+void deviceinfo_unregister(struct btd_device *device);
diff --git a/deviceinfo/main.c b/deviceinfo/main.c
new file mode 100644
index 0000000..82ecc82
--- /dev/null
+++ b/deviceinfo/main.c
@@ -0,0 +1,52 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2012 Texas Instruments, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <errno.h>
+#include <stdint.h>
+
+#include "plugin.h"
+#include "manager.h"
+#include "hcid.h"
+#include "log.h"
+
+static int deviceinfo_init(void)
+{
+	if (!main_opts.gatt_enabled) {
+		error("DIS cannot start: GATT is disabled");
+		return -ENOTSUP;
+	}
+
+	return deviceinfo_manager_init();
+}
+
+static void deviceinfo_exit(void)
+{
+	deviceinfo_manager_exit();
+}
+
+BLUETOOTH_PLUGIN_DEFINE(deviceinfo, VERSION, BLUETOOTH_PLUGIN_PRIORITY_DEFAULT,
+					deviceinfo_init, deviceinfo_exit)
diff --git a/deviceinfo/manager.c b/deviceinfo/manager.c
new file mode 100644
index 0000000..d5de171
--- /dev/null
+++ b/deviceinfo/manager.c
@@ -0,0 +1,62 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2012 Texas Instruments, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <glib.h>
+#include <errno.h>
+#include <bluetooth/uuid.h>
+
+#include "adapter.h"
+#include "device.h"
+#include "att.h"
+#include "gattrib.h"
+#include "gatt.h"
+#include "deviceinfo.h"
+#include "manager.h"
+
+#define DEVICE_INFORMATION_UUID		"0000180a-0000-1000-8000-00805f9b34fb"
+
+static int deviceinfo_driver_probe(struct btd_device *device, GSList *uuids)
+{
+	return deviceinfo_register(device);
+}
+
+static void deviceinfo_driver_remove(struct btd_device *device)
+{
+	deviceinfo_unregister(device);
+}
+
+static struct btd_device_driver deviceinfo_device_driver = {
+	.name	= "deviceinfo-driver",
+	.uuids	= BTD_UUIDS(DEVICE_INFORMATION_UUID),
+	.probe	= deviceinfo_driver_probe,
+	.remove	= deviceinfo_driver_remove
+};
+
+int deviceinfo_manager_init(void)
+{
+	return btd_register_device_driver(&deviceinfo_device_driver);
+}
+
+void deviceinfo_manager_exit(void)
+{
+	btd_unregister_device_driver(&deviceinfo_device_driver);
+}
diff --git a/deviceinfo/manager.h b/deviceinfo/manager.h
new file mode 100644
index 0000000..0f742ca
--- /dev/null
+++ b/deviceinfo/manager.h
@@ -0,0 +1,24 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2012 Texas Instruments, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+int deviceinfo_manager_init(void);
+void deviceinfo_manager_exit(void);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v6 2/4] DeviceInfo: Add connection logic
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
  2012-04-04  8:28 ` [PATCH v6 1/4] Add DeviceInformation GATT Client chen.ganir
@ 2012-04-04  8:28 ` chen.ganir
  2012-04-04  8:28 ` [PATCH v6 3/4] DeviceInfo: Discover Characteristics chen.ganir
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: chen.ganir @ 2012-04-04  8:28 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Chen Ganir

From: Chen Ganir <chen.ganir@ti.com>

Add connection logic to the Device Information Plugin. When the
driver is loaded, it will request a connection to the remote device
and release the connection request when destroyed.
---
 deviceinfo/deviceinfo.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/deviceinfo/deviceinfo.c b/deviceinfo/deviceinfo.c
index fed0cc8..150b061 100644
--- a/deviceinfo/deviceinfo.c
+++ b/deviceinfo/deviceinfo.c
@@ -28,6 +28,8 @@
 #include <bluetooth/uuid.h>
 #include "adapter.h"
 #include "device.h"
+#include "gattrib.h"
+#include "attio.h"
 #include "att.h"
 #include "gattrib.h"
 #include "gatt.h"
@@ -35,6 +37,8 @@
 
 struct deviceinfo {
 	struct btd_device	*dev;		/* Device reference */
+	GAttrib			*attrib;	/* GATT connection */
+	guint			attioid;	/* Att watcher id */
 };
 
 static GSList *servers = NULL;
@@ -43,6 +47,12 @@ static void deviceinfo_free(gpointer user_data)
 {
 	struct deviceinfo *d = user_data;
 
+	if (d->attioid > 0)
+		btd_device_remove_attio_callback(d->dev, d->attioid);
+
+	if (d->attrib != NULL)
+		g_attrib_unref(d->attrib);
+
 	btd_device_unref(d->dev);
 	g_free(d);
 }
@@ -58,6 +68,21 @@ static gint cmp_device(gconstpointer a, gconstpointer b)
 	return -1;
 }
 
+static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
+{
+	struct deviceinfo *d = user_data;
+
+	d->attrib = g_attrib_ref(attrib);
+}
+
+static void attio_disconnected_cb(gpointer user_data)
+{
+	struct deviceinfo *d = user_data;
+
+	g_attrib_unref(d->attrib);
+	d->attrib = NULL;
+}
+
 int deviceinfo_register(struct btd_device *device)
 {
 	struct deviceinfo *d;
@@ -67,6 +92,8 @@ int deviceinfo_register(struct btd_device *device)
 
 	servers = g_slist_prepend(servers, d);
 
+	d->attioid = btd_device_add_attio_callback(device, attio_connected_cb,
+						attio_disconnected_cb, d);
 	return 0;
 }
 
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v6 3/4] DeviceInfo: Discover Characteristics
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
  2012-04-04  8:28 ` [PATCH v6 1/4] Add DeviceInformation GATT Client chen.ganir
  2012-04-04  8:28 ` [PATCH v6 2/4] DeviceInfo: Add connection logic chen.ganir
@ 2012-04-04  8:28 ` chen.ganir
  2012-04-04  8:28 ` [PATCH v6 4/4] DeviceInfo: Read PNP ID chen.ganir
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: chen.ganir @ 2012-04-04  8:28 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Chen Ganir

From: Chen Ganir <chen.ganir@ti.com>

Add logic to discover all characteristics and build a
characteristic list.
---
 deviceinfo/deviceinfo.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++-
 deviceinfo/deviceinfo.h |    2 +-
 deviceinfo/manager.c    |   22 +++++++++++++++++++++-
 3 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/deviceinfo/deviceinfo.c b/deviceinfo/deviceinfo.c
index 150b061..8e4e8cb 100644
--- a/deviceinfo/deviceinfo.c
+++ b/deviceinfo/deviceinfo.c
@@ -33,16 +33,26 @@
 #include "att.h"
 #include "gattrib.h"
 #include "gatt.h"
+#include "log.h"
 #include "deviceinfo.h"
 
+#define PNPID_UUID		"00002a50-0000-1000-8000-00805f9b34fb"
+
 struct deviceinfo {
 	struct btd_device	*dev;		/* Device reference */
 	GAttrib			*attrib;	/* GATT connection */
 	guint			attioid;	/* Att watcher id */
+	struct att_range	*svc_range;	/* DeviceInfo range */
+	GSList			*chars;		/* Characteristics */
 };
 
 static GSList *servers = NULL;
 
+struct characteristic {
+	struct gatt_char	attr;	/* Characteristic */
+	struct deviceinfo	*d;	/* deviceinfo where the char belongs */
+};
+
 static void deviceinfo_free(gpointer user_data)
 {
 	struct deviceinfo *d = user_data;
@@ -53,7 +63,10 @@ static void deviceinfo_free(gpointer user_data)
 	if (d->attrib != NULL)
 		g_attrib_unref(d->attrib);
 
+	g_slist_free_full(d->chars, g_free);
+
 	btd_device_unref(d->dev);
+	g_free(d->svc_range);
 	g_free(d);
 }
 
@@ -68,11 +81,40 @@ static gint cmp_device(gconstpointer a, gconstpointer b)
 	return -1;
 }
 
+static void configure_deviceinfo_cb(GSList *characteristics, guint8 status,
+							gpointer user_data)
+{
+	struct deviceinfo *d = user_data;
+	GSList *l;
+
+	if (status != 0) {
+		error("Discover deviceinfo characteristics: %s",
+							att_ecode2str(status));
+		return;
+	}
+
+	for (l = characteristics; l; l = l->next) {
+		struct gatt_char *c = l->data;
+		struct characteristic *ch;
+
+		ch = g_new0(struct characteristic, 1);
+		ch->attr.handle = c->handle;
+		ch->attr.properties = c->properties;
+		ch->attr.value_handle = c->value_handle;
+		memcpy(ch->attr.uuid, c->uuid, MAX_LEN_UUID_STR + 1);
+		ch->d = d;
+
+		d->chars = g_slist_append(d->chars, ch);
+	}
+}
 static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
 {
 	struct deviceinfo *d = user_data;
 
 	d->attrib = g_attrib_ref(attrib);
+
+	gatt_discover_char(d->attrib, d->svc_range->start, d->svc_range->end,
+					NULL, configure_deviceinfo_cb, d);
 }
 
 static void attio_disconnected_cb(gpointer user_data)
@@ -83,12 +125,15 @@ static void attio_disconnected_cb(gpointer user_data)
 	d->attrib = NULL;
 }
 
-int deviceinfo_register(struct btd_device *device)
+int deviceinfo_register(struct btd_device *device, struct gatt_primary *prim)
 {
 	struct deviceinfo *d;
 
 	d = g_new0(struct deviceinfo, 1);
 	d->dev = btd_device_ref(device);
+	d->svc_range = g_new0(struct att_range, 1);
+	d->svc_range->start = prim->range.start;
+	d->svc_range->end = prim->range.end;
 
 	servers = g_slist_prepend(servers, d);
 
diff --git a/deviceinfo/deviceinfo.h b/deviceinfo/deviceinfo.h
index 0ea6ff5..7a804a5 100644
--- a/deviceinfo/deviceinfo.h
+++ b/deviceinfo/deviceinfo.h
@@ -20,5 +20,5 @@
  *
  */
 
-int deviceinfo_register(struct btd_device *device);
+int deviceinfo_register(struct btd_device *device, struct gatt_primary *prim);
 void deviceinfo_unregister(struct btd_device *device);
diff --git a/deviceinfo/manager.c b/deviceinfo/manager.c
index d5de171..c2378c2 100644
--- a/deviceinfo/manager.c
+++ b/deviceinfo/manager.c
@@ -34,9 +34,29 @@
 
 #define DEVICE_INFORMATION_UUID		"0000180a-0000-1000-8000-00805f9b34fb"
 
+static gint primary_uuid_cmp(gconstpointer a, gconstpointer b)
+{
+	const struct gatt_primary *prim = a;
+	const char *uuid = b;
+
+	return g_strcmp0(prim->uuid, uuid);
+}
+
 static int deviceinfo_driver_probe(struct btd_device *device, GSList *uuids)
 {
-	return deviceinfo_register(device);
+	struct gatt_primary *prim;
+	GSList *primaries, *l;
+
+	primaries = btd_device_get_primaries(device);
+
+	l = g_slist_find_custom(primaries, DEVICE_INFORMATION_UUID,
+							primary_uuid_cmp);
+	if (l == NULL)
+		return -EINVAL;
+
+	prim = l->data;
+
+	return deviceinfo_register(device, prim);
 }
 
 static void deviceinfo_driver_remove(struct btd_device *device)
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v6 4/4] DeviceInfo: Read PNP ID
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
                   ` (2 preceding siblings ...)
  2012-04-04  8:28 ` [PATCH v6 3/4] DeviceInfo: Discover Characteristics chen.ganir
@ 2012-04-04  8:28 ` chen.ganir
  2012-04-04 11:54 ` [PATCH v6 0/4] Add DeviceInformationService plugin Anderson Lizardo
  2012-04-04 12:04 ` Johan Hedberg
  5 siblings, 0 replies; 7+ messages in thread
From: chen.ganir @ 2012-04-04  8:28 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Chen Ganir

From: Chen Ganir <chen.ganir@ti.com>

Read the PNP ID characteristic of the DeviceInfo Service, and
store it inside the btd_device, for use by other profiles.
---
 deviceinfo/deviceinfo.c |   35 +++++++++++++++++++++++++++++++++++
 doc/device-api.txt      |    4 ++++
 src/device.c            |   34 ++++++++++++++++++++++++++++++++++
 src/device.h            |    4 ++++
 4 files changed, 77 insertions(+), 0 deletions(-)

diff --git a/deviceinfo/deviceinfo.c b/deviceinfo/deviceinfo.c
index 8e4e8cb..e9fcd04 100644
--- a/deviceinfo/deviceinfo.c
+++ b/deviceinfo/deviceinfo.c
@@ -81,6 +81,39 @@ static gint cmp_device(gconstpointer a, gconstpointer b)
 	return -1;
 }
 
+static void read_pnpid_cb(guint8 status, const guint8 *pdu, guint16 len,
+							gpointer user_data)
+{
+	struct characteristic *ch = user_data;
+	uint8_t value[ATT_MAX_MTU];
+	int vlen;
+
+	if (status != 0) {
+		error("Error reading PNP_ID value: %s", att_ecode2str(status));
+		return;
+	}
+
+	if (!dec_read_resp(pdu, len, value, &vlen)) {
+		error("Error reading PNP_ID: Protocol error");
+		return;
+	}
+
+	if (vlen < 7) {
+		error("Error reading PNP_ID: Invalid pdu length received");
+		return;
+	}
+
+	device_set_pnpid(ch->d->dev,value[0],att_get_u16(&value[1]),
+				att_get_u16(&value[3]),	att_get_u16(&value[5]));
+}
+
+static void process_deviceinfo_char(struct characteristic *ch)
+{
+	if (g_strcmp0(ch->attr.uuid, PNPID_UUID) == 0)
+		gatt_read_char(ch->d->attrib, ch->attr.value_handle, 0,
+							read_pnpid_cb, ch);
+}
+
 static void configure_deviceinfo_cb(GSList *characteristics, guint8 status,
 							gpointer user_data)
 {
@@ -105,6 +138,8 @@ static void configure_deviceinfo_cb(GSList *characteristics, guint8 status,
 		ch->d = d;
 
 		d->chars = g_slist_append(d->chars, ch);
+
+		process_deviceinfo_char(ch);
 	}
 }
 static void attio_connected_cb(GAttrib *attrib, gpointer user_data)
diff --git a/doc/device-api.txt b/doc/device-api.txt
index e8fc314..6c1a3c7 100644
--- a/doc/device-api.txt
+++ b/doc/device-api.txt
@@ -129,6 +129,10 @@ Properties	string Address [readonly]
 
 			Vendor unique numeric identifier.
 
+	    uint16 VendorSource [readonly]
+
+	        Vendor source numeric identifier.
+
 		uint16 Product [readonly]
 
 			Product unique numeric identifier.
diff --git a/src/device.c b/src/device.c
index 48b693c..df3fbac 100644
--- a/src/device.c
+++ b/src/device.c
@@ -134,6 +134,7 @@ struct btd_device {
 	gchar		*path;
 	char		name[MAX_NAME_LENGTH + 1];
 	char		*alias;
+	uint16_t	vendor_src;
 	uint16_t	vendor;
 	uint16_t	product;
 	uint16_t	version;
@@ -381,6 +382,11 @@ static DBusMessage *get_properties(DBusConnection *conn,
 		dict_append_entry(&dict, "Vendor", DBUS_TYPE_UINT16,
 							&device->vendor);
 
+	/* Vendor Source*/
+	if (device->vendor_src)
+		dict_append_entry(&dict, "VendorSource", DBUS_TYPE_UINT16,
+							&device->vendor_src);
+
 	/* Product */
 	if (device->product)
 		dict_append_entry(&dict, "Product", DBUS_TYPE_UINT16,
@@ -987,6 +993,19 @@ static void device_set_vendor(struct btd_device *device, uint16_t value)
 				DBUS_TYPE_UINT16, &value);
 }
 
+static void device_set_vendor_src(struct btd_device *device, uint16_t value)
+{
+	DBusConnection *conn = get_dbus_connection();
+
+	if (device->vendor_src == value)
+		return;
+
+	device->vendor_src = value;
+
+	emit_property_changed(conn, device->path, DEVICE_INTERFACE,
+				"VendorSource",	DBUS_TYPE_UINT16, &value);
+}
+
 static void device_set_product(struct btd_device *device, uint16_t value)
 {
 	DBusConnection *conn = get_dbus_connection();
@@ -1106,6 +1125,11 @@ uint16_t btd_device_get_vendor(struct btd_device *device)
 	return device->vendor;
 }
 
+uint16_t btd_device_get_vendor_src(struct btd_device *device)
+{
+	return device->vendor_src;
+}
+
 uint16_t btd_device_get_product(struct btd_device *device)
 {
 	return device->product;
@@ -3048,3 +3072,13 @@ gboolean btd_device_remove_attio_callback(struct btd_device *device, guint id)
 
 	return TRUE;
 }
+
+void device_set_pnpid(struct btd_device *device, uint8_t vendor_id_src,
+			uint16_t vendor_id, uint16_t product_id,
+			uint16_t product_ver)
+{
+	device_set_vendor(device, vendor_id);
+	device_set_vendor_src(device, vendor_id_src);
+	device_set_product(device, product_id);
+	device_set_version(device, product_ver);
+}
diff --git a/src/device.h b/src/device.h
index 7cb9bb2..f3d6c70 100644
--- a/src/device.h
+++ b/src/device.h
@@ -39,6 +39,7 @@ struct btd_device *device_create(DBusConnection *conn,
 void device_set_name(struct btd_device *device, const char *name);
 void device_get_name(struct btd_device *device, char *name, size_t len);
 uint16_t btd_device_get_vendor(struct btd_device *device);
+uint16_t btd_device_get_vendor_src(struct btd_device *device);
 uint16_t btd_device_get_product(struct btd_device *device);
 uint16_t btd_device_get_version(struct btd_device *device);
 void device_remove(struct btd_device *device, gboolean remove_stored);
@@ -120,3 +121,6 @@ int device_block(DBusConnection *conn, struct btd_device *device,
 						gboolean update_only);
 int device_unblock(DBusConnection *conn, struct btd_device *device,
 					gboolean silent, gboolean update_only);
+void device_set_pnpid(struct btd_device *device, uint8_t vendor_id_src,
+			uint16_t vendor_id, uint16_t product_id,
+			uint16_t product_ver);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v6 0/4] Add DeviceInformationService plugin
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
                   ` (3 preceding siblings ...)
  2012-04-04  8:28 ` [PATCH v6 4/4] DeviceInfo: Read PNP ID chen.ganir
@ 2012-04-04 11:54 ` Anderson Lizardo
  2012-04-04 12:04 ` Johan Hedberg
  5 siblings, 0 replies; 7+ messages in thread
From: Anderson Lizardo @ 2012-04-04 11:54 UTC (permalink / raw)
  To: chen.ganir; +Cc: linux-bluetooth

Hi Chen,

On Wed, Apr 4, 2012 at 4:28 AM,  <chen.ganir@ti.com> wrote:
> From: Chen Ganir <chen.ganir@ti.com>
>
> Add Device Information Service GATT Client for reading peer
> device PNP_ID and store it.
>
> Chen Ganir (4):
>  Add DeviceInformation GATT Client
>  DeviceInfo: Add connection logic
>  DeviceInfo: Discover Characteristics
>  DeviceInfo: Read PNP ID
>
>  Makefile.am             |    8 ++-
>  deviceinfo/deviceinfo.c |  193 +++++++++++++++++++++++++++++++++++++++++++++++
>  deviceinfo/deviceinfo.h |   24 ++++++
>  deviceinfo/main.c       |   52 +++++++++++++
>  deviceinfo/manager.c    |   82 ++++++++++++++++++++
>  deviceinfo/manager.h    |   24 ++++++
>  doc/device-api.txt      |    4 +
>  src/device.c            |   34 ++++++++
>  src/device.h            |    4 +
>  9 files changed, 423 insertions(+), 2 deletions(-)
>  create mode 100644 deviceinfo/deviceinfo.c
>  create mode 100644 deviceinfo/deviceinfo.h
>  create mode 100644 deviceinfo/main.c
>  create mode 100644 deviceinfo/manager.c
>  create mode 100644 deviceinfo/manager.h

Looks good to me.

Regards,
-- 
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v6 0/4] Add DeviceInformationService plugin
  2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
                   ` (4 preceding siblings ...)
  2012-04-04 11:54 ` [PATCH v6 0/4] Add DeviceInformationService plugin Anderson Lizardo
@ 2012-04-04 12:04 ` Johan Hedberg
  5 siblings, 0 replies; 7+ messages in thread
From: Johan Hedberg @ 2012-04-04 12:04 UTC (permalink / raw)
  To: chen.ganir; +Cc: linux-bluetooth

Hi Chen,

On Wed, Apr 04, 2012, chen.ganir@ti.com wrote:
> From: Chen Ganir <chen.ganir@ti.com>
> 
> Add Device Information Service GATT Client for reading peer
> device PNP_ID and store it.
> 
> Chen Ganir (4):
>   Add DeviceInformation GATT Client
>   DeviceInfo: Add connection logic
>   DeviceInfo: Discover Characteristics
>   DeviceInfo: Read PNP ID
> 
>  Makefile.am             |    8 ++-
>  deviceinfo/deviceinfo.c |  193 +++++++++++++++++++++++++++++++++++++++++++++++
>  deviceinfo/deviceinfo.h |   24 ++++++
>  deviceinfo/main.c       |   52 +++++++++++++
>  deviceinfo/manager.c    |   82 ++++++++++++++++++++
>  deviceinfo/manager.h    |   24 ++++++
>  doc/device-api.txt      |    4 +
>  src/device.c            |   34 ++++++++
>  src/device.h            |    4 +
>  9 files changed, 423 insertions(+), 2 deletions(-)
>  create mode 100644 deviceinfo/deviceinfo.c
>  create mode 100644 deviceinfo/deviceinfo.h
>  create mode 100644 deviceinfo/main.c
>  create mode 100644 deviceinfo/manager.c
>  create mode 100644 deviceinfo/manager.h

All four patches have been applied though I did have to fix up your
additions to device-api.txt since you weren't being consistent with the
indentation with the rest of the file.

Johan

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-04-04 12:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-04  8:28 [PATCH v6 0/4] Add DeviceInformationService plugin chen.ganir
2012-04-04  8:28 ` [PATCH v6 1/4] Add DeviceInformation GATT Client chen.ganir
2012-04-04  8:28 ` [PATCH v6 2/4] DeviceInfo: Add connection logic chen.ganir
2012-04-04  8:28 ` [PATCH v6 3/4] DeviceInfo: Discover Characteristics chen.ganir
2012-04-04  8:28 ` [PATCH v6 4/4] DeviceInfo: Read PNP ID chen.ganir
2012-04-04 11:54 ` [PATCH v6 0/4] Add DeviceInformationService plugin Anderson Lizardo
2012-04-04 12:04 ` Johan Hedberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).