[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