Realtek/inc/bluetooth/gap/gap_adv.h
2025-11-25 10:21:47 +08:00

483 lines
18 KiB
C

/**
*********************************************************************************************************
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
*********************************************************************************************************
* @file gap_adv.h
* @brief Head file for Gap adv
* @details This file defines advertising related API
* @author ranhui
* @date 2016-02-18
* @version v1.0
* *********************************************************************************************************
*/
/*============================================================================*
* Define to prevent recursive inclusion
*============================================================================*/
#ifndef GAP_ADV_H
#define GAP_ADV_H
#ifdef __cplusplus
extern "C"
{
#endif
/*============================================================================*
* Header Files
*============================================================================*/
#include "upperstack_config.h"
#if F_BT_LE_GAP_PERIPHERAL_SUPPORT
#include "gap_le.h"
/** @addtogroup GAP_BROADCASTER_Role GAP Broadcaster Role
* @brief GAP Broadcaster Role
* @{
*/
/*============================================================================*
* Macros
*============================================================================*/
/** @addtogroup GAP_Broadcaster_Exported_Macros GAP Broadcaster Exported Macros
* @brief
* @{
*/
#define GAP_MAX_ADV_LEN 31 //!< BLE Maximum Advertising or Scan Response Packet Length
/** End of GAP_Broadcaster_Exported_Macros
* @}
*/
/*============================================================================*
* Types
*============================================================================*/
/** @defgroup GAP_Broadcaster_Exported_Types GAP Broadcaster Exported Types
* @brief
* @{
*/
/** @brief LE advertising parameter types */
typedef enum
{
GAP_PARAM_ADV_LOCAL_ADDR_TYPE = 0x260,//!< Advertisement used local bluetooth device address type. Read/Write Size is uint8.
GAP_PARAM_ADV_DATA = 0x261,//!< Advertisement Data. Read/Write. Max size is uint8[GAP_MAX_ADV_LEN]. Default is "02:01:05", which means that it is a Limited Discoverable Advertisement.
GAP_PARAM_SCAN_RSP_DATA = 0x262,//!< Scan Response Data. Read/Write. Max size is uint8[GAP_MAX_ADV_LEN]. Defaults to all 0.
GAP_PARAM_ADV_EVENT_TYPE = 0x263,//!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (@ref T_GAP_ADTYPE).
GAP_PARAM_ADV_DIRECT_ADDR_TYPE = 0x264,//!< Direct Advertisement Address Type. Read/Write. Size is uint8.
GAP_PARAM_ADV_DIRECT_ADDR = 0x265,//!< Direct Advertisement Address. Read/Write. Size is uint8[GAP_BD_ADDR_LEN]. Default is NULL.
GAP_PARAM_ADV_CHANNEL_MAP = 0x266,//!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (@ref ADV_CHANNEL_MAP)
GAP_PARAM_ADV_FILTER_POLICY = 0x267,//!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_ADV_FILTER_ANY (@ref T_GAP_ADV_FILTER_POLICY).
GAP_PARAM_ADV_INTERVAL_MIN = 0x268,//!< Minimum advertising interval for undirected and low duty cycle directed advertising. Value range: 0x0020 - 0x4000 (20ms - 10240ms 0.625ms/step),Read/Write Size is uint16_t.
GAP_PARAM_ADV_INTERVAL_MAX = 0x269,//!< Maximum advertising interval for undirected and low duty cycle directed advertising. Value range: 0x0020 - 0x4000 (20ms - 10240ms 0.625ms/step)),Read/Write Size is uint16_t.
} T_LE_ADV_PARAM_TYPE;
/** End of GAP_Broadcaster_Exported_Types
* @}
*/
/*============================================================================*
* Functions
*============================================================================*/
/** @defgroup GAP_Broadcaster_Exported_Functions GAP Broadcaster Exported Functions
* @brief
* @{
*/
/**
* @brief Set a GAP advertising parameter.
*
* NOTE: You can call this function with a advertising parameter type and it will set the
* advertising parameter. Advertising parameters are defined in @ref T_LE_ADV_PARAM_TYPE.
* If the "len" field sets to the size of "uint16_t" ,the
* "p_value" field must point to a data with type of "uint16_t".
*
* @param[in] param LE advertising parameter type: @ref T_LE_ADV_PARAM_TYPE
* @param[in] len Length of data to write
* @param[in] p_value Pointer to data to write. This is dependent on
* the parameter type and will be cast to the appropriate
* data type (For example: if data type of param is uint16_t, p_value will be cast to
* pointer of uint16_t).
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval GAP_CAUSE_INVALID_PARAM Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void app_le_gap_init(void)
{
//advertising parameters
uint8_t adv_evt_type = GAP_ADTYPE_ADV_IND;
uint8_t adv_direct_type = GAP_REMOTE_ADDR_LE_PUBLIC;
uint8_t adv_direct_addr[GAP_BD_ADDR_LEN] = {0};
uint8_t adv_chann_map = GAP_ADVCHAN_ALL;
uint8_t adv_filter_policy = GAP_ADV_FILTER_ANY;
uint16_t adv_int_min = DEFAULT_ADVERTISING_INTERVAL_MIN;
uint16_t adv_int_max = DEFAULT_ADVERTISING_INTERVAL_MIN;
//Set advertising parameters
le_adv_set_param(GAP_PARAM_ADV_EVENT_TYPE, sizeof(adv_evt_type), &adv_evt_type);
le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR_TYPE, sizeof(adv_direct_type), &adv_direct_type);
le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR, sizeof(adv_direct_addr), adv_direct_addr);
le_adv_set_param(GAP_PARAM_ADV_CHANNEL_MAP, sizeof(adv_chann_map), &adv_chann_map);
le_adv_set_param(GAP_PARAM_ADV_FILTER_POLICY, sizeof(adv_filter_policy), &adv_filter_policy);
le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MIN, sizeof(adv_int_min), &adv_int_min);
le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MAX, sizeof(adv_int_max), &adv_int_max);
le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), adv_data);
le_adv_set_param(GAP_PARAM_SCAN_RSP_DATA, sizeof(scan_rsp_data), scan_rsp_data);
}
* \endcode
*/
T_GAP_CAUSE le_adv_set_param(T_LE_ADV_PARAM_TYPE param, uint8_t len, void *p_value);
/**
* @brief Get a GAP advertising parameter.
*
* NOTE: You can call this function with a advertising parameter type and it will get a
* advertising parameter. Advertising parameters are defined in @ref T_LE_ADV_PARAM_TYPE.
* Also, the "p_value" field must point to a data with type "uint16_t".
*
* @param[in] param Advertising parameter type: @ref T_LE_ADV_PARAM_TYPE
* @param[in,out] p_value Pointer to the location to get the parameter value. This is dependent on
* the parameter type and will be cast to the appropriate
* data type (For example: if data type of param is uint16_t, p_value will be cast to
* pointer of uint16_t).
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval GAP_CAUSE_INVALID_PARAM Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void test(void)
{
uint8_t local_bd_type = GAP_LOCAL_ADDR_LE_PUBLIC;
le_adv_get_param(GAP_PARAM_ADV_LOCAL_ADDR_TYPE, &local_bd_type);
}
* \endcode
*/
T_GAP_CAUSE le_adv_get_param(T_LE_ADV_PARAM_TYPE param, void *p_value);
/**
* @brief Start advertising with params set by @ref le_adv_set_param.
*
* NOTE: This function can be called after @ref gap_start_bt_stack is invoked.
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Start request success.
* @retval other Start request failed.
*
* <b>Example usage</b>
* \code{.c}
void test()
{
uint8_t adv_evt_type = GAP_ADTYPE_ADV_IND;
uint8_t adv_direct_type = GAP_REMOTE_ADDR_LE_PUBLIC;
uint8_t adv_direct_addr[GAP_BD_ADDR_LEN] = {0};
uint8_t adv_chann_map = GAP_ADVCHAN_ALL;
uint8_t adv_filter_policy = GAP_ADV_FILTER_ANY;
uint16_t adv_int_min = DEFAULT_ADVERTISING_INTERVAL_MIN;
uint16_t adv_int_max = DEFAULT_ADVERTISING_INTERVAL_MIN;
le_adv_set_param(GAP_PARAM_ADV_EVENT_TYPE, sizeof(adv_evt_type), &adv_evt_type);
le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR_TYPE, sizeof(adv_direct_type), &adv_direct_type);
le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR, sizeof(adv_direct_addr), adv_direct_addr);
le_adv_set_param(GAP_PARAM_ADV_CHANNEL_MAP, sizeof(adv_chann_map), &adv_chann_map);
le_adv_set_param(GAP_PARAM_ADV_FILTER_POLICY, sizeof(adv_filter_policy), &adv_filter_policy);
le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MIN, sizeof(adv_int_min), &adv_int_min);
le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MAX, sizeof(adv_int_max), &adv_int_max);
le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), (void *)adv_data);
le_adv_set_param(GAP_PARAM_SCAN_RSP_DATA, sizeof(scan_rsp_data), (void *)scan_rsp_data);
le_adv_start();
}
void app_handle_dev_state_evt(T_GAP_DEV_STATE new_state, uint16_t cause)
{
APP_PRINT_INFO3("app_handle_dev_state_evt: init state %d, adv state %d, cause 0x%x",
new_state.gap_init_state, new_state.gap_adv_state, cause);
if (gap_dev_state.gap_init_state != new_state.gap_init_state)
{
if (new_state.gap_init_state == GAP_INIT_STATE_STACK_READY)
{
APP_PRINT_INFO0("GAP stack ready");
le_adv_start();
}
}
if (gap_dev_state.gap_adv_state != new_state.gap_adv_state)
{
if (new_state.gap_adv_state == GAP_ADV_STATE_IDLE)
{
if (new_state.gap_adv_sub_state == GAP_ADV_TO_IDLE_CAUSE_CONN)
{
APP_PRINT_INFO0("GAP adv stoped: because connection created");
}
else
{
APP_PRINT_INFO0("GAP adv stoped");
}
}
else if (new_state.gap_adv_state == GAP_ADV_STATE_ADVERTISING)
{
APP_PRINT_INFO0("GAP adv start");
}
}
gap_dev_state = new_state;
}
//When the link was establishment, app_gap_callback will be called with callback type GAP_MSG_LE_CREATE_CONN_IND
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_LE_CB_DATA cb_data;
memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
APP_PRINT_TRACE1("app_gap_callback: cb_type = %d", cb_type);
switch (cb_type)
{
...
case GAP_MSG_LE_CREATE_CONN_IND:
APP_PRINT_INFO0("GAP_MSG_LE_CREATE_CONN_IND");
result = APP_RESULT_ACCEPT;
break;
...
}
}
* \endcode
*/
T_GAP_CAUSE le_adv_start(void);
/**
* @brief Stop advertising. When the device is in advertising state, App can call this API to stop advertising.
*
* NOTE: This function can be called after @ref gap_start_bt_stack is invoked.
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval Others Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void test()
{
le_adv_stop();
}
void app_handle_dev_state_evt(T_GAP_DEV_STATE new_state, uint16_t cause)
{
APP_PRINT_INFO3("app_handle_dev_state_evt: init state %d, adv state %d, cause 0x%x",
new_state.gap_init_state, new_state.gap_adv_state, cause);
if (gap_dev_state.gap_init_state != new_state.gap_init_state)
{
if (new_state.gap_init_state == GAP_INIT_STATE_STACK_READY)
{
APP_PRINT_INFO0("GAP stack ready");
le_adv_start();
}
}
if (gap_dev_state.gap_adv_state != new_state.gap_adv_state)
{
if (new_state.gap_adv_state == GAP_ADV_STATE_IDLE)
{
if (new_state.gap_adv_sub_state == GAP_ADV_TO_IDLE_CAUSE_CONN)
{
APP_PRINT_INFO0("GAP adv stoped: because connection created");
}
else
{
APP_PRINT_INFO0("GAP adv stoped");
}
}
else if (new_state.gap_adv_state == GAP_ADV_STATE_ADVERTISING)
{
APP_PRINT_INFO0("GAP adv start");
}
}
gap_dev_state = new_state;
}
* \endcode
*/
T_GAP_CAUSE le_adv_stop(void);
/**
* @brief Update advertising parameters.
* Application can update one or more advertising paramters, @ref le_adv_set_param should be called first to specify
* which paramter shall be update. If gap adv state is not @ref GAP_ADV_STATE_IDLE, application can only update
* advertising data and scan response data.
*
* NOTE: This function can be called after @ref gap_start_bt_stack is invoked.
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval Others Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void test()
{
...
le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), adv_data);
le_adv_update_param();
}
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_LE_CB_DATA cb_data;
memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
APP_PRINT_TRACE1("app_gap_callback: cb_type = %d", cb_type);
switch (cb_type)
{
...
case GAP_MSG_LE_ADV_UPDATE_PARAM:
APP_PRINT_INFO1("GAP_MSG_LE_ADV_UPDATE_PARAM: cause 0x%x",
cb_data.p_le_adv_update_param_rsp->cause);
break;
}
...
}
* \endcode
*/
T_GAP_CAUSE le_adv_update_param(void);
#if F_BT_LE_READ_ADV_TX_POWRE_SUPPORT
/**
* @brief Read advertising transmit power.
*
* NOTE: This function can be called after @ref gap_start_bt_stack is invoked.
*
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval Others Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void test()
{
le_adv_read_tx_power();
}
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_LE_CB_DATA cb_data;
memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
APP_PRINT_TRACE1("app_gap_callback: cb_type = %d", cb_type);
switch (cb_type)
{
...
case GAP_MSG_LE_ADV_READ_TX_POWER:
APP_PRINT_INFO2("GAP_MSG_LE_ADV_READ_TX_POWER: cause 0x%x, tx_power_level 0x%x",
cb_data.p_le_adv_read_tx_power_rsp->cause,
cb_data.p_le_adv_read_tx_power_rsp->tx_power_level);
break;
}
...
}
* \endcode
*/
T_GAP_CAUSE le_adv_read_tx_power(void);
#endif
/**
* @brief Set the advertising tx power for the device, or reset advertising tx power to default value.
*
* NOTE: This function can be called after @ref gap_start_bt_stack is invoked.
*
* @param[in] type adv tx power type.
* @param[in] tx_gain index for power level. NOTE: The following tx gain table may be changed in future version.
* @retval GAP_CAUSE_SUCCESS Operation success.
* @retval GAP_CAUSE_SEND_REQ_FAILED Operation failure.
*
* <b>Example usage</b>
* \code{.c}
void test()
{
T_GAP_CAUSE cause;
uint8_t type = GAP_ADV_TX_POW_SET_1M;
uint8_t tx_gain = 0x80;
cause = le_adv_set_tx_power((T_GAP_ADV_TX_POW_TYPE)type, tx_gain);
}
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_LE_CB_DATA cb_data;
memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
APP_PRINT_TRACE1("app_gap_callback: msgType = %d", cb_type);
switch (cb_type)
{
...
case GAP_MSG_LE_ADV_SET_TX_POWER:
APP_PRINT_INFO1("GAP_MSG_LE_ADV_SET_TX_POWER: cause 0x%x",
p_data->le_cause.cause);
break;
...
}
}
* \endcode
*/
T_GAP_CAUSE le_adv_set_tx_power(T_GAP_ADV_TX_POW_TYPE type, uint8_t tx_gain);
/**
* @brief Trigger One Shot Advertising.
* NOTE: Trigger advertising after guard_slot * 625 + guard_usec + wait_usec(us).
* This function can be called after @ref gap_start_bt_stack is invoked.
* This function cannot be used if advertising type is connectable high duty cycle directed advertising.
*
* @param[in] guard_slot The delay time to trigger advertising in units of 625us, range: 0~224
* @param[in] guard_usec The delay time to trigger advertising in units of us, range: 0~65535
* @param[in] wait_usec The delay time to trigger advertising in units of us, range: 0~65535
* @return Operation result.
* @retval GAP_CAUSE_SUCCESS: Operation success.
* @retval GAP_CAUSE_SEND_REQ_FAILED: Operation fail.
*
* <b>Example usage</b>
* \code{.c}
static T_USER_CMD_PARSE_RESULT cmd_oneshot(T_USER_CMD_PARSED_VALUE *p_parse_value)
{
uint8_t guard_slot = p_parse_value->dw_param[0];
uint16_t guard_usec = p_parse_value->dw_param[1];
uint16_t wait_usec = p_parse_value->dw_param[2];
T_GAP_CAUSE cause;
cause = le_vendor_one_shot_adv(guard_slot, guard_usec, wait_usec);
return (T_USER_CMD_PARSE_RESULT)cause;
}
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
T_APP_RESULT result = APP_RESULT_SUCCESS;
T_LE_CB_DATA cb_data;
memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
APP_PRINT_TRACE1("app_gap_callback: cb_type = %d", cb_type);
switch (cb_type)
{
...
case GAP_MSG_LE_VENDOR_ONE_SHOT_ADV:
APP_PRINT_INFO1("GAP_MSG_LE_VENDOR_ONE_SHOT_ADV: cause 0x%x",
p_data->le_cause.cause);
break;
}
...
}
* \endcode
*/
T_GAP_CAUSE le_vendor_one_shot_adv(uint8_t guard_slot, uint16_t guard_usec, uint16_t wait_usec);
/** @} */ /* End of group GAP_Broadcaster_Exported_Functions */
/** @} */ /* End of group GAP_Broadcaster_Role */
#endif
#ifdef __cplusplus
}
#endif
#endif /* GAP_ADV_H */