Code moved frome lwm2m-engine to lwm2m-queue-mode to have a clearer separation
This commit is contained in:
parent
eba756e340
commit
ec8fe6eb22
@ -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_ */
|
||||
|
@ -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 */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** @} */
|
||||
|
@ -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 */
|
||||
/** @} */
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
/** @} */
|
||||
|
@ -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_ */
|
||||
/** @} */
|
||||
|
@ -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*/
|
||||
|
Loading…
Reference in New Issue
Block a user