diff --git a/sys/include/xtimer.h b/sys/include/xtimer.h index dae327a6d2..31c85c5e35 100644 --- a/sys/include/xtimer.h +++ b/sys/include/xtimer.h @@ -375,6 +375,56 @@ static inline xtimer_ticks32_t xtimer_ticks(uint32_t ticks); */ static inline xtimer_ticks64_t xtimer_ticks64(uint64_t ticks); +/** + * @brief Compute difference between two xtimer time stamps + * + * @param[in] a left operand + * @param[in] b right operand + * + * @return @p a - @p b + */ +static inline xtimer_ticks32_t xtimer_diff(xtimer_ticks32_t a, xtimer_ticks32_t b); + +/** + * @brief Compute difference between two xtimer time stamps, 64 bit version + * + * @param[in] a left operand + * @param[in] b right operand + * + * @return @p a - @p b + */ +static inline xtimer_ticks64_t xtimer_diff64(xtimer_ticks64_t a, xtimer_ticks64_t b); + +/** + * @brief Compute 32 bit difference between two 64 bit xtimer time stamps + * + * @param[in] a left operand + * @param[in] b right operand + * + * @return @p a - @p b cast truncated to 32 bit + */ +static inline xtimer_ticks32_t xtimer_diff32_64(xtimer_ticks64_t a, xtimer_ticks64_t b); + +/** + * @brief Compare two xtimer time stamps + * + * @param[in] a left operand + * @param[in] b right operand + * + * @return @p a < @p b + */ +static inline bool xtimer_less(xtimer_ticks32_t a, xtimer_ticks32_t b); + +/** + * @brief Compare two xtimer time stamps, 64 bit version + * + * @param[in] a left operand + * @param[in] b right operand + * + * @return @p a < @p b + */ +static inline bool xtimer_less64(xtimer_ticks64_t a, xtimer_ticks64_t b); + /** * @brief xtimer backoff value * diff --git a/sys/include/xtimer/implementation.h b/sys/include/xtimer/implementation.h index e4c376de6d..1065d560fc 100644 --- a/sys/include/xtimer/implementation.h +++ b/sys/include/xtimer/implementation.h @@ -258,6 +258,35 @@ static inline xtimer_ticks64_t xtimer_ticks64(uint64_t ticks) return ret; } +static inline xtimer_ticks32_t xtimer_diff(xtimer_ticks32_t a, xtimer_ticks32_t b) +{ + xtimer_ticks32_t ret = { .ticks32 = (a.ticks32 - b.ticks32) }; + return ret; +} + +static inline xtimer_ticks64_t xtimer_diff64(xtimer_ticks64_t a, xtimer_ticks64_t b) +{ + xtimer_ticks64_t ret = { .ticks64 = (a.ticks64 - b.ticks64) }; + return ret; +} + +static inline xtimer_ticks32_t xtimer_diff32_64(xtimer_ticks64_t a, xtimer_ticks64_t b) +{ + uint64_t diff = (a.ticks64 - b.ticks64); + xtimer_ticks32_t ret = { .ticks32 = (uint32_t) diff }; + return ret; +} + +static inline bool xtimer_less(xtimer_ticks32_t a, xtimer_ticks32_t b) +{ + return (a.ticks32 < b.ticks32); +} + +static inline bool xtimer_less64(xtimer_ticks64_t a, xtimer_ticks64_t b) +{ + return (a.ticks64 < b.ticks64); +} + #endif /* !defined(DOXYGEN) */ #ifdef __cplusplus