45#if LWM2M_QUEUE_MODE_ENABLED
55#define LOG_MODULE "lwm2m-queue-mode"
56#define LOG_LEVEL LOG_LEVEL_LWM2M
59#define FIRST_REQUEST_MASK 0x01
60#define HANDLER_FROM_NOTIFICATION_MASK 0x02
62static uint16_t queue_mode_awake_time = LWM2M_QUEUE_MODE_DEFAULT_CLIENT_AWAKE_TIME;
63static uint32_t queue_mode_sleep_time = LWM2M_QUEUE_MODE_DEFAULT_CLIENT_SLEEP_TIME;
66static uint8_t waked_up_by_notification;
69#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
70static uint8_t queue_mode_dynamic_adaptation_flag = LWM2M_QUEUE_MODE_DEFAULT_DYNAMIC_ADAPTATION_FLAG;
73uint16_t times_window[LWM2M_QUEUE_MODE_DYNAMIC_ADAPTATION_WINDOW_LENGTH] = { 0 };
74uint8_t times_window_index = 0;
75static uint8_t dynamic_adaptation_params = 0x00;
76static uint64_t previous_request_time;
77static inline void clear_first_request();
78static inline uint8_t is_first_request();
79static inline void clear_handler_from_notification();
80static inline uint8_t get_handler_from_notification();
84lwm2m_queue_mode_get_awake_time()
86 LOG_DBG(
"Client Awake Time: %d ms\n", (
int)queue_mode_awake_time);
87 return queue_mode_awake_time;
91lwm2m_queue_mode_set_awake_time(uint16_t time)
93 queue_mode_awake_time = time;
97lwm2m_queue_mode_get_sleep_time()
99 LOG_DBG(
"Client Sleep Time: %d ms\n", (
int)queue_mode_sleep_time);
100 return queue_mode_sleep_time;
104lwm2m_queue_mode_set_sleep_time(uint32_t time)
106 queue_mode_sleep_time = time;
109#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
111lwm2m_queue_mode_get_dynamic_adaptation_flag()
113 LOG_DBG(
"Dynamic Adaptation Flag: %d ms\n", (
int)queue_mode_dynamic_adaptation_flag);
114 return queue_mode_dynamic_adaptation_flag;
118lwm2m_queue_mode_set_dynamic_adaptation_flag(uint8_t flag)
120 queue_mode_dynamic_adaptation_flag = flag;
128 uint16_t max_time = 0;
130 for(i = 0; i < LWM2M_QUEUE_MODE_DYNAMIC_ADAPTATION_WINDOW_LENGTH; i++) {
131 if(times_window[i] > max_time) {
132 max_time = times_window[i];
143 uint16_t mean_time = 0;
145 for(i = 0; i < LWM2M_QUEUE_MODE_DYNAMIC_ADAPTATION_WINDOW_LENGTH; i++) {
147 mean_time = times_window[i];
149 if(times_window[i] != 0) {
150 mean_time = (mean_time + times_window[i]) / 2;
162 uint16_t mean_time = get_mean_time();
163 LOG_DBG(
"Dynamic Adaptation: updated awake time: %d ms\n", (
int)mean_time);
164 lwm2m_queue_mode_set_awake_time(mean_time + (mean_time >> 1));
167 uint16_t max_time = get_maximum_time();
168 LOG_DBG(
"Dynamic Adaptation: updated awake time: %d ms\n", (
int)max_time);
169 lwm2m_queue_mode_set_awake_time(max_time + (max_time >> 1));
175lwm2m_queue_mode_add_time_to_window(uint16_t time)
177 if(times_window_index == LWM2M_QUEUE_MODE_DYNAMIC_ADAPTATION_WINDOW_LENGTH) {
178 times_window_index = 0;
180 times_window[times_window_index] = time;
181 times_window_index++;
186lwm2m_queue_mode_is_waked_up_by_notification()
188 return waked_up_by_notification;
192lwm2m_queue_mode_clear_waked_up_by_notification()
194 waked_up_by_notification = 0;
198lwm2m_queue_mode_set_waked_up_by_notification()
200 waked_up_by_notification = 1;
204lwm2m_queue_mode_request_received()
206 if(lwm2m_rd_client_is_client_awake()) {
207 lwm2m_rd_client_restart_client_awake_timer();
209#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
210 if(lwm2m_queue_mode_get_dynamic_adaptation_flag() && !get_handler_from_notification()) {
211 if(is_first_request()) {
213 clear_first_request();
217 lwm2m_queue_mode_add_time_to_window(0xffff);
219 lwm2m_queue_mode_add_time_to_window(
coap_timer_uptime() - previous_request_time);
225 if(get_handler_from_notification()) {
226 clear_handler_from_notification();
231#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
233lwm2m_queue_mode_set_first_request()
235 dynamic_adaptation_params |= FIRST_REQUEST_MASK;
239lwm2m_queue_mode_set_handler_from_notification()
241 dynamic_adaptation_params |= HANDLER_FROM_NOTIFICATION_MASK;
247 return dynamic_adaptation_params & FIRST_REQUEST_MASK;
251get_handler_from_notification()
253 return (dynamic_adaptation_params & HANDLER_FROM_NOTIFICATION_MASK) != 0;
259 dynamic_adaptation_params &= ~FIRST_REQUEST_MASK;
263clear_handler_from_notification()
265 dynamic_adaptation_params &= ~HANDLER_FROM_NOTIFICATION_MASK;
static uint64_t coap_timer_uptime(void)
Get the time since boot in milliseconds.
Linked list manipulation routines.
Header file for the Contiki OMA LWM2M engine.
Header file for the Contiki OMA LWM2M Queue Mode implementation to manage the parameters.
Header file for the Contiki OMA LWM2M Registration and Bootstrap Client.
Memory block allocation routines.