Added macros for defining wake up/sleep behaviour depending on the platform

This commit is contained in:
carlosgp143@gmail.com 2018-04-06 15:16:42 +02:00
parent d744e8306a
commit 1f8754766a
2 changed files with 45 additions and 23 deletions

View File

@ -27,8 +27,22 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Only sleep mode 1 on Zoul to enable full 32 KiB RAM */ /* Only sleep mode 1 on Zoul to enable full 32 KiB RAM */
#define LPM_CONF_MAX_PM 1 #define LPM_CONF_MAX_PM 1
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Macros to enter sleep mode and wake up in the Zoul module. Sleep consists
* on turn off the radio and start a RTIMER to wake up, and wake up consists on
* turn on the radio again
*/
#define LWM2M_Q_MODE_WAKE_UP() do { \
NETSTACK_MAC.on(); \
} while(0)
#define LWM2M_Q_MODE_SLEEP_MS(TIME_MS) do { \
uint64_t aux = TIME_MS * RTIMER_SECOND; \
NETSTACK_MAC.off(); \
rtimer_arch_schedule(RTIMER_NOW() + (rtimer_clock_t)(aux / 1000)); \
} while(0)

View File

@ -43,7 +43,6 @@
* Joel Hoglund <joel@sics.se> * Joel Hoglund <joel@sics.se>
* Carlos Gonzalo Peces <carlosgp143@gmail.com> * Carlos Gonzalo Peces <carlosgp143@gmail.com>
*/ */
#include "lwm2m-engine.h" #include "lwm2m-engine.h"
#include "lwm2m-object.h" #include "lwm2m-object.h"
#include "lwm2m-device.h" #include "lwm2m-device.h"
@ -58,15 +57,16 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#if LWM2M_Q_MODE_ENABLED
#include "lwm2m-qmode-object.h"
#include "lwm2m-notification-queue.h"
#endif
#if UIP_CONF_IPV6_RPL #if UIP_CONF_IPV6_RPL
#include "rpl.h" #include "rpl.h"
#endif /* UIP_CONF_IPV6_RPL */ #endif /* UIP_CONF_IPV6_RPL */
#if LWM2M_Q_MODE_ENABLED
#include "lwm2m-qmode-object.h"
#include "lwm2m-notification-queue.h"
#endif /* LWM2M_Q_MODE_ENABLED */
/* Log configuration */ /* Log configuration */
#include "coap-log.h" #include "coap-log.h"
#define LOG_MODULE "lwm2m-rd" #define LOG_MODULE "lwm2m-rd"
@ -131,10 +131,15 @@ static void (*rd_callback)(coap_request_state_t *state);
static coap_timer_t block1_timer; static coap_timer_t block1_timer;
#if LWM2M_Q_MODE_ENABLED #if LWM2M_Q_MODE_ENABLED
static coap_timer_t q_mode_client_awake_timer; /* Timer to control the client awake time */ static coap_timer_t q_mode_client_awake_timer; /* Timer to control the client's
static uint8_t q_mode_client_awake; /* 1 - client is awake, 0 - client is sleeping */ * awake time
*/
static uint8_t q_mode_client_awake; /* 1 - client is awake,
* 0 - client is sleeping
*/
static uint16_t q_mode_client_awake_time; /* The time to be awake */ static uint16_t q_mode_client_awake_time; /* The time to be awake */
static void q_mode_awake_timer_callback(coap_timer_t *timer); /* Callback for the client awake timer */ /* Callback for the client awake timer */
static void q_mode_awake_timer_callback(coap_timer_t *timer);
#endif #endif
static void check_periodic_observations(); static void check_periodic_observations();
@ -742,16 +747,19 @@ periodic_process(coap_timer_t *timer)
coap_timer_set(&q_mode_client_awake_timer, q_mode_client_awake_time); coap_timer_set(&q_mode_client_awake_timer, q_mode_client_awake_time);
break; break;
case Q_MODE_SEND_UPDATE: case Q_MODE_SEND_UPDATE:
#if !STANDALONE /* Define this macro to make the necessary actions for waking up,
NETSTACK_MAC.on(); * depending on the platform
#endif */
#ifdef LWM2M_Q_MODE_WAKE_UP
LWM2M_Q_MODE_WAKE_UP();
#endif /* LWM2M_Q_MODE_WAKE_UP */
prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED); prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
coap_send_request(&rd_request_state, &session_info.server_ep, request, coap_send_request(&rd_request_state, &session_info.server_ep, request,
update_callback); update_callback);
last_rd_progress = coap_timer_uptime(); last_rd_progress = coap_timer_uptime();
rd_state = UPDATE_SENT; rd_state = UPDATE_SENT;
break; break;
#endif #endif /* LWM2M_Q_MODE_ENABLED */
case UPDATE_SENT: case UPDATE_SENT:
/* just wait until the callback kicks us to the next state... */ /* just wait until the callback kicks us to the next state... */
@ -787,9 +795,10 @@ lwm2m_rd_client_init(const char *ep)
/* default binding U = UDP, UQ = UDP Q-mode*/ /* default binding U = UDP, UQ = UDP Q-mode*/
#if LWM2M_Q_MODE_ENABLED #if LWM2M_Q_MODE_ENABLED
session_info.binding = "UQ"; session_info.binding = "UQ";
session_info.lifetime = (LWM2M_Q_MODE_DEFAULT_CLIENT_SLEEP_TIME / 1000) * 2; /* Enough margin to ensure that the client is not unregistered (we /* Enough margin to ensure that the client is not unregistered (we
* do not know the time it can stay awake) * do not know the time it can stay awake)
*/ */
session_info.lifetime = (LWM2M_Q_MODE_DEFAULT_CLIENT_SLEEP_TIME / 1000) * 2;
#else #else
session_info.binding = "U"; session_info.binding = "U";
if(session_info.lifetime == 0) { if(session_info.lifetime == 0) {
@ -836,12 +845,11 @@ q_mode_awake_timer_callback(coap_timer_t *timer)
/* Timer has expired, no requests has been received, client can go to sleep */ /* Timer has expired, no requests has been received, client can go to sleep */
LOG_DBG("Queue Mode: Client is SLEEPING at %lu\n", (unsigned long)coap_timer_uptime()); LOG_DBG("Queue Mode: Client is SLEEPING at %lu\n", (unsigned long)coap_timer_uptime());
q_mode_client_awake = 0; q_mode_client_awake = 0;
#if !STANDALONE
/* Turn off the radio and start sleeping timer. LPM will be entered since the radio /* Define this macro to enter sleep mode depending on the platform */
and the peripherals are off, and there is a sleep timer started for waking up */ #ifdef LWM2M_Q_MODE_SLEEP_MS
NETSTACK_MAC.off(); LWM2M_Q_MODE_SLEEP_MS(lwm2m_q_object_get_sleep_time());
rtimer_arch_schedule(RTIMER_NOW() + ((lwm2m_q_object_get_sleep_time() / 1000) * RTIMER_SECOND)); #endif /* LWM2M_Q_MODE_SLEEP_MS */
#endif
rd_state = Q_MODE_SEND_UPDATE; rd_state = Q_MODE_SEND_UPDATE;
coap_timer_set(&rd_timer, lwm2m_q_object_get_sleep_time()); coap_timer_set(&rd_timer, lwm2m_q_object_get_sleep_time());
} }
@ -862,6 +870,6 @@ lwm2m_rd_client_fsm_execute_q_mode_update()
periodic_process(&rd_timer); periodic_process(&rd_timer);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#endif #endif /* LWM2M_Q_MODE_ENABLED */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** @} */ /** @} */