able to build
This commit is contained in:
		@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup app_error Common application error handler
 | 
			
		||||
@@ -24,14 +51,6 @@
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
#include "sdk_errors.h"
 | 
			
		||||
#include "nrf_log.h"
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#include "bsp.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for error handling, which is called when an error has occurred.
 | 
			
		||||
 *
 | 
			
		||||
 * @warning This handler is an example only and does not fit a final product. You need to analyze
 | 
			
		||||
@@ -65,6 +84,7 @@ void app_error_handler_bare(ret_code_t error_code)
 | 
			
		||||
        .p_file_name = NULL,
 | 
			
		||||
        .err_code    = error_code,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    app_error_fault_handler(NRF_FAULT_ID_SDK_ERROR, 0, (uint32_t)(&error_info));
 | 
			
		||||
 | 
			
		||||
    UNUSED_VARIABLE(error_info);
 | 
			
		||||
@@ -115,8 +135,7 @@ void app_error_save_and_stop(uint32_t id, uint32_t pc, uint32_t info)
 | 
			
		||||
 | 
			
		||||
    // If printing is disrupted, remove the irq calls, or set the loop variable to 0 in the debugger.
 | 
			
		||||
    __disable_irq();
 | 
			
		||||
 | 
			
		||||
    while(loop);
 | 
			
		||||
    while (loop);
 | 
			
		||||
 | 
			
		||||
    __enable_irq();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup app_error Common application error handler
 | 
			
		||||
@@ -22,14 +49,23 @@
 | 
			
		||||
#ifndef APP_ERROR_H__
 | 
			
		||||
#define APP_ERROR_H__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include "nrf.h"
 | 
			
		||||
#include "sdk_errors.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
#include "nrf_log.h"
 | 
			
		||||
#include "app_error_weak.h"
 | 
			
		||||
#ifdef ANT_STACK_SUPPORT_REQD
 | 
			
		||||
#include "ant_error.h"
 | 
			
		||||
#endif // ANT_STACK_SUPPORT_REQD
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define NRF_FAULT_ID_SDK_RANGE_START 0x00004000 /**< The start of the range of error IDs defined in the SDK. */
 | 
			
		||||
 | 
			
		||||
@@ -80,76 +116,6 @@ void app_error_handler_bare(ret_code_t error_code);
 | 
			
		||||
 */
 | 
			
		||||
void app_error_save_and_stop(uint32_t id, uint32_t pc, uint32_t info);
 | 
			
		||||
 | 
			
		||||
/**@brief       Function for printing all error info (using nrf_log).
 | 
			
		||||
 *
 | 
			
		||||
 * @details     Nrf_log library must be initialized using NRF_LOG_INIT macro before calling
 | 
			
		||||
 *              this function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] id    Fault identifier. See @ref NRF_FAULT_IDS.
 | 
			
		||||
 * @param[in] pc    The program counter of the instruction that triggered the fault, or 0 if
 | 
			
		||||
 *                  unavailable.
 | 
			
		||||
 * @param[in] info  Optional additional information regarding the fault. Refer to each fault
 | 
			
		||||
 *                  identifier for details.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE void app_error_log(uint32_t id, uint32_t pc, uint32_t info)
 | 
			
		||||
{
 | 
			
		||||
    switch (id)
 | 
			
		||||
    {
 | 
			
		||||
        case NRF_FAULT_ID_SDK_ASSERT:
 | 
			
		||||
            NRF_LOG(NRF_LOG_COLOR_RED "\n*** ASSERTION FAILED ***\n");
 | 
			
		||||
            if (((assert_info_t *)(info))->p_file_name)
 | 
			
		||||
            {
 | 
			
		||||
                NRF_LOG_PRINTF(NRF_LOG_COLOR_WHITE "Line Number: %u\n", (unsigned int) ((assert_info_t *)(info))->line_num);
 | 
			
		||||
                NRF_LOG_PRINTF("File Name:   %s\n", ((assert_info_t *)(info))->p_file_name);
 | 
			
		||||
            }
 | 
			
		||||
            NRF_LOG_PRINTF(NRF_LOG_COLOR_DEFAULT "\n");
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case NRF_FAULT_ID_SDK_ERROR:
 | 
			
		||||
            NRF_LOG(NRF_LOG_COLOR_RED "\n*** APPLICATION ERROR *** \n" NRF_LOG_COLOR_WHITE);
 | 
			
		||||
            if (((error_info_t *)(info))->p_file_name)
 | 
			
		||||
            {
 | 
			
		||||
                NRF_LOG_PRINTF("Line Number: %u\n", (unsigned int) ((error_info_t *)(info))->line_num);
 | 
			
		||||
                NRF_LOG_PRINTF("File Name:   %s\n", ((error_info_t *)(info))->p_file_name);
 | 
			
		||||
            }
 | 
			
		||||
            NRF_LOG_PRINTF("Error Code:  0x%X\n" NRF_LOG_COLOR_DEFAULT "\n", (unsigned int) ((error_info_t *)(info))->err_code);
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**@brief       Function for printing all error info (using printf).
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] id    Fault identifier. See @ref NRF_FAULT_IDS.
 | 
			
		||||
 * @param[in] pc    The program counter of the instruction that triggered the fault, or 0 if
 | 
			
		||||
 *                  unavailable.
 | 
			
		||||
 * @param[in] info  Optional additional information regarding the fault. Refer to each fault
 | 
			
		||||
 *                  identifier for details.
 | 
			
		||||
 */
 | 
			
		||||
//lint -save -e438
 | 
			
		||||
static __INLINE void app_error_print(uint32_t id, uint32_t pc, uint32_t info)
 | 
			
		||||
{
 | 
			
		||||
    unsigned int tmp = id;
 | 
			
		||||
    printf("app_error_print():\r\n");
 | 
			
		||||
    printf("Fault identifier:  0x%X\r\n", tmp);
 | 
			
		||||
    printf("Program counter:   0x%X\r\n", tmp = pc);
 | 
			
		||||
    printf("Fault information: 0x%X\r\n", tmp = info);
 | 
			
		||||
 | 
			
		||||
    switch (id)
 | 
			
		||||
    {
 | 
			
		||||
        case NRF_FAULT_ID_SDK_ASSERT:
 | 
			
		||||
            printf("Line Number: %u\r\n", tmp = ((assert_info_t *)(info))->line_num);
 | 
			
		||||
            printf("File Name:   %s\r\n",       ((assert_info_t *)(info))->p_file_name);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case NRF_FAULT_ID_SDK_ERROR:
 | 
			
		||||
            printf("Line Number: %u\r\n",   tmp = ((error_info_t *)(info))->line_num);
 | 
			
		||||
            printf("File Name:   %s\r\n",         ((error_info_t *)(info))->p_file_name);
 | 
			
		||||
            printf("Error Code:  0x%X\r\n", tmp = ((error_info_t *)(info))->err_code);
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for calling error handler function.
 | 
			
		||||
 *
 | 
			
		||||
@@ -196,6 +162,11 @@ static __INLINE void app_error_print(uint32_t id, uint32_t pc, uint32_t info)
 | 
			
		||||
        }                                                     \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // APP_ERROR_H__
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup app_util Utility Functions and Definitions
 | 
			
		||||
@@ -24,11 +51,17 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include "compiler_abstraction.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
#include "nrf.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//lint -save -e27 -e10 -e19
 | 
			
		||||
#if defined ( __CC_ARM )
 | 
			
		||||
#if defined ( __CC_ARM ) && !defined (__LINT__)
 | 
			
		||||
extern char STACK$$Base;
 | 
			
		||||
extern char STACK$$Length;
 | 
			
		||||
#define STACK_BASE    &STACK$$Base
 | 
			
		||||
@@ -48,12 +81,19 @@ extern uint32_t __StackLimit;
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
    UNIT_0_625_MS = 625,                                /**< Number of microseconds in 0.625 milliseconds. */
 | 
			
		||||
    UNIT_1_25_MS  = 1250,                               /**< Number of microseconds in 1.25 milliseconds. */
 | 
			
		||||
    UNIT_10_MS    = 10000                               /**< Number of microseconds in 10 milliseconds. */
 | 
			
		||||
    UNIT_0_625_MS = 625,        /**< Number of microseconds in 0.625 milliseconds. */
 | 
			
		||||
    UNIT_1_25_MS  = 1250,       /**< Number of microseconds in 1.25 milliseconds. */
 | 
			
		||||
    UNIT_10_MS    = 10000       /**< Number of microseconds in 10 milliseconds. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*Segger embedded studio originally has offsetof macro which cannot be used in macros (like STATIC_ASSERT).
 | 
			
		||||
  This redefinition is to allow using that. */
 | 
			
		||||
#if defined(__SES_ARM) && defined(__GNUC__)
 | 
			
		||||
#undef offsetof
 | 
			
		||||
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**@brief Implementation specific macro for delayed macro expansion used in string concatenation
 | 
			
		||||
*
 | 
			
		||||
* @param[in]   lhs   Left hand side in concatenation
 | 
			
		||||
@@ -72,46 +112,52 @@ enum
 | 
			
		||||
#define STRING_CONCATENATE(lhs, rhs) STRING_CONCATENATE_IMPL(lhs, rhs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Disable lint-warnings/errors for STATIC_ASSERT
 | 
			
		||||
//lint --emacro(10,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(18,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(19,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(30,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(37,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(42,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(26,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(102,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(533,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(534,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(132,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(414,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(578,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(628,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(648,STATIC_ASSERT)
 | 
			
		||||
//lint --emacro(830,STATIC_ASSERT)
 | 
			
		||||
#ifndef __LINT__
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#define STATIC_ASSERT_SIMPLE(EXPR)      _Static_assert(EXPR, "unspecified message")
 | 
			
		||||
#define STATIC_ASSERT_MSG(EXPR, MSG)    _Static_assert(EXPR, MSG)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for doing static (i.e. compile time) assertion.
 | 
			
		||||
*
 | 
			
		||||
* @note If the EXPR isn't resolvable, then the error message won't be shown.
 | 
			
		||||
*
 | 
			
		||||
* @note The output of STATIC_ASSERT will be different across different compilers.
 | 
			
		||||
*
 | 
			
		||||
* @param[in] EXPR Constant expression to be verified.
 | 
			
		||||
*/
 | 
			
		||||
#if defined ( __COUNTER__ )
 | 
			
		||||
#ifdef __CC_ARM
 | 
			
		||||
#define STATIC_ASSERT_SIMPLE(EXPR)      extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(EXPR)])]
 | 
			
		||||
#define STATIC_ASSERT_MSG(EXPR, MSG)    extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(EXPR)])]
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define STATIC_ASSERT(EXPR) \
 | 
			
		||||
    ;enum { STRING_CONCATENATE(static_assert_, __COUNTER__) = 1/(!!(EXPR)) }
 | 
			
		||||
#ifdef __ICCARM__
 | 
			
		||||
#define STATIC_ASSERT_SIMPLE(EXPR)      static_assert(EXPR, "unspecified message")
 | 
			
		||||
#define STATIC_ASSERT_MSG(EXPR, MSG)    static_assert(EXPR, MSG)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#else // __LINT__
 | 
			
		||||
 | 
			
		||||
#define STATIC_ASSERT(EXPR) \
 | 
			
		||||
    ;enum { STRING_CONCATENATE(assert_line_, __LINE__) = 1/(!!(EXPR)) }
 | 
			
		||||
#define STATIC_ASSERT_SIMPLE(EXPR)      extern char (*_ignore(void))
 | 
			
		||||
#define STATIC_ASSERT_MSG(EXPR, MSG)    extern char (*_ignore(void))
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define _SELECT_ASSERT_FUNC(x, EXPR, MSG, ASSERT_MACRO, ...) ASSERT_MACRO
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Static (i.e. compile time) assert macro.
 | 
			
		||||
 *
 | 
			
		||||
 * @note The output of STATIC_ASSERT can be different across compilers.
 | 
			
		||||
 *
 | 
			
		||||
 * Usage:
 | 
			
		||||
 * STATIC_ASSERT(expression);
 | 
			
		||||
 * STATIC_ASSERT(expression, message);
 | 
			
		||||
 *
 | 
			
		||||
 * @hideinitializer
 | 
			
		||||
 */
 | 
			
		||||
//lint -save -esym(???, STATIC_ASSERT)
 | 
			
		||||
#define STATIC_ASSERT(...)                                                                          \
 | 
			
		||||
    _SELECT_ASSERT_FUNC(x, ##__VA_ARGS__,                                                           \
 | 
			
		||||
                        STATIC_ASSERT_MSG(__VA_ARGS__),                                             \
 | 
			
		||||
                        STATIC_ASSERT_SIMPLE(__VA_ARGS__))
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Implementation details for NUM_VAR_ARGS */
 | 
			
		||||
#define NUM_VA_ARGS_IMPL(                              \
 | 
			
		||||
    _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,       \
 | 
			
		||||
@@ -137,6 +183,32 @@ enum
 | 
			
		||||
    20, 19, 18, 17, 16, 15, 14, 13, 12, 11,                         \
 | 
			
		||||
    10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
 | 
			
		||||
 | 
			
		||||
/**@brief Implementation details for NUM_VAR_ARGS */
 | 
			
		||||
#define NUM_VA_ARGS_LESS_1_IMPL(                       \
 | 
			
		||||
    _ignored,                                          \
 | 
			
		||||
    _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,       \
 | 
			
		||||
    _11, _12, _13, _14, _15, _16, _17, _18, _19, _20,  \
 | 
			
		||||
    _21, _22, _23, _24, _25, _26, _27, _28, _29, _30,  \
 | 
			
		||||
    _31, _32, _33, _34, _35, _36, _37, _38, _39, _40,  \
 | 
			
		||||
    _41, _42, _43, _44, _45, _46, _47, _48, _49, _50,  \
 | 
			
		||||
    _51, _52, _53, _54, _55, _56, _57, _58, _59, _60,  \
 | 
			
		||||
    _61, _62, N, ...) N
 | 
			
		||||
 | 
			
		||||
/**@brief Macro to get the number of arguments in a call variadic macro call.
 | 
			
		||||
 * First argument is not counted.
 | 
			
		||||
 *
 | 
			
		||||
 * param[in]    ...     List of arguments
 | 
			
		||||
 *
 | 
			
		||||
 * @retval  Number of variadic arguments in the argument list
 | 
			
		||||
 */
 | 
			
		||||
#define NUM_VA_ARGS_LESS_1(...) NUM_VA_ARGS_LESS_1_IMPL(__VA_ARGS__, 63, 62, 61,  \
 | 
			
		||||
    60, 59, 58, 57, 56, 55, 54, 53, 52, 51,                         \
 | 
			
		||||
    50, 49, 48, 47, 46, 45, 44, 43, 42, 41,                         \
 | 
			
		||||
    40, 39, 38, 37, 36, 35, 34, 33, 32, 31,                         \
 | 
			
		||||
    30, 29, 28, 27, 26, 25, 24, 23, 22, 21,                         \
 | 
			
		||||
    20, 19, 18, 17, 16, 15, 14, 13, 12, 11,                         \
 | 
			
		||||
    10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ~)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief type for holding an encoded (i.e. little endian) 16 bit unsigned integer. */
 | 
			
		||||
typedef uint8_t uint16_le_t[2];
 | 
			
		||||
@@ -227,6 +299,509 @@ typedef struct
 | 
			
		||||
 */
 | 
			
		||||
#define ALIGN_NUM(alignment, number) ((number - 1) + alignment - ((number - 1) % alignment))
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for getting first of 2 parameters.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] a1    First parameter.
 | 
			
		||||
 * @param[in] a2    Second parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define GET_ARG_1(a1, a2) a1
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for getting second of 2 parameters.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] a1    First parameter.
 | 
			
		||||
 * @param[in] a2    Second parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define GET_ARG_2(a1, a2) a2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Container of macro (borrowed from Linux kernel).
 | 
			
		||||
 *
 | 
			
		||||
 * This macro returns parent structure address basing on child member address.
 | 
			
		||||
 *
 | 
			
		||||
 * @param ptr       Address of child type.
 | 
			
		||||
 * @param type      Type of parent structure.
 | 
			
		||||
 * @param member    Name of child field in parent structure.
 | 
			
		||||
 *
 | 
			
		||||
 * @return Parent structure address.
 | 
			
		||||
 * */
 | 
			
		||||
#define CONTAINER_OF(ptr, type, member)                 \
 | 
			
		||||
        (type *)((char *)ptr - offsetof(type, member))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Define Bit-field mask
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that defined the mask with selected number of bits set, starting from
 | 
			
		||||
 * provided bit number.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] bcnt Number of bits in the bit-field
 | 
			
		||||
 * @param[in] boff Lowest bit number
 | 
			
		||||
 */
 | 
			
		||||
#define BF_MASK(bcnt, boff) ( ((1U << (bcnt)) - 1U) << (boff) )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that extracts selected bit-field from provided value
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] val  Value from witch selected bit-field would be extracted
 | 
			
		||||
 * @param[in] bcnt Number of bits in the bit-field
 | 
			
		||||
 * @param[in] boff Lowest bit number
 | 
			
		||||
 *
 | 
			
		||||
 * @return Value of the selected bits
 | 
			
		||||
 */
 | 
			
		||||
#define BF_GET(val, bcnt, boff) ( ( (val) & BF_MASK((bcnt), (boff)) ) >> (boff) )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Create bit-field value
 | 
			
		||||
 *
 | 
			
		||||
 * Value is masked and shifted to match given bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] val  Value to set on bit-field
 | 
			
		||||
 * @param[in] bcnt Number of bits for bit-field
 | 
			
		||||
 * @param[in] boff Offset of bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Value positioned of given bit-field.
 | 
			
		||||
 */
 | 
			
		||||
#define BF_VAL(val, bcnt, boff) ( (((uint32_t)(val)) << (boff)) & BF_MASK(bcnt, boff) )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Configuration of complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @sa BF_CX
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
/** @brief Position of bit count in complex bit-field value */
 | 
			
		||||
#define BF_CX_BCNT_POS  0U
 | 
			
		||||
/** @brief Mask of bit count in complex bit-field value */
 | 
			
		||||
#define BF_CX_BCNT_MASK (0xffU << BF_CX_BCNT_POS)
 | 
			
		||||
/** @brief Position of bit position in complex bit-field value */
 | 
			
		||||
#define BF_CX_BOFF_POS  8U
 | 
			
		||||
/** @brief Mask of bit position in complex bit-field value */
 | 
			
		||||
#define BF_CX_BOFF_MASK (0xffU << BF_CX_BOFF_POS)
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Define complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * Complex bit-field would contain its position and size in one number.
 | 
			
		||||
 * @sa BF_CX_MASK
 | 
			
		||||
 * @sa BF_CX_POS
 | 
			
		||||
 * @sa BF_CX_GET
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] bcnt Number of bits in the bit-field
 | 
			
		||||
 * @param[in] boff Lowest bit number
 | 
			
		||||
 *
 | 
			
		||||
 * @return The single number that describes the bit-field completely.
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX(bcnt, boff) ( ((((uint32_t)(bcnt)) << BF_CX_BCNT_POS) & BF_CX_BCNT_MASK) | ((((uint32_t)(boff)) << BF_CX_BOFF_POS) & BF_CX_BOFF_MASK) )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get number of bits in bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @sa BF_CX
 | 
			
		||||
 *
 | 
			
		||||
 * @param bf_cx Complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Number of bits in given bit-field
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX_BCNT(bf_cx) ( ((bf_cx) & BF_CX_BCNT_MASK) >> BF_CX_BCNT_POS )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get lowest bit number in the field
 | 
			
		||||
 *
 | 
			
		||||
 * @sa BF_CX
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] bf_cx Complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Lowest bit number in given bit-field
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX_BOFF(bf_cx) ( ((bf_cx) & BF_CX_BOFF_MASK) >> BF_CX_BOFF_POS )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get bit mask of the selected field
 | 
			
		||||
 *
 | 
			
		||||
 * @sa BF_CX
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] bf_cx Complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Mask of given bit-field
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX_MASK(bf_cx) BF_MASK(BF_CX_BCNT(bf_cx), BF_CX_BOFF(bf_cx))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that extracts selected bit-field from provided value.
 | 
			
		||||
 * Bit-field is given as a complex value.
 | 
			
		||||
 *
 | 
			
		||||
 * @sa BF_CX
 | 
			
		||||
 * @sa BF_GET
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] val   Value from witch selected bit-field would be extracted
 | 
			
		||||
 * @param[in] bf_cx Complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Value of the selected bits.
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX_GET(val, bf_cx) BF_GET(val, BF_CX_BCNT(bf_cx), BF_CX_BOFF(bf_cx))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Create bit-field value
 | 
			
		||||
 *
 | 
			
		||||
 * Value is masked and shifted to match given bit-field.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] val  Value to set on bit-field
 | 
			
		||||
 * @param[in] bf_cx Complex bit-field
 | 
			
		||||
 *
 | 
			
		||||
 * @return Value positioned of given bit-field.
 | 
			
		||||
 */
 | 
			
		||||
#define BF_CX_VAL(val, bf_cx) BF_VAL(val, BF_CX_BCNT(bf_cx), BF_CX_BOFF(bf_cx))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Extracting data from the brackets
 | 
			
		||||
 *
 | 
			
		||||
 * This macro get rid of brackets around the argument.
 | 
			
		||||
 * It can be used to pass multiple arguments in logical one argument to a macro.
 | 
			
		||||
 * Call it with arguments inside brackets:
 | 
			
		||||
 * @code
 | 
			
		||||
 * #define ARGUMENTS (a, b, c)
 | 
			
		||||
 * BRACKET_EXTRACT(ARGUMENTS)
 | 
			
		||||
 * @endcode
 | 
			
		||||
 * It would produce:
 | 
			
		||||
 * @code
 | 
			
		||||
 * a, b, c
 | 
			
		||||
 * @endcode
 | 
			
		||||
 *
 | 
			
		||||
 * @param a Argument with anything inside brackets
 | 
			
		||||
 * @return Anything that appears inside the brackets of the argument
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * The argument of the macro have to be inside brackets.
 | 
			
		||||
 * In other case the compilation would fail.
 | 
			
		||||
 */
 | 
			
		||||
#define BRACKET_EXTRACT(a)  BRACKET_EXTRACT_(a)
 | 
			
		||||
#define BRACKET_EXTRACT_(a) BRACKET_EXTRACT__ a
 | 
			
		||||
#define BRACKET_EXTRACT__(...) __VA_ARGS__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Check if number of parameters is more than 1
 | 
			
		||||
 *
 | 
			
		||||
 * @param ... Arguments to count
 | 
			
		||||
 *
 | 
			
		||||
 * @return 0 If argument count is <= 1
 | 
			
		||||
 * @return 1 If argument count is > 1
 | 
			
		||||
 *
 | 
			
		||||
 * @sa NUM_VA_ARGS
 | 
			
		||||
 * @sa NUM_IS_MORE_THAN_1
 | 
			
		||||
 */
 | 
			
		||||
#define NUM_VA_ARGS_IS_MORE_THAN_1(...) NUM_IS_MORE_THAN_1(NUM_VA_ARGS(__VA_ARGS__))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Check if given numeric value is bigger than 1
 | 
			
		||||
 *
 | 
			
		||||
 * This macro accepts numeric value, that may be the result of argument expansion.
 | 
			
		||||
 * This numeric value is then converted to 0 if it is lover than 1 or to 1 if
 | 
			
		||||
 * its value is higher than 1.
 | 
			
		||||
 * The generated result can be used to glue it into other macro mnemonic name.
 | 
			
		||||
 *
 | 
			
		||||
 * @param N Numeric value to check
 | 
			
		||||
 *
 | 
			
		||||
 * @return 0 If argument is <= 1
 | 
			
		||||
 * @return 1 If argument is > 1
 | 
			
		||||
 *
 | 
			
		||||
 * @note Any existing definition of a form NUM_IS_MORE_THAN_1_PROBE_[N] can
 | 
			
		||||
 *       broke the result of this macro
 | 
			
		||||
 */
 | 
			
		||||
#define NUM_IS_MORE_THAN_1(N) NUM_IS_MORE_THAN_1_(N)
 | 
			
		||||
#define NUM_IS_MORE_THAN_1_(N)  NUM_IS_MORE_THAN_1_PROBE_(NUM_IS_MORE_THAN_1_PROBE_ ## N, 1)
 | 
			
		||||
#define NUM_IS_MORE_THAN_1_PROBE_(...) GET_VA_ARG_1(GET_ARGS_AFTER_1(__VA_ARGS__))
 | 
			
		||||
#define NUM_IS_MORE_THAN_1_PROBE_0 ~, 0
 | 
			
		||||
#define NUM_IS_MORE_THAN_1_PROBE_1 ~, 0
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get the first argument
 | 
			
		||||
 *
 | 
			
		||||
 * @param ... Arguments to select
 | 
			
		||||
 *
 | 
			
		||||
 * @return First argument or empty if no arguments are provided
 | 
			
		||||
 */
 | 
			
		||||
#define GET_VA_ARG_1(...) GET_VA_ARG_1_(__VA_ARGS__, ) // Make sure that also for 1 argument it works
 | 
			
		||||
#define GET_VA_ARG_1_(a1, ...) a1
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get all the arguments but the first one
 | 
			
		||||
 *
 | 
			
		||||
 * @param ... Arguments to select
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments after the first one or empty if less than 2 arguments are provided
 | 
			
		||||
 */
 | 
			
		||||
#define GET_ARGS_AFTER_1(...) GET_ARGS_AFTER_1_(__VA_ARGS__, ) // Make sure that also for 1 argument it works
 | 
			
		||||
#define GET_ARGS_AFTER_1_(a1, ...) __VA_ARGS__
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Size of a field in declared structure
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that returns the size of the structure field.
 | 
			
		||||
 * @param struct_type Variable type to get the field size from
 | 
			
		||||
 * @param field Field name to analyze. It can be even field inside field (field.somethingelse.and_another).
 | 
			
		||||
 *
 | 
			
		||||
 * @return Size of the field
 | 
			
		||||
 */
 | 
			
		||||
#define FIELD_SIZE(struct_type, field) sizeof(((struct struct_type*)NULL)->field)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Number of elements in field array in declared structure
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that returns number of elementy in structure field.
 | 
			
		||||
 * @param struct_type Variable type to get the field size from
 | 
			
		||||
 * @param field Field name to analyze.
 | 
			
		||||
 *
 | 
			
		||||
 * @return Number of elements in field array
 | 
			
		||||
 *
 | 
			
		||||
 * @sa FIELD_SIZE
 | 
			
		||||
 */
 | 
			
		||||
#define FIELD_ARRAY_SIZE(struct_type, field) (FIELD_SIZE(struct_type, field) / FIELD_SIZE(struct_type, field[0]))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping macro
 | 
			
		||||
 *
 | 
			
		||||
 * Macro that process all arguments using given macro
 | 
			
		||||
 *
 | 
			
		||||
 * @param ... Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *            Macro should have following form: MACRO(argument)
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP(...) MACRO_MAP_(__VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_(...) MACRO_MAP_N(NUM_VA_ARGS_LESS_1(__VA_ARGS__), __VA_ARGS__) // To make sure it works also for 2 arguments in total
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping macro, recursive version
 | 
			
		||||
 *
 | 
			
		||||
 *  Can be used in @ref MACRO_MAP macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_REC(...) MACRO_MAP_REC_(__VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_REC_(...) MACRO_MAP_REC_N(NUM_VA_ARGS_LESS_1(__VA_ARGS__), __VA_ARGS__) // To make sure it works also for 2 arguments in total
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping N arguments macro
 | 
			
		||||
 *
 | 
			
		||||
 * Macro similar to @ref MACRO_MAP but maps exact number of arguments.
 | 
			
		||||
 * If there is more arguments given, the rest would be ignored.
 | 
			
		||||
 *
 | 
			
		||||
 * @param N   Number of arguments to map
 | 
			
		||||
 * @param ... Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *            Macro should have following form: MACRO(argument)
 | 
			
		||||
 *
 | 
			
		||||
 * @return Selected number of arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_N(N, ...) MACRO_MAP_N_(N, __VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_N_(N, ...) CONCAT_2(MACRO_MAP_, N)(__VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping N arguments macro, recursive version
 | 
			
		||||
 *
 | 
			
		||||
 *  Can be used in @ref MACRO_MAP_N macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_REC_N(N, ...) MACRO_MAP_REC_N_(N, __VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_REC_N_(N, ...) CONCAT_2(MACRO_MAP_REC_, N)(__VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
#define MACRO_MAP_0(           ...)
 | 
			
		||||
#define MACRO_MAP_1( macro, a, ...) macro(a)
 | 
			
		||||
#define MACRO_MAP_2( macro, a, ...) macro(a) MACRO_MAP_1 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_3( macro, a, ...) macro(a) MACRO_MAP_2 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_4( macro, a, ...) macro(a) MACRO_MAP_3 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_5( macro, a, ...) macro(a) MACRO_MAP_4 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_6( macro, a, ...) macro(a) MACRO_MAP_5 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_7( macro, a, ...) macro(a) MACRO_MAP_6 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_8( macro, a, ...) macro(a) MACRO_MAP_7 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_9( macro, a, ...) macro(a) MACRO_MAP_8 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_10(macro, a, ...) macro(a) MACRO_MAP_9 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_11(macro, a, ...) macro(a) MACRO_MAP_10(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_12(macro, a, ...) macro(a) MACRO_MAP_11(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_13(macro, a, ...) macro(a) MACRO_MAP_12(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_14(macro, a, ...) macro(a) MACRO_MAP_13(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_15(macro, a, ...) macro(a) MACRO_MAP_14(macro, __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
#define MACRO_MAP_REC_0(           ...)
 | 
			
		||||
#define MACRO_MAP_REC_1( macro, a, ...) macro(a)
 | 
			
		||||
#define MACRO_MAP_REC_2( macro, a, ...) macro(a) MACRO_MAP_REC_1 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_3( macro, a, ...) macro(a) MACRO_MAP_REC_2 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_4( macro, a, ...) macro(a) MACRO_MAP_REC_3 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_5( macro, a, ...) macro(a) MACRO_MAP_REC_4 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_6( macro, a, ...) macro(a) MACRO_MAP_REC_5 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_7( macro, a, ...) macro(a) MACRO_MAP_REC_6 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_8( macro, a, ...) macro(a) MACRO_MAP_REC_7 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_9( macro, a, ...) macro(a) MACRO_MAP_REC_8 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_10(macro, a, ...) macro(a) MACRO_MAP_REC_9 (macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_11(macro, a, ...) macro(a) MACRO_MAP_REC_10(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_12(macro, a, ...) macro(a) MACRO_MAP_REC_11(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_13(macro, a, ...) macro(a) MACRO_MAP_REC_12(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_14(macro, a, ...) macro(a) MACRO_MAP_REC_13(macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_REC_15(macro, a, ...) macro(a) MACRO_MAP_REC_14(macro, __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping macro with current index
 | 
			
		||||
 *
 | 
			
		||||
 * Basically macro similar to @ref MACRO_MAP, but the processing function would get an argument
 | 
			
		||||
 * and current argument index (beginning from 0).
 | 
			
		||||
 *
 | 
			
		||||
 * @param ... Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *            Macro should have following form: MACRO(argument, index)
 | 
			
		||||
 * @return All arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_FOR(...) MACRO_MAP_FOR_(__VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_FOR_N_LIST 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
 | 
			
		||||
#define MACRO_MAP_FOR_(...) MACRO_MAP_FOR_N(NUM_VA_ARGS_LESS_1(__VA_ARGS__), __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping N arguments macro with current index
 | 
			
		||||
 *
 | 
			
		||||
 * Macro is similar to @ref MACRO_MAP_FOR but maps exact number of arguments.
 | 
			
		||||
 * If there is more arguments given, the rest would be ignored.
 | 
			
		||||
 *
 | 
			
		||||
 * @param N   Number of arguments to map
 | 
			
		||||
 * @param ... Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *            Macro should have following form: MACRO(argument, index)
 | 
			
		||||
 *
 | 
			
		||||
 * @return Selected number of arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_FOR_N(N, ...) MACRO_MAP_FOR_N_(N, __VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_FOR_N_(N, ...) CONCAT_2(MACRO_MAP_FOR_, N)((MACRO_MAP_FOR_N_LIST), __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
#define MACRO_MAP_FOR_0( n_list,           ...)
 | 
			
		||||
#define MACRO_MAP_FOR_1( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)))
 | 
			
		||||
#define MACRO_MAP_FOR_2( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_1 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_3( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_2 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_4( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_3 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_5( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_4 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_6( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_5 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_7( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_6 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_8( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_7 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_9( n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_8 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_10(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_9 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_11(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_10((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_12(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_11((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_13(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_12((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_14(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_13((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_15(n_list, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list))) MACRO_MAP_FOR_14((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping macro with current index and parameter
 | 
			
		||||
 *
 | 
			
		||||
 * Version of @ref MACRO_MAP_FOR that passes also the same parameter to all macros.
 | 
			
		||||
 *
 | 
			
		||||
 * @param param Parameter that would be passed to each macro call during mapping.
 | 
			
		||||
 * @param ...   Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *              Macro should have following form: MACRO(argument, index, param)
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM(param, ...) MACRO_MAP_FOR_PARAM_(param, __VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_(param, ...) MACRO_MAP_FOR_PARAM_N(NUM_VA_ARGS_LESS_1(__VA_ARGS__), param, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Mapping N arguments macro with with current index and parameter
 | 
			
		||||
 *
 | 
			
		||||
 * @param N     Number of arguments to map
 | 
			
		||||
 * @param param Parameter that would be passed to each macro call during mapping.
 | 
			
		||||
 * @param ...   Macro name to be used for argument processing followed by arguments to process.
 | 
			
		||||
 *              Macro should have following form: MACRO(argument, index, param)
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments processed by given macro
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_N(N, param, ...) MACRO_MAP_FOR_PARAM_N_(N, param, __VA_ARGS__)
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_N_(N, param, ...) CONCAT_2(MACRO_MAP_FOR_PARAM_, N)((MACRO_MAP_FOR_N_LIST), param, __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_0( n_list, param, ...)
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_1( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param)
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_2( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_1 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_3( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_2 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_4( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_3 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_5( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_4 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_6( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_5 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_7( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_6 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_8( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_7 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_9( n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_8 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_10(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_9 ((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_11(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_10((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_12(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_11((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_13(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_12((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_14(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_13((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
#define MACRO_MAP_FOR_PARAM_15(n_list, param, macro, a, ...) macro(a, GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), param) MACRO_MAP_FOR_PARAM_14((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), param, macro, __VA_ARGS__, )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Repeating macro.
 | 
			
		||||
 *
 | 
			
		||||
 * @param count Count of repeats.
 | 
			
		||||
 * @param macro Macro must have the following form: MACRO(arguments).
 | 
			
		||||
 * @param ...   Arguments passed to the macro.
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments processed by the given macro.
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_REPEAT(count, macro, ...)     MACRO_REPEAT_(count, macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_(count, macro, ...)    CONCAT_2(MACRO_REPEAT_, count)(macro, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define MACRO_REPEAT_0(macro, ...)
 | 
			
		||||
#define MACRO_REPEAT_1(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_0(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_2(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_1(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_3(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_2(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_4(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_3(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_5(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_4(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_6(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_5(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_7(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_6(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_8(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_7(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_9(macro, ...)  macro(__VA_ARGS__) MACRO_REPEAT_8(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_10(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_9(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_11(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_10(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_12(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_11(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_13(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_12(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_14(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_13(macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_15(macro, ...) macro(__VA_ARGS__) MACRO_REPEAT_14(macro, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Repeating macro with current index.
 | 
			
		||||
 *
 | 
			
		||||
 * Macro similar to @ref MACRO_REPEAT but the processing function gets the arguments
 | 
			
		||||
 * and the current argument index (beginning from 0).
 | 
			
		||||
 | 
			
		||||
 * @param count Count of repeats.
 | 
			
		||||
 * @param macro Macro must have the following form: MACRO(index, arguments).
 | 
			
		||||
 * @param ...   Arguments passed to the macro.
 | 
			
		||||
 *
 | 
			
		||||
 * @return All arguments processed by the given macro.
 | 
			
		||||
 */
 | 
			
		||||
#define MACRO_REPEAT_FOR(count, macro, ...)     MACRO_REPEAT_FOR_(count, macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_(count, macro, ...)    CONCAT_2(MACRO_REPEAT_FOR_, count)((MACRO_MAP_FOR_N_LIST), macro, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define MACRO_REPEAT_FOR_0(n_list, macro, ...)
 | 
			
		||||
#define MACRO_REPEAT_FOR_1(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_0((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_2(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_1((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_3(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_2((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_4(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_3((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_5(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_4((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_6(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_5((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_7(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_6((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_8(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_7((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_9(n_list, macro, ...)  macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_8((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_10(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_9((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_11(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_10((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_12(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_11((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_13(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_12((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_14(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_13((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
#define MACRO_REPEAT_FOR_15(n_list, macro, ...) macro(GET_VA_ARG_1(BRACKET_EXTRACT(n_list)), __VA_ARGS__) MACRO_REPEAT_FOR_14((GET_ARGS_AFTER_1(BRACKET_EXTRACT(n_list))), macro, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/**@brief Adding curly brace to the macro parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * Useful in array of structures initialization.
 | 
			
		||||
 *
 | 
			
		||||
 * @param p Parameter to put into the curly brace. */
 | 
			
		||||
#define PARAM_CBRACE(p) { p },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for changing the value unit.
 | 
			
		||||
 *
 | 
			
		||||
@@ -369,6 +944,22 @@ static __INLINE uint32_t uint32_big_decode(const uint8_t * p_encoded_data)
 | 
			
		||||
             (((uint32_t)((uint8_t *)p_encoded_data)[3]) << 0) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Function for encoding an uint16 value in big-endian format.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   value            Value to be encoded.
 | 
			
		||||
 * @param[out]  p_encoded_data   Buffer where the encoded data will be written.
 | 
			
		||||
 *
 | 
			
		||||
 * @return      Number of bytes written.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t uint16_big_encode(uint16_t value, uint8_t * p_encoded_data)
 | 
			
		||||
{
 | 
			
		||||
    p_encoded_data[0] = (uint8_t) (value >> 8);
 | 
			
		||||
    p_encoded_data[1] = (uint8_t) (value & 0xFF);
 | 
			
		||||
 | 
			
		||||
    return sizeof(uint16_t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**@brief Function for encoding a uint32 value in big-endian format.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   value            Value to be encoded.
 | 
			
		||||
@@ -378,14 +969,7 @@ static __INLINE uint32_t uint32_big_decode(const uint8_t * p_encoded_data)
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t uint32_big_encode(uint32_t value, uint8_t * p_encoded_data)
 | 
			
		||||
{
 | 
			
		||||
#ifdef NRF51
 | 
			
		||||
    p_encoded_data[0] = (uint8_t) ((value & 0xFF000000) >> 24);
 | 
			
		||||
    p_encoded_data[1] = (uint8_t) ((value & 0x00FF0000) >> 16);
 | 
			
		||||
    p_encoded_data[2] = (uint8_t) ((value & 0x0000FF00) >> 8);
 | 
			
		||||
    p_encoded_data[3] = (uint8_t) ((value & 0x000000FF) >> 0);
 | 
			
		||||
#elif NRF52
 | 
			
		||||
    *(uint32_t *)p_encoded_data = __REV(value);
 | 
			
		||||
#endif
 | 
			
		||||
    return sizeof(uint32_t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -488,6 +1072,11 @@ static __INLINE bool is_address_from_stack(void * ptr)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // APP_UTIL_H__
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup app_util Utility Functions and Definitions
 | 
			
		||||
@@ -29,7 +56,11 @@
 | 
			
		||||
#include "app_util.h"
 | 
			
		||||
#include "ble_srv_common.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef uint8_t nibble_t;
 | 
			
		||||
typedef uint32_t uint24_t;
 | 
			
		||||
typedef uint64_t uint40_t;
 | 
			
		||||
@@ -95,7 +126,7 @@ static __INLINE uint8_t bds_uint24_encode(const uint32_t * p_value, uint8_t * p_
 | 
			
		||||
    return (3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
/**@brief Function for encoding a uint32 value.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   p_value          Value to be encoded.
 | 
			
		||||
@@ -112,7 +143,7 @@ static __INLINE uint8_t bds_uint32_encode(const uint32_t * p_value, uint8_t * p_
 | 
			
		||||
    return sizeof(uint32_t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
/**@brief Function for encoding a uint40 value.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   p_value          Value to be encoded.
 | 
			
		||||
@@ -153,12 +184,12 @@ static __INLINE uint8_t bds_sfloat_encode(const sfloat_t * p_value, uint8_t * p_
 | 
			
		||||
 * @param[in]   p_value          Value to be encoded.
 | 
			
		||||
 * @param[out]  p_encoded_data   Buffer where the encoded data is to be written.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint8_array_encode(const uint8_array_t * p_value, 
 | 
			
		||||
static __INLINE uint8_t bds_uint8_array_encode(const uint8_array_t * p_value,
 | 
			
		||||
                                               uint8_t             * p_encoded_data)
 | 
			
		||||
{
 | 
			
		||||
    memcpy(p_encoded_data, p_value->p_data, p_value->size);
 | 
			
		||||
    return p_value->size;
 | 
			
		||||
}    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for encoding a utf8_str value.
 | 
			
		||||
@@ -172,7 +203,7 @@ static __INLINE uint8_t bds_ble_srv_utf8_str_encode(const ble_srv_utf8_str_t * p
 | 
			
		||||
{
 | 
			
		||||
    memcpy(p_encoded_data, p_value->p_str, p_value->length);
 | 
			
		||||
    return p_value->length;
 | 
			
		||||
}    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**@brief Function for encoding a regcertdatalist value.
 | 
			
		||||
 *
 | 
			
		||||
@@ -180,12 +211,12 @@ static __INLINE uint8_t bds_ble_srv_utf8_str_encode(const ble_srv_utf8_str_t * p
 | 
			
		||||
 * @param[out]  p_encoded_data   Buffer where the encoded data is to be written.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_regcertdatalist_encode(const regcertdatalist_t * p_value, 
 | 
			
		||||
static __INLINE uint8_t bds_regcertdatalist_encode(const regcertdatalist_t * p_value,
 | 
			
		||||
                                                   uint8_t                 * p_encoded_data)
 | 
			
		||||
{
 | 
			
		||||
    memcpy(p_encoded_data, p_value->p_list, p_value->list_len);
 | 
			
		||||
    return p_value->list_len;
 | 
			
		||||
}    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for decoding a date_time value.
 | 
			
		||||
@@ -198,13 +229,13 @@ static __INLINE uint8_t bds_ble_date_time_encode(const ble_date_time_t * p_date_
 | 
			
		||||
                                                 uint8_t               * p_encoded_data)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t len = bds_uint16_encode(&p_date_time->year, &p_encoded_data[0]);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    p_encoded_data[len++] = p_date_time->month;
 | 
			
		||||
    p_encoded_data[len++] = p_date_time->day;
 | 
			
		||||
    p_encoded_data[len++] = p_date_time->hours;
 | 
			
		||||
    p_encoded_data[len++] = p_date_time->minutes;
 | 
			
		||||
    p_encoded_data[len++] = p_date_time->seconds;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -216,12 +247,12 @@ static __INLINE uint8_t bds_ble_date_time_encode(const ble_date_time_t * p_date_
 | 
			
		||||
 * @param[in]   p_decoded_val    pointer to the decoded value
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint16_decode(const uint8_t len, 
 | 
			
		||||
                                          const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_uint16_decode(const uint8_t len,
 | 
			
		||||
                                          const uint8_t * p_encoded_data,
 | 
			
		||||
                                          uint16_t      * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
    *p_decoded_val = (((uint16_t)((uint8_t *)p_encoded_data)[0])) | 
 | 
			
		||||
    *p_decoded_val = (((uint16_t)((uint8_t *)p_encoded_data)[0])) |
 | 
			
		||||
                     (((uint16_t)((uint8_t *)p_encoded_data)[1]) << 8 );
 | 
			
		||||
    return (sizeof(uint16_t));
 | 
			
		||||
}
 | 
			
		||||
@@ -234,8 +265,8 @@ static __INLINE uint8_t bds_uint16_decode(const uint8_t len,
 | 
			
		||||
 * @param[in]   p_decoded_val    pointer to the decoded value
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_int16_decode(const uint8_t len, 
 | 
			
		||||
                                         const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_int16_decode(const uint8_t len,
 | 
			
		||||
                                         const uint8_t * p_encoded_data,
 | 
			
		||||
                                         int16_t       * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
@@ -254,8 +285,8 @@ static __INLINE uint8_t bds_int16_decode(const uint8_t len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint24_decode(const uint8_t len, 
 | 
			
		||||
                                          const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_uint24_decode(const uint8_t len,
 | 
			
		||||
                                          const uint8_t * p_encoded_data,
 | 
			
		||||
                                          uint32_t      * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
@@ -274,8 +305,8 @@ static __INLINE uint8_t bds_uint24_decode(const uint8_t len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint32_decode(const uint8_t len, 
 | 
			
		||||
                                          const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_uint32_decode(const uint8_t len,
 | 
			
		||||
                                          const uint8_t * p_encoded_data,
 | 
			
		||||
                                          uint32_t      * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
@@ -295,8 +326,8 @@ static __INLINE uint8_t bds_uint32_decode(const uint8_t len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint40_decode(const uint8_t len, 
 | 
			
		||||
                                          const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_uint40_decode(const uint8_t len,
 | 
			
		||||
                                          const uint8_t * p_encoded_data,
 | 
			
		||||
                                          uint64_t      * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
@@ -318,11 +349,11 @@ static __INLINE uint8_t bds_uint40_decode(const uint8_t len,
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_sfloat_decode(const uint8_t len, 
 | 
			
		||||
                                          const uint8_t * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_sfloat_decode(const uint8_t len,
 | 
			
		||||
                                          const uint8_t * p_encoded_data,
 | 
			
		||||
                                          sfloat_t      * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    p_decoded_val->exponent = 0;
 | 
			
		||||
    bds_uint16_decode(len, p_encoded_data, (uint16_t*)&p_decoded_val->mantissa);
 | 
			
		||||
    p_decoded_val->exponent = (uint8_t)((p_decoded_val->mantissa & 0xF000) >> 12);
 | 
			
		||||
@@ -339,14 +370,14 @@ static __INLINE uint8_t bds_sfloat_decode(const uint8_t len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_uint8_array_decode(const uint8_t len, 
 | 
			
		||||
static __INLINE uint8_t bds_uint8_array_decode(const uint8_t len,
 | 
			
		||||
                                               const uint8_t * p_encoded_data,
 | 
			
		||||
                                               uint8_array_t * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    memcpy(p_decoded_val->p_data, p_encoded_data, len);
 | 
			
		||||
    p_decoded_val->size = len;
 | 
			
		||||
    return p_decoded_val->size;
 | 
			
		||||
}   
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for decoding a utf8_str value.
 | 
			
		||||
@@ -357,14 +388,14 @@ static __INLINE uint8_t bds_uint8_array_decode(const uint8_t len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_ble_srv_utf8_str_decode(const uint8_t      len, 
 | 
			
		||||
                                                    const uint8_t      * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_ble_srv_utf8_str_decode(const uint8_t      len,
 | 
			
		||||
                                                    const uint8_t      * p_encoded_data,
 | 
			
		||||
                                                    ble_srv_utf8_str_t * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    p_decoded_val->p_str = (uint8_t*)p_encoded_data;
 | 
			
		||||
    p_decoded_val->length = len;
 | 
			
		||||
    return p_decoded_val->length;
 | 
			
		||||
}   
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for decoding a regcertdatalist value.
 | 
			
		||||
@@ -375,14 +406,14 @@ static __INLINE uint8_t bds_ble_srv_utf8_str_decode(const uint8_t      len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_regcertdatalist_decode(const uint8_t     len, 
 | 
			
		||||
                                                   const uint8_t     * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_regcertdatalist_decode(const uint8_t     len,
 | 
			
		||||
                                                   const uint8_t     * p_encoded_data,
 | 
			
		||||
                                                   regcertdatalist_t * p_decoded_val)
 | 
			
		||||
{
 | 
			
		||||
    memcpy(p_decoded_val->p_list, p_encoded_data, len);
 | 
			
		||||
    p_decoded_val->list_len = len;
 | 
			
		||||
    return p_decoded_val->list_len;
 | 
			
		||||
}    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for decoding a date_time value.
 | 
			
		||||
@@ -393,8 +424,8 @@ static __INLINE uint8_t bds_regcertdatalist_decode(const uint8_t     len,
 | 
			
		||||
 *
 | 
			
		||||
 * @return      length of the decoded field.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t bds_ble_date_time_decode(const uint8_t   len, 
 | 
			
		||||
                                                 const uint8_t   * p_encoded_data, 
 | 
			
		||||
static __INLINE uint8_t bds_ble_date_time_decode(const uint8_t   len,
 | 
			
		||||
                                                 const uint8_t   * p_encoded_data,
 | 
			
		||||
                                                 ble_date_time_t * p_date_time)
 | 
			
		||||
{
 | 
			
		||||
    UNUSED_VARIABLE(len);
 | 
			
		||||
@@ -408,6 +439,11 @@ static __INLINE uint8_t bds_ble_date_time_decode(const uint8_t   len,
 | 
			
		||||
    return pos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // APP_UTIL_BDS_H__
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,60 @@
 | 
			
		||||
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "app_util_platform.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SOFTDEVICE_PRESENT
 | 
			
		||||
/* Global nvic state instance, required by nrf_nvic.h */
 | 
			
		||||
nrf_nvic_state_t nrf_nvic_state;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static uint32_t m_in_critical_region = 0;
 | 
			
		||||
 | 
			
		||||
void app_util_disable_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    __disable_irq();    
 | 
			
		||||
    m_in_critical_region++;    
 | 
			
		||||
    __disable_irq();
 | 
			
		||||
    m_in_critical_region++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void app_util_enable_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    m_in_critical_region--;    
 | 
			
		||||
    m_in_critical_region--;
 | 
			
		||||
    if (m_in_critical_region == 0)
 | 
			
		||||
    {
 | 
			
		||||
        __enable_irq();
 | 
			
		||||
@@ -31,7 +63,7 @@ void app_util_enable_irq(void)
 | 
			
		||||
 | 
			
		||||
void app_util_critical_region_enter(uint8_t *p_nested)
 | 
			
		||||
{
 | 
			
		||||
#ifdef NRF52
 | 
			
		||||
#if __CORTEX_M == (0x04U)
 | 
			
		||||
    ASSERT(APP_LEVEL_PRIVILEGED == privilege_level_get())
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +77,7 @@ void app_util_critical_region_enter(uint8_t *p_nested)
 | 
			
		||||
 | 
			
		||||
void app_util_critical_region_exit(uint8_t nested)
 | 
			
		||||
{
 | 
			
		||||
#ifdef NRF52
 | 
			
		||||
#if __CORTEX_M == (0x04U)
 | 
			
		||||
    ASSERT(APP_LEVEL_PRIVILEGED == privilege_level_get())
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -58,3 +90,38 @@ void app_util_critical_region_exit(uint8_t nested)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t privilege_level_get(void)
 | 
			
		||||
{
 | 
			
		||||
#if __CORTEX_M == (0x00U) || defined(_WIN32) || defined(__unix) || defined(__APPLE__)
 | 
			
		||||
    /* the Cortex-M0 has no concept of privilege */
 | 
			
		||||
    return APP_LEVEL_PRIVILEGED;
 | 
			
		||||
#elif __CORTEX_M == (0x04U)
 | 
			
		||||
    uint32_t isr_vector_num = __get_IPSR() & IPSR_ISR_Msk ;
 | 
			
		||||
    if (0 == isr_vector_num)
 | 
			
		||||
    {
 | 
			
		||||
        /* Thread Mode, check nPRIV */
 | 
			
		||||
        int32_t control = __get_CONTROL();
 | 
			
		||||
        return control & CONTROL_nPRIV_Msk ? APP_LEVEL_UNPRIVILEGED : APP_LEVEL_PRIVILEGED;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        /* Handler Mode, always privileged */
 | 
			
		||||
        return APP_LEVEL_PRIVILEGED;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t current_int_priority_get(void)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t isr_vector_num = __get_IPSR() & IPSR_ISR_Msk ;
 | 
			
		||||
    if (isr_vector_num > 0)
 | 
			
		||||
    {
 | 
			
		||||
        int32_t irq_type = ((int32_t)isr_vector_num - EXTERNAL_INT_VECTOR_OFFSET);
 | 
			
		||||
        return (NVIC_GetPriority((IRQn_Type)irq_type) & 0xFF);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return APP_IRQ_PRIORITY_THREAD;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**@file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup app_util_platform Utility Functions and Definitions (Platform)
 | 
			
		||||
@@ -32,7 +59,11 @@
 | 
			
		||||
#include "nrf_assert.h"
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
 | 
			
		||||
#if defined(NRF51)
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if __CORTEX_M == (0x00U)
 | 
			
		||||
#define _PRIO_SD_HIGH       0
 | 
			
		||||
#define _PRIO_APP_HIGH      1
 | 
			
		||||
#define _PRIO_APP_MID       1
 | 
			
		||||
@@ -40,7 +71,7 @@
 | 
			
		||||
#define _PRIO_APP_LOW       3
 | 
			
		||||
#define _PRIO_APP_LOWEST    3
 | 
			
		||||
#define _PRIO_THREAD        4
 | 
			
		||||
#elif defined(NRF52)
 | 
			
		||||
#elif __CORTEX_M == (0x04U)
 | 
			
		||||
#define _PRIO_SD_HIGH       0
 | 
			
		||||
#define _PRIO_SD_MID        1
 | 
			
		||||
#define _PRIO_APP_HIGH      2
 | 
			
		||||
@@ -54,10 +85,12 @@
 | 
			
		||||
    #error "No platform defined"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//lint -save -e113 -e452
 | 
			
		||||
/**@brief The interrupt priorities available to the application while the SoftDevice is active. */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
#ifdef SOFTDEVICE_PRESENT
 | 
			
		||||
#ifndef SOFTDEVICE_PRESENT
 | 
			
		||||
    APP_IRQ_PRIORITY_HIGHEST = _PRIO_SD_HIGH,
 | 
			
		||||
#else
 | 
			
		||||
    APP_IRQ_PRIORITY_HIGHEST = _PRIO_APP_HIGH,
 | 
			
		||||
@@ -72,6 +105,8 @@ typedef enum
 | 
			
		||||
    APP_IRQ_PRIORITY_LOWEST  = _PRIO_APP_LOWEST,
 | 
			
		||||
    APP_IRQ_PRIORITY_THREAD  = _PRIO_THREAD     /**< "Interrupt level" when running in Thread Mode. */
 | 
			
		||||
} app_irq_priority_t;
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*@brief The privilege levels available to applications in Thread Mode */
 | 
			
		||||
typedef enum
 | 
			
		||||
@@ -84,7 +119,41 @@ typedef enum
 | 
			
		||||
#define EXTERNAL_INT_VECTOR_OFFSET 16
 | 
			
		||||
/**@endcond */
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for setting a breakpoint.
 | 
			
		||||
 */
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#define NRF_BREAKPOINT __builtin_trap()
 | 
			
		||||
#else
 | 
			
		||||
#define NRF_BREAKPOINT __BKPT(0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @brief Macro for setting a breakpoint.
 | 
			
		||||
 *
 | 
			
		||||
 * If it is possible to detect debugger presence then it is set only in that case.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#if __CORTEX_M == 0x04
 | 
			
		||||
#define NRF_BREAKPOINT_COND do {                            \
 | 
			
		||||
    /* C_DEBUGEN == 1 -> Debugger Connected */              \
 | 
			
		||||
    if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)   \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
       /* Generate breakpoint if debugger is connected */   \
 | 
			
		||||
            NRF_BREAKPOINT;                                 \
 | 
			
		||||
    } \
 | 
			
		||||
    }while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define NRF_BREAKPOINT_COND NRF_BREAKPOINT
 | 
			
		||||
#endif // __CORTEX_M == 0x04
 | 
			
		||||
 | 
			
		||||
#if defined ( __CC_ARM )
 | 
			
		||||
#define PACKED(TYPE) __packed TYPE
 | 
			
		||||
#define PACKED_STRUCT PACKED(struct)
 | 
			
		||||
#elif defined   ( __GNUC__ )
 | 
			
		||||
#define PACKED __attribute__((packed))
 | 
			
		||||
#define PACKED_STRUCT struct PACKED
 | 
			
		||||
#elif defined (__ICCARM__)
 | 
			
		||||
#define PACKED_STRUCT __packed struct
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void app_util_critical_region_enter (uint8_t *p_nested);
 | 
			
		||||
void app_util_critical_region_exit (uint8_t nested);
 | 
			
		||||
@@ -116,13 +185,13 @@ void app_util_critical_region_exit (uint8_t nested);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
#define CRITICAL_REGION_EXIT() app_util_critical_region_exit(0)
 | 
			
		||||
#endif 
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Workaround for Keil 4 */
 | 
			
		||||
#ifndef IPSR_ISR_Msk
 | 
			
		||||
#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */
 | 
			
		||||
#endif
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro to enable anonymous unions from a certain point in the code.
 | 
			
		||||
@@ -152,6 +221,13 @@ void app_util_critical_region_exit (uint8_t nested);
 | 
			
		||||
    // For GCC anonymous unions are enabled by default.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for adding pragma directive only for GCC.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#define GCC_PRAGMA(v)            _Pragma(v)
 | 
			
		||||
#else
 | 
			
		||||
#define GCC_PRAGMA(v)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Workaround for Keil 4 */
 | 
			
		||||
#ifndef CONTROL_nPRIV_Msk
 | 
			
		||||
@@ -165,19 +241,8 @@ void app_util_critical_region_exit (uint8_t nested);
 | 
			
		||||
 * @retval   APP_IRQ_PRIORITY_LOW     We are running in Application Low interrupt level.
 | 
			
		||||
 * @retval   APP_IRQ_PRIORITY_THREAD  We are running in Thread Mode.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t current_int_priority_get(void)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t isr_vector_num = __get_IPSR() & IPSR_ISR_Msk ;
 | 
			
		||||
    if (isr_vector_num > 0)
 | 
			
		||||
    {
 | 
			
		||||
        int32_t irq_type = ((int32_t)isr_vector_num - EXTERNAL_INT_VECTOR_OFFSET);
 | 
			
		||||
        return (NVIC_GetPriority((IRQn_Type)irq_type) & 0xFF);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return APP_IRQ_PRIORITY_THREAD;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
uint8_t current_int_priority_get(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for finding out the current privilege level.
 | 
			
		||||
 *
 | 
			
		||||
@@ -185,26 +250,12 @@ static __INLINE uint8_t current_int_priority_get(void)
 | 
			
		||||
 * @retval   APP_LEVEL_UNPRIVILEGED    We are running in unprivileged level.
 | 
			
		||||
 * @retval   APP_LEVEL_PRIVILEGED    We are running in privileged level.
 | 
			
		||||
 */
 | 
			
		||||
static __INLINE uint8_t privilege_level_get(void)
 | 
			
		||||
{
 | 
			
		||||
#if defined(NRF51)
 | 
			
		||||
    /* the Cortex-M0 has no concept of privilege */
 | 
			
		||||
    return APP_LEVEL_PRIVILEGED;
 | 
			
		||||
#elif defined(NRF52)
 | 
			
		||||
    uint32_t isr_vector_num = __get_IPSR() & IPSR_ISR_Msk ;
 | 
			
		||||
    if (0 == isr_vector_num)
 | 
			
		||||
    {
 | 
			
		||||
        /* Thread Mode, check nPRIV */
 | 
			
		||||
        int32_t control = __get_CONTROL();
 | 
			
		||||
        return control & CONTROL_nPRIV_Msk ? APP_LEVEL_UNPRIVILEGED : APP_LEVEL_PRIVILEGED;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        /* Handler Mode, always privileged */
 | 
			
		||||
        return APP_LEVEL_PRIVILEGED;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
uint8_t privilege_level_get(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // APP_UTIL_PLATFORM_H__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
 /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef COMMON_H
 | 
			
		||||
#define COMMON_H
 | 
			
		||||
 | 
			
		||||
/*lint ++flb "Enter library region" */
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* @file
 | 
			
		||||
* @brief Common header file for generic macros and definitions
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GPIO glue macros, this can be used to define a pin number in source/header file and use that macro for pin
 | 
			
		||||
 * configuration using this expansion.
 | 
			
		||||
 * example:
 | 
			
		||||
 * #define RESET_PIN    8
 | 
			
		||||
 * NRF_GPIO->PINCNF(RESET_PIN) = XXX  ;  // Expanded NRF_GPIO->PIN_CNF[8] = XXX
 | 
			
		||||
 */
 | 
			
		||||
#define PINX_GLUE(x, y, z)       x##y##_##z            /*!< first level glue for pin macros */
 | 
			
		||||
#define PINCNF(p)                PINX_GLUE(PIN,p,CNF)  /*!< gpio configure pin number 'p' */
 | 
			
		||||
#define PINOUT(p)                PINX_GLUE(PIN,p,OUT)  /*!< gpio out pin number 'p' */
 | 
			
		||||
 | 
			
		||||
/*lint --flb "Leave library region" */
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,14 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2008 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2008 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 * @brief Common defines and macros for firmware developed by Nordic Semiconductor.
 | 
			
		||||
 */
 | 
			
		||||
@@ -16,8 +44,40 @@
 | 
			
		||||
#ifndef NORDIC_COMMON_H__
 | 
			
		||||
#define NORDIC_COMMON_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Check if selected module is enabled
 | 
			
		||||
 *
 | 
			
		||||
 * This is save function for driver enable checking.
 | 
			
		||||
 * Correct from Lint point of view (not using default of undefined value).
 | 
			
		||||
 *
 | 
			
		||||
 * Usage:
 | 
			
		||||
 * @code
 | 
			
		||||
   #if NRF_MODULE_ENABLED(UART)
 | 
			
		||||
   ...
 | 
			
		||||
   #endif
 | 
			
		||||
 * @endcode
 | 
			
		||||
 *
 | 
			
		||||
 * @param module The module name.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval 1 The macro <module>_ENABLE is defined and is non-zero.
 | 
			
		||||
 * @retval 0 The macro <module>_ENABLE is not defined or it equals zero.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * This macro intentionally does not implement second expansion level.
 | 
			
		||||
 * The name of the module to be checked has to be given directly as a parameter.
 | 
			
		||||
 * And given parameter would be connected with @c _ENABLED postfix directly
 | 
			
		||||
 * without evaluating its value.
 | 
			
		||||
 */
 | 
			
		||||
//lint -emacro(491,NRF_MODULE_ENABLED) // Suppers warning 491 "non-standard use of 'defined' preprocessor operator"
 | 
			
		||||
#define NRF_MODULE_ENABLED(module) \
 | 
			
		||||
    ((defined(module ## _ENABLED) && (module ## _ENABLED)) ? 1 : 0)
 | 
			
		||||
 | 
			
		||||
/** The upper 8 bits of a 32 bit value */
 | 
			
		||||
//lint -emacro(572,MSB) // Suppress warning 572 "Excessive shift value"
 | 
			
		||||
//lint -emacro(572,MSB_32) // Suppress warning 572 "Excessive shift value"
 | 
			
		||||
#define MSB_32(a) (((a) & 0xFF000000) >> 24)
 | 
			
		||||
/** The lower 8 bits (of a 32 bit value) */
 | 
			
		||||
#define LSB_32(a) ((a) & 0x000000FF)
 | 
			
		||||
@@ -35,19 +95,58 @@
 | 
			
		||||
/*lint -emacro(506, MAX) */ /* Suppress "Constant value Boolean */
 | 
			
		||||
#define MAX(a, b) ((a) < (b) ? (b) : (a))
 | 
			
		||||
 | 
			
		||||
/** Concatenates two parameters. Useful as a second level of indirection,
 | 
			
		||||
 *  when a parameter can be macro itself. */
 | 
			
		||||
#define CONCAT_2(p1, p2)      p1##p2
 | 
			
		||||
/** Concatenates three parameters. Useful as a second level of indirection,
 | 
			
		||||
 *  when a parameter can be macro itself. */
 | 
			
		||||
#define CONCAT_3(p1, p2, p3)  p1##p2##p3
 | 
			
		||||
/**@brief Concatenates two parameters.
 | 
			
		||||
 *
 | 
			
		||||
 * It realizes two level expansion to make it sure that all the parameters
 | 
			
		||||
 * are actually expanded before gluing them together.
 | 
			
		||||
 *
 | 
			
		||||
 * @param p1 First parameter to concatenating
 | 
			
		||||
 * @param p2 Second parameter to concatenating
 | 
			
		||||
 *
 | 
			
		||||
 * @return Two parameters glued together.
 | 
			
		||||
 *         They have to create correct C mnemonic in other case
 | 
			
		||||
 *         preprocessor error would be generated.
 | 
			
		||||
 *
 | 
			
		||||
 * @sa CONCAT_3
 | 
			
		||||
 */
 | 
			
		||||
#define CONCAT_2(p1, p2)      CONCAT_2_(p1, p2)
 | 
			
		||||
/** Auxiliary macro used by @ref CONCAT_2 */
 | 
			
		||||
#define CONCAT_2_(p1, p2)     p1##p2
 | 
			
		||||
 | 
			
		||||
/**@brief Concatenates three parameters.
 | 
			
		||||
 *
 | 
			
		||||
 * It realizes two level expansion to make it sure that all the parameters
 | 
			
		||||
 * are actually expanded before gluing them together.
 | 
			
		||||
 *
 | 
			
		||||
 * @param p1 First parameter to concatenating
 | 
			
		||||
 * @param p2 Second parameter to concatenating
 | 
			
		||||
 * @param p3 Third parameter to concatenating
 | 
			
		||||
 *
 | 
			
		||||
 * @return Three parameters glued together.
 | 
			
		||||
 *         They have to create correct C mnemonic in other case
 | 
			
		||||
 *         preprocessor error would be generated.
 | 
			
		||||
 *
 | 
			
		||||
 * @sa CONCAT_2
 | 
			
		||||
 */
 | 
			
		||||
#define CONCAT_3(p1, p2, p3)  CONCAT_3_(p1, p2, p3)
 | 
			
		||||
/** Auxiliary macro used by @ref CONCAT_3 */
 | 
			
		||||
#define CONCAT_3_(p1, p2, p3) p1##p2##p3
 | 
			
		||||
 | 
			
		||||
#define STRINGIFY_(val) #val
 | 
			
		||||
/** Converts a macro argument into a character constant.
 | 
			
		||||
 */
 | 
			
		||||
#define STRINGIFY(val)  STRINGIFY_(val)
 | 
			
		||||
 | 
			
		||||
/** Counts number of elements inside the array
 | 
			
		||||
 */
 | 
			
		||||
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 | 
			
		||||
 | 
			
		||||
/**@brief Set a bit in the uint32 word.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] W  Word whose bit is being set.
 | 
			
		||||
 * @param[in] B  Bit number in the word to be set.
 | 
			
		||||
 */
 | 
			
		||||
#define SET_BIT(W,B)  ((W) |= (uint32_t)(1U << (B)))
 | 
			
		||||
#define SET_BIT(W, B)  ((W) |= (uint32_t)(1U << (B)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Clears a bit in the uint32 word.
 | 
			
		||||
@@ -55,7 +154,7 @@
 | 
			
		||||
 * @param[in] W   Word whose bit is to be cleared.
 | 
			
		||||
 * @param[in] B   Bit number in the word to be cleared.
 | 
			
		||||
 */
 | 
			
		||||
#define CLR_BIT(W, B) ((W) &= (~((uint32_t)1 << (B))))
 | 
			
		||||
#define CLR_BIT(W, B) ((W) &= (~(uint32_t)(1U << (B))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Checks if a bit is set.
 | 
			
		||||
@@ -66,7 +165,7 @@
 | 
			
		||||
 * @retval 1 if bit is set.
 | 
			
		||||
 * @retval 0 if bit is not set.
 | 
			
		||||
 */
 | 
			
		||||
#define IS_SET(W,B) (((W) >> (B)) & 1)
 | 
			
		||||
#define IS_SET(W, B) (((W) >> (B)) & 1)
 | 
			
		||||
 | 
			
		||||
#define BIT_0 0x01 /**< The value of bit 0 */
 | 
			
		||||
#define BIT_1 0x02 /**< The value of bit 1 */
 | 
			
		||||
@@ -105,4 +204,8 @@
 | 
			
		||||
#define UNUSED_PARAMETER(X) UNUSED_VARIABLE(X)
 | 
			
		||||
#define UNUSED_RETURN_VALUE(X) UNUSED_VARIABLE(X)
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // NORDIC_COMMON_H__
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,47 @@
 | 
			
		||||
/* Copyright (c) 2006 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
#include "nrf_assert.h"
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
 | 
			
		||||
#if defined(DEBUG_NRF)
 | 
			
		||||
void assert_nrf_callback(uint16_t line_num, const uint8_t * file_name)
 | 
			
		||||
__WEAK void assert_nrf_callback(uint16_t line_num, const uint8_t * file_name)
 | 
			
		||||
{
 | 
			
		||||
    assert_info_t assert_info =
 | 
			
		||||
    {
 | 
			
		||||
@@ -25,4 +52,3 @@ void assert_nrf_callback(uint16_t line_num, const uint8_t * file_name)
 | 
			
		||||
 | 
			
		||||
    UNUSED_VARIABLE(assert_info);
 | 
			
		||||
}
 | 
			
		||||
#endif /* DEBUG_NRF */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,42 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2006 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is confidential property of Nordic Semiconductor. The use,
 | 
			
		||||
 * copying, transfer or disclosure of such information is prohibited except by express written
 | 
			
		||||
 * agreement with Nordic Semiconductor.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 * @brief Utilities for verifying program logic
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,7 +48,9 @@
 | 
			
		||||
#include "nrf.h"
 | 
			
		||||
#include "app_error.h"
 | 
			
		||||
 | 
			
		||||
#if defined(DEBUG_NRF) || defined(DEBUG_NRF_USER)
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @brief Function for handling assertions.
 | 
			
		||||
 *
 | 
			
		||||
@@ -26,6 +58,10 @@
 | 
			
		||||
 * @note
 | 
			
		||||
 * This function is called when an assertion has triggered.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * This function is deprecated and will be removed in future releases.
 | 
			
		||||
 * Use app_error_fault_handler instead.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * @post
 | 
			
		||||
 * All hardware is put into an idle non-emitting state (in particular the radio is highly
 | 
			
		||||
@@ -36,25 +72,52 @@
 | 
			
		||||
 * @param line_num The line number where the assertion is called
 | 
			
		||||
 * @param file_name Pointer to the file name
 | 
			
		||||
 */
 | 
			
		||||
//lint -save -esym(14, assert_nrf_callback)
 | 
			
		||||
void assert_nrf_callback(uint16_t line_num, const uint8_t *file_name);
 | 
			
		||||
//lint -restore
 | 
			
		||||
 | 
			
		||||
/*lint -emacro(506, ASSERT) */ /* Suppress "Constant value Boolean */ 
 | 
			
		||||
#if (defined(DEBUG_NRF) || defined(DEBUG_NRF_USER))
 | 
			
		||||
#define NRF_ASSERT_PRESENT 1
 | 
			
		||||
#else
 | 
			
		||||
#define NRF_ASSERT_PRESENT 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//#if defined(DEBUG_NRF) || defined(DEBUG_NRF_USER)
 | 
			
		||||
 | 
			
		||||
/*lint -emacro(506, ASSERT) */ /* Suppress "Constant value Boolean */
 | 
			
		||||
/*lint -emacro(774, ASSERT) */ /* Suppress "Boolean within 'if' always evaluates to True" */ \
 | 
			
		||||
 | 
			
		||||
/** @brief Function for checking intended for production code.
 | 
			
		||||
 *
 | 
			
		||||
 * Check passes if "expr" evaluates to true. */
 | 
			
		||||
#define ASSERT(expr) \
 | 
			
		||||
 | 
			
		||||
#ifdef _lint
 | 
			
		||||
#define ASSERT(expr)                                                          \
 | 
			
		||||
if (expr)                                                                     \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
}                                                                             \
 | 
			
		||||
else                                                                          \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
    assert_nrf_callback((uint16_t)__LINE__, (uint8_t *)__FILE__);             \
 | 
			
		||||
    while (1);                                                                \
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
#define ASSERT(expr) //!< Assert empty when disabled
 | 
			
		||||
__WEAK void assert_nrf_callback(uint16_t line_num, const uint8_t *file_name);
 | 
			
		||||
#endif /* defined(DEBUG_NRF) || defined(DEBUG_NRF_USER) */
 | 
			
		||||
#else //_lint
 | 
			
		||||
#define ASSERT(expr)                                                          \
 | 
			
		||||
if (NRF_ASSERT_PRESENT)                                                       \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
    if (expr)                                                                 \
 | 
			
		||||
    {                                                                         \
 | 
			
		||||
    }                                                                         \
 | 
			
		||||
    else                                                                      \
 | 
			
		||||
    {                                                                         \
 | 
			
		||||
        assert_nrf_callback((uint16_t)__LINE__, (uint8_t *)__FILE__);         \
 | 
			
		||||
    }                                                                         \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* NRF_ASSERT_H_ */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										147
									
								
								nRF5_SDK_11.0.0_89a8197/components/libraries/util/nrf_bitmask.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								nRF5_SDK_11.0.0_89a8197/components/libraries/util/nrf_bitmask.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,147 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
#ifndef NRF_BITMASK_H
 | 
			
		||||
#define NRF_BITMASK_H
 | 
			
		||||
 | 
			
		||||
#include "compiler_abstraction.h"
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BITMASK_BYTE_GET(abs_bit) ((abs_bit)/8)
 | 
			
		||||
#define BITMASK_RELBIT_GET(abs_bit) ((abs_bit) & 0x00000007)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function for checking if bit in the multi-byte bit mask is set.
 | 
			
		||||
 *
 | 
			
		||||
 * @param bit    Bit index.
 | 
			
		||||
 * @param p_mask A pointer to mask with bit fields.
 | 
			
		||||
 *
 | 
			
		||||
 * @return 0 if bit is not set, positive value otherwise.
 | 
			
		||||
 */
 | 
			
		||||
__STATIC_INLINE uint32_t nrf_bitmask_bit_is_set(uint32_t bit, void const * p_mask)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t const * p_mask8 = (uint8_t const *)p_mask;
 | 
			
		||||
    uint32_t byte_idx = BITMASK_BYTE_GET(bit);
 | 
			
		||||
    bit = BITMASK_RELBIT_GET(bit);
 | 
			
		||||
    return (1 << bit) & p_mask8[byte_idx];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function for setting a bit in the multi-byte bit mask.
 | 
			
		||||
 *
 | 
			
		||||
 * @param bit    Bit index.
 | 
			
		||||
 * @param p_mask A pointer to mask with bit fields.
 | 
			
		||||
 */
 | 
			
		||||
__STATIC_INLINE void nrf_bitmask_bit_set(uint32_t bit, void * p_mask)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t * p_mask8 = (uint8_t *)p_mask;
 | 
			
		||||
    uint32_t byte_idx = BITMASK_BYTE_GET(bit);
 | 
			
		||||
    bit = BITMASK_RELBIT_GET(bit);
 | 
			
		||||
    p_mask8[byte_idx] |= (1 << bit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function for clearing a bit in the multi-byte bit mask.
 | 
			
		||||
 *
 | 
			
		||||
 * @param bit    Bit index.
 | 
			
		||||
 * @param p_mask A pointer to mask with bit fields.
 | 
			
		||||
 */
 | 
			
		||||
__STATIC_INLINE void nrf_bitmask_bit_clear(uint32_t bit, void * p_mask)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t * p_mask8 = (uint8_t *)p_mask;
 | 
			
		||||
    uint32_t byte_idx = BITMASK_BYTE_GET(bit);
 | 
			
		||||
    bit = BITMASK_RELBIT_GET(bit);
 | 
			
		||||
    p_mask8[byte_idx] &= ~(1 << bit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function for performing bitwise OR operation on two multi-byte bit masks.
 | 
			
		||||
 *
 | 
			
		||||
 * @param p_mask1    A pointer to the first bit mask.
 | 
			
		||||
 * @param p_mask2    A pointer to the second bit mask.
 | 
			
		||||
 * @param p_mask_out A pointer to the output bit mask.
 | 
			
		||||
 * @param length     Length of output mask in bytes.
 | 
			
		||||
 */
 | 
			
		||||
__STATIC_INLINE void nrf_bitmask_masks_or(void const *   p_mask1,
 | 
			
		||||
                                          void const *   p_mask2,
 | 
			
		||||
                                          void *         p_out_mask,
 | 
			
		||||
                                          uint32_t       length)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t const * p_mask8_1 = (uint8_t const *)p_mask1;
 | 
			
		||||
    uint8_t const * p_mask8_2 = (uint8_t const *)p_mask2;
 | 
			
		||||
    uint8_t * p_mask8_out = (uint8_t *)p_out_mask;
 | 
			
		||||
    uint32_t i;
 | 
			
		||||
    for (i = 0; i < length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        p_mask8_out[i] = p_mask8_1[i] | p_mask8_2[i];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function for performing bitwise AND operation on two multi-byte bit masks.
 | 
			
		||||
 *
 | 
			
		||||
 * @param p_mask1    A pointer to the first bit mask.
 | 
			
		||||
 * @param p_mask2    A pointer to the second bit mask.
 | 
			
		||||
 * @param p_mask_out A pointer to the output bit mask.
 | 
			
		||||
 * @param length     Length of output mask in bytes.
 | 
			
		||||
 */
 | 
			
		||||
__STATIC_INLINE void nrf_bitmask_masks_and(void const *   p_mask1,
 | 
			
		||||
                                           void const *   p_mask2,
 | 
			
		||||
                                           void *         p_out_mask,
 | 
			
		||||
                                           uint32_t       length)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t const * p_mask8_1 = (uint8_t const *)p_mask1;
 | 
			
		||||
    uint8_t const * p_mask8_2 = (uint8_t const *)p_mask2;
 | 
			
		||||
    uint8_t * p_mask8_out = (uint8_t *)p_out_mask;
 | 
			
		||||
    uint32_t i;
 | 
			
		||||
    for (i = 0; i < length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        p_mask8_out[i] = p_mask8_1[i] & p_mask8_2[i];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif //NRF_BITMASK_H
 | 
			
		||||
@@ -7,6 +7,22 @@
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <app_util.h>
 | 
			
		||||
 | 
			
		||||
#define NRF_LOG_MODULE_REGISTER()
 | 
			
		||||
 | 
			
		||||
#define NRF_LOG_ERROR(...)
 | 
			
		||||
#define NRF_LOG_WARNING(...)
 | 
			
		||||
#define NRF_LOG_INFO(...)
 | 
			
		||||
#define NRF_LOG_DEBUG(...)
 | 
			
		||||
#define NRF_LOG_RAW_INFO(...)
 | 
			
		||||
#define NRF_LOG_HEXDUMP_ERROR(p_data, len)
 | 
			
		||||
#define NRF_LOG_HEXDUMP_WARNING(p_data, len)
 | 
			
		||||
#define NRF_LOG_HEXDUMP_INFO(p_data, len)
 | 
			
		||||
#define NRF_LOG_HEXDUMP_DEBUG(p_data, len)
 | 
			
		||||
#define NRF_LOG_RAW_HEXDUMP_INFO(p_data, len)
 | 
			
		||||
#define NRF_LOG_GETCHAR()
 | 
			
		||||
#define NRF_LOG_PUSH(_str)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef NRF_LOG_USES_RTT
 | 
			
		||||
#define NRF_LOG_USES_RTT 0
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,48 @@
 | 
			
		||||
/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @cond */
 | 
			
		||||
/**@file
 | 
			
		||||
 *
 | 
			
		||||
 * @ingroup experimental_api
 | 
			
		||||
 * @defgroup sdk_common SDK Common Header
 | 
			
		||||
 * @breif All common headers needed for SDK examples will be included here so that application
 | 
			
		||||
 * @brief All common headers needed for SDK examples will be included here so that application
 | 
			
		||||
 *       developer does not have to include headers on him/herself.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
@@ -26,149 +53,25 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "sdk_config.h"
 | 
			
		||||
#include "nordic_common.h"
 | 
			
		||||
#include "compiler_abstraction.h"
 | 
			
		||||
#include "sdk_os.h"
 | 
			
		||||
#include "sdk_errors.h"
 | 
			
		||||
#include "app_util.h"
 | 
			
		||||
#include "sdk_macros.h"
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the function to return
 | 
			
		||||
 *        if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] param  The variable to check if is NULL.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL(param)                \
 | 
			
		||||
do                                                  \
 | 
			
		||||
{                                                   \
 | 
			
		||||
    if (param == NULL)                              \
 | 
			
		||||
    {                                               \
 | 
			
		||||
        return NRF_ERROR_NULL;                      \
 | 
			
		||||
    }                                               \
 | 
			
		||||
} while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL()
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the function to return
 | 
			
		||||
 *        if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] param  The variable to check if is NULL.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL_VOID(param)           \
 | 
			
		||||
do                                                  \
 | 
			
		||||
{                                                   \
 | 
			
		||||
    if (param == NULL)                              \
 | 
			
		||||
    {                                               \
 | 
			
		||||
        return;                                     \
 | 
			
		||||
    }                                               \
 | 
			
		||||
} while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL_VOID()
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that a function returned NRF_SUCCESS. Will return the err code
 | 
			
		||||
 * if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] err_code The error code to check.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_SUCCESS(err_code)            \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if (err_code != NRF_SUCCESS)            \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return err_code;                    \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_SUCCESS()
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that a function returned NRF_SUCCESS. Will return if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] err_code The error code to check.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_SUCCESS_VOID(err_code)       \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if (err_code != NRF_SUCCESS)            \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return;                             \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_SUCCESS_VOID()
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be true. Will return err_code if not.
 | 
			
		||||
*
 | 
			
		||||
* @param[in]   statement   Statement to test.
 | 
			
		||||
* @param[in]   err_code     Error value to return if test was invalid.
 | 
			
		||||
*
 | 
			
		||||
* @retval      err_code if test fails.
 | 
			
		||||
*/
 | 
			
		||||
#define VERIFY_TRUE(statement, err_code)    \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if (!(statement))                       \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return err_code;                    \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be true. Will return if not.
 | 
			
		||||
*
 | 
			
		||||
* @param[in]   statement   Statement to test.
 | 
			
		||||
*/
 | 
			
		||||
#define VERIFY_TRUE_VOID(statement)         \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if (!(statement))                       \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return;                             \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be false. Will return err_code if not.
 | 
			
		||||
*
 | 
			
		||||
* @param[in]   statement   Statement to test.
 | 
			
		||||
* @param[in]   err_code     Error value to return if test was invalid.
 | 
			
		||||
*
 | 
			
		||||
* @retval      err_code if test fails.
 | 
			
		||||
*/
 | 
			
		||||
#define VERIFY_FALSE(statement, err_code)   \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if ((statement))                        \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return err_code;                    \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be false. Will return if not.
 | 
			
		||||
*
 | 
			
		||||
* @param[in]   statement    Statement to test.
 | 
			
		||||
*/
 | 
			
		||||
#define VERIFY_FALSE_VOID(statement)        \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if ((statement))                        \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return;                             \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
/** @endcond */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // SDK_COMMON_H__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**@file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup sdk_error SDK Error codes
 | 
			
		||||
@@ -21,9 +48,9 @@
 | 
			
		||||
 *          are used to provide the cause or nature of error. Each module is assigned a 16-bit
 | 
			
		||||
 *          unsigned integer. Which it will use to identify all errors that occurred in it. 16-bit
 | 
			
		||||
 *          LSB range is with module id as the MSB in the 32-bit error code is reserved for the
 | 
			
		||||
 *          module. As an example, if 0x8800 identifies a certain SDK module, all values from 
 | 
			
		||||
 *          module. As an example, if 0x8800 identifies a certain SDK module, all values from
 | 
			
		||||
 *          0x88000000 - 0x8800FFFF are reserved for this module.
 | 
			
		||||
 *          It should be noted that common error reasons have been assigned values to make it 
 | 
			
		||||
 *          It should be noted that common error reasons have been assigned values to make it
 | 
			
		||||
 *          possible to decode error reason easily. As an example, lets module uninitialized has
 | 
			
		||||
 *          been assigned an error code 0x000A0. Then, if application encounters an error code
 | 
			
		||||
 *          0xZZZZ00A0, it knows that it accessing a certain module without initializing it.
 | 
			
		||||
@@ -35,7 +62,7 @@
 | 
			
		||||
 *          A range is reserved for application as well, it can use this range for defining
 | 
			
		||||
 *          application specific errors.
 | 
			
		||||
 *
 | 
			
		||||
 * @note Success code, NRF_SUCCESS, does not include any module identifier.          
 | 
			
		||||
 * @note Success code, NRF_SUCCESS, does not include any module identifier.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@@ -44,58 +71,78 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "nrf_error.h"
 | 
			
		||||
#include "sdk_config.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup sdk_err_base Base defined for SDK Modules
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define SDK_ERROR_BASE         (NRF_ERROR_BASE_NUM + 0x8000)   /**< Base value defined for SDK module identifiers. */
 | 
			
		||||
#define SDK_COMMON_ERROR_BASE  (NRF_ERROR_BASE_NUM + 0x0080)   /**< Base error value to be used for SDK error values. */
 | 
			
		||||
/* @} */
 | 
			
		||||
#define NRF_ERROR_SDK_ERROR_BASE         (NRF_ERROR_BASE_NUM + 0x8000)   /**< Base value defined for SDK module identifiers. */
 | 
			
		||||
#define NRF_ERROR_SDK_COMMON_ERROR_BASE  (NRF_ERROR_BASE_NUM + 0x0080)   /**< Base error value to be used for SDK error values. */
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup sdk_module_codes Codes reserved as identification for module where the error occurred.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define DEVICE_MANAGER_ERR_BASE   (0x8000)
 | 
			
		||||
#define MEMORY_MANAGER_ERR_BASE   (0x8100)
 | 
			
		||||
/* @} */
 | 
			
		||||
#define NRF_ERROR_MEMORY_MANAGER_ERR_BASE   (0x8100)
 | 
			
		||||
#define NRF_ERROR_PERIPH_DRIVERS_ERR_BASE   (0x8200)
 | 
			
		||||
#define NRF_ERROR_GAZELLE_ERR_BASE          (0x8300)
 | 
			
		||||
#define NRF_ERROR_BLE_IPSP_ERR_BASE         (0x8400)
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup sdk_iot_errors Codes reserved as identification for IoT errors.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define IOT_ERR_BASE_START        (0xA000)
 | 
			
		||||
#define IOT_ERR_BASE_STOP         (0xAFFF)
 | 
			
		||||
/* @} */
 | 
			
		||||
 
 | 
			
		||||
#define NRF_ERROR_IOT_ERR_BASE_START        (0xA000)
 | 
			
		||||
#define NRF_ERROR_IOT_ERR_BASE_STOP         (0xAFFF)
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup sdk_common_errors Codes reserved as identification for common errors.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define MODULE_NOT_INITIALZED      (SDK_COMMON_ERROR_BASE + 0x0000)
 | 
			
		||||
#define MUTEX_INIT_FAILED          (SDK_COMMON_ERROR_BASE + 0x0001)
 | 
			
		||||
#define MUTEX_LOCK_FAILED          (SDK_COMMON_ERROR_BASE + 0x0002)
 | 
			
		||||
#define MUTEX_UNLOCK_FAILED        (SDK_COMMON_ERROR_BASE + 0x0003)
 | 
			
		||||
#define MUTEX_COND_INIT_FAILED     (SDK_COMMON_ERROR_BASE + 0x0004)
 | 
			
		||||
#define MODULE_ALREADY_INITIALIZED (SDK_COMMON_ERROR_BASE + 0x0005)
 | 
			
		||||
#define API_NOT_IMPLEMENTED        (SDK_COMMON_ERROR_BASE + 0x0010)
 | 
			
		||||
#define FEATURE_NOT_ENABLED        (SDK_COMMON_ERROR_BASE + 0x0011)
 | 
			
		||||
/* @} */
 | 
			
		||||
#define NRF_ERROR_MODULE_NOT_INITIALZED      (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0000)
 | 
			
		||||
#define NRF_ERROR_MUTEX_INIT_FAILED          (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0001)
 | 
			
		||||
#define NRF_ERROR_MUTEX_LOCK_FAILED          (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0002)
 | 
			
		||||
#define NRF_ERROR_MUTEX_UNLOCK_FAILED        (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0003)
 | 
			
		||||
#define NRF_ERROR_MUTEX_COND_INIT_FAILED     (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0004)
 | 
			
		||||
#define NRF_ERROR_MODULE_ALREADY_INITIALIZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0005)
 | 
			
		||||
#define NRF_ERROR_STORAGE_FULL               (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0006)
 | 
			
		||||
#define NRF_ERROR_API_NOT_IMPLEMENTED        (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0010)
 | 
			
		||||
#define NRF_ERROR_FEATURE_NOT_ENABLED        (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0011)
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup dm_specific_errors Error / status codes specific to device manager.
 | 
			
		||||
 * @defgroup drv_specific_errors Error / status codes specific to drivers.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define DM_NO_APP_CONTEXT                (DEVICE_MANAGER_ERR_BASE + 0x0040)
 | 
			
		||||
#define DM_SERVICE_CONTEXT_NOT_APPLIED   (DEVICE_MANAGER_ERR_BASE + 0x0041)
 | 
			
		||||
#define DM_CONTEXT_INFO_LOST             (DEVICE_MANAGER_ERR_BASE + 0x0042)
 | 
			
		||||
#define DM_DEVICE_CONTEXT_FULL           (DEVICE_MANAGER_ERR_BASE + 0x0043)
 | 
			
		||||
#define NRF_ERROR_DRV_TWI_ERR_OVERRUN        (NRF_ERROR_PERIPH_DRIVERS_ERR_BASE + 0x0000)
 | 
			
		||||
#define NRF_ERROR_DRV_TWI_ERR_ANACK          (NRF_ERROR_PERIPH_DRIVERS_ERR_BASE + 0x0001)
 | 
			
		||||
#define NRF_ERROR_DRV_TWI_ERR_DNACK          (NRF_ERROR_PERIPH_DRIVERS_ERR_BASE + 0x0002)
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup ble_ipsp_errors IPSP codes
 | 
			
		||||
 * @brief Error and status codes specific to IPSP.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define NRF_ERROR_BLE_IPSP_RX_PKT_TRUNCATED       (NRF_ERROR_BLE_IPSP_ERR_BASE + 0x0000)
 | 
			
		||||
#define NRF_ERROR_BLE_IPSP_CHANNEL_ALREADY_EXISTS (NRF_ERROR_BLE_IPSP_ERR_BASE + 0x0001)
 | 
			
		||||
#define NRF_ERROR_BLE_IPSP_LINK_DISCONNECTED      (NRF_ERROR_BLE_IPSP_ERR_BASE + 0x0002)
 | 
			
		||||
#define NRF_ERROR_BLE_IPSP_PEER_REJECTED          (NRF_ERROR_BLE_IPSP_ERR_BASE + 0x0003)
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief API Result.
 | 
			
		||||
 *
 | 
			
		||||
@@ -108,8 +155,12 @@
 | 
			
		||||
 *          an indicative of whether the procedure has been requested successfully.
 | 
			
		||||
 */
 | 
			
		||||
typedef uint32_t ret_code_t;
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // SDK_ERRORS_H__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +1,191 @@
 | 
			
		||||
/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @cond */
 | 
			
		||||
/**@file
 | 
			
		||||
 *
 | 
			
		||||
 * @ingroup sdk_util
 | 
			
		||||
 | 
			
		||||
 * @defgroup sdk_common_macros SDK Common Header
 | 
			
		||||
 * @breif Macros for parameter checking and similar tasks
 | 
			
		||||
 * @ingroup app_common
 | 
			
		||||
 * @brief Macros for parameter checking and similar tasks
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SDK_MACROS_H__
 | 
			
		||||
#define SDK_MACROS_H__
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the function to return
 | 
			
		||||
 *        @ref NRF_ERROR_INVALID_STATE if not.
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be true. It will cause the exterior function to return
 | 
			
		||||
 *        err_code if the statement is not true.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   statement   Statement to test.
 | 
			
		||||
 * @param[in]   err_code    Error value to return if test was invalid.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval      nothing, but will cause the exterior function to return @p err_code if @p statement
 | 
			
		||||
 *              is false.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED()
 | 
			
		||||
#else
 | 
			
		||||
#ifdef MODULE_INITIALIZED
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED()                 \
 | 
			
		||||
#define VERIFY_TRUE(statement, err_code)    \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if (!MODULE_INITIALIZED)                \
 | 
			
		||||
    if (!(statement))                       \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return NRF_ERROR_INVALID_STATE;     \
 | 
			
		||||
        return err_code;                    \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while(0)
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be true. It will cause the exterior function to return
 | 
			
		||||
 *        if the statement is not true.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   statement   Statement to test.
 | 
			
		||||
 */
 | 
			
		||||
#define VERIFY_TRUE_VOID(statement) VERIFY_TRUE((statement), )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be false. It will cause the exterior function to return
 | 
			
		||||
 *        err_code if the statement is not false.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   statement   Statement to test.
 | 
			
		||||
 * @param[in]   err_code    Error value to return if test was invalid.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval      nothing, but will cause the exterior function to return @p err_code if @p statement
 | 
			
		||||
 *              is true.
 | 
			
		||||
 */
 | 
			
		||||
#define VERIFY_FALSE(statement, err_code)   \
 | 
			
		||||
do                                          \
 | 
			
		||||
{                                           \
 | 
			
		||||
    if ((statement))                        \
 | 
			
		||||
    {                                       \
 | 
			
		||||
        return err_code;                    \
 | 
			
		||||
    }                                       \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying statement to be false. It will cause the exterior function to return
 | 
			
		||||
 *        if the statement is not false.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]   statement    Statement to test.
 | 
			
		||||
 */
 | 
			
		||||
#define VERIFY_FALSE_VOID(statement) VERIFY_FALSE((statement), )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that a function returned NRF_SUCCESS. It will cause the exterior
 | 
			
		||||
 *        function to return err_code if the err_code is not @ref NRF_SUCCESS.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] err_code The error code to check.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_SUCCESS()
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED()
 | 
			
		||||
#endif /* MODULE_INITIALIZED  */
 | 
			
		||||
#define VERIFY_SUCCESS(err_code) VERIFY_TRUE((err_code) == NRF_SUCCESS, (err_code))
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the function to return
 | 
			
		||||
 *        if not.
 | 
			
		||||
/**@brief Macro for verifying that a function returned NRF_SUCCESS. It will cause the exterior
 | 
			
		||||
 *        function to return if the err_code is not @ref NRF_SUCCESS.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] err_code The error code to check.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_SUCCESS_VOID()
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_SUCCESS_VOID(err_code) VERIFY_TRUE_VOID((err_code) == NRF_SUCCESS)
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the exterior function to
 | 
			
		||||
 *        return @ref NRF_ERROR_INVALID_STATE if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @note MODULE_INITIALIZED must be defined in each module using this macro. MODULE_INITIALIZED
 | 
			
		||||
 *       should be true if the module is initialized, false if not.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED()
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED() VERIFY_TRUE((MODULE_INITIALIZED), NRF_ERROR_INVALID_STATE)
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the exterior function to
 | 
			
		||||
 *        return if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @note MODULE_INITIALIZED must be defined in each module using this macro. MODULE_INITIALIZED
 | 
			
		||||
 *       should be true if the module is initialized, false if not.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED_VOID()
 | 
			
		||||
#else
 | 
			
		||||
#ifdef MODULE_INITIALIZED
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED_VOID()            \
 | 
			
		||||
do                                                  \
 | 
			
		||||
{                                                   \
 | 
			
		||||
    if (!MODULE_INITIALIZED)                        \
 | 
			
		||||
    {                                               \
 | 
			
		||||
        return;                                     \
 | 
			
		||||
    }                                               \
 | 
			
		||||
} while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED_VOID()
 | 
			
		||||
#endif /* MODULE_INITIALIZED  */
 | 
			
		||||
#define VERIFY_MODULE_INITIALIZED_VOID() VERIFY_TRUE_VOID((MODULE_INITIALIZED))
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the exterior function to
 | 
			
		||||
 *        return if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] param  The variable to check if is NULL.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL()
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL(param) VERIFY_FALSE(((param) == NULL), NRF_ERROR_NULL)
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Macro for verifying that the module is initialized. It will cause the exterior function to
 | 
			
		||||
 *        return if not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] param  The variable to check if is NULL.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef DISABLE_PARAM_CHECK
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL_VOID()
 | 
			
		||||
#else
 | 
			
		||||
#define VERIFY_PARAM_NOT_NULL_VOID(param) VERIFY_FALSE_VOID(((param) == NULL))
 | 
			
		||||
#endif /* DISABLE_PARAM_CHECK */
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
/** @endcond */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // SDK_MACROS_H__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "sdk_mapped_flags.h"
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
@@ -17,6 +44,11 @@
 | 
			
		||||
#include "compiler_abstraction.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test whether the flag collection type is large enough to hold all the flags. If this fails,
 | 
			
		||||
// reduce SDK_MAPPED_FLAGS_N_KEYS or increase the size of sdk_mapped_flags_t.
 | 
			
		||||
STATIC_ASSERT((sizeof(sdk_mapped_flags_t) * SDK_MAPPED_FLAGS_N_KEYS_PER_BYTE) >= SDK_MAPPED_FLAGS_N_KEYS);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for setting the state of a flag to true.
 | 
			
		||||
 *
 | 
			
		||||
 * @note This function does not check whether the index is valid.
 | 
			
		||||
@@ -109,6 +141,33 @@ void sdk_mapped_flags_bulk_update_by_key(uint16_t           * p_keys,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool sdk_mapped_flags_get_by_key_w_idx(uint16_t         * p_keys,
 | 
			
		||||
                                       sdk_mapped_flags_t flags,
 | 
			
		||||
                                       uint16_t           key,
 | 
			
		||||
                                       uint8_t          * p_index)
 | 
			
		||||
{
 | 
			
		||||
    if (p_keys != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        for (uint32_t i = 0; i < SDK_MAPPED_FLAGS_N_KEYS; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (p_keys[i] == key)
 | 
			
		||||
            {
 | 
			
		||||
                if (p_index != NULL)
 | 
			
		||||
                {
 | 
			
		||||
                    *p_index = i;
 | 
			
		||||
                }
 | 
			
		||||
                return sdk_mapped_flags_get_by_index(flags, i);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (p_index != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        *p_index = SDK_MAPPED_FLAGS_N_KEYS;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool sdk_mapped_flags_get_by_key(uint16_t * p_keys, sdk_mapped_flags_t flags, uint16_t key)
 | 
			
		||||
{
 | 
			
		||||
    if (p_keys != NULL)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SDK_MAPPED_FLAGS_H__
 | 
			
		||||
#define SDK_MAPPED_FLAGS_H__
 | 
			
		||||
 | 
			
		||||
@@ -18,6 +45,10 @@
 | 
			
		||||
#include "app_util.h"
 | 
			
		||||
#include "compiler_abstraction.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * @defgroup sdk_mapped_flags Mapped flags
 | 
			
		||||
@@ -37,17 +68,11 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define SDK_MAPPED_FLAGS_N_KEYS          8       /**< The number of keys to keep flags for. This is also the number of flags in a flag collection. If changing this value, you might also need change the width of the sdk_mapped_flags_t type. */
 | 
			
		||||
#define SDK_MAPPED_FLAGS_N_KEYS          32      /**< The number of keys to keep flags for. This is also the number of flags in a flag collection. If changing this value, you might also need change the width of the sdk_mapped_flags_t type. */
 | 
			
		||||
#define SDK_MAPPED_FLAGS_N_KEYS_PER_BYTE 8       /**< The number of flags that fit in one byte. */
 | 
			
		||||
#define SDK_MAPPED_FLAGS_INVALID_INDEX   0xFFFF  /**< A flag index guaranteed to be invalid. */
 | 
			
		||||
 | 
			
		||||
typedef uint8_t sdk_mapped_flags_t; /**< The bitmap to hold flags. Each flag is one bit, and each bit represents the flag state associated with one key. */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test whether the flag collection type is large enough to hold all the flags. If this fails,
 | 
			
		||||
// reduce SDK_MAPPED_FLAGS_N_KEYS or increase the size of sdk_mapped_flags_t.
 | 
			
		||||
STATIC_ASSERT((
 | 
			
		||||
    sizeof(sdk_mapped_flags_t)*SDK_MAPPED_FLAGS_N_KEYS_PER_BYTE) >= SDK_MAPPED_FLAGS_N_KEYS);
 | 
			
		||||
typedef uint32_t sdk_mapped_flags_t; /**< The bitmap to hold flags. Each flag is one bit, and each bit represents the flag state associated with one key. */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Type used to present a subset of the registered keys.
 | 
			
		||||
@@ -114,6 +139,22 @@ void sdk_mapped_flags_bulk_update_by_key(uint16_t           * p_keys,
 | 
			
		||||
bool sdk_mapped_flags_get_by_key(uint16_t * p_keys, sdk_mapped_flags_t flags, uint16_t key);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for getting the state of a specific flag.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  p_keys   The list of associated keys (assumed to have a length of
 | 
			
		||||
 *                      @ref SDK_MAPPED_FLAGS_N_KEYS).
 | 
			
		||||
 * @param[in]  flags    The flag collection from which to read.
 | 
			
		||||
 * @param[in]  key      The key for which to get the flag.
 | 
			
		||||
 * @param[out] p_index  If not NULL, the index of the key.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  The state of the flag.
 | 
			
		||||
 */
 | 
			
		||||
bool sdk_mapped_flags_get_by_key_w_idx(uint16_t         * p_keys,
 | 
			
		||||
                                       sdk_mapped_flags_t flags,
 | 
			
		||||
                                       uint16_t           key,
 | 
			
		||||
                                       uint8_t          * p_index);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@brief Function for getting a list of all keys that have a specific flag set to true.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  p_keys  The list of associated keys (assumed to have a length of
 | 
			
		||||
@@ -150,4 +191,9 @@ static __INLINE bool sdk_mapped_flags_any_set(sdk_mapped_flags_t flags)
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* SDK_MAPPED_FLAGS_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,43 @@
 | 
			
		||||
/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
 *
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 /** @cond */
 | 
			
		||||
/** @cond */
 | 
			
		||||
/**@file
 | 
			
		||||
 *
 | 
			
		||||
 * @defgroup sdk_os SDK OS Abstraction
 | 
			
		||||
@@ -25,6 +52,10 @@
 | 
			
		||||
#ifndef SDK_OS_H__
 | 
			
		||||
#define SDK_OS_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SDK_MUTEX_DEFINE(X)
 | 
			
		||||
#define SDK_MUTEX_INIT(X)
 | 
			
		||||
#define SDK_MUTEX_LOCK(X)
 | 
			
		||||
@@ -33,8 +64,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup os_data_type Data types.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
/** @endcond */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // SDK_OS_H__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,42 @@
 | 
			
		||||
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * The information contained herein is property of Nordic Semiconductor ASA.
 | 
			
		||||
 * Terms and conditions of usage are described in detail in NORDIC
 | 
			
		||||
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensees are granted free, non-transferable use of the information. NO
 | 
			
		||||
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 | 
			
		||||
 * the file.
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 Nordic
 | 
			
		||||
 *    Semiconductor ASA 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 Nordic Semiconductor ASA nor the names of its
 | 
			
		||||
 *    contributors may be used to endorse or promote products derived from this
 | 
			
		||||
 *    software without specific prior written permission.
 | 
			
		||||
 * 
 | 
			
		||||
 * 4. This software, with or without modification, must only be used with a
 | 
			
		||||
 *    Nordic Semiconductor ASA integrated circuit.
 | 
			
		||||
 * 
 | 
			
		||||
 * 5. Any software provided in binary form under this license must not be reverse
 | 
			
		||||
 *    engineered, decompiled, modified and/or disassembled.
 | 
			
		||||
 * 
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 | 
			
		||||
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 * @brief Definition file for resource usage by SoftDevice, ESB and Gazell.
 | 
			
		||||
 */
 | 
			
		||||
@@ -16,30 +44,34 @@
 | 
			
		||||
#ifndef APP_RESOURCES_H__
 | 
			
		||||
#define APP_RESOURCES_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SOFTDEVICE_PRESENT
 | 
			
		||||
	#include "nrf_sd_def.h"
 | 
			
		||||
    #include "nrf_sd_def.h"
 | 
			
		||||
#else
 | 
			
		||||
	#define SD_PPI_RESTRICTED	      0uL /**< 1 if PPI peripheral is restricted, 0 otherwise. */
 | 
			
		||||
	#define SD_PPI_CHANNELS_USED      0uL /**< PPI channels utilized by SotfDevice (not available to th spplication). */
 | 
			
		||||
	#define SD_PPI_GROUPS_USED        0uL /**< PPI groups utilized by SotfDevice (not available to th spplication). */
 | 
			
		||||
	#define SD_TIMERS_USED            0uL /**< Timers used by SoftDevice. */
 | 
			
		||||
	#define SD_SWI_USED               0uL /**< Software interrupts used by SoftDevice. */
 | 
			
		||||
    #define SD_PPI_RESTRICTED         0uL /**< 1 if PPI peripheral is restricted, 0 otherwise. */
 | 
			
		||||
    #define SD_PPI_CHANNELS_USED      0uL /**< PPI channels utilized by SotfDevice (not available to th spplication). */
 | 
			
		||||
    #define SD_PPI_GROUPS_USED        0uL /**< PPI groups utilized by SotfDevice (not available to th spplication). */
 | 
			
		||||
    #define SD_TIMERS_USED            0uL /**< Timers used by SoftDevice. */
 | 
			
		||||
    #define SD_SWI_USED               0uL /**< Software interrupts used by SoftDevice. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef GAZELL_PRESENT
 | 
			
		||||
	#include "nrf_gzll_resources.h"
 | 
			
		||||
    #include "nrf_gzll_resources.h"
 | 
			
		||||
#else
 | 
			
		||||
	#define GZLL_PPI_CHANNELS_USED    0uL /**< PPI channels utilized by Gazell (not available to th spplication). */
 | 
			
		||||
	#define GZLL_TIMERS_USED          0uL /**< Timers used by Gazell. */
 | 
			
		||||
	#define GZLL_SWI_USED             0uL /**< Software interrupts used by Gazell */
 | 
			
		||||
    #define GZLL_PPI_CHANNELS_USED    0uL /**< PPI channels utilized by Gazell (not available to th spplication). */
 | 
			
		||||
    #define GZLL_TIMERS_USED          0uL /**< Timers used by Gazell. */
 | 
			
		||||
    #define GZLL_SWI_USED             0uL /**< Software interrupts used by Gazell */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ESB_PRESENT
 | 
			
		||||
	#include "nrf_esb_resources.h"
 | 
			
		||||
    #include "nrf_esb_resources.h"
 | 
			
		||||
#else
 | 
			
		||||
	#define ESB_PPI_CHANNELS_USED    0uL /**< PPI channels utilized by ESB (not available to th spplication). */
 | 
			
		||||
	#define ESB_TIMERS_USED          0uL /**< Timers used by ESB. */
 | 
			
		||||
	#define ESB_SWI_USED             0uL /**< Software interrupts used by ESB */
 | 
			
		||||
    #define ESB_PPI_CHANNELS_USED    0uL /**< PPI channels utilized by ESB (not available to th spplication). */
 | 
			
		||||
    #define ESB_TIMERS_USED          0uL /**< Timers used by ESB. */
 | 
			
		||||
    #define ESB_SWI_USED             0uL /**< Software interrupts used by ESB */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define NRF_PPI_CHANNELS_USED (SD_PPI_CHANNELS_USED | GZLL_PPI_CHANNELS_USED | ESB_PPI_CHANNELS_USED)
 | 
			
		||||
@@ -47,4 +79,8 @@
 | 
			
		||||
#define NRF_SWI_USED          (SD_SWI_USED | GZLL_SWI_USED | ESB_SWI_USED)
 | 
			
		||||
#define NRF_TIMERS_USED       (SD_TIMERS_USED | GZLL_TIMERS_USED | ESB_TIMERS_USED)
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // APP_RESOURCES_H__
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user