/* Copyright (c) 2016, Nordic Semiconductor ASA
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright notice, this
 *      list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

/**
 * @file
 * @brief RADIO HAL API.
 */

#ifndef NRF_RADIO_H__
#define NRF_RADIO_H__
/**
 * @defgroup nrf_radio_hal RADIO HAL
 * @{
 * @ingroup nrf_radio
 * @brief Hardware access layer for managing the radio (RADIO).
 */

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "nrf.h"

#ifdef __cplusplus
extern "C" {
#endif

#define NRF_RADIO_TASK_SET    (1UL)
#define NRF_RADIO_EVENT_CLEAR (0UL)
/**
 * @enum nrf_radio_task_t
 * @brief RADIO tasks.
 */
typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */
{
    NRF_RADIO_TASK_TXEN      = offsetof(NRF_RADIO_Type, TASKS_TXEN),      /**< Enable radio transmitter. */
    NRF_RADIO_TASK_RXEN      = offsetof(NRF_RADIO_Type, TASKS_RXEN),      /**< Enable radio receiver. */
    NRF_RADIO_TASK_START     = offsetof(NRF_RADIO_Type, TASKS_START),     /**< Start radio transmission or reception. */
    NRF_RADIO_TASK_STOP      = offsetof(NRF_RADIO_Type, TASKS_STOP),      /**< Stop radio transmission or reception. */
    NRF_RADIO_TASK_DISABLE   = offsetof(NRF_RADIO_Type, TASKS_DISABLE),   /**< Disable radio transmitter and receiver. */
    NRF_RADIO_TASK_CCASTART  = offsetof(NRF_RADIO_Type, TASKS_CCASTART),  /**< Start Clear Channel Assessment procedure. */
    NRF_RADIO_TASK_CCASTOP   = offsetof(NRF_RADIO_Type, TASKS_CCASTOP),   /**< Stop Clear Channel Assessment procedure. */
    NRF_RADIO_TASK_EDSTART   = offsetof(NRF_RADIO_Type, TASKS_EDSTART),   /**< Start Energy Detection procedure. */
    NRF_RADIO_TASK_RSSISTART = offsetof(NRF_RADIO_Type, TASKS_RSSISTART), /**< Start the RSSI and take one single sample of received signal strength. */
} nrf_radio_task_t;                                                       /*lint -restore */

/**
 * @enum nrf_radio_event_t
 * @brief RADIO events.
 */
typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */
{
    NRF_RADIO_EVENT_READY      = offsetof(NRF_RADIO_Type, EVENTS_READY),      /**< Radio has ramped up and is ready to be started. */
    NRF_RADIO_EVENT_ADDRESS    = offsetof(NRF_RADIO_Type, EVENTS_ADDRESS),    /**< Address sent or received. */
    NRF_RADIO_EVENT_END        = offsetof(NRF_RADIO_Type, EVENTS_END),        /**< Packet transmitted or received. */
    NRF_RADIO_EVENT_DISABLED   = offsetof(NRF_RADIO_Type, EVENTS_DISABLED),   /**< Radio has been disabled. */
    NRF_RADIO_EVENT_CRCOK      = offsetof(NRF_RADIO_Type, EVENTS_CRCOK),      /**< Packet received with correct CRC. */
    NRF_RADIO_EVENT_CRCERROR   = offsetof(NRF_RADIO_Type, EVENTS_CRCERROR),   /**< Packet received with incorrect CRC. */
    NRF_RADIO_EVENT_CCAIDLE    = offsetof(NRF_RADIO_Type, EVENTS_CCAIDLE),    /**< Wireless medium is idle. */
    NRF_RADIO_EVENT_CCABUSY    = offsetof(NRF_RADIO_Type, EVENTS_CCABUSY),    /**< Wireless medium is busy. */
    NRF_RADIO_EVENT_RSSIEND    = offsetof(NRF_RADIO_Type, EVENTS_RSSIEND),    /**< Sampling of receive signal strength complete. */
    NRF_RADIO_EVENT_MHRMATCH   = offsetof(NRF_RADIO_Type, EVENTS_MHRMATCH),   /**< MAC Header match found. */
    NRF_RADIO_EVENT_FRAMESTART = offsetof(NRF_RADIO_Type, EVENTS_FRAMESTART), /**< IEEE 802.15.4 length field received. */
    NRF_RADIO_EVENT_EDEND      = offsetof(NRF_RADIO_Type, EVENTS_EDEND),      /**< Energy Detection procedure ended. */
    NRF_RADIO_EVENT_BCMATCH    = offsetof(NRF_RADIO_Type, EVENTS_BCMATCH),    /**< Bit counter reached bit count value. */
} nrf_radio_event_t;                                                          /*lint -restore */

/**
 * @enum nrf_radio_int_mask_t
 * @brief RADIO interrupts.
 */
typedef enum
{
    NRF_RADIO_INT_READY_MASK      = RADIO_INTENSET_READY_Msk,      /**< Mask for enabling or disabling an interrupt on READY event.  */
    NRF_RADIO_INT_ADDRESS_MASK    = RADIO_INTENSET_ADDRESS_Msk,    /**< Mask for enabling or disabling an interrupt on ADDRESS event. */
    NRF_RADIO_INT_END_MASK        = RADIO_INTENSET_END_Msk,        /**< Mask for enabling or disabling an interrupt on END event. */
    NRF_RADIO_INT_DISABLED_MASK   = RADIO_INTENSET_DISABLED_Msk,   /**< Mask for enabling or disabling an interrupt on DISABLED event. */
    NRF_RADIO_INT_CRCOK_MASK      = RADIO_INTENSET_CRCOK_Msk,      /**< Mask for enabling or disabling an interrupt on CRCOK event. */
    NRF_RADIO_INT_CRCERROR_MASK   = RADIO_INTENSET_CRCERROR_Msk,   /**< Mask for enabling or disabling an interrupt on CRCERROR event. */
    NRF_RADIO_INT_CCAIDLE_MASK    = RADIO_INTENSET_CCAIDLE_Msk,    /**< Mask for enabling or disabling an interrupt on CCAIDLE event. */
    NRF_RADIO_INT_CCABUSY_MASK    = RADIO_INTENSET_CCABUSY_Msk,    /**< Mask for enabling or disabling an interrupt on CCABUSY event. */
    NRF_RADIO_INT_RSSIEND_MASK    = RADIO_INTENSET_RSSIEND_Msk,    /**< Mask for enabling or disabling an interrupt on RSSIEND event. */
    NRF_RADIO_INT_FRAMESTART_MASK = RADIO_INTENSET_FRAMESTART_Msk, /**< Mask for enabling or disabling an interrupt on FRAMESTART event. */
    NRF_RADIO_INT_EDEND_MASK      = RADIO_INTENSET_EDEND_Msk,      /**< Mask for enabling or disabling an interrupt on EDEND event. */
    NRF_RADIO_INT_BCMATCH_MASK    = RADIO_INTENSET_BCMATCH_Msk,    /**< Mask for enabling or disabling an interrupt on BCMATCH event. */
} nrf_radio_int_mask_t;

/**
 * @enum nrf_radio_short_mask_t
 * @brief Types of RADIO shortcuts.
 */
typedef enum
{
    NRF_RADIO_SHORT_READY_START_MASK        = RADIO_SHORTS_READY_START_Msk,        /**< Mask for setting shortcut between EVENT_READY and TASK_START. */
    NRF_RADIO_SHORT_ADDRESS_RSSISTART_MASK  = RADIO_SHORTS_ADDRESS_RSSISTART_Msk,  /**< Mask for setting shortcut between EVENT_ADDRESS and TASK_RSSISTART. */
    NRF_RADIO_SHORT_END_DISABLE_MASK        = RADIO_SHORTS_END_DISABLE_Msk,        /**< Mask for setting shortcut between EVENT_END and TASK_DISABLE. */
    NRF_RADIO_SHORT_END_START_MASK          = RADIO_SHORTS_END_START_Msk,          /**< Mask for setting shortcut between EVENT_END and TASK_START. */
    NRF_RADIO_SHORT_CCAIDLE_TXEN_MASK       = RADIO_SHORTS_CCAIDLE_TXEN_Msk,       /**< Mask for setting shortcut between EVENT_CCAIDLE and TASK_TXEN. */
    NRF_RADIO_SHORT_DISABLED_TXEN_MASK      = RADIO_SHORTS_DISABLED_TXEN_Msk,      /**< Mask for setting shortcut between EVENT_DISABLED and TASK_TXEN. */
    NRF_RADIO_SHORT_FRAMESTART_BCSTART_MASK = RADIO_SHORTS_FRAMESTART_BCSTART_Msk, /**< Mask for setting shortcut between EVENT_FRAMESTART and TASK_BCSTART. */
} nrf_radio_short_mask_t;

/**
 * @enum nrf_radio_cca_mode_t
 * @brief Types of RADIO Clear Channel Assessment modes.
 */
typedef enum
{
    NRF_RADIO_CCA_MODE_ED             = RADIO_CCACTRL_CCAMODE_EdMode,           /**< Energy Above Threshold. Will report busy whenever energy is detected above set threshold. */
    NRF_RADIO_CCA_MODE_CARRIER        = RADIO_CCACTRL_CCAMODE_CarrierMode,      /**< Carrier Seen. Will report busy whenever compliant IEEE 802.15.4 signal is seen. */
    NRF_RADIO_CCA_MODE_CARRIER_AND_ED = RADIO_CCACTRL_CCAMODE_CarrierAndEdMode, /**< Energy Above Threshold AND Carrier Seen. */
    NRF_RADIO_CCA_MODE_CARRIER_OR_ED  = RADIO_CCACTRL_CCAMODE_CarrierOrEdMode,  /**< Energy Above Threshold OR Carrier Seen. */
} nrf_radio_cca_mode_t;

/**
 * @enum nrf_radio_state_t
 * @brief Types of RADIO States.
 */
typedef enum
{
    NRF_RADIO_STATE_DISABLED   = RADIO_STATE_STATE_Disabled,  /**< No operations are going on inside the radio and the power consumption is at a minimum. */
    NRF_RADIO_STATE_RX_RU      = RADIO_STATE_STATE_RxRu,      /**< The radio is ramping up and preparing for reception. */
    NRF_RADIO_STATE_RX_IDLE    = RADIO_STATE_STATE_RxIdle,    /**< The radio is ready for reception to start. */
    NRF_RADIO_STATE_RX         = RADIO_STATE_STATE_Rx,        /**< Reception has been started. */
    NRF_RADIO_STATE_RX_DISABLE = RADIO_STATE_STATE_RxDisable, /**< The radio is disabling the receiver. */
    NRF_RADIO_STATE_TX_RU      = RADIO_STATE_STATE_TxRu,      /**< The radio is ramping up and preparing for transmission. */
    NRF_RADIO_STATE_TX_IDLE    = RADIO_STATE_STATE_TxIdle,    /**< The radio is ready for transmission to start. */
    NRF_RADIO_STATE_TX         = RADIO_STATE_STATE_Tx,        /**< The radio is transmitting a packet. */
    NRF_RADIO_STATE_TX_DISABLE = RADIO_STATE_STATE_TxDisable, /**< The radio is disabling the transmitter. */
} nrf_radio_state_t;

/**
 * @enum nrf_radio_crc_status_t
 * @brief Types of CRC status.
 */
typedef enum
{
    NRF_RADIO_CRC_STATUS_ERROR = RADIO_CRCSTATUS_CRCSTATUS_CRCError, /**< Packet received with CRC error. */
    NRF_RADIO_CRC_STATUS_OK    = RADIO_CRCSTATUS_CRCSTATUS_CRCOk,    /**< Packet received with CRC ok. */
} nrf_radio_crc_status_t;

/**
 * @enum nrf_radio_mode_t
 * @brief Types of RADIO modes (data rate and modulation).
 */
typedef enum
{
    NRF_RADIO_MODE_NRF_1MBIT          = RADIO_MODE_MODE_Nrf_1Mbit,          /**< 1Mbit/s Nordic proprietary radio mode. */
    NRF_RADIO_MODE_NRF_2MBIT          = RADIO_MODE_MODE_Nrf_2Mbit,          /**< 2Mbit/s Nordic proprietary radio mode. */
    NRF_RADIO_MODE_BLE_1MBIT          = RADIO_MODE_MODE_Ble_1Mbit,          /**< 1 Mbit/s Bluetooth Low Energy. */
    NRF_RADIO_MODE_BLE_2MBIT          = RADIO_MODE_MODE_Ble_2Mbit,          /**< 2 Mbit/s Bluetooth Low Energy. */
    NRF_RADIO_MODE_IEEE802154_250KBIT = RADIO_MODE_MODE_Ieee802154_250Kbit, /**< IEEE 802.15.4-2006 250 kbit/s. */
} nrf_radio_mode_t;

/**
 * @enum nrf_radio_preamble_length_t
 * @brief Types of preamble length.
 */
typedef enum
{
    NRF_RADIO_PREAMBLE_LENGTH_8BIT       = RADIO_PCNF0_PLEN_8bit,      /**< 8-bit preamble. */
    NRF_RADIO_PREAMBLE_LENGTH_16BIT      = RADIO_PCNF0_PLEN_16bit,     /**< 16-bit preamble. */
    NRF_RADIO_PREAMBLE_LENGTH_32BIT_ZERO = RADIO_PCNF0_PLEN_32bitZero, /**< 32-bit zero preamble used for IEEE 802.15.4. */
    NRF_RADIO_PREAMBLE_LENGTH_LONG_RANGE = RADIO_PCNF0_PLEN_LongRange, /**< Preamble - used for BTLE Long Range. */
} nrf_radio_preamble_length_t;

/**
 * @enum nrf_radio_crc_includes_addr_t
 * @brief Types of CRC calculatons regarding address.
 */
typedef enum
{
    NRF_RADIO_CRC_INCLUDES_ADDR_INCLUDE    = RADIO_CRCCNF_SKIPADDR_Include,    /**< CRC calculation includes address field. */
    NRF_RADIO_CRC_INCLUDES_ADDR_SKIP       = RADIO_CRCCNF_SKIPADDR_Skip,       /**< CRC calculation does not include address field. */
    NRF_RADIO_CRC_INCLUDES_ADDR_IEEE802154 = RADIO_CRCCNF_SKIPADDR_Ieee802154, /**< CRC calculation as per 802.15.4 standard. */
} nrf_radio_crc_includes_addr_t;

/**
 * @brief Function for enabling interrupts.
 *
 * @param[in]  radio_int_mask              Mask of interrupts.
 */
__STATIC_INLINE void nrf_radio_int_enable(uint32_t radio_int_mask)
{
    NRF_RADIO->INTENSET = radio_int_mask;
}

/**
 * @brief Function for disabling interrupts.
 *
 * @param[in]  radio_int_mask              Mask of interrupts.
 */
__STATIC_INLINE void nrf_radio_int_disable(uint32_t radio_int_mask)
{
    NRF_RADIO->INTENCLR = radio_int_mask;
}

/**
 * @brief Function for getting the state of a specific interrupt.
 *
 * @param[in]  radio_int_mask              Interrupt.
 *
 * @retval     true                   If the interrupt is not enabled.
 * @retval     false                  If the interrupt is enabled.
 */
__STATIC_INLINE bool nrf_radio_int_get(nrf_radio_int_mask_t radio_int_mask)
{
    return (bool)(NRF_RADIO->INTENCLR & radio_int_mask);
}

/**
 * @brief Function for getting the address of a specific task.
 *
 * This function can be used by the PPI module.
 *
 * @param[in]  radio_task              Task.
 */
__STATIC_INLINE uint32_t *nrf_radio_task_address_get(nrf_radio_task_t radio_task)
{
    return (uint32_t *)((uint8_t *)NRF_RADIO + radio_task);
}

/**
 * @brief Function for setting a specific task.
 *
 * @param[in]  radio_task              Task.
 */
__STATIC_INLINE void nrf_radio_task_trigger(nrf_radio_task_t radio_task)
{
    *((volatile uint32_t *)((uint8_t *)NRF_RADIO + radio_task)) = NRF_RADIO_TASK_SET;
}

/**
 * @brief Function for getting address of a specific event.
 *
 * This function can be used by the PPI module.
 *
 * @param[in]  radio_event              Event.
 */
__STATIC_INLINE uint32_t *nrf_radio_event_address_get(nrf_radio_event_t radio_event)
{
    return (uint32_t *)((uint8_t *)NRF_RADIO + radio_event);
}

/**
 * @brief Function for clearing a specific event.
 *
 * @param[in]  radio_event              Event.
 */
__STATIC_INLINE void nrf_radio_event_clear(nrf_radio_event_t radio_event)
{
    *((volatile uint32_t *)((uint8_t *)NRF_RADIO + radio_event)) = NRF_RADIO_EVENT_CLEAR;
#if __CORTEX_M == 0x04
    volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)NRF_RADIO + radio_event));
    (void)dummy;
#endif
}

/**
 * @brief Function for getting the state of a specific event.
 *
 * @param[in]  radio_event              Event.
 *
 * @retval     true               If the event is not set.
 * @retval     false              If the event is set.
 */
__STATIC_INLINE bool nrf_radio_event_get(nrf_radio_event_t radio_event)
{
    return (bool) * ((volatile uint32_t *)((uint8_t *)NRF_RADIO + radio_event));
}

/**
 * @brief Function for setting shortcuts.
 *
 * @param[in]  radio_short_mask              Mask of shortcuts.
 *
 */
__STATIC_INLINE void nrf_radio_shorts_enable(uint32_t radio_short_mask)
{
    NRF_RADIO->SHORTS |= radio_short_mask;
}

/**
 * @brief Function for clearing shortcuts.
 *
 * @param[in]  radio_short_mask              Mask of shortcuts.
 *
 */
__STATIC_INLINE void nrf_radio_shorts_disable(uint32_t radio_short_mask)
{
    NRF_RADIO->SHORTS &= ~radio_short_mask;
}

/**
 * @brief Function for setting shortcuts.
 *
 * @param[in]  radio_short_mask             Mask of shortcuts.
 *
 */
__STATIC_INLINE void nrf_radio_shorts_set(uint32_t radio_short_mask)
{
    NRF_RADIO->SHORTS = radio_short_mask;
}

/**
 * @brief Function for getting shortcuts.
 *
 * @return  Mask of shortcuts.
 *
 */
__STATIC_INLINE uint32_t nrf_radio_shorts_get(void)
{
    return NRF_RADIO->SHORTS;
}

/**
 * @brief Function for getting present state of the radio module.
 */
__STATIC_INLINE nrf_radio_state_t nrf_radio_state_get(void)
{
    return (nrf_radio_state_t) NRF_RADIO->STATE;
}

/**
 * @brief Function for setting Packet Pointer to given location in memory.
 *
 * @param[in]  p_radio_packet_ptr           Pointer to tx or rx packet buffer.
 */
__STATIC_INLINE void nrf_radio_packet_ptr_set(const void *p_radio_packet_ptr)
{
    NRF_RADIO->PACKETPTR = (uint32_t) p_radio_packet_ptr;
}

/**
 * @brief Function for getting CRC status of last received packet.
 */
__STATIC_INLINE nrf_radio_crc_status_t nrf_radio_crc_status_get(void)
{
    return (nrf_radio_crc_status_t) NRF_RADIO->CRCSTATUS;
}

/**
 * @brief Function for setting Clear Channel Assessment mode.
 *
 * @param[in]  radio_cca_mode                Mode of CCA
 */
__STATIC_INLINE void nrf_radio_cca_mode_set(nrf_radio_cca_mode_t radio_cca_mode)
{
    NRF_RADIO->CCACTRL &= (~RADIO_CCACTRL_CCAMODE_Msk);
    NRF_RADIO->CCACTRL |= ((uint32_t) radio_cca_mode << RADIO_CCACTRL_CCAMODE_Pos);
}

/**
 * @brief Function for setting CCA Energy Busy Threshold.
 *
 * @param[in]  radio_cca_ed_threshold        Energy Detection threshold value.
 */
__STATIC_INLINE void nrf_radio_cca_ed_threshold_set(uint8_t radio_cca_ed_threshold)
{
    NRF_RADIO->CCACTRL &= (~RADIO_CCACTRL_CCAEDTHRES_Msk);
    NRF_RADIO->CCACTRL |= ((uint32_t) radio_cca_ed_threshold << RADIO_CCACTRL_CCAEDTHRES_Pos);
}

/**
 * @brief Function for setting CCA Correlator Busy Threshold.
 *
 * @param[in]  radio_cca_corr_threshold      Correlator Busy Threshold.
 */
__STATIC_INLINE void nrf_radio_cca_corr_threshold_set(uint8_t radio_cca_corr_threshold_set)
{
    NRF_RADIO->CCACTRL &= (~RADIO_CCACTRL_CCACORRTHRES_Msk);
    NRF_RADIO->CCACTRL |= ((uint32_t) radio_cca_corr_threshold_set << RADIO_CCACTRL_CCACORRTHRES_Pos);
}

/**
 * @brief Function for setting limit of occurances above Correlator Threshold.
 *
 * When not equal to zero the correlator based signal detect is enabled.
 *
 * @param[in]  radio_cca_corr_cnt           Limit of occurances above Correlator Threshold
 */
__STATIC_INLINE void nrf_radio_cca_corr_counter_set(uint8_t radio_cca_corr_counter_set)
{
    NRF_RADIO->CCACTRL &= (~RADIO_CCACTRL_CCACORRCNT_Msk);
    NRF_RADIO->CCACTRL |= ((uint32_t) radio_cca_corr_counter_set << RADIO_CCACTRL_CCACORRCNT_Pos);
}

/**
 * @brief Function for setting Radio data rate and modulation settings.
 *
 * @param[in]  radio_mode                   Mode of radio data rate and modulation.
 */
__STATIC_INLINE void nrf_radio_mode_set(nrf_radio_mode_t radio_mode)
{
    NRF_RADIO->MODE = ((uint32_t) radio_mode << RADIO_MODE_MODE_Pos);
}

/**
 * @brief Function for setting Length of LENGTH field in number of bits.
 *
 * @param[in]  radio_length_length          Length of LENGTH field in number of bits.
 */
__STATIC_INLINE void nrf_radio_config_length_field_length_set(uint8_t radio_length_length)
{
    NRF_RADIO->PCNF0 &= (~RADIO_PCNF0_LFLEN_Msk);
    NRF_RADIO->PCNF0 |= ((uint32_t) radio_length_length << RADIO_PCNF0_LFLEN_Pos);
}

/**
 * @brief Function for setting length of preamble on air.
 *
 * @param[in]  radio_preamble_length        Length of preamble on air.
 */
__STATIC_INLINE void nrf_radio_config_preamble_length_set(
    nrf_radio_preamble_length_t radio_preamble_length)
{
    NRF_RADIO->PCNF0 &= (~RADIO_PCNF0_PLEN_Msk);
    NRF_RADIO->PCNF0 |= ((uint32_t) radio_preamble_length << RADIO_PCNF0_PLEN_Pos);
}

/**
 * @brief Function for setting if LENGTH field contains CRC.
 *
 * @param[in]  radio_length_contains_crc    True if LENGTH field should contain CRC.
 */
__STATIC_INLINE void nrf_radio_config_crc_included_set(bool radio_length_contains_crc)
{
    NRF_RADIO->PCNF0 &= (~RADIO_PCNF0_CRCINC_Msk);
    NRF_RADIO->PCNF0 |= ((uint32_t) radio_length_contains_crc << RADIO_PCNF0_CRCINC_Pos);
}

/**
 * @brief Function for setting maximum length of packet payload.
 *
 * @param[in]  radio_max_packet_length      Maximum length of packet payload.
 */
__STATIC_INLINE void nrf_radio_config_max_length_set(uint8_t radio_max_packet_length)
{
    NRF_RADIO->PCNF1 &= (~RADIO_PCNF1_MAXLEN_Msk);
    NRF_RADIO->PCNF1 |= ((uint32_t) radio_max_packet_length << RADIO_PCNF1_MAXLEN_Pos);
}

/**
 * @brief Function for setting CRC length.
 *
 * @param[in]  radio_crc_length             CRC length in number of bytes [0-3].
 */
__STATIC_INLINE void nrf_radio_crc_length_set(uint8_t radio_crc_length)
{
    NRF_RADIO->CRCCNF &= (~RADIO_CRCCNF_LEN_Msk);
    NRF_RADIO->CRCCNF |= ((uint32_t) radio_crc_length << RADIO_CRCCNF_LEN_Pos);
}

/**
 * @brief Function for setting if address filed should be included or excluded from CRC calculation.
 *
 * @param[in]  radio_crc_skip_address       Include or exclude packet address field out of CRC.
 */
__STATIC_INLINE void nrf_radio_crc_includes_address_set(
    nrf_radio_crc_includes_addr_t radio_crc_skip_address)
{
    NRF_RADIO->CRCCNF &= (~RADIO_CRCCNF_SKIPADDR_Msk);
    NRF_RADIO->CRCCNF |= ((uint32_t) radio_crc_skip_address << RADIO_CRCCNF_SKIPADDR_Pos);
}

/**
 * @brief Function for setting CRC polynominal.
 *
 * @param[in]  radio_crc_polynominal        CRC polynominal to set.
 */
__STATIC_INLINE void nrf_radio_crc_polynominal_set(uint32_t radio_crc_polynominal)
{
    NRF_RADIO->CRCPOLY = (radio_crc_polynominal << RADIO_CRCPOLY_CRCPOLY_Pos);
}

/**
 * @brief Function for getting RSSI sample result.
 *
 * @note The value is a positive value while the actual received signal is a negative value.
 *       Actual received signal strength is therefore as follows:
 *       received signal strength = - returned_value dBm .
 */
__STATIC_INLINE uint8_t nrf_radio_rssi_sample_get(void)
{
    return (uint8_t)(((NRF_RADIO->RSSISAMPLE) & RADIO_RSSISAMPLE_RSSISAMPLE_Msk) >>
                     RADIO_RSSISAMPLE_RSSISAMPLE_Pos);
}

/**
 * @brief Function for setting MAC Header Match Unit search pattern configuration.
 *
 * @param[in]  radio_mhmu_search_pattern    Search Pattern Configuration.
 */
__STATIC_INLINE void nrf_radio_mhmu_search_pattern_set(uint32_t radio_mhmu_search_pattern)
{
    NRF_RADIO->MHRMATCHCONF = radio_mhmu_search_pattern;
}

/**
 * @brief Function for setting MAC Header Match Unit pattern mask configuration.
 *
 * @param[in]  radio_mhmu_pattern_mask      Pattern mask.
 */
__STATIC_INLINE void nrf_radio_mhmu_pattern_mask_set(uint32_t radio_mhmu_pattern_mask)
{
    NRF_RADIO->MHRMATCHMAS = radio_mhmu_pattern_mask;
}

/**
 * @brief Function for setting radio frequency.
 *
 * @param[in]  radio_frequency              Frequency above 2400 MHz [MHz]
 */
__STATIC_INLINE void nrf_radio_frequency_set(uint32_t radio_frequency)
{
    NRF_RADIO->FREQUENCY = radio_frequency;
}

/**
 * @brief Function for getting radio frequency.
 *
 * @returns Frequency above 2400 MHz [MHz]
 */
__STATIC_INLINE uint32_t nrf_radio_frequency_get(void)
{
    return NRF_RADIO->FREQUENCY;
}

/**
 * @brief Function for setting radio transmit power.
 *
 * @param[in]  radio_tx_power               Transmit power of the radio.
 */
__STATIC_INLINE void nrf_radio_tx_power_set(int8_t radio_tx_power)
{
    NRF_RADIO->TXPOWER = (uint8_t) radio_tx_power;
}

/**
 * @brief Function for setting Inter Frame Spacing
 *
 * @param[in]  radio_ifs                    Inter frame spacing [us].
 */
__STATIC_INLINE void nrf_radio_ifs_set(uint32_t radio_ifs)
{
    NRF_RADIO->TIFS = radio_ifs;
}

/**
 * @brief Function for setting Bit counter compare.
 *
 * @param[in]  radio_bcc                    Bit counter compare [bits].
 */
__STATIC_INLINE void nrf_radio_bcc_set(uint32_t radio_bcc)
{
    NRF_RADIO->BCC = radio_bcc;
}

/**
 * @brief Function for getting Bit counter compare.
 */
__STATIC_INLINE uint32_t nrf_radio_bcc_get(void)
{
    return NRF_RADIO->BCC;
}

/**
 * @brief Function for getting Energy Detection level.
 */
__STATIC_INLINE uint8_t nrf_radio_ed_sample_get(void)
{
    return (uint8_t) NRF_RADIO->EDSAMPLE;
}

/**
 * @brief Function for setting number of iterations to perform ED scan.
 *
 * @param[in]  radio_ed_loop_count          Number of iterations during ED procedure.
 */
__STATIC_INLINE void nrf_radio_ed_loop_count_set(uint32_t radio_ed_loop_count)
{
    NRF_RADIO->EDCNT = (radio_ed_loop_count & 0x001FFFFF);
}

/**
 * @brief Function for setting power mode of the radio peripheral.
 *
 * @param[in]  radio_power                  If radio should powered on.
 */
__STATIC_INLINE void nrf_radio_power_set(bool radio_power)
{
    NRF_RADIO->POWER = (uint32_t) radio_power;
}


/**
 *@}
 **/

#ifdef __cplusplus
}
#endif

#endif /* NRF_RADIO_H__ */
