161 lines
5.1 KiB
C
161 lines
5.1 KiB
C
/*
|
|
* Copyright (c) 2012-2022 DSR Corporation, Denver CO, USA
|
|
* Copyright (c) 2021-2022 Espressif Systems (Shanghai) PTE LTD
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form, except as embedded into a Espressif Systems
|
|
* integrated circuit in a product or a software update for such product,
|
|
* must reproduce the above copyright notice, this list of conditions and
|
|
* the following disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* 4. Any software provided in binary form under this license must not be reverse
|
|
* engineered, decompiled, modified and/or disassembled.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/* PURPOSE: Common definitions for time functionality
|
|
*/
|
|
|
|
#ifndef ZB_TIME_H
|
|
#define ZB_TIME_H 1
|
|
|
|
#include "zboss_api_core.h"
|
|
|
|
|
|
/*! @cond internals_doc */
|
|
/*! \addtogroup time */
|
|
/*! @{ */
|
|
|
|
#define ZB_HALF_MAX_TIME32_VAL (ZB_UINT32_MAX / 2U)
|
|
|
|
/**
|
|
Time subtraction: subtract 'b' from 'a'for 32bit-time
|
|
|
|
Take overflow into account: change sign (subtraction order) if result >
|
|
values_diapason/2.
|
|
Suppose a always >= b, so result is never negative.
|
|
This macro will be used to calculate, for example, amount of time to sleep
|
|
- it is positive by definition.
|
|
Do not use it to compare time values! Use ZB_TIME32_GE() instead.
|
|
@note Both a and b is of type @ref zb_time_t. Can't decrease time (subtract
|
|
constant from it) using this macro.
|
|
|
|
@param a - time to subtract from
|
|
@param b - time to subtract
|
|
@return subtraction result
|
|
*/
|
|
#define ZB_TIME32_SUBTRACT(a, b) ((zb_uint32_t)((a) - (b)) < ZB_HALF_MAX_TIME32_VAL ? (zb_uint32_t)((a) - (b)) : (zb_uint32_t)((b) - (a)))
|
|
|
|
/**
|
|
Time add: add 'a' to 'b' for 32-bit time
|
|
|
|
Overflow is possible, but this is ok - it handled by subtraction and compare macros.
|
|
|
|
@param a - time to add to
|
|
@param b - value to add
|
|
@return addition result
|
|
*/
|
|
#define ZB_TIME32_ADD(a, b) (zb_uint32_t)((a) + (b))
|
|
|
|
/**
|
|
Compare times a and b - check that a >= b for 32-bit time
|
|
|
|
Taking into account overflow and unsigned values arithmetic and supposing
|
|
difference between a and b can't be > 1/2 of the overall time values
|
|
diapason,
|
|
a >= b only if a - b < values_diapason/2
|
|
|
|
@param a - first time value to compare
|
|
@param b - second time value to compare
|
|
@return 1 is a >= b, 0 otherwise
|
|
*/
|
|
#define ZB_TIME32_GE(a, b) ((zb_uint32_t)((a) - (b)) < ZB_HALF_MAX_TIME32_VAL)
|
|
|
|
#ifndef ZB_ALIEN_TIMER
|
|
/**
|
|
Start timer - assign time to sleep
|
|
|
|
@param timeout - time in internal format to sleep before delayed callback run
|
|
*/
|
|
void zb_timer_start(zb_time_t timeout);
|
|
|
|
/**
|
|
Stop timer - timer stop and callback not run
|
|
*/
|
|
void zb_timer_stop(void);
|
|
|
|
#endif
|
|
|
|
/**
|
|
Timer internals
|
|
|
|
'timer' always ticks (if some timer is started), usually with overflow.
|
|
Timer unit is beacon interval, for every system.
|
|
*/
|
|
typedef struct zb_timer_s
|
|
{
|
|
zb_time_t timer; /*!< current time, measured in beacon intervals */
|
|
|
|
#ifndef ZB_ALIEN_TIMER
|
|
zb_uint32_t sleep_tmo_remainder_ms; /*!< slept time remainder, used for timer corrections */
|
|
zb_time_t timer_stop; /*!< time to stop timer (disable timer interrupts etc) */
|
|
zb_bool_t started; /*!< flag - timer is started */
|
|
zb_bool_t canstop; /*!< flag - Can the timer be stopped? */
|
|
#endif
|
|
}
|
|
zb_timer_t;
|
|
|
|
/**
|
|
Enable ability to stop times saving power.
|
|
|
|
Might be used for ZED. Not sure will use it for now.
|
|
*/
|
|
void zb_timer_enable_stop(void);
|
|
|
|
/**
|
|
Disable ability to stop times saving power.
|
|
*/
|
|
void zb_timer_disable_stop(void);
|
|
|
|
/**
|
|
Get current transceiver time value in usec
|
|
*/
|
|
zb_time_t osif_transceiver_time_get(void);
|
|
|
|
/**
|
|
Sleep for required interval using transceiver timer.
|
|
|
|
Can be implemented as a busy wait or as a real sleep.
|
|
|
|
@param interval - time to sleep in microseconds
|
|
*/
|
|
void osif_sleep_using_transc_timer(zb_time_t interval);
|
|
|
|
|
|
/*! @} */
|
|
/*! @endcond */
|
|
|
|
#endif /* ZB_TIME_H */
|