diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2018-08-23 17:08:59 +0200 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2018-08-23 17:12:21 +0200 |
commit | 3061ecca3d0fdfb87dabbf5f63c9e06c2a30f53a (patch) | |
tree | ab49cc16ed0b853452c5c2ed2d3042416d628986 /thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL | |
download | iot-sensors-master.tar.gz iot-sensors-master.tar.bz2 iot-sensors-master.tar.xz iot-sensors-master.zip |
Diffstat (limited to 'thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL')
14 files changed, 2765 insertions, 0 deletions
diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_crc.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_crc.h new file mode 100644 index 0000000..f85430b --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_crc.h @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_CRC_H_INCLUDED +#define SYS_CRC_H_INCLUDED + +#include <stdint.h> +#include <stddef.h> + +/** @file + * This file contains declarations of the CRC computing routines and necessary macros/types. + * + * @defgroup sys_crc System CRC API + * @ingroup sys_15_4 + * @{ + * @brief Module to declare System CRC API. + * @details The CRC module implements a set of routines to compute the 16-bit CRC value for octet arrays. + */ + +/** + * @brief Defines an initial value for the CRC sum. + */ +#define SYS_CRC_INIT 0 + +/** + * @brief CRC value type. This module uses 16-bit CRC. + */ +typedef uint16_t sys_crc_t; + +/** + * @brief Function for computing CRC value for given data. + * + * @param[in] p_data Pointer to data to compute. + * @param[in] length Length of data. + * + * @return Returns the CRC value for input data. + */ +sys_crc_t sys_crc_calc(const uint8_t * p_data, size_t length); + +/** + * @brief Function for updating the CRC value taking into the account the previously counted value. + * + * @details This function is used when input data is represented by several pieces. + * Consequently, a call to this function for each piece will give a correct + * total CRC value. + * + * @param[in] current_crc Previously counted CRC value. Should be SYS_CRC_INIT for the first piece. + * @param[in] p_data Pointer to the current piece of data. + * @param[in] length Length of the current piece of data. + * + * @return Returns the updated CRC value. + */ +sys_crc_t sys_crc_continue(sys_crc_t current_crc, const uint8_t * p_data, size_t length); + +/** @} */ + +#endif /* SYS_CRC_H_INCLUDED */ diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_debug.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_debug.h new file mode 100644 index 0000000..c9943de --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_debug.h @@ -0,0 +1,177 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_DEBUG_H_INCLUDED +#define SYS_DEBUG_H_INCLUDED + + +#include "hal_debug_interface.h" +#include "hal_trace_interface.h" +#include <stdbool.h> +#include <stdarg.h> + +/* This header file contains macros for debugging. */ + +#ifndef ASSERT + #ifdef CONFIG_DEBUG + #define ASSERT(CONDITION_STATEMENT) \ + do \ + { \ + bool LOCAL_CONDITION_CHECK = (CONDITION_STATEMENT); \ + if (LOCAL_CONDITION_CHECK != true) \ + { \ + sys_assert_handler((#CONDITION_STATEMENT), __LINE__, __FILE__); \ + } \ + } while (0) + #else + + #define ASSERT(CONDITION_STATEMENT) + + #endif // CONFIG_DEBUG +#endif // ASSERT + +#ifndef ASSERT_INFO + #ifdef CONFIG_DEBUG + #define ASSERT_INFO(CONDITION_STATEMENT, INFO_FMT, ...) \ + do \ + { \ + bool LOCAL_CONDITION_CHECK = (CONDITION_STATEMENT); \ + if (LOCAL_CONDITION_CHECK != true) \ + { \ + sys_assert_info_handler((#CONDITION_STATEMENT), __LINE__, __FILE__, \ + INFO_FMT, __VA_ARGS__); \ + } \ + } while (0) + + #else + + #define ASSERT_INFO(CONDITION_STATEMENT, INFO_FMT, ...) + + #endif // CONFIG_DEBUG +#endif // ASSERT_INFO + +#ifndef ASSERT_STATIC + #ifdef CONFIG_DEBUG + #define ASSERT_STATIC(e) do { enum {SA = 1/(e)}; } while (0) + #else + #define ASSERT_STATIC(e) + #endif // CONFIG_DEBUG +#endif // ASSERT_STATIC + +/** + * @defgroup sys_debug Debugging macros + * @ingroup sys_15_4 + * @{ + * @brief Functions used for debugging. + */ + + +/**@brief System assertion fault handler. + * + * @details This macro should be used whenever an assertion fault is detected. + * + * @param[in] CONDITION_STRING Assertion condition string, which occurred to be not true. + */ +#define SYS_ASSERT_HANDLER(CONDITION_STRING) \ + do \ + { \ + sys_assert_handler(CONDITION_STRING, __LINE__, __FILE__); \ + } while (0) + + +#ifndef TRACE_PUTS + #ifdef CONFIG_TRACE + #define TRACE_PUTS(s) HAL_TRACE_INTERFACE_PUTS(s) + #else + #define TRACE_PUTS(s) + #endif //CONFIG_TRACE +#endif //TRACE_PUTS + + +#ifndef TRACE + #ifdef CONFIG_TRACE + #define TRACE(INFO_FMT, ...) sys_trace_handler(INFO_FMT, __VA_ARGS__) + #else + #define TRACE(INFO_FMT, ...) + #endif // CONFIG_DEBUG +#endif // TRACE + + +/**@brief System assertion fault handler function. + * + * @param[in] condition Assertion condition string, which was expected to be true. + * + * @param[in] line Line number. + * + * @param[in] file File name. + */ +extern void sys_assert_handler( + const char * condition, const int line, const char * file); + + +/**@brief System assertion fault handler function with additional assertion information. + * + * @param[in] condition Assertion condition string, which was expected to be true. + * + * @param[in] line Line number. + * + * @param[in] file File name. + * + * @param[in] info_fmt Format string for additional assert information. + * + * @param[in] ... Arguments list corresponding to the format string. + */ +extern void sys_assert_info_handler( + const char * condition, const int line, const char * file, + const char * info_fmt, ...); + + +/**@brief System trace output handler function. + * + * @param[in] fmt Format string for trace output. + * + * @param[in] ... Arguments list corresponding to the format string. + */ +extern void sys_trace_handler(const char * fmt, ...); + +/** @} */ + +#endif // SYS_DEBUG_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_events.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_events.h new file mode 100644 index 0000000..554f892 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_events.h @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_EVENTS_H_INCLUDED +#define SYS_EVENTS_H_INCLUDED + +#include <stddef.h> +#include "sys_queue.h" + +/** @file + * This file contains declarations of the Events API and necessary types. The Events feature is implemented + * using the Queue functionality. + * + * @defgroup sys_events System events API + * @ingroup sys_15_4 + * @{ + * @brief Module for declaring system events API. + * @details The Events module defines some routines to subscribe/unsubscribe to/from system events. The events pool + * can be extended by adding new events to the sys_event_id_t enumeration. The registered callbacks + * can be called for an array of events. The callbacks can be called implicitly via posting the event by the + * sys_event_post() routine. + */ + +/**@brief IDs of globally available events. + * + * @details Event IDs are system extension points that allow the user to implement + * specific processing of predefined set of events, occurring in different modules. + */ +typedef enum +{ + SYS_EVENT_FALLING_ASLEEP, /**< Falling asleep event. */ + SYS_EVENT_WAKE_UP, /**< Waking up event. */ + SYS_EVENT_OUT_OF_MEMORY, /**< Out of memory event. */ + SYS_EVENT_MEMORY_FREED, /**< Memory was freed up event. */ + + /** \note The list of system events can be extended during the implementation phase. */ + + /* The following event IDs are used only for unit testing */ + TST_EVENT_0, /**< Test event #0. */ + TST_EVENT_1, /**< Test event #1. */ + TST_EVENT_2, /**< Test event #2. */ + +#if (CONFIG_USE_SYS_TASK_NOTIFIER == 1) + /** This event is posted when there are unhandled events available in + * any of the schedulers. + */ + SYS_EVENT_NEW_TASK, +#endif + + SYS_EVENTS_AMOUNT +} sys_event_id_t; + + +/**@brief Prototype of user-implemented callback for processing an event. + * + * @details This callback is registered for the given event by a *_subscribe routine, + * and is then called by the system events engine, when this event occurs. + * + * @param[in] p_data Pointer to the data, specific for this event. + */ +typedef void (* sys_event_callback_t)(const void * p_data); + + +/**@brief Event descriptor. + * + * @details This descriptor is used to subscribe/unsubscribe to/from the event. + */ +typedef struct +{ + /** Service field. */ + sys_queue_item_t queue_item; + + /** ID of the event to which this callback is to be subscribed. */ + sys_event_id_t event_id; + + /** Callback function which is to be called when this event occurs. */ + sys_event_callback_t callback; +} sys_event_desc_t; + + +/**@brief Function for initializing the global events infrastructure. + */ +void sys_events_init(void); + + +/**@brief Function for subscribing to a system event. + * + * @param[in] p_event_desc Pointer to the event descriptor. + */ +void sys_event_subscribe(sys_event_desc_t * p_event_desc); + + +/**@brief Function for unsubscribing from a system event event. + * + * @param[in] p_event_desc Pointer to the event descriptor. + */ +void sys_event_unsubscribe(sys_event_desc_t * p_event_desc); + + +/**@brief Function for subscribing to a group of events. + * + * @param[in] p_desc_array Pointer to the array of event descriptors. + * @param[in] desc_amount Amount of event descriptors in the array. + */ +void sys_events_array_subscribe(sys_event_desc_t * p_desc_array, size_t desc_amount); + + +/**@brief Function for unsubscribing from the group of events. + * + * + * @param[in] p_desc_array Pointer to the array of event descriptors. + * @param[in] desc_amount Amount of the event descriptors in the array. + */ +void sys_events_array_unsubscribe(sys_event_desc_t * p_desc_array, size_t desc_amount); + + +/**@brief Function for posting an event. + * + * @details This function is used to notify all the subscribers of the given events via + * their callbacks, when the given event occurs. + * + * @param[in] event_id ID of the event to be posted. + * @param[in] p_data Pointer to be passed to the event handlers' callbacks. + */ +void sys_event_post(sys_event_id_t event_id, const void * p_data); + +/** @} */ + +#endif // SYS_EVENTS_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_fsm.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_fsm.h new file mode 100644 index 0000000..51a3ee2 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_fsm.h @@ -0,0 +1,286 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_FSM_H_INCLUDED +#define SYS_FSM_H_INCLUDED + +#include <stdint.h> +#include <stdbool.h> + +/** @file + * This file contains declarations of the Finite State Machine (FSM) primitives and necessary types. + * + * @defgroup sys_fsm Finite State Machine API + * @ingroup sys_15_4 + * @{ + * @brief Module to declare Finite State Machine API + * @details The FSM module implements the Finite State Machine abstraction. The user is intended to implement a transition + * table of states with guards and actions in order to represent some event-driven subject. When a table is + * implemented, call sys_fsm_init() to initialize the FSM. After that, the only routine to + * work with FSM is sys_fsm_event_post(). + */ + +/**@brief Fixed-size type for FSM state ID. + */ +typedef uint8_t sys_fsm_state_id_t; + + +/**@brief Fixed-size type for FSM event ID. + */ +typedef uint8_t sys_fsm_event_id_t; + + +/**@brief Fixed-size type for FSM guard condition ID. + */ +typedef uint8_t sys_fsm_guard_id_t; + + +/**@brief Fixed-size type for FSM action ID. + */ +typedef uint8_t sys_fsm_action_id_t; + + +/**@brief FSM transition description (item of FSM transition table). + * + * @details When an event with given event_id occurs, the guard condition with guard_id + * is checked, and if it returns true, the action with action_id is performed, + * and state machine is switched to the state with new_state_id. + */ +typedef struct +{ + sys_fsm_event_id_t event_id; /**< FSM event ID. */ + sys_fsm_guard_id_t guard_id; /**< FSM guard ID. */ + sys_fsm_action_id_t action_id; /**< FSM action ID. */ + sys_fsm_state_id_t new_state_id; /**< New state ID. */ +#if defined(CONFIG_FSM_DEBUG) + const char * debug_string; +#endif +} sys_fsm_transition_t; + + +/**@brief FSM transition declaration (item of FSM transition table). + */ +#if defined(CONFIG_FSM_DEBUG) +# define SYS_FSM_TRANSITION(event_id, guard_id, action_id, new_state_id) \ + {(event_id), (guard_id), (action_id), (new_state_id), \ + "(" #event_id ", " #guard_id ", " #action_id " -> " #new_state_id ")"} +#else +# define SYS_FSM_TRANSITION(event_id, guard_id, action_id, new_state_id) \ + {(event_id), (guard_id), (action_id), (new_state_id)} +#endif + + +/**@brief FSM state declaration. + * + * @details The state is an aggregator item of the FSM transition table, aggregating + * the transitions, declared immediately after this state declaration. + * All transition declaration items, following the state declaration item, + * will be aggregated in this state, until the next state declaration item, + * or the "end of table" item. + */ +#define SYS_FSM_STATE(state_id) \ + {(state_id) | SYS_FSM_STATE_FLAG, 0, 0, 0} + + +/**@brief Empty guard condition ID. + * + * @details Special value of the guard_id field. If it is used in transition declaration, + * guard check will be omitted. + */ +#define SYS_FSM_NO_GUARD 0xFF + + +/**@brief Empty guard condition ID (useful synonym). + * + * @details Special value of the guard_id field. If it is used in transition declaration, + * guard check will be omitted. + */ +#define SYS_FSM_OTHERWISE 0xFF + + +/**@brief Empty guard condition ID (useful synonym). + * + * @details Special value of the guard_id field. If it is used in transition declaration, + * guard check will be omitted. + */ +#define SYS_FSM_ALWAYS 0xFF + + +/**@brief Empty action ID. + * + * @details Special value of the action_id field. If it is used in transition declaration, + * no action will be performed during the transition. + */ +#define SYS_FSM_NO_ACTION 0xFF + + +/**@brief Same state ID. + * + * @details Special value of the next_state_id field. If it is used in transition + * declaration, the current state will not be changed. + */ +#define SYS_FSM_SAME_STATE 0xFF + + +/**@brief Any state ID. + * + * @details Special value of the event_id field. If it is used in transition + * declaration table, then the transitions listed in this state will be applied + * in case they have not been listed in the transition table for the + * current FSM state. + * Only one SYS_FSM_STATE(SYS_FSM_ANY_STATE) can be present in the transition table. + */ +#define SYS_FSM_ANY_STATE 0xFF + + +/**@brief State declaration flag. + * + * @details Special flag of the event_id field. This flag is used to distinguish + * between state declaration and transition declaration. + */ +#define SYS_FSM_STATE_FLAG 0x80 + + +/**@brief Prototype of a user-defined FSM guard condition function. + * + * @details You must implement a single FSM guard condition function which will + * use an ID of the needed guard check as a parameter. + * + * @param[in] guard_id Guard condition ID to be checked. + * @param[in] p_data Additional FSM specific data. + * + * @retval true Transition is allowed, false otherwise. + */ +typedef bool (* sys_fsm_guard_t)(sys_fsm_guard_id_t guard_id, void * p_data); + + +/**@brief Prototype of a user-defined FSM action function. + * + * @details You must implement a single FSM action function which will + * use an ID of the needed action as a parameter. + * + * @param[in] action_id Action ID to be performed. + * @param[in] p_data Additional FSM specific data. + */ +typedef void (* sys_fsm_action_t)(sys_fsm_action_id_t action_id, void * p_data); + + +/**@brief Constant FSM descriptor which can reside in read-only memory. + */ +typedef struct +{ +#if defined(CONFIG_FSM_DEBUG) + const char * debug_fsm_name; +#endif + /** Pointer to the transition table. + */ + const sys_fsm_transition_t * transition_table; + + /** Number of transitions in the transition table. + */ + uint8_t transitions_amount; + + /** Initial state ID. + */ + sys_fsm_state_id_t initial_state; + + /** Pointer to the guard condition function. + */ + sys_fsm_guard_t guard; + + /** Pointer to the action function. + */ + sys_fsm_action_t action; +} sys_fsm_const_descriptor_t; + + +/**@brief FSM dynamic descriptor, holding the current state of the FSM. +*/ +typedef struct +{ + /** Pointer to the constant FSM descriptor which can reside in read-only memory. + */ + const sys_fsm_const_descriptor_t * fsm_const_desc; + + /** Index of the "any state transitions" block. + */ + uint8_t any_state_transitions_index; + + /** Current state ID. + */ + volatile sys_fsm_state_id_t current_state; + + /** Recursion protection. + */ + volatile uint8_t recursion_protection; +} sys_fsm_t; + + +#if defined(CONFIG_FSM_DEBUG) + #define FSM_DEBUG_NAME(name_string) .debug_fsm_name = name_string, +#else + #define FSM_DEBUG_NAME(name_string) +#endif + + +/**@brief Function for initializing a specific FSM. + * + * @param[in] p_fsm Pointer to FSM descriptor to initialize. + * @param[in] p_fsm_const Pointer to constant FSM descriptor with transition table, etc. + */ +void sys_fsm_init(sys_fsm_t * p_fsm, const sys_fsm_const_descriptor_t * p_fsm_const); + + +/**@brief Function for posting an event to FSM. + * + * @details This function causes FSM transition from the current state to the new state, + * according to the transition table of this FSM. + * The corresponding guard check and action is performed. + * + * @param[in] p_fsm Pointer to FSM descriptor. + * @param[in] event_id Event ID to post. + * @param[in] p_data Pointer to the FSM-specific data. + */ +void sys_fsm_event_post(sys_fsm_t * p_fsm, sys_fsm_event_id_t event_id, void * p_data); + +/** @} */ + +#endif // SYS_FSM_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_init.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_init.h new file mode 100644 index 0000000..8efeaf6 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_init.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_INIT_H_INCLUDED +#define SYS_INIT_H_INCLUDED + +#include <stddef.h> + +/** + * @defgroup sys_15_4_init Initialization API + * @ingroup sys_15_4 + * @{ + * @brief API for initizalizing the system abstraction library. + */ + +/** @brief Initializes every component of this stack. + * + * This function must be called before using any of the components. + * + * @param[in] p_start Pool start address. + * @param[in] size Size of the pool in bytes. + * + * @details The pool start address must be aligned on the ALIGN_VALUE boundary, which is + * defined in @c sys_utils.h. + * The pool size should be multiple of an ALIGN_VALUE, which is defined in @c sys_utils.h. + */ +void sys_init(void * p_start, size_t size); + +/** @} */ + +#endif /* SYS_INIT_H_INCLUDED */ diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_list.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_list.h new file mode 100644 index 0000000..533ee6f --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_list.h @@ -0,0 +1,248 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_LIST_H_INCLUDED +#define SYS_LIST_H_INCLUDED + +/** @file + * This file contains declarations of the doubly linked list primitives and necessary types. + * This implementation is Linux-proven and used in the memory management module. + * + * @defgroup sys_list Doubly linked list API. + * @ingroup sys_15_4 + * @{ + * @brief Module to declare the doubly linked list API. + */ + +/** + * Internal list "head" struct. + */ +struct sys_list_head +{ + struct sys_list_head * next; + struct sys_list_head * prev; +}; + +typedef struct sys_list_head sys_list_head_t; + + +/** + * @brief Initializes a list by variable name. + * @warning this macro assumes that a list "head" (sys_list_head_t) variable + * with name \a name is already created. + * + * @param[inout] name The "head" struct name. + */ +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +/** + * @brief Defines and initializes a new list. + * @details A call to this macro creates a new variable with the given name and + * initializes it as a list "head". + * + * @param[inout] name The "head" struct name. + */ +#define LIST_HEAD(name) sys_list_head_t name = { &(name), &(name) } + + +/** + * @brief Initializes a list by pointer. + * + * @param[inout] ptr Pointer to a list. + */ +#define INIT_LIST_HEAD(ptr) \ + do \ + { \ + (ptr)->prev = (ptr); \ + (ptr)->next = (ptr); \ + } while (0) + + +/** + * @brief Checks if a list is empty. + * + * @param[in] sys_list_head Pointer to a list. + * @return 0 if not empty, non-zero otherwise. + */ +#define IS_EMPTY(sys_list_head) (sys_list_head)->next == (sys_list_head) + + +/** + * @brief Adds a new item to the list between \a l_prev and \a l_next elements. + * @warning This routine assumes that \a l_next is next to \a l_prev in the list. + * @note This is an internal helper routine which is not intended to be used by the user. + * + * @param[in] l_prev Pointer to the previous element. + * @param[in] l_next Pointer to the next element. + * @param[in] l_new Pointer to a new element. + */ +static inline void sys_ll_list_add(sys_list_head_t * l_prev, + sys_list_head_t * l_next, + sys_list_head_t * l_new) +{ + l_new->prev = l_prev; + l_prev->next = l_new; + l_next->prev = l_new; + l_new->next = l_next; +} + +/** + * @brief Deletes an element between \a l_prev and \a l_next elements. + * @warning This macro assumes that \a l_next is next to \a l_prev in the list. + * @note This is an internal helper routine which is not intended to be used by the user. + * + * @param[in] l_prev Pointer to the previous element. + * @param[in] l_next Pointer to the next element. + */ +static inline void sys_ll_list_del(sys_list_head_t * l_next, + sys_list_head_t * l_prev) +{ + l_next->prev = l_prev; + l_prev->next = l_next; +} + +/** + * @brief Function for adding a new item to the head of the list. + * + * @param[in] new Pointer to a new element. + * @param[in] head Pointer to the list head. + */ +static inline void sys_list_add(sys_list_head_t * new, sys_list_head_t * head) +{ + sys_ll_list_add(head, head->next, new); +} + + +/** + * @brief Function for adding a new item to the tail of the list. + * + * @param[in] new Pointer to a new element. + * @param[in] head Pointer to the list head. + */ +static inline void sys_list_add_tail(sys_list_head_t * new, sys_list_head_t * head) +{ + sys_ll_list_add(head->prev, head, new); +} + + +/** + * @brief Function for deleting an entry from list. + * + * @param[in] entry The element to delete from the list. + */ +static inline void sys_list_del(sys_list_head_t * entry) +{ + sys_ll_list_del(entry->next, entry->prev); +} + + +/** + * @brief Function for deleting an entry from the list and reinitializing it. + * + * @param[in] entry The element to delete from the list. + */ +static inline void sys_list_del_init(sys_list_head_t * entry) +{ + sys_ll_list_del(entry->next, entry->prev); + INIT_LIST_HEAD(entry); +} + + +/** + * @brief Function for testing if a list is empty. + + * @param[in] head The list to test. + * @return 0 if not empty, non-zero otherwise. + */ +static inline unsigned int sys_list_empty(sys_list_head_t * head) +{ + return IS_EMPTY(head); +} + + +/** + * @brief Sets a pointer to a variable to the parent structure pointer using a + * pointer to a field in this structure. + * + * @note This is a version of @ref GET_PARENT_BY_FIELD() extended by setting to a variable. + * + * @param[out] ll_ret_var Variable pointer name to return. + * @param[in] ll_ptr Pointer to the structure field. + * @param[in] ll_type Name of the parent structure. + * @param[in] ll_member Name of the structure field. + */ +#define SYS_LIST_ENTRY(ll_ret_var, ll_ptr, ll_type, ll_member) \ + do \ + { \ + size_t p = (size_t) ll_ptr; \ + size_t off = offsetof(ll_type, ll_member); \ + ll_ret_var = (ll_type *) (p - off); \ + } while (0) + + +/** + * @brief Iterates through the list. + * @note Use @ref SYS_LIST_FOR_EACH_SAFE() for thread-safe cases. + * + * @param[out] pos Iterator variable. + * @param[in] head Pointer to the list head. + */ +#define SYS_LIST_FOR_EACH(pos, head) \ + for (pos = ((head)->next); \ + ((pos) != (head)); \ + pos = (pos)->next) + + +/** + * @brief Thread-safe version of @ref SYS_LIST_FOR_EACH(). + * + * @param[out] ll_pos Iterator variable. + * @param[out] ll_pos_n Temporary iterator variable (next entry). + * @param[in] ll_head Pointer to the list head. + */ +#define SYS_LIST_FOR_EACH_SAFE(ll_pos, ll_pos_n, ll_head) \ + for (ll_pos = (ll_head)->next, ll_pos_n = (ll_head)->next->next; \ + (ll_pos) != (ll_head); \ + ll_pos = ll_pos_n, ll_pos_n = ll_pos->next) + +/** @} */ + +#endif /* SYS_LIST_H_INCLUDED */ diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_memory_manager.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_memory_manager.h new file mode 100644 index 0000000..c05849b --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_memory_manager.h @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_MEMORY_MANAGER_H_INCLUDED +#define SYS_MEMORY_MANAGER_H_INCLUDED + +#include <stddef.h> +#include <stdint.h> + +/** @file + * This file contains declarations of the Memory manager API. + * + * @defgroup sys_memory_manager Memory Manager API + * @ingroup sys_15_4 + * @{ + * @brief Module to declare Memory Manager API. + * @details The Memory Manager module implements the standard API for allocating/freeing memory chunks. The module must + * be initialized by sys_mm_init() before a call to any alloc/free routines. The memory can be allocated by a + * call to sys_mm_alloc() and freed by a call to sys_mm_free(). Minimal chunk of memory to allocate is one byte, + * however the sys_mm_alloc() routine will allocate the number of bytes aligned to the length of the + * machine word (e.g. 4 bytes for 32-bit architectures). The module is implemented using the doubly linked + * lists API. + */ + +/**@brief Function for initializing the memory manager. + * @details Initialize the memory manager pool of the 'size' bytes length at 'p_start' address. + * + * @param p_start Pool start address. + * @param size Size of the pool in bytes. + */ +void sys_mm_init(void * p_start, size_t size); + + +/**@brief Function for allocating memory in the pool. + * @details Search and allocate free memory resources. + * + * @param[in] size Size of the requested memory. + * + * @retval Pointer to allocated memory, + * NULL in case of error. + */ +void * sys_mm_alloc(size_t size); + + +/**@brief Function for freeing the allocated memory. + * + * @param[in] p_addr Pointer to the memory to free. + * + */ +void sys_mm_free(void * p_addr); + +/** @} */ + +#endif // SYS_MEMORY_MANAGER_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_queue.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_queue.h new file mode 100644 index 0000000..8f817c0 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_queue.h @@ -0,0 +1,290 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_QUEUE_H_INCLUDED +#define SYS_QUEUE_H_INCLUDED + +#include <stdbool.h> +#include <stdint.h> + +/** @file + * This file contains declarations of the primitives to work with queues and necessary types. + * + * @defgroup sys_queues Queue API + * @ingroup sys_15_4 + * @{ + * @brief Module to declare the queue API. + * @details The queue module implements a set of routines to deal with queues. Before + * any calls to its API are issued, a queue must be initialized using sys_queue_init(). The following routines + * return queue items from different parts of an initialized queue without removing it from the queue: + * sys_queue_front(), sys_queue_back(), sys_queue_next(), and sys_queue_at(). + * The following routines insert elements to the queue: sys_queue_push_front(), + * sys_queue_push_back(), sys_queue_push_predicated(), sys_queue_push_predicated_force(), and sys_queue_insert(). + * The following routines remove elements from the queue: sys_queue_pop_front(), sys_queue_remove(), + * sys_queue_remove_after(). These helper routines get information about a queue: sys_queue_size() and + * sys_queue_is_empty(). The module also supports an iterator macro implemented by SYS_QUEUE_FOR_EACH(). + */ + +/**@brief Queue item descriptor. + * + * @details In order to store any user data struct in a queue, the user struct should contain + * a field of type 'sys_queue_item_t'. This field may be at any offset. + * The user data item can be cast from the queue item, + * by the \ref GET_PARENT_BY_FIELD() macro from sys_utils.h. + */ +typedef struct sys_queue_item_s +{ + struct sys_queue_item_s * next; +} sys_queue_item_t; + +/**@brief Queue descriptor. + */ +typedef sys_queue_item_t sys_queue_t; + +/**@brief Prototype of a predicate function for pushing an item into the queue. + * + * @details As a user of the queue library, implement the predicate function and pass it + * as a parameter to \ref sys_queue_push_predicated(). You can choose + * whether insertion of a new item should be done before the given existing item of + * the queue, or not. + * + * @param[in] p_before_item Pointer to the existing item before which a new item + * should be inserted. + * @param[in] p_new_item Pointer to the item to be inserted into the queue. + * + * @retval true Insertion is to be done before the given item, false otherwise. + */ +typedef bool (* sys_queue_push_predicate_t)( + sys_queue_item_t * p_before_item, + sys_queue_item_t * p_new_item); + + +/**@brief Function for initializing the queue before any other usage of the queue. + * + * @details Initialize (reset) the queue to its initial state. The queue becomes empty. + * + * @param[in] p_queue Queue to be initialized. + */ +void sys_queue_init(sys_queue_t * p_queue); + + +/**@brief Function for getting the front (head) item of the queue without removing it. + * + * @details Return a pointer to the item from the head of the queue but leave it in the queue. + * + * @param[in] p_queue Queue to get the item from. + * + * @retval Pointer to the head item of the queue, or NULL if the queue is empty. + */ +sys_queue_item_t * sys_queue_front(const sys_queue_t * p_queue); + + +/**@brief Function for getting the back (tail) item of the queue without removing it. + * + * @details Return a pointer to the item from the tail of the queue but leave it in the queue. + * + * @param[in] p_queue Queue to get the item from. + * + * @retval Pointer to the tail item of the queue, or NULL if the queue is empty. + */ +sys_queue_item_t * sys_queue_back(const sys_queue_t * p_queue); + + +/**@brief Function for getting the item, next to the given item of the queue. + * + * @details Return a pointer to the next item after the given one, or NULL if the + * given item is the last item of the queue. + * + * @param[in] p_queue Pointer to the queue. + * @param[in] p_item Pointer to the item. + * + * @retval Pointer to the next item after the given one, or NULL if the + * given item is the last item of the queue. + */ +sys_queue_item_t * sys_queue_next(const sys_queue_t * p_queue, const sys_queue_item_t * p_item); + + +/**@brief Function for pushing an item to the front (head) of the queue. + * + * @details This function inserts an item to the head of the queue. + * + * @param[in] p_queue Queue to push the item to. + * @param[in] p_item Item to insert to the front of the queue. + */ +void sys_queue_push_front(sys_queue_t * p_queue, sys_queue_item_t * p_item); + + +/**@brief Function for pushing an item to the back (tail) of the queue. + * + * @details This function inserts an item to the tail of the queue. + * + * @param[in] p_queue Queue to push the item to. + * @param[in] p_item Item to insert to the tail of the queue. + */ +void sys_queue_push_back(sys_queue_t * p_queue, sys_queue_item_t * p_item); + + +/**@brief Function for pushing an item to the queue with a predicate. + * + * @details Conditionally push an item to the queue using the given predicate that tries to determine + * the insertion position. + * + * @param[in] p_queue Queue to push the item to. + * @param[in] p_item Item to be pushed. + * @param[in] predicate Predicate to be used to find the insertion position. + * + * @retval true The item was inserted into the queue, false otherwise. + */ +bool sys_queue_push_predicated( + sys_queue_t * p_queue, + sys_queue_item_t * p_item, + sys_queue_push_predicate_t predicate); + + +/**@brief Function for pushing an item to the queue with a predicate forcing insertion to the tail if the predicate + * fails. + * + * @details Unconditionally push an item to the queue using the given predicate that tries to + * determine the insertion position. + * If predicate returns false, then force the insertion to the tail of the queue. + * + * @param[in] p_queue Queue to push item to. + * @param[in] p_item Item to be pushed. + * @param[in] predicate Predicate to be used to find the insertion position. + */ +void sys_queue_push_predicated_force( + sys_queue_t * p_queue, + sys_queue_item_t * p_item, + sys_queue_push_predicate_t predicate); + + +/**@brief Function for getting and removing the front (head) item from the queue. + * + * @details Get an item from the head of the queue and remove it from the queue. + * + * @param[in] p_queue Queue to get and remove the head item from. + * + * @retval Pointer to the head item of queue or NULL if the queue is empty. + */ +sys_queue_item_t * sys_queue_pop_front(sys_queue_t * p_queue); + + +/**@brief Function for removing an item from the queue. + * + * @details The given item will be removed from the queue. + * + * @note The complexity of this function is O(n). Use function \ref sys_queue_remove_after() + * whenever the previous item of the queue is known. + * + * @param[in] p_queue Queue to remove the item from. + * @param[in] p_item Item to remove from the queue. + */ +void sys_queue_remove(sys_queue_t * p_queue, sys_queue_item_t * p_item); + + +/**@brief Function for removing the item after the given item from the queue. + * + * @details The item next to the given one will be removed from the queue. + * + * @param[in] p_queue Queue to remove the item from. + * @param[in] p_after_item Next to this item will be removed. + */ +void sys_queue_remove_after(sys_queue_t * p_queue, sys_queue_item_t * p_after_item); + + +/**@brief Function for returning the current size of a queue, i.e. number of elements inside it. + * + * @details This function goes through the whole queue, so it is relatively slow. + * + * @param[in] p_queue Queue to work with. + * + * @retval Number of items currently inserted into the queue. + */ +uint8_t sys_queue_size(const sys_queue_t * p_queue); + + +/**@brief Function for returning a pointer to the item inside a queue represented by an index. + * + * @details This function searches through the whole queue, so it is relatively slow. + * + * @param[in] p_queue Queue to work with. + * @param[in] index Requested index. + * + * @retval Pointer to the requested item or NULL if the queue size is less + * than \a index. + */ +sys_queue_item_t * sys_queue_at(const sys_queue_t * p_queue, const uint8_t index); + + +/**@brief Function for inserting an item at the specified position represented by an index in the queue. + * If this position is too big, it is inserted to the tail of the queue. + * + * @details This function searches through the whole queue, so it is relatively slow. + * + * @param[in] p_queue Queue to insert to. + * @param[in] p_item Item to be inserted. + * @param[in] pos Position inside the queue (0 is the front). + */ +void sys_queue_insert(sys_queue_t * p_queue, sys_queue_item_t * p_item, const uint8_t pos); + + +/**@brief Function for determining if a queue is empty. + * + * @param[in] p_queue Queue to be checked. + * + * @retval True if queue is empty, false otherwise. + */ +bool sys_queue_is_empty(const sys_queue_t * p_queue); + + +/**@brief Macro for iterating through all items in the queue. + * + * @param[in] p_queue Pointer to the queue (sys_queue_t *). + * @param[in] p_iterator Variable to be used as an iterator (sys_queue_item_t *). + */ +#define SYS_QUEUE_FOR_EACH(p_queue, p_iterator) \ + for (sys_queue_item_t * p_iterator = sys_queue_front(p_queue); \ + p_iterator != NULL; \ + p_iterator = sys_queue_next(p_queue, p_iterator)) + +/** @} */ + +#endif // SYS_QUEUE_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_ringbuffer.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_ringbuffer.h new file mode 100644 index 0000000..fcd8277 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_ringbuffer.h @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_RINGBUFFER_H_INCLUDED +#define SYS_RINGBUFFER_H_INCLUDED + +#include <stdint.h> +#include <stdlib.h> +#include <stdbool.h> + +/** @file + * This file contains declarations of the Ring buffer routines and necessary types. Please note that + * each ring buffer element should have size of 1 byte. + * + * @defgroup sys_ringbuffer System Ring buffer API + * @ingroup sys_15_4 + * @{ + * @brief Module for declaring System Ring buffer API. + * @details The Ring Buffer module implements routines to deal with the ring buffer. The following routines are supported: + * sys_ringbuffer_insert(), sys_ringbuffer_remove() to operate with single element. The + * sys_ringbuffer_remove_multiple() can be used to remove (read) several elements at once. The + * sys_ringbuffer_clear(), sys_ringbuffer_init(), and sys_ringbuffer_init_over() functions are used to clean up and + * initialize the ring buffer. Some information about the initialized ring buffer is available via the + * following routines: sys_ringbuffer_size_get() to get the number of used elements, sys_ringbuffer_chunk_get() + * to return the biggest, available to read, continuous chunk of elements, sys_ringbuffer_is_empty() and + * sys_ringbuffer_is_full() to check if the ring buffer is empty/full, and sys_ringbuffer_max_size_get() to get + * the ring buffer capacity. One of the samples for ring buffer usage is the UART implementation. + */ + +/** This structure holds all necessary information about a ring buffer. It is intentionally left undocumented + * by Doxygen. + * + * All these fields are private and must NOT be changed by the user. + */ +typedef struct +{ + size_t write_index; + size_t read_index; + uint8_t * array; + size_t size; + bool is_full; +} sys_ringbuffer_t; + +/** @brief Function for initializing an empty ring buffer over passed memory. + * + * @param[inout] buffer Instance of sys_ringbuffer_t that will be initialized. + * @param[in] memory Start address of the memory region used as a ring buffer. + * @param[in] length Size in bytes of the memory region used as a ring buffer. + */ +void sys_ringbuffer_init(sys_ringbuffer_t * buffer, + const void * memory, + const size_t length); + +/** @brief Function for initializing a ring buffer over passed memory and marking all + * pre_init_length elements as inserted. + * + * @details This function may be used to initialize a buffer with some + * pre-initialized data in it. Passed memory region is interpreted by this function + * as an already filled (partly or fully) ring buffer so that \a pre_init_length + * elements are marked as inserted. + * + * @param[inout] buffer Instance of sys_ringbuffer_t that will be initialized. + * @param[in] memory Start address of the memory region used as a ring buffer. + * @param[in] pre_init_length Number of elements (bytes) that had already been in \a memory. + * They would be inserted into the newly-initialized ring buffer in a FIFO manner. + * @param[in] length Size of the memory region used as a ring buffer. + */ +void sys_ringbuffer_init_over(sys_ringbuffer_t * buffer, + const void * memory, + const size_t pre_init_length, + const size_t length); + +/** @brief Function for removing an element from a ring buffer and returning it. + * + * @param[inout] buf Instance of @c sys_ringbuffer_t. + * + * @return Value of the removed element. + * + * @warning This buffer has no underflow control except assert. + */ +uint8_t sys_ringbuffer_remove(sys_ringbuffer_t * buf); + +/** @brief Function for quickly removing up to chunk_size elements from a ring buffer + * and marking those elements as available in the ring buffer. + * + * @param[inout] buffer Instance of @c sys_ringbuffer_t. + * @param[in] chunk_size Number of elements to release. + */ +void sys_ringbuffer_remove_multiple(sys_ringbuffer_t * buffer, + const size_t chunk_size); + +/** @brief Function for inserting a new element into a ring buffer. + * + * @param[inout] buffer Instance of @c sys_ringbuffer_t. + * @param[in] data Element value to insert. + * + * @warning In case of overflow, this buffer will overwrite the oldest + * element and the number of available elements will remain unchanged. + */ +void sys_ringbuffer_insert(sys_ringbuffer_t * buffer, const uint8_t data); + +/** @brief Function for clearing an instance of \a sys_ringbuffer_t, making it empty. + * + * @param[inout] buffer Instance of @c sys_ringbuffer_t. + */ +void sys_ringbuffer_clear(sys_ringbuffer_t * buffer); + +/** @brief Function for returning the number of used elements in a ring buffer instance. + * + * @param[inout] buf Instance of sys_ringbuffer_t. + * + * @return Number of elements. + */ +size_t sys_ringbuffer_size_get(const sys_ringbuffer_t * buf); + +/** @brief Function for returning the biggest, available to read, continuous chunk from a ring buffer array. + * + * @param[inout] buffer Instance of @c sys_ringbuffer_t. + * @param[out] chunk Pointer to a memory chunk removed from the ring buffer. + * @param[out] chunk_size Size of the removed chunk. + * + * @warning The returned chunk is still part of the ring buffer. To make the chunk elements available + * for write, call @c sys_ringbuffer_remove_multiple() after the chunk is processed. + */ +void sys_ringbuffer_chunk_get(sys_ringbuffer_t * buffer, + void ** chunk, + size_t * chunk_size); + +/** @brief Function for checking whether a ring buffer is empty. + * + * @param[inout] buf Instance of @c sys_ringbuffer_t. + * + * @return True if the ring buffer is empty. + */ +static inline bool sys_ringbuffer_is_empty(const sys_ringbuffer_t * buf) +{ + return ((buf->write_index == buf->read_index) && (!buf->is_full)); +} + +/** @brief Function for checking whether a ring buffer is full. + * + * @param[inout] buf Instance of @c sys_ringbuffer_t. + * + * @return True if number of items in the buffer equals to (length - 1). + */ +static inline bool sys_ringbuffer_is_full(const sys_ringbuffer_t * buf) +{ + return buf->is_full; +} + +/** @brief Function for returning number of elements that can be potentially put into the buffer. + * + * @param[inout] buf Instance of @c sys_ringbuffer_t. + * + * @return Number of elements. + */ +static inline size_t sys_ringbuffer_max_size_get(const sys_ringbuffer_t * buf) +{ + return buf->size; +} + +/** @} */ + +#endif /* SYS_RINGBUFFER_H_INCLUDED */ diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_slab_allocator.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_slab_allocator.h new file mode 100644 index 0000000..006f7d2 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_slab_allocator.h @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_SLAB_ALLOCATOR_H_INCLUDED +#define SYS_SLAB_ALLOCATOR_H_INCLUDED + +#include "phy_pd_data.h" + +#ifndef CONFIG_SLAB_FRAME_POOL_SIZE +#define CONFIG_SLAB_FRAME_POOL_SIZE 4 +#warning "CONFIG_SLAB_FRAME_POOL_SIZE not set in .config, using default" +#endif + +/** @file + * This file contains declarations of the SLAB allocator API. + * + * @defgroup sys_slab_allocator SLAB Allocator API + * @ingroup sys_15_4 + * @{ + * @brief Module for declaring the SLAB Allocator API + */ + +/**@brief The SLAB allocator buffer type (free or busy buffer). + */ +typedef enum +{ + SYS_SLAB_FREE_BUFFER, /**< The buffer is free */ + SYS_SLAB_BUSY_BUFFER, /**< The buffer is busy */ +} sys_slab_buffer_type_t; + +/**@brief Initializes the SLAB allocator. + * + * @details Preallocates the frame pool + */ +void sys_sa_init(void); + +/**@brief Resets the SLAB allocator. + * + * @details Clear allocated the frame pools + */ +void sys_sa_reset(void); + +/**@brief Inserts item into one of the queues of the SLAB allocator. + * + * @details This function is used to put the item into the SLAB allocator + * queue. Type of buffer shall be chosen. + * + * @param[in] type Type of an inserted buffer (free or busy). + * @param[in] p_item Pointer to an inserted buffer. + */ +void sys_sa_buffer_put(sys_slab_buffer_type_t type, pd_data_ind_t * p_item); + +/**@brief Gets item from one of the queues of the SLAB allocator. + * + * @details This function is used to get the item from the SLAB allocator + * queues. Type of buffer shall be chosen. The buffer is deleted + * from the SLAB allocator + * + * @param[in] type Type of a gotten buffer (free or busy). + * + * @retval Pointer to a gotten buffer in case of success. NULL otherwise. + */ +pd_data_ind_t * sys_sa_buffer_get(sys_slab_buffer_type_t type); + +/**@brief Deletes an allocated item from the heap. + * + * @details This function is used to delete allocated by SLAB allocator buffer + * from the heap. Pointer to a frame memory of an allocated item shall be used. + * + * @param[in] p_frame Pointer to a frame memory of an allocated item. + */ +void sys_sa_buffer_free(uint8_t * p_frame); + +/**@brief Returns buffer back to queue of free buffers. + * + * @details This function is used to return allocated buffer back to the queue + * without allocation and deallocation. + * + * @param[in] p_item Pointer to an allocated item. + */ +void sys_sa_buffer_release(pd_data_ind_t * p_item); + +/**@brief Allocates memory for the queue of free buffers. + * + * @details This function is used to allocate buffer from heap + * and put them into the queue + * + * @retval True in case of success. False otherwise. + */ +bool sys_sa_memory_allocate(void); + +/**@brief Checks if there are any buffers in the SLAB allocator queue or not. + * + * @details Type of checked buffers shall be passed. + * + * @param[in] type Type of an checked buffers (free or busy). + * + * @retval True in case of absence of buffers. False otherwise. + */ +bool sys_sa_is_empty(sys_slab_buffer_type_t type); + +/** @} */ + +#endif /* SYS_SLAB_ALLOCATOR_H_INCLUDED */ diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_sleep.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_sleep.h new file mode 100644 index 0000000..0174ac4 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_sleep.h @@ -0,0 +1,155 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_SLEEP_H_INCLUDED +#define SYS_SLEEP_H_INCLUDED + +#include <stdint.h> +#include "sys_events.h" +#include "hal_sleep.h" + + +/** @file + * + * @defgroup sys_sleep Falling Asleep API + * @ingroup sys_15_4 + * @{ + * @brief Module for declaring the Falling Asleep API. + * @details Because additional preparation may be required to be done by user modules, + * prior to putting hardware into the sleep mode, a notification and approval mechanism + * is provided to the user. + * Each module that wants to be notified about the "falling asleep" event, has to subscribe + * to the HAL_EVENT_FALLING_ASLEEP event, using sys_sleep_approver_register(), and to + * get the unique approver's ID value. + * In the handler of the HAL_EVENT_FALLING_ASLEEP event, the module is able to perform + * the required preparation before falling asleep, and to approve the falling asleep request, + * using the module unique approver ID, after all preparation to sleep is finished. + * The hardware will fall asleep only after all the registered approvers + * approve the fall asleep request. + */ + +/**@brief Approver ID typedef. + */ +typedef uint8_t sys_sleep_approver_id_t; + + +/* Sanity check for CONFIG_MAX_SLEEP_APPROVERS + */ +#if (!defined(CONFIG_MAX_SLEEP_APPROVERS)) +# error "CONFIG_MAX_SLEEP_APPROVERS must be defined in config file" +#elif (CONFIG_MAX_SLEEP_APPROVERS >= 256) +# error "CONFIG_MAX_SLEEP_APPROVERS must be less than 256" +#endif + + +/**@brief Function for initializing the system sleep module. + * + * @details This function must be called before any usage of the System Sleep module. + */ +void sys_sleep_init(void); + + +/**@brief Function for registering the approver of the system sleep request. + * + * @details After the sleep approver is registered with this function, the hardware will + * not fall asleep without its approval. + * + * @param[in] p_event_falling_asleep Event descriptor, which will handle + * the SYS_EVENT_FALLING_ASLEEP event. + * @param[in] p_event_wake_up Event descriptor, which will handle + * the SYS_EVENT_WAKE_UP event. + * + * @retval The unique approver ID, reserved for this newly-registered approver. + * This ID will be required to approve system sleep requests by this approver module. + */ +sys_sleep_approver_id_t sys_sleep_approver_register( + sys_event_desc_t * p_event_falling_asleep, + sys_event_desc_t * p_event_wake_up); + + +/**@brief Function for unregistering the approver of the system sleep request. + * + * @details After the approver is unregistered, its approval will not be + * required to put the system into sleep mode. + * + * @param[in] approver_id The unique approver ID to be unregistered. + * @param[in] p_event_falling_asleep Event descriptor to unsubscribe from + * the SYS_EVENT_FALLING_ASLEEP event. + * @param[in] p_event_wake_up Event descriptor to unsubscribe from + * the SYS_EVENT_WAKE_UP event. + */ +void sys_sleep_approver_unregister( + sys_sleep_approver_id_t approver_id, + sys_event_desc_t * p_event_falling_asleep, + sys_event_desc_t * p_event_wake_up); + + +/**@brief Function for approving the system sleep request. + * + * @details This function is to be called by the registered approver + * in order to approve putting the system into the sleep mode. + * + * @param[in] approver_id The unique approver ID. + */ +void sys_sleep_approve(sys_sleep_approver_id_t approver_id); + + +/**@brief Function for requesting the system to safely enter into sleep mode. + * + * @details This function notifies all the registered sleep approvers with the + * HAL_EVENT_FALLING_ASLEEP event, allowing them to perform all the needed preparation + * before the hardware falls asleep. The hardware will enter sleep mode only after + * all registered approvers approve the fall asleep request. + * + * @param[in] sleep_time_ms Defines sleep time in ms. + */ +void sys_sleep_request_ms(uint32_t sleep_time_ms); + + +/**@brief Function for getting information about the wakeup reason. + * + * @retval hal_wakeup_reason Interrupt source which was the wakeup reason. + */ +hal_wakeup_reason_t sys_sleep_wakeup_reason(void); + +/** @} */ + +#endif // SYS_SLEEP_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_task_scheduler.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_task_scheduler.h new file mode 100644 index 0000000..201b931 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_task_scheduler.h @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_TASK_SCHEDULER_H_INCLUDED +#define SYS_TASK_SCHEDULER_H_INCLUDED + +#include <stdint.h> +#include <stdbool.h> +#include "sys_utils.h" +#include "hal_atomic.h" +#include "sys_events.h" + +/** @file + * @defgroup sys_task_scheduler Task scheduler + * @ingroup sys_15_4 + * @{ + * @brief Module for task scheduling. + */ + +/**@brief Identificators for registered handlers. + * + * Handlers will be called from the task scheduler. + */ +typedef enum +{ + PHY_TASK_ID, + HAL_TASK_ID, +#if (CONFIG_HIGHEST_LAYER_PHY == 0) + MAC_TASK_ID, +#endif + APP_TASK_ID, + SYS_TASK_ID, + SYS_TASKS_AMOUNT +} sys_task_ids_t; + +/**@brief Prototype of a task handler. + * + * @details Handler which will be called by the scheduler. + */ +typedef void (* sys_task_handler_t)(void); + +/**@brief Pending tasks. + * + * @details Variable which includes markers of pending tasks. + */ +extern volatile uint_fast16_t g_tasks; + +/**@brief Notify task scheduler to add a task for execution. + * + * @details The function sets a marker for the task for execution. + * The task handler implements a tree architecture. + * Task handler of each layer includes handlers of the layer's components. + * + * @param[in] task_id Task identificator. + */ +static inline void sys_task_post(sys_task_ids_t task_id) +{ + atomic_t atomic = 0; + + hal_atomic_start(&atomic); + g_tasks |= BIT(task_id); +#if (CONFIG_USE_SYS_TASK_NOTIFIER == 1) + sys_event_post(SYS_EVENT_NEW_TASK, NULL); +#endif + hal_atomic_end(&atomic); +} + +/**@brief Returns true, if there are any event flags awaiting in the system scheduler. + */ +static inline bool sys_tasks_pending(void) +{ + return g_tasks != 0; +} + +/**@brief Handle tasks in the main function. + * + * @details Handle tasks in the main function. + */ +void sys_task_run(void); + +/** @} */ + +#endif // SYS_TASK_SCHEDULER_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_time.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_time.h new file mode 100644 index 0000000..00155b3 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_time.h @@ -0,0 +1,180 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_TIME_H_INCLUDED +#define SYS_TIME_H_INCLUDED + +#include <stdint.h> +#include "sys_queue.h" + +/** @file + * This file contains declarations of the primitives to work with Time (timers) and necessary types. + * + * @defgroup sys_time Time API + * @ingroup sys_15_4 + * @{ + * @brief Module for declaring Time API. + * @details The system time module implements some routines to deal with time (timers). The timer can be started by + * sys_timer_start(), stopped by sys_timer_stop(), and adjusted after sleep by sys_timer_adjust(). Some + * information can be acquired by sys_timer_is_started() and sys_time_get(). The correct API for implementing hardware + * delays is sys_time_delay_us(). Note that the module must be initialized by sys_timers_init() which + * is done by sys_init(). + */ + +/**@brief Unsigned type of system time. + */ +typedef uint64_t sys_time_t; + +/**@brief Signed type of system time. + */ +typedef int64_t sys_signed_time_t; + +/**@brief Prototype of the user-defined timer callback. + * + * @param p_data Pointer to the data, specific for this callback. + */ +typedef void (* sys_timer_callback_t)(void * p_data); + + +/**@brief System timer type (one-shot or periodic timer). + */ +typedef enum +{ + SYS_TIMER_ONESHOT, /**< The timer is Oneshot */ + SYS_TIMER_PERIODIC /**< The timer is Periodic */ +} sys_timer_type_t; + + +/**@brief Timer descriptor. + */ +typedef struct +{ + /** Service field. */ + sys_queue_item_t item; + + /** Service field. */ + sys_time_t absolute_time; + + /** Relevant time moment, at which this timer is programmed to be triggered, + * measured in microseconds. + */ + sys_time_t interval; + + /** Periodic or one-shot timer. + * + * @details If type is set to SYS_TIMER_PERIODIC, the timer will restart automatically + * with the same period. + */ + sys_timer_type_t type; + + /** Timer callback function. + * + * @details This function is to be called, when this timer triggers. + */ + sys_timer_callback_t callback; + + /** Timer callback parameter. + * + * @details This pointer is to be passed to the timer callback function. + */ + void * p_data; +} sys_timer_t; + + +/**@brief Function for initializing the timers module. + */ +void sys_timers_init(void); + + +/**@brief Function for starting the timer. + * + * @details See the description of \ref sys_timer_t fields for the details + * on how to program the timer. + * + * @param[in] p_timer Pointer to a valid timer descriptor, which is filled by the user, + * according to \ref sys_timer_t fields description. + */ +void sys_timer_start(sys_timer_t * p_timer); + + +/**@brief Function for stopping the timer. + * + * @details This function is used to stop the timer, which was started earlier. + * After this function is called, the timer will not fire. + * + * @param[in] p_timer Pointer to a valid timer descriptor. + */ +void sys_timer_stop(sys_timer_t * p_timer); + + +/**@brief Function for checking if input timer has been started. + * + * @param[in] p_timer Pointer to a timer. + * + * @retval true p_timer has been started and has not been stopped yet. + * @retval false p_timer has never been started or already timed out. + */ +bool sys_timer_is_started(sys_timer_t * p_timer); + + +/**@brief Function for getting the current system time. + * + * @retval The current system timer counter value in microseconds. + */ +sys_time_t sys_time_get(void); + + +/**@brief Function for implementing a delay for short hardware delays. + * + * @warning Interrupts are NOT disabled inside this function. + * + * @param[in] delay_us Number of microseconds to delay. + */ +void sys_time_delay_us(uint32_t delay_us); + + +/**@brief Function for executing expired timers after sleep. + */ +void sys_timer_adjust(void); + +/** @} */ + +#endif // SYS_TIME_H_INCLUDED diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_utils.h b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_utils.h new file mode 100644 index 0000000..d577292 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/components/802_15_4/api/SysAL/sys_utils.h @@ -0,0 +1,541 @@ +/** + * Copyright (c) 2016 - 2018 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh. + * + * 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 SYS_UTILS_H_INCLUDED +#define SYS_UTILS_H_INCLUDED + +#include <stdint.h> +#include <stddef.h> +#include <string.h> +#if (defined(__GNUC__) && !defined(__SES_ARM)) +#include <strings.h> +#endif +#ifdef __MINGW32__ +#define ffs __builtin_ffs +#endif + +/** @file + * This file contains definitions of useful macros and types. + * + * @defgroup sys_utils System Utilities API + * @ingroup sys_15_4 + * @{ + * @brief Module to declare System Utilities API. + * @details The System Utilities module implements multiple useful macros and inlines for the whole stack. Including + * this header you will get access to GET_PARENT_BY_FIELD(), FIELD_SIZE() to work with complex structures, + * ARRAY_SIZE() for arrays, mathematics macros like IMP(), LL_MIN(), LL_MAX(), CEIL(), ROUND(), Bitmap helpers + * and many others. The variable arguments support macros are also defined here. Some SWAP routines are implemented + * by this module as well. + */ + +/**@brief Returns the pointer to the data structure + * + * @param[in] struct_type name of the parent structure + * @param[in] field_name name of the structure field + * @param[in] field_pointer pointer to the structure field + * + * @retval Pointer to the parent structure which includes the field. + */ +#define GET_PARENT_BY_FIELD(struct_type, field_name, field_pointer) \ + ((struct_type*)(void*)(((uint8_t*)field_pointer) - offsetof(struct_type, field_name))) + + +/**@brief Returns the implication of two given expressions x and y. + * @details The implication means: if X==TRUE then Y==TRUE. + * The formula is: (X imp Y) = ((not X) or Y) + */ +#define IMP(x, y) ( !(x) || (y) ) + + +/**@brief Returns the minimum of two given expressions x and y. + */ +#define LL_MIN(x, y) ( ((x) < (y)) ? (x) : (y) ) + + +/**@brief Returns the maximum of two given expressions x and y. + */ +#define LL_MAX(x, y) ( ((x) > (y)) ? (x) : (y) ) + + +/**@brief Returns the quotient of a divided by b rounded upwards to the nearest + * integer. + */ +#define CEIL(a, b) ((a) ? (((a) - 1U) / (b) + 1U) : 0U) + + +/**@brief Returns the quotient of a divided by b rounded to the nearest integer + * according to the standard arithmetic rules: if the fractional part of (a/b) is greater + * or equal to 0.5 then the result is rounded upwards; if the fractional part of (a/b) is + * less then 0.5 the result is rounded downwards. + * + * @note Use this formula only for unsigned arguments. The formula is not compatible with + * the signed arguments: when a and b have different signs it gives incorrect result. + */ +#define ROUND(a, b) ( ((a) + ((b) >> 1)) / (b) ) + + +/**@brief Declares a long bitmap named name of size bits. The size is rounded + * upwards to come a multiple of 8. + */ +#define BITMAP_DECLARE(name, size) uint8_t name[CEIL(size, 8)] + +/**@brief Clears all bits in given bitmap. + */ +#define BITMAP_RESET(name) memset((name), 0U, sizeof(name)) + +/**@brief Returns the value of a bit at position bit in the long bitmap named name. + */ +#define BITMAP_ISSET(name, bit) ( 0 != ((name)[(bit) >> 3] & (1 << ((bit) & 0x7))) ) + +/**@brief Sets the bit at position bit in the long bitmap named name. + */ +#define BITMAP_SET(name, bit) (name)[(bit) >> 3] |= (1 << ((bit) & 0x7)) + +/**@brief Clears the bit at position bit in the long bitmap named name. + */ +#define BITMAP_CLR(name, bit) (name)[(bit) >> 3] &= ~(1 << ((bit) & 0x7)) + +/**@brief Assigns the given bitmap with the second bitmap. + */ +#define BITMAP_ASSIGN(nameDst, nameSrc) memcpy((nameDst), (nameSrc), sizeof(nameDst)) + +/**@brief Compares two bitmaps and returns zero if they are equal. + */ +#define BITMAP_EQUAL(name1, name2) ((sizeof(name1) == sizeof(name2)) && \ + (memcmp((name1), (name2), sizeof(name1)) == 0)) + +/**@brief Checks number. Return true if number is power of two. + */ +#define LL_IS_POWER_OF_TWO(name) ((0 != (name)) && (0 == ((name)&(name - 1)))) + +/**@brief Return True if mask is fully included into a given set and False otherwise + */ +#define IS_SUBSET_OF(mask, set) ((mask) == ((set) & (mask))) + +/**@brief Creates a bit mask with single set bit on the specified position. + */ +#define BIT(pos) (1UL << (pos)) + +/**@brief Gets the given bit in the given value + */ +#define BIT_GET(val, pos) ((((uint32_t)val) & BIT(pos)) != 0) + +/**@brief Sets or clears the given bit in the given value + */ +#define BIT_SET(val, pos, bit) { \ + if (bit) \ + { \ + val |= BIT(pos); \ + } \ + else \ + { \ + val &= ~BIT(pos); \ + } \ + } + +/**@brief Returns two to the income power.*/ +#define POWER2(n) (1ULL << (n)) + +/**@brief Creates a bit mask of specified length. + */ +#define BIT_MASK(len) (BIT(len) - 1UL) + +/**@brief Creates a bit field mask of specified length and start position. + */ +#define BIT_FIELD_MASK(start, len) (BIT_MASK(len) << (start)) + +/**@brief Creates a bit field mask of specified length, start position and value. + */ +#define BIT_FIELD_VALUE(value, start, len) (((value) & BIT_MASK(len)) << (start)) + +/**@brief Extracts a bit field value of specified start position and length. + */ +#define GET_BITFIELD_VALUE(bitmask, start, len) (((bitmask) >> (start)) & BIT_MASK(len)) + +/**@brief Inserts a bit field value with specified start position and length. + */ +#define SET_BITFIELD_VALUE(bitmask, start, len, value) \ + (bitmask = (bitmask & ~BIT_FIELD_MASK(start, len)) | BIT_FIELD_VALUE(value, start, len)) + +/**@brief Extracts a mask from a BITMAP. + * BITMAP MUST be aligned and mask length MUST be one of 2, 4, 8, 16, 32. + */ +#define BITMAP_MASK_GET(bitmap, bit, len) \ + GET_BITFIELD_VALUE(((uint32_t*)(bitmap))[(bit) >> 5], (bit) & 0x1F, len) + +/**@brief Sets up a mask to a BITMAP. + * BITMAP MUST be aligned and mask length MUST be one of 2, 4, 8, 16, 32. + */ +#define BITMAP_MASK_SET(bitmap, bit, len, value) \ + SET_BITFIELD_VALUE(((uint32_t*)(bitmap))[(bit) >> 5], (bit) & 0x1F, len, value) + +/**@brief Gets amount of the arguments. + */ +#define VA_NARGS(...) VA_NARGS_EVAL(__VA_ARGS__) +#define VA_NARGS_EVAL(...) VA_NARGS_IMPL(__VA_ARGS__, \ + /* 255, 254, */ 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, \ + 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, \ + 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, \ + 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, \ + 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, \ + 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, \ + 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, \ + 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, \ + 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, \ + 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, \ + 095, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, \ + 079, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, \ + 063, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, \ + 047, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, \ + 031, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, \ + 015, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) + +/**@brief Helper macro. Gets amount of the arguments. + */ +#define VA_NARGS_IMPL(_________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, _63, \ + __64, _65, _66, _67, _68, _69, _70, _71, \ + _72, _73, _74, _75, _76, _77, _78, _79, \ + __80, _81, _82, _83, _84, _85, _86, _87, \ + _88, _89, _90, _91, _92, _93, _94, _95, \ + __96, _97, _98, _99, _100, _101, _102, _103, \ + _104, _105, _106, _107, _108, _109, _110, _111, \ + _112, _113, _114, _115, _116, _117, _118, _119, \ + _120, _121, _122, _123, _124, _125, _126, _127, \ + _128, _129, _130, _131, _132, _133, _134, _135, \ + _136, _137, _138, _139, _140, _141, _142, _143, \ + _144, _145, _146, _147, _148, _149, _150, _151, \ + _152, _153, _154, _155, _156, _157, _158, _159, \ + _160, _161, _162, _163, _164, _165, _166, _167, \ + _168, _169, _170, _171, _172, _173, _174, _175, \ + _176, _177, _178, _179, _180, _181, _182, _183, \ + _184, _185, _186, _187, _188, _189, _190, _191, \ + _192, _193, _194, _195, _196, _197, _198, _199, \ + _200, _201, _202, _203, _204, _205, _206, _207, \ + _208, _209, _210, _211, _212, _213, _214, _215, \ + _216, _217, _218, _219, _220, _221, _222, _223, \ + _224, _225, _226, _227, _228, _229, _230, _231, \ + _232, _233, _234, _235, _236, _237, _238, _239, \ + _240, _241, _242, _243, _244, _245, _246, _247, \ + _248, _249, _250, _251, _252, _253, /* _254, _255, */\ + N, ...) N + +/**@brief Gets amount of the arguments. Execute by compiler. + */ +#define VA_NARGS_COMPILE_TIME(...) ((uint8_t)(sizeof((uint8_t[]){ __VA_ARGS__ })/sizeof(uint8_t))) + +/**@brief Swaps values. + */ +#define SWAP_XOR(a, b) \ + do \ + { \ + (((b) ^= (a) ^= (b), (a) ^= (b))); \ + } while(0); + +/**@brief Compare two number and take care of overflow threshold limit. + */ +#define COMPARE_WITH_THRESHOLD(a, b, threshold) \ + (((LL_MAX((a), (b)) - LL_MIN((a), (b))) < (threshold)) ? ((a) >= (b) ? 1 : 0) : ((a) > (b) ? 0 : 1)) + + +#define ROUND_MASK(a) ((a) - 1) +#define ROUND_UP(x, a) (((x) + ROUND_MASK(a)) & ~ROUND_MASK(a)) +#define ROUND_DOWN(x, a) ((x) & ~ROUND_MASK(a)) + +/**@brief Dereferences input pointer \a y as a type \a x. + * + * @param[in] x type name. + * @param[in] y pointer name. + */ +#define DEREF_VOID_PTR_AS(x, y) (*(x *)y) + +/**@brief Extends some bit value to the left extending 2's complement value + * to 8-bit length. + * + * @param[out] result variable, where result is store to. + * @param[in] x input value. + * @param[in] sign_pos an integer in range 2..6 specifying bit position of sign bit. + */ +#define SIGN_EXTENSION(result, x, sign_pos) \ + do \ + { \ + result = x & (1 << sign_pos) ? \ + x | (~((1 << (sign_pos + 1)) - 1)) : \ + x & ((1 << (sign_pos + 1)) - 1); \ + } while (0) + +/**@brief Clears some most significant bits of integer value reducing it precision. + * Name and interface of the macro emphasizes complementary action to #SIGN_EXTENSION. + * + * @param[out] result variable, where result is store to. + * @param[in] x input value. + * @param[in] sign_pos an integer in range 2..6 specifying bit position of sign bit. + */ +#define SIGN_COMPRESSION(result, x, sign_pos) \ + do \ + { \ + result = x & ((1 << (sign_pos + 1)) - 1); \ + } while (0) + +/************************* PROTOTYPES **************************************************/ +/**@brief Swaps values of two bytes. + * + */ +static inline void SWAP8(uint8_t * const x, uint8_t * const y) +{ + uint8_t _x = *x; + *x = *y; + *y = _x; +} + +/**@brief Swaps values of two double words (DWORD). + * + */ +static inline void SWAP32(uint32_t * const x, uint32_t * const y) +{ + uint32_t _x = *x; + *x = *y; + *y = _x; +} + +/**@brief Swaps values of two arrays. + * + * @param[inout] x array pointer + * @param[inout] y array pointer + * @param[in] length amount of bytes to swap + */ +static inline void SWAP_ARRAYS(void * x, void * y, uint32_t length) +{ + uint8_t *_x = (uint8_t *)(void *)x; + uint8_t *_y = (uint8_t *)(void *)y; + if (0x0 == ((((size_t)_x) | ((size_t)_y)) & 0x3)) + { + size_t len4 = length / sizeof(uint32_t); + for (size_t i = 0; i < len4; i++) + { + SWAP32((uint32_t*)_x, (uint32_t*)_y); + _x += sizeof(uint32_t); + _y += sizeof(uint32_t); + } + length &= 0x3; + } + + for (size_t i = 0; i < length; i++) + { + SWAP8(_x, _y); + _x++; + _y++; + } +} + + +/**@brief Find the first bit of the bitmap with the given value + * (one or zero, as specified). + * + * @param[in] p_bitmap Pointer to bitmap. + * @param[in] bitmap_size Number of bits in the bitmap. + * @param[in] bit_value The bit value to find (one or zero). + * + * @retval Bit position of the bit with specified value, or bitmap_size if no such bit + * was found. + */ +static inline size_t bitmap_find_bit(uint8_t * p_bitmap, size_t bitmap_size, uint8_t bit_value) +{ +#if (defined(__GNUC__) && !defined(__SES_ARM)) + if (bitmap_size <= 32) + { + uint32_t bitmap; + memcpy(&bitmap, p_bitmap, sizeof(uint32_t)); + if (!bit_value) + { + bitmap ^= 0xFFFFFFFF; + } + size_t result = ffs(bitmap); + if (result == 0 || result > bitmap_size) + { + return bitmap_size; + } + // built-in ffs implementation gives ffs(1) = 1, not 0 + return result - 1; + } + else +#endif + { + for (size_t i = 0; i < bitmap_size; i++) + { + if (BITMAP_ISSET(p_bitmap, i) == bit_value) + { + return i; + } + } + return bitmap_size; + } +} + +/**@brief Reverse the elements of array + * + * @param[in] ptr Pointer to array. + * @param[in] len Length of array. + */ +static inline void array_reverse(uint8_t * ptr, size_t len) +{ + for (size_t i = 0; i < len/2; i++) + { + SWAP_XOR(ptr[i], ptr[len - 1 - i]); + } +} + +/**@brief Returns least significant byte of word. + */ +#define LSB_WORD(x) ((uint8_t)(x & 0xFF)) + +/**@brief Returns least significant byte of halfword. + */ +#define LSB_HWORD(x) LSB_WORD(x) + +/**@brief Returns most significant byte of halfword. + */ +#define MSB_HWORD(x) ((uint8_t)(x >> 8)) + +#define ALIGN_VALUE (sizeof(size_t)) + +/**@brief Compiler-independent definitions. + */ +#if defined ( __CC_ARM ) + + #ifndef __WEAK + #define __WEAK __weak + #endif + + #ifndef PACK + #define PACK __attribute__ ((packed)) + #endif + + #ifndef BEGIN_PACK + #define BEGIN_PACK + #endif + + #ifndef END_PACK + #define END_PACK + #endif + +#ifndef __ALIGN + #define __ALIGN(n) __align(n) +#endif + +#elif defined ( __ICCARM__ ) + + #ifndef __WEAK + #define __WEAK __weak + #endif + + #ifndef PACK + #define PACK + #endif + + #ifndef BEGIN_PACK + #define BEGIN_PACK _Pragma("pack(push, 1)") + #endif + + #ifndef END_PACK + #define END_PACK _Pragma("pack(pop)") + #endif + +#ifndef __ALIGN + #define __ALIGN(n) +#endif + +#elif defined ( __GNUC__ ) + + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + + #ifndef PACK + #define PACK __attribute__ ((packed)) + #endif + + #ifndef BEGIN_PACK + #define BEGIN_PACK _Pragma("pack(push,1)") + + #endif + + #ifndef END_PACK + #define END_PACK _Pragma("pack(pop)") + #endif + +#ifndef __ALIGN + #define __ALIGN(n) __attribute__((aligned(n))) +#endif + +#elif defined ( __TASKING__ ) + + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + + #ifndef PACK + #define PACK __attribute__ ((packed)) + #endif + + #ifndef BEGIN_PACK + #define BEGIN_PACK + #endif + + #ifndef END_PACK + #define END_PACK + #endif + +#ifndef __ALIGN + #define __ALIGN(n) __align(n) +#endif + +#endif + +/** @} */ + +#endif /* SYS_UTILS_H_INCLUDED */ |