#ifndef COAP_TIME_H_
#define COAP_TIME_H_
#if defined(WITH_LWIP)
#include <stdint.h>
#include <lwip/sys.h>
#define COAP_TICKS_PER_SECOND 1000
typedef uint32_t coap_tick_t;
typedef uint32_t coap_time_t;
typedef int32_t coap_tick_diff_t;
COAP_STATIC_INLINE void coap_ticks_impl(coap_tick_t *t) {
*t = sys_now();
}
COAP_STATIC_INLINE void coap_clock_init_impl(void) {
}
#define coap_clock_init coap_clock_init_impl
#define coap_ticks coap_ticks_impl
COAP_STATIC_INLINE coap_time_t coap_ticks_to_rt(coap_tick_t t) {
return t / COAP_TICKS_PER_SECOND;
}
COAP_STATIC_INLINE uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
return (uint64_t)t * 1000000 / COAP_TICKS_PER_SECOND;
}
#elif defined(WITH_CONTIKI)
#include "clock.h"
typedef clock_time_t coap_tick_t;
typedef clock_time_t coap_time_t;
typedef int coap_tick_diff_t;
#define COAP_TICKS_PER_SECOND CLOCK_SECOND
COAP_STATIC_INLINE void coap_clock_init(void) {
clock_init();
}
COAP_STATIC_INLINE void coap_ticks(coap_tick_t *t) {
*t = clock_time();
}
COAP_STATIC_INLINE coap_time_t coap_ticks_to_rt(coap_tick_t t) {
return t / COAP_TICKS_PER_SECOND;
}
COAP_STATIC_INLINE uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
return (uint64_t)t * 1000000 / COAP_TICKS_PER_SECOND;
}
#elif defined(RIOT_VERSION)
#include <xtimer.h>
#ifdef XTIMER_HZ
#define COAP_TICKS_PER_SECOND (XTIMER_HZ)
#else
#define COAP_TICKS_PER_SECOND (XTIMER_HZ_BASE)
#endif
typedef uint64_t coap_tick_t;
typedef int64_t coap_tick_diff_t;
typedef uint32_t coap_time_t;
static inline void coap_clock_init(void) {}
static inline void coap_ticks(coap_tick_t *t) {
*t = xtimer_now_usec64();
}
static inline coap_time_t coap_ticks_to_rt(coap_tick_t t) {
return t / 1000000UL;
}
static inline uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
return t;
}
static inline coap_tick_t coap_ticks_from_rt_us(uint64_t t) {
return t / 1000000UL;
}
#else
#include <stdint.h>
typedef uint64_t coap_tick_t;
typedef time_t coap_time_t;
typedef int64_t coap_tick_diff_t;
#define COAP_TICKS_PER_SECOND ((coap_tick_t)(1000U))
void coap_clock_init(void);
void coap_ticks(coap_tick_t *t);
coap_time_t coap_ticks_to_rt(coap_tick_t t);
uint64_t coap_ticks_to_rt_us(coap_tick_t t);
coap_tick_t coap_ticks_from_rt_us(uint64_t t);
#endif
COAP_STATIC_INLINE int coap_time_lt(coap_tick_t a, coap_tick_t b) {
return ((coap_tick_diff_t)(a - b)) < 0;
}
COAP_STATIC_INLINE int coap_time_le(coap_tick_t a, coap_tick_t b) {
return a == b || coap_time_lt(a,b);
}
#endif