Code moved frome lwm2m-engine to lwm2m-queue-mode to have a clearer separation

This commit is contained in:
carlosgp143@gmail.com 2018-05-22 15:34:30 +02:00
parent eba756e340
commit ec8fe6eb22
7 changed files with 125 additions and 119 deletions

View File

@ -60,10 +60,11 @@
#define COAP_OBSERVE_CLIENT 1
/* Definitions to enable Queue Mode, include the dynamic adaptation and change the default parameters */
/* #define LWM2M_Q_MODE_CONF_ENABLED 1
#define LWM2M_Q_MODE_CONF_INCLUDE_DYNAMIC_ADAPTATION 1
#define LWM2M_Q_MODE_CONF_DEFAULT_CLIENT_AWAKE_TIME 2000
#define LWM2M_Q_MODE_CONF_DEFAULT_CLIENT_SLEEP_TIME 10000
#define LWM2M_Q_MODE_CONF_DEFAULT_DYNAMIC_ADAPTATION_FLAG 0 */
/* #define LWM2M_QUEUE_MODE_CONF_ENABLED 1
#define LWM2M_QUEUE_MODE_CONF_INCLUDE_DYNAMIC_ADAPTATION 1
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_AWAKE_TIME 2000
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_SLEEP_TIME 10000
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_DYNAMIC_ADAPTATION_FLAG 1
#define LWM2M_QUEUE_MODE_OBJECT_CONF_ENABLED 0 */
#endif /* PROJECT_CONF_H_ */

View File

@ -84,9 +84,6 @@
#if LWM2M_QUEUE_MODE_ENABLED
/* Queue Mode is handled using the RD Client and the Q-Mode object */
#define USE_RD_CLIENT 1
/* Queue Mode dynamic adaptation masks */
#define FIRST_REQUEST_MASK 0x01
#define HANDLER_FROM_NOTIFICATION_MASK 0x02
#endif
#if USE_RD_CLIENT
@ -146,19 +143,6 @@ static struct {
/* in the future also a timeout */
} created;
#if LWM2M_QUEUE_MODE_ENABLED
static uint8_t waked_up_by_notification;
/* For the dynamic adaptation of the awake time */
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
static uint8_t dynamic_adaptation_params = 0x00; /* bit0: first_request, bit1: handler from notification */
static uint64_t previous_request_time;
static inline void clear_first_request();
static inline uint8_t is_first_request();
static inline void clear_handler_from_notification();
static inline uint8_t get_handler_from_notification();
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
#endif /* LWM2M_QUEUE_MODE_ENABLED */
COAP_HANDLER(lwm2m_handler, lwm2m_handler_callback);
LIST(object_list);
LIST(generic_object_list);
@ -1406,32 +1390,8 @@ lwm2m_handler_callback(coap_message_t *request, coap_message_t *response,
context.inbuf->size = coap_get_payload(request, (const uint8_t **)&context.inbuf->buffer);
context.inbuf->pos = 0;
/*If Queue Mode, restart the client awake timer */
#if LWM2M_QUEUE_MODE_ENABLED
if(lwm2m_rd_client_is_client_awake()) {
lwm2m_rd_client_restart_client_awake_timer();
}
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag() && !get_handler_from_notification()) {
if(is_first_request()) {
previous_request_time = coap_timer_uptime();
clear_first_request();
} else {
if(coap_timer_uptime()-previous_request_time >= 0) {
if(coap_timer_uptime()-previous_request_time > 0xffff) {
lwm2m_queue_mode_add_time_to_window(0xffff);
} else {
lwm2m_queue_mode_add_time_to_window(coap_timer_uptime()-previous_request_time);
}
}
previous_request_time = coap_timer_uptime();
}
}
if(get_handler_from_notification()) {
clear_handler_from_notification();
}
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
lwm2m_queue_mode_request_received();
#endif /* LWM2M_QUEUE_MODE_ENABLED */
/* Maybe this should be part of CoAP itself - this seems not to be working
@ -1698,7 +1658,7 @@ lwm2m_send_notification(char* path)
{
#if LWM2M_QUEUE_MODE_ENABLED && LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
lwm2m_engine_set_handler_from_notification();
lwm2m_queue_mode_set_handler_from_notification();
}
#endif
coap_notify_observers_sub(NULL, path);
@ -1721,8 +1681,8 @@ lwm2m_notify_object_observers(lwm2m_object_instance_t *obj,
lwm2m_notification_queue_add_notification_path(obj->object_id, obj->instance_id, resource);
/* if it is the first notification -> wake up and send update */
if(!waked_up_by_notification) {
waked_up_by_notification = 1;
if(!lwm2m_queue_mode_is_waked_up_by_notification()) {
lwm2m_queue_mode_set_waked_up_by_notification();
lwm2m_rd_client_fsm_execute_queue_mode_update();
}
/* Client is awake -> send the notification */
@ -1735,57 +1695,4 @@ lwm2m_notify_object_observers(lwm2m_object_instance_t *obj,
#endif
}
/*---------------------------------------------------------------------------*/
/* Queue Mode Support and dynamic adaptation of the client awake time */
#if LWM2M_QUEUE_MODE_ENABLED
uint8_t
lwm2m_engine_is_waked_up_by_notification()
{
return waked_up_by_notification;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_engine_clear_waked_up_by_notification()
{
waked_up_by_notification = 0;
}
/*---------------------------------------------------------------------------*/
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
void
lwm2m_engine_set_first_request()
{
dynamic_adaptation_params |= FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_engine_set_handler_from_notification()
{
dynamic_adaptation_params |= HANDLER_FROM_NOTIFICATION_MASK;
}
/*---------------------------------------------------------------------------*/
static inline uint8_t
is_first_request()
{
return dynamic_adaptation_params & FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
static inline uint8_t
get_handler_from_notification()
{
return (dynamic_adaptation_params & HANDLER_FROM_NOTIFICATION_MASK) != 0;
}
/*---------------------------------------------------------------------------*/
static inline void
clear_first_request()
{
dynamic_adaptation_params &= ~FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
static inline void
clear_handler_from_notification()
{
dynamic_adaptation_params &= ~HANDLER_FROM_NOTIFICATION_MASK;
}
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
#endif /* LWM2M_QUEUE_MODE_ENABLED */
/*---------------------------------------------------------------------------*/
/** @} */

View File

@ -116,14 +116,5 @@ void lwm2m_notify_object_observers(lwm2m_object_instance_t *obj,
void lwm2m_engine_set_opaque_callback(lwm2m_context_t *ctx, lwm2m_write_opaque_callback cb);
#if LWM2M_QUEUE_MODE_ENABLED
uint8_t lwm2m_engine_is_waked_up_by_notification();
void lwm2m_engine_clear_waked_up_by_notification();
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
void lwm2m_engine_set_first_request();
void lwm2m_engine_set_handler_from_notification();
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
#endif /* LWM2M_QUEUE_MODE_ENABLED */
#endif /* LWM2M_ENGINE_H */
/** @} */

View File

@ -145,7 +145,7 @@ lwm2m_notification_queue_send_notifications()
extend_path(iteration_path, path, sizeof(path));
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
lwm2m_engine_set_handler_from_notification();
lwm2m_queue_mode_set_handler_from_notification();
}
#endif
LOG_DBG("Sending stored notification with path: %s\n", path);

View File

@ -55,17 +55,30 @@
#define LOG_MODULE "lwm2m-queue-mode"
#define LOG_LEVEL LOG_LEVEL_LWM2M
/* Queue Mode dynamic adaptation masks */
#define FIRST_REQUEST_MASK 0x01
#define HANDLER_FROM_NOTIFICATION_MASK 0x02
static uint16_t queue_mode_awake_time = LWM2M_QUEUE_MODE_DEFAULT_CLIENT_AWAKE_TIME;
static uint32_t queue_mode_sleep_time = LWM2M_QUEUE_MODE_DEFAULT_CLIENT_SLEEP_TIME;
/* Flag for notifications */
static uint8_t waked_up_by_notification;
/* For the dynamic adaptation of the awake time */
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
static uint8_t queue_mode_dynamic_adaptation_flag = LWM2M_QUEUE_MODE_DEFAULT_DYNAMIC_ADAPTATION_FLAG;
/* Window to save the times and do the dynamic adaptation of the awake time*/
uint16_t times_window[LWM2M_QUEUE_MODE_DYNAMIC_ADAPTATION_WINDOW_LENGTH] = { 0 };
uint8_t times_window_index = 0;
#endif
static uint8_t dynamic_adaptation_params = 0x00; /* bit0: first_request, bit1: handler from notification */
static uint64_t previous_request_time;
static inline void clear_first_request();
static inline uint8_t is_first_request();
static inline void clear_handler_from_notification();
static inline uint8_t get_handler_from_notification();
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
/*---------------------------------------------------------------------------*/
uint16_t
lwm2m_queue_mode_get_awake_time()
@ -106,6 +119,7 @@ lwm2m_queue_mode_set_dynamic_adaptation_flag(uint8_t flag)
{
queue_mode_dynamic_adaptation_flag = flag;
}
#endif
/*---------------------------------------------------------------------------*/
#if !UPDATE_WITH_MEAN
static uint16_t
@ -167,6 +181,89 @@ lwm2m_queue_mode_add_time_to_window(uint16_t time)
times_window_index++;
update_awake_time();
}
/*---------------------------------------------------------------------------*/
uint8_t
lwm2m_queue_mode_is_waked_up_by_notification()
{
return waked_up_by_notification;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_queue_mode_clear_waked_up_by_notification()
{
waked_up_by_notification = 0;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_queue_mode_set_waked_up_by_notification()
{
waked_up_by_notification = 1;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_queue_mode_request_received()
{
if(lwm2m_rd_client_is_client_awake()) {
lwm2m_rd_client_restart_client_awake_timer();
}
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag() && !get_handler_from_notification()) {
if(is_first_request()) {
previous_request_time = coap_timer_uptime();
clear_first_request();
} else {
if(coap_timer_uptime() - previous_request_time >= 0) {
if(coap_timer_uptime() - previous_request_time > 0xffff) {
lwm2m_queue_mode_add_time_to_window(0xffff);
} else {
lwm2m_queue_mode_add_time_to_window(coap_timer_uptime() - previous_request_time);
}
}
previous_request_time = coap_timer_uptime();
}
}
if(get_handler_from_notification()) {
clear_handler_from_notification();
}
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
}
/*---------------------------------------------------------------------------*/
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
void
lwm2m_queue_mode_set_first_request()
{
dynamic_adaptation_params |= FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
void
lwm2m_queue_mode_set_handler_from_notification()
{
dynamic_adaptation_params |= HANDLER_FROM_NOTIFICATION_MASK;
}
/*---------------------------------------------------------------------------*/
static inline uint8_t
is_first_request()
{
return dynamic_adaptation_params & FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
static inline uint8_t
get_handler_from_notification()
{
return (dynamic_adaptation_params & HANDLER_FROM_NOTIFICATION_MASK) != 0;
}
/*---------------------------------------------------------------------------*/
static inline void
clear_first_request()
{
dynamic_adaptation_params &= ~FIRST_REQUEST_MASK;
}
/*---------------------------------------------------------------------------*/
static inline void
clear_handler_from_notification()
{
dynamic_adaptation_params &= ~HANDLER_FROM_NOTIFICATION_MASK;
}
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
#endif /* LWM2M_QUEUE_MODE_ENABLED */
/** @} */

View File

@ -36,7 +36,7 @@
/**
* \file
* Header file for the Contiki OMA LWM2M Queue Mode implementation
to manage the parameters
to manage the parameters
* \author
* Carlos Gonzalo Peces <carlosgp143@gmail.com>
*/
@ -51,11 +51,21 @@ uint16_t lwm2m_queue_mode_get_awake_time();
void lwm2m_queue_mode_set_awake_time(uint16_t time);
uint32_t lwm2m_queue_mode_get_sleep_time();
void lwm2m_queue_mode_set_sleep_time(uint32_t time);
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
uint8_t lwm2m_queue_mode_get_dynamic_adaptation_flag();
void lwm2m_queue_mode_set_dynamic_adaptation_flag(uint8_t flag);
void lwm2m_queue_mode_add_time_to_window(uint16_t time);
#endif
uint8_t lwm2m_queue_mode_is_waked_up_by_notification();
void lwm2m_queue_mode_clear_waked_up_by_notification();
void lwm2m_queue_mode_set_waked_up_by_notification();
void lwm2m_queue_mode_set_first_request();
void lwm2m_queue_mode_set_handler_from_notification();
void lwm2m_queue_mode_request_received();
#endif /* LWM2M_QUEUE_MODE_H_ */
/** @} */

View File

@ -448,7 +448,7 @@ registration_callback(coap_request_state_t *state)
#if LWM2M_QUEUE_MODE_ENABLED
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
lwm2m_engine_set_first_request();
lwm2m_queue_mode_set_first_request();
}
#endif
lwm2m_rd_client_fsm_execute_queue_mode_awake(); /* Avoid 500 ms delay and move directly to the state*/
@ -501,14 +501,14 @@ update_callback(coap_request_state_t *state)
last_update = coap_timer_uptime();
#if LWM2M_QUEUE_MODE_ENABLED
/* If it has been waked up by a notification, send the stored notifications in queue */
if(lwm2m_engine_is_waked_up_by_notification()) {
if(lwm2m_queue_mode_is_waked_up_by_notification()) {
lwm2m_engine_clear_waked_up_by_notification();
lwm2m_queue_mode_clear_waked_up_by_notification();
lwm2m_notification_queue_send_notifications();
}
#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
lwm2m_engine_set_first_request();
lwm2m_queue_mode_set_first_request();
}
#endif /* LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION */
lwm2m_rd_client_fsm_execute_queue_mode_awake(); /* Avoid 500 ms delay and move directly to the state*/