/* * 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: Tests and debug macros */ #ifndef ZB_DEBUG_H #define ZB_DEBUG_H 1 /*! \addtogroup ZB_ASSERT_DYNAMIC */ /*! @{ */ #if (defined USE_ASSERT) /** Trace current location, abort current program execution, with core dump if possible. @param caller_file - source file name @param caller_line - line in the source */ void zb_abort(char *caller_file, int caller_line); #if !defined(ZB_BINARY_TRACE) || defined(ESP_ZB_USE_ASSERT) /** @cond internals_doc */ /** Assert: print diagnostic and force core dump @param file_name - source file name @param line_number - line in the source */ ZB_NORETURN void zb_assert(const zb_char_t *file_name, zb_int_t line_number); /** @endcond */ /** Check for expression in runtime and call zb_assert() if it is false. Compiled to nothing if USE_ASSERT is not defined. @param expr expression to check */ #define ZB_ASSERT(expr) do {if(!(expr)){zb_assert(__FILE__, __LINE__);}} while (0) /** @cond internals_doc */ #define ZB_INLINE_ASSERT_SIMPLE(expr) ((expr) ? 1 : (zb_assert(__FILE__, __LINE__), 1)) /** @endcond */ #else /* !ZB_BINARY_TRACE */ /** Assert: print diagnostic and force core dump @param file_id - source file id @param line_number - line in the source */ ZB_NORETURN void zb_assert(zb_uint16_t file_id, zb_int_t line_number); /** Check for expression in runtime and call zb_assert() if it is false. Compiled to nothing if USE_ASSERT is not defined. @param expr expression to check */ #define ZB_ASSERT(expr) do {if(!(expr)) { zb_assert(ZB_TRACE_FILE_ID, __LINE__);} } while (0) /** @cond internals_doc */ #define ZB_INLINE_ASSERT_SIMPLE(expr) ((expr) ? 1 : (zb_assert(ZB_TRACE_FILE_ID, __LINE__), 1)) /** @endcond */ #endif /* !ZB_BINARY_TRACE */ /** @cond internals_doc */ void lwip_zb_assert(zb_uint16_t file_id, zb_int_t line_number); /** @endcond */ /** Assert which can be used inside an expression. @param expr - expression to check. @return always 1 (true) */ #define ZB_INLINE_ASSERT(expr) ZB_INLINE_ASSERT_SIMPLE((expr)), #else /* release */ #define ZB_ASSERT(expr) ((void)(expr)) #define ZB_INLINE_ASSERT_SIMPLE(expr) -1 #define ZB_INLINE_ASSERT(expr) #endif /*! @} */ /** \addtogroup ZB_ASSERT_STATIC */ /** @{ */ /** @cond internals_doc */ /* Tricks to force preprocessor to substitute __LINE__ in macros */ #define ZB_ASSERT_CAT_(a, b) a##_##b #define ZB_ASSERT_CAT(a, b) ZB_ASSERT_CAT_(a, b) /** @endcond */ /** Check condition at compile time in the code (not declaration block) @param expr - expression to check. */ #if defined SDCC || defined KEIL #define ZB_ASSERT_COMPILE_TIME(expr) #else #define ZB_ASSERT_COMPILE_TIME(expr) ((void)(zb_int_t (*)[(expr) ? 1 : -1])0) #endif /** Check condition at compile time in the code (not declaration block), return 0 To be used inside an expressions. @param expr - expression to check. */ #define ZB_ASSERT_COMPILE_TIME_EXPR(expr) ((zb_int_t)((zb_int_t (*)[(expr) ? 1 : -1])0)) /** Check condition at compile time in the declaration block @param expr - expression to check. */ #ifdef __cplusplus #define ZB_ASSERT_COMPILE_DECL(expr) __extension__ static_assert(expr, "Assert at line __LINE__") #elif (defined __GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define ZB_ASSERT_COMPILE_DECL(expr) __extension__ _Static_assert(expr, "Assert at line __LINE__") #elif defined(__COUNTER__) #define ZB_ASSERT_COMPILE_DECL(expr) typedef zb_int_t ZB_ASSERT_CAT(assert, ZB_ASSERT_CAT(__LINE__, __COUNTER__))[(expr) ? 1 : -1] #else #define ZB_ASSERT_COMPILE_DECL(expr) #endif #define ZB_ASSERT_PRINTF(expr, format, ...) \ do { \ if (!(expr)) { \ fprintf(stderr, format"\n", ##__VA_ARGS__); \ ZB_ASSERT(0); \ } \ } while (0) /** Ensures, that size of type `type' is not greater than `limit'. If it is not, compilation is aborted. @param type - type name @param limit - size limit */ #define ZB_ASSERT_TYPE_SIZE_NOT_GREATER(type, limit) ZB_ASSERT_COMPILE_DECL(sizeof(type) <= (limit)) /** Ensures, that size of type `type' is not less than `limit'. If it is not, compilation is aborted. @param type - type name @param limit - size limit */ #define ZB_ASSERT_TYPE_SIZE_NOT_LESS(type, limit) ZB_ASSERT_COMPILE_DECL(sizeof(type) >= (limit)) /** Ensures, that size of type `type' is equal to the `limit'. If it is not, compilation is aborted. @param type - type name @param limit - size limit */ #define ZB_ASSERT_TYPE_SIZE_EQ(type, limit) ZB_ASSERT_COMPILE_DECL(sizeof(type) == (limit)) /*! @} */ #ifdef ZB_ARRAYS_CHECK /** Address all array elements. Use this macro to test that array really inited by valgrind in Linux */ #define ZB_CHK_ARR(arr, len) \ do \ { \ zb_ushort_t _ii; \ zb_ushort_t n = 0; \ for (_ii = 0 ; _ii < (len) ; ++_ii) \ { \ if ((arr)[_ii] < 2) \ { \ n++; \ } \ else \ { \ n--; \ } \ } \ } \ while (0) #else #define ZB_CHK_ARR(arr, len) #endif /* ZB_ARRAYS_CHECK */ #if defined ZB_TRAFFIC_DUMP_ON /** Dump array of byte @param buf - array of byte @param len - size of array */ void dump_traf(zb_uint8_t *buf, zb_ushort_t len); #endif /* DEBUG */ #ifdef ZB_TRAFFIC_DUMP_ON void dump_usb_traf(zb_uint8_t *buf, zb_ushort_t len); #else #define dump_usb_traf(buf, len) #endif #if (defined ZB_MAC_TESTING_MODE) && (defined ZB_TRAFFIC_DUMP_ON) #define DUMP_TRAF(cmt, buf, len, total) TRACE_MSG(TRACE_MAC3, #cmt, (FMT__0)); dump_traf(buf, len) #else #define DUMP_TRAF(comment, buf, len, total) #endif #ifdef DEBUG void dump_hex_data(zb_uint_t trace_mask, zb_uint8_t trace_level, const zb_uint8_t *buf, zb_ushort_t len); void trace_hex_data_func(const zb_uint8_t *ptr, zb_short_t size, zb_bool_t format); #define trace_8hex_per_line(ptr, size) trace_hex_data_func((ptr), (size), ZB_FALSE) #define trace_16hex_per_line(ptr, size) trace_hex_data_func((ptr), (size), ZB_TRUE) #else #define dump_hex_data(trace_mask, trace_level, buf, len) #define trace_8hex_per_line(ptr, size) #define trace_16hex_per_line(ptr, size) #endif /* DEBUG */ #endif /* ZB_DEBUG_H */