From 2559e27414aae68bae414a8286b4a91f7b27c147 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Thu, 25 Mar 2010 08:49:56 +0000 Subject: [PATCH] API change to the announcement module: an annoucement can now be registered without a value. Such announcements are never transmitted to neighbors, until the announcement's value is set. --- core/net/rime/announcement.c | 29 +++++++++++++++----------- core/net/rime/announcement.h | 21 ++++++++++--------- core/net/rime/broadcast-announcement.c | 7 ++++--- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/core/net/rime/announcement.c b/core/net/rime/announcement.c index 113d72d7c..99fb4694a 100644 --- a/core/net/rime/announcement.c +++ b/core/net/rime/announcement.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: announcement.c,v 1.4 2010/03/19 13:16:11 adamdunkels Exp $ + * $Id: announcement.c,v 1.5 2010/03/25 08:49:56 adamdunkels Exp $ */ /** @@ -60,15 +60,16 @@ announcement_init(void) } /*---------------------------------------------------------------------------*/ void -announcement_register(struct announcement *a, uint16_t id, uint16_t value, +announcement_register(struct announcement *a, uint16_t id, announcement_callback_t callback) { a->id = id; - a->value = value; + a->has_value = 0; a->callback = callback; list_add(announcements, a); if(observer_callback) { - observer_callback(a->id, a->value, 0, ANNOUNCEMENT_BUMP); + observer_callback(a->id, a->has_value, + a->value, 0, ANNOUNCEMENT_BUMP); } } /*---------------------------------------------------------------------------*/ @@ -79,21 +80,24 @@ announcement_remove(struct announcement *a) } /*---------------------------------------------------------------------------*/ void -announcement_set_value(struct announcement *a, uint16_t value) +announcement_remove_value(struct announcement *a) { - uint16_t oldvalue = a->value; - a->value = value; + a->has_value = 0; if(observer_callback) { - observer_callback(a->id, value, oldvalue, ANNOUNCEMENT_NOBUMP); + observer_callback(a->id, 0, 0, 0, ANNOUNCEMENT_NOBUMP); } + } /*---------------------------------------------------------------------------*/ void -announcement_set_id(struct announcement *a, uint16_t id) +announcement_set_value(struct announcement *a, uint16_t value) { - a->id = id; + uint16_t oldvalue = a->value; + a->has_value = 1; + a->value = value; if(observer_callback) { - observer_callback(a->id, a->value, a->value, ANNOUNCEMENT_NOBUMP); + observer_callback(a->id, a->has_value, + value, oldvalue, ANNOUNCEMENT_NOBUMP); } } /*---------------------------------------------------------------------------*/ @@ -101,7 +105,8 @@ void announcement_bump(struct announcement *a) { if(observer_callback) { - observer_callback(a->id, a->value, a->value, ANNOUNCEMENT_BUMP); + observer_callback(a->id, a->has_value, + a->value, a->value, ANNOUNCEMENT_BUMP); } } /*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/announcement.h b/core/net/rime/announcement.h index ffca0d4d5..0bf206143 100644 --- a/core/net/rime/announcement.h +++ b/core/net/rime/announcement.h @@ -54,7 +54,7 @@ * * This file is part of the Contiki operating system. * - * $Id: announcement.h,v 1.7 2010/03/19 13:16:11 adamdunkels Exp $ + * $Id: announcement.h,v 1.8 2010/03/25 08:49:56 adamdunkels Exp $ */ /** @@ -86,6 +86,7 @@ struct announcement { uint16_t id; uint16_t value; announcement_callback_t callback; + uint8_t has_value; }; /** @@ -96,7 +97,6 @@ struct announcement { * \brief Register an announcement * \param a A pointer to a struct announcement * \param id The identifying number of the announcement - * \param value The initial value of the announcement * \param callback A pointer to a callback function that is called * when an announcement is heard * @@ -112,7 +112,7 @@ struct announcement { * */ void announcement_register(struct announcement *a, - uint16_t id, uint16_t value, + uint16_t id, announcement_callback_t callback); /** @@ -140,18 +140,18 @@ void announcement_remove(struct announcement *a); */ void announcement_set_value(struct announcement *a, uint16_t value); - /** - * \brief Set the identifier of an announcement + * \brief Remove the value of an announcement * \param a A pointer to a struct announcement that has * previously been registered * - * This function sets the identifier of an announcement - * that has previously been registered with + * This function removes the value of an announcement that + * has previously been registered with * announcement_register(). * */ -void announcement_set_id(struct announcement *a, uint16_t id); +void announcement_remove_value(struct announcement *a); + /** * \brief Bump an announcement @@ -244,8 +244,9 @@ enum { ANNOUNCEMENT_BUMP, }; -typedef void (* announcement_observer)(uint16_t id, uint16_t newvalue, - uint16_t oldvalue, uint8_t bump); +typedef void (* announcement_observer)(uint16_t id, uint8_t has_value, + uint16_t newvalue, uint16_t oldvalue, + uint8_t bump); /** * \brief Register an observer callback with the announcement module diff --git a/core/net/rime/broadcast-announcement.c b/core/net/rime/broadcast-announcement.c index a7791da4e..5d4f14fdb 100644 --- a/core/net/rime/broadcast-announcement.c +++ b/core/net/rime/broadcast-announcement.c @@ -33,7 +33,7 @@ * * This file is part of the Contiki operating system. * - * $Id: broadcast-announcement.c,v 1.2 2010/03/22 11:32:29 fros4943 Exp $ + * $Id: broadcast-announcement.c,v 1.3 2010/03/25 08:49:56 adamdunkels Exp $ */ /** @@ -104,7 +104,7 @@ send_adv(void *ptr) packetbuf_clear(); adata = packetbuf_dataptr(); adata->num = 0; - for(a = announcement_list(); a != NULL; a = a->next) { + for(a = announcement_list(); a != NULL && a->has_value; a = a->next) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; @@ -186,7 +186,8 @@ send_timer(void *ptr) } /*---------------------------------------------------------------------------*/ static void -new_announcement(uint16_t id, uint16_t newval, uint16_t oldval, uint8_t bump) +new_announcement(uint16_t id, uint8_t has_value, + uint16_t newval, uint16_t oldval, uint8_t bump) { if(bump == ANNOUNCEMENT_BUMP) { c.current_interval = c.initial_interval;