/*********************************************************************************************
    *   Filename        : ll_config.h

    *   Description     : Lto 优化Macro 定义

    *   Author          : Bingquan

    *   Email           : bingquan_cai@zh-jieli.com

    *   Last modifiled  : 2018-12-19 16:12

    *   Copyright:(c)JIELI  2011-2017  @ , All Rights Reserved.
*********************************************************************************************/
#ifndef _LL_CONFIG_H_
#define _LL_CONFIG_H_
#include <stdint.h> //for UINT64_C

/*
 *-------------------LE FEATURE SUPPORT
 *  brief : 运行时优化（LTO）下，代码空间优化；
 */

/* --- Core Spec 4.0 --- */
#define LL_FEAT_ENCRYPTION                          (UINT64_C(1) << ( 0))   /*!< Encryption supported. */
/* --- Core Spec 4.2 --- */
#define LL_FEAT_CONN_PARAM_REQ_PROC                 (UINT64_C(1) << ( 1))   /*!< Connection Parameters Request Procedure supported. */
#define LL_FEAT_EXT_REJECT_IND                      (UINT64_C(1) << ( 2))   /*!< Extended Reject Indication supported. */
#define LL_FEAT_SLV_INIT_FEAT_EXCH                  (UINT64_C(1) << ( 3))   /*!< Slave-Initiated Features Exchange supported. */
#define LL_FEAT_LE_PING                             (UINT64_C(1) << ( 4))   /*!< LE Ping supported. */
#define LL_FEAT_DATA_LEN_EXT                        (UINT64_C(1) << ( 5))   /*!< Data Length Extension supported. */
#define LL_FEAT_PRIVACY                             (UINT64_C(1) << ( 6))   /*!< LL Privacy supported. */
#define LL_FEAT_EXT_SCAN_FILT_POLICY                (UINT64_C(1) << ( 7))   /*!< Extended Scan Filter Policy supported. */
/* --- Core Spec 5.0 --- */
#define LL_FEAT_LE_2M_PHY                           (UINT64_C(1) << ( 8))   /*!< LE 2M PHY supported. */
#define LL_FEAT_STABLE_MOD_IDX_TRANSMITTER          (UINT64_C(1) << ( 9))   /*!< Stable Modulation Index - Transmitter supported. */
#define LL_FEAT_STABLE_MOD_IDX_RECEIVER             (UINT64_C(1) << (10))   /*!< Stable Modulation Index - Receiver supported. */
#define LL_FEAT_LE_CODED_PHY                        (UINT64_C(1) << (11))   /*!< LE Coded PHY supported. */
#define LL_FEAT_LE_EXT_ADV                          (UINT64_C(1) << (12))   /*!< LE Extended Advertising supported. */
#define LL_FEAT_LE_PER_ADV                          (UINT64_C(1) << (13))   /*!< LE Periodic Advertising supported. */
#define LL_FEAT_CH_SEL_2                            (UINT64_C(1) << (14))   /*!< Channel Selection Algorithm #2 supported. */
#define LL_FEAT_LE_POWER_CLASS_1                    (UINT64_C(1) << (15))   /*!< LE Power Class 1 supported. */
#define LL_FEAT_MIN_NUM_USED_CHAN                   (UINT64_C(1) << (16))   /*!< Minimum Number of Used Channels supported. */
/* --- Core Spec 5.1 --- */
#define LL_FEAT_CONN_CTE_REQ                        (UINT64_C(1) << (17))   /*!< Connection CTE Request supported */
#define LL_FEAT_CONN_CTE_RSP                        (UINT64_C(1) << (18))   /*!< Connection CTE Response supported */
#define LL_FEAT_CONNLESS_CTE_TRANS                  (UINT64_C(1) << (19))   /*!< Connectionless CTE Transmitter supported */
#define LL_FEAT_CONNLESS_CTE_RECV                   (UINT64_C(1) << (20))   /*!< Connectionless CTE Receiver supported */
#define LL_FEAT_ANTENNA_SWITCH_AOD                  (UINT64_C(1) << (21))   /*!< Anetenna Switching during CTE Transmission (AoD) supported */
#define LL_FEAT_ANTENNA_SWITCH_AOA                  (UINT64_C(1) << (22))   /*!< Anetenna Switching during CTE Reception (AoA) supported */
#define LL_FEAT_RECV_CTE                            (UINT64_C(1) << (23))   /*!< Receive Constant Tone Extension supported */
#define LL_FEAT_PAST_SENDER                         (UINT64_C(1) << (24))   /*!< Periodic Advertising Sync Transfer – Sender supported. */
#define LL_FEAT_PAST_RECIPIENT                      (UINT64_C(1) << (25))   /*!< Periodic Advertising Sync Transfer – Recipient supported. */
#define LL_FEAT_SCA_UPDATE                          (UINT64_C(1) << (26))   /*!< Sleep Clock Accuracy Updates supported. */
#define LL_FEAT_REMOTE_PUB_KEY_VALIDATION           (UINT64_C(1) << (27))   /*!< Remote Public Key Validation supported. */
/* --- Core Spec 5.2 --- */
#define LL_FEAT_CIS_MASTER_ROLE                     (UINT64_C(1) << (28))   /*!< Connected Isochronous Stream Master Role supported. */
#define LL_FEAT_CIS_SLAVE_ROLE                      (UINT64_C(1) << (29))   /*!< Connected Isochronous Stream Slave Role supported. */
#define LL_FEAT_ISO_BROADCASTER                     (UINT64_C(1) << (30))   /*!< Isochronous Broadcaster Role supported. */
#define LL_FEAT_ISO_SYNC                            (UINT64_C(1) << (31))   /*!< Isochronous Synchronizer Role supported. */
#define LL_FEAT_ISO_HOST_SUPPORT                    (UINT64_C(1) << (32))   /*!< Host support for ISO Channels. */
#define LL_FEAT_POWER_CONTROL_REQUEST               (UINT64_C(1) << (33))   /*!< Power control requests supported. */
#define LL_FEAT_POWER_CHANGE_IND                    (UINT64_C(1) << (34))   /*!< Power control power change indication supported. */
#define LL_FEAT_PATH_LOSS_MONITOR                   (UINT64_C(1) << (35))   /*!< Path loss monitoring supported. */

#define LE_ENCRYPTION                       LL_FEAT_ENCRYPTION
#define CONNECTION_PARAMETER_REQUEST        LL_FEAT_CONN_PARAM_REQ_PROC
#define EXTENDED_REJECT_INDICATION          LL_FEAT_EXT_REJECT_IND
#define LE_SLAVE_INIT_FEATURES_EXCHANGE     LL_FEAT_SLV_INIT_FEAT_EXCH
#define LE_PING                             LL_FEAT_LE_PING
#define LE_DATA_PACKET_LENGTH_EXTENSION     LL_FEAT_DATA_LEN_EXT
#define LL_PRIVACY                          LL_FEAT_PRIVACY
#define EXTENDED_SCANNER_FILTER_POLICIES    LL_FEAT_EXT_SCAN_FILT_POLICY
#define LE_2M_PHY                           LL_FEAT_LE_2M_PHY
#define LE_CODED_PHY                        LL_FEAT_LE_CODED_PHY
#define LE_EXTENDED_ADVERTISING             LL_FEAT_LE_EXT_ADV
#define LE_PERIODIC_ADVERTISING             LL_FEAT_LE_PER_ADV
#define CHANNEL_SELECTION_ALGORITHM_2       LL_FEAT_CH_SEL_2


#define LE_CORE_V50_FEATURES \
( \
    LE_2M_PHY | \
    LE_CODED_PHY | \
    LE_EXTENDED_ADVERTISING | \
    LE_PERIODIC_ADVERTISING | \
    CHANNEL_SELECTION_ALGORITHM_2 | \
    0 \
)

#if (LE_CORE_V50_FEATURES & LE_PERIODIC_ADVERTISING)
#if ((LE_CORE_V50_FEATURES & LE_EXTENDED_ADVERTISING) == 0)
#error "enable <LE_PERIODIC_ADVERTISING> must enable <LE_EXTENDED_ADVERTISING> at the same time"
#endif
#endif

#define LE_FEATURES_CONST_TONE          (LL_FEAT_CONN_CTE_REQ | \
                                            LL_FEAT_CONN_CTE_RSP | \
                                            LL_FEAT_CONNLESS_CTE_TRANS | \
                                            LL_FEAT_CONNLESS_CTE_RECV | \
                                            LL_FEAT_ANTENNA_SWITCH_AOD | \
                                            LL_FEAT_ANTENNA_SWITCH_AOA | \
                                            LL_FEAT_RECV_CTE)

#define LE_FEATURES_CIS                 (LL_FEAT_CIS_MASTER_ROLE | \
                                            LL_FEAT_CIS_SLAVE_ROLE | \
                                            LL_FEAT_ISO_HOST_SUPPORT)

#define LE_FEATURES_BIS                 (LL_FEAT_ISO_BROADCASTER | \
                                            LL_FEAT_ISO_SYNC | \
                                            LL_FEAT_ISO_HOST_SUPPORT)

#define LE_FEATURES_ISO                 (LE_FEATURES_BIS|LE_FEATURES_CIS)

#define LE_FEATURES_POWER_CONTROL       (LL_FEAT_POWER_CONTROL_REQUEST | \
                                            LL_FEAT_POWER_CHANGE_IND | \
                                            LL_FEAT_PATH_LOSS_MONITOR)

extern const uint64_t config_btctler_le_features;
#define LE_FEATURES_IS_SUPPORT(x)           (config_btctler_le_features & (x))

#define LE_FEATURES_IS_SUPPORT_OPTIMIZE(x)  if (LE_FEATURES_IS_SUPPORT(x) == 0x0)   return
/*-----------------------------------------------------------*/

/*
 *-------------------LE ROLES SUPPORT
 *  brief : 运行时优化（LTO）下，代码空间优化；
 */
#define LE_MASTER                           BIT(0)
#define LE_SLAVE                            BIT(1)
#define LE_ADV                              BIT(2)
#define LE_SCAN                             BIT(3)
#define LE_INIT                             BIT(4)

/*! \brief      Combination */
#define LE_CONN                             (LE_MASTER|LE_SLAVE)

extern const int config_btctler_le_roles;
#define LE_ROLES_IS_SUPPORT(x)              (config_btctler_le_roles & x)

#define LE_ROLES_IS_SUPPORT_OPTIMIZE(x)     if (LE_ROLES_IS_SUPPORT(x) == 0x0)   return
/*-----------------------------------------------------------*/

extern const int config_btctler_le_tws;
#define LE_TWS_IS_SUPPORT()                (config_btctler_le_tws)


/*-----------------------------------------------------------*/

extern const int config_btctler_le_afh_en;
#define LE_AFH_IS_SUPPORT()                (config_btctler_le_afh_en)

#define LE_AFH_IS_SUPPORT_OPTIMIZE(x)     if (LE_AFH_IS_SUPPORT() == 0x0)   return

/*
 *-------------------LE PARAM CHECK
 *  brief : 运行时优化（LTO）下，代码空间优化；
 */
// extern const int config_btctler_le_param_check;
#define LE_PARAM_IS_CHECK()                TRUE//(config_btctler_le_param_check)
/*
 *-------------------LE RAM CONTROL
 *
 */
extern const int config_btctler_le_hw_nums;
extern const int config_btctler_le_rx_nums;
extern const int config_btctler_le_acl_packet_length;
extern const int config_btctler_le_acl_total_nums;
extern const int config_btctler_le_slave_conn_update_winden;
/*-----------------------------------------------------------*/

/*
 *-------------------LE Multi-link CONTROL
 */
extern const int config_btctler_le_master_multilink;
/*-----------------------------------------------------------*/

#endif //_LL_CONFIG_H_
