Thread (17 messages) 17 messages, 2 authors, 2012-11-30
STALE4988d

[PATCH 01/15] thermometer: Store Temperature Measurement CCC handle in struct

From: Andrzej Kaczmarek <hidden>
Date: 2012-11-09 08:55:43
Subsystem: the rest · Maintainer: Linus Torvalds

This patch adds Temperature Measurement CCC handle value directly into
thermometer struct. This way there's no need to traverse nested lists
looking for value.
---
 profiles/thermometer/thermometer.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/profiles/thermometer/thermometer.c b/profiles/thermometer/thermometer.c
index 4d1df1d..3ea6e96 100644
--- a/profiles/thermometer/thermometer.c
+++ b/profiles/thermometer/thermometer.c
@@ -80,6 +80,8 @@ struct thermometer {
 	uint16_t			min;
 	gboolean			has_type;
 	gboolean			has_interval;
+
+	uint16_t			measurement_ccc_handle;
 };
 
 struct characteristic {
@@ -403,6 +405,8 @@ static void process_thermometer_desc(struct descriptor *desc)
 
 		if (g_strcmp0(ch->attr.uuid,
 					TEMPERATURE_MEASUREMENT_UUID) == 0) {
+			desc->ch->t->measurement_ccc_handle = desc->handle;
+
 			if (g_slist_length(ch->t->tadapter->fwatchers) == 0)
 				return;
 
@@ -759,9 +763,18 @@ static void write_ccc(struct thermometer *t, const char *uuid, uint16_t value)
 static void enable_final_measurement(gpointer data, gpointer user_data)
 {
 	struct thermometer *t = data;
+	uint16_t handle = t->measurement_ccc_handle;
+	uint8_t value[2];
+	char *msg;
+
+	if (t->attrib == NULL || !handle)
+		return;
+
+	att_put_u16(GATT_CLIENT_CHARAC_CFG_IND_BIT, value);
+	msg = g_strdup("Enable Temperature Measurement indications");
 
-	write_ccc(t, TEMPERATURE_MEASUREMENT_UUID,
-					GATT_CLIENT_CHARAC_CFG_IND_BIT);
+	gatt_write_char(t->attrib, handle, value, sizeof(value),
+							write_ccc_cb, msg);
 }
 
 static void enable_intermediate_measurement(gpointer data, gpointer user_data)
@@ -775,8 +788,18 @@ static void enable_intermediate_measurement(gpointer data, gpointer user_data)
 static void disable_final_measurement(gpointer data, gpointer user_data)
 {
 	struct thermometer *t = data;
+	uint16_t handle = t->measurement_ccc_handle;
+	uint8_t value[2];
+	char *msg;
+
+	if (t->attrib == NULL || !handle)
+		return;
+
+	att_put_u16(0x0000, value);
+	msg = g_strdup("Disable Temperature Measurement indications");
 
-	write_ccc(t, TEMPERATURE_MEASUREMENT_UUID, 0x0000);
+	gatt_write_char(t->attrib, handle, value, sizeof(value),
+							write_ccc_cb, msg);
 }
 
 static void disable_intermediate_measurement(gpointer data, gpointer user_data)
-- 
1.8.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help