From f4b4485d25932bd62e2de799352f04015a4d6888 Mon Sep 17 00:00:00 2001 From: Andrzej Kaczmarek Date: Fri, 9 Nov 2012 09:55:43 +0100 Subject: [PATCH] thermometer: Store Temperature Measurement CCC handle in struct 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 46e2b7cd6..49d4d6f7f 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) -- 2.47.3