aboutsummaryrefslogtreecommitdiff
path: root/inc/bluetooth/gap/gap_conn_le.h
diff options
context:
space:
mode:
Diffstat (limited to 'inc/bluetooth/gap/gap_conn_le.h')
-rw-r--r--inc/bluetooth/gap/gap_conn_le.h1000
1 files changed, 1000 insertions, 0 deletions
diff --git a/inc/bluetooth/gap/gap_conn_le.h b/inc/bluetooth/gap/gap_conn_le.h
new file mode 100644
index 0000000..edcba14
--- /dev/null
+++ b/inc/bluetooth/gap/gap_conn_le.h
@@ -0,0 +1,1000 @@
+/**
+*****************************************************************************************
+* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
+*****************************************************************************************
+ * @file gap_conn_le.h
+ * @brief This file contains all the constants and functions prototypes for GAP protocol.
+ * @details
+ * @author jane
+ * @date 2016-02-18
+ * @version v1.0
+ * *************************************************************************************
+ */
+
+/*============================================================================*
+ * Define to prevent recursive inclusion
+ *============================================================================*/
+#ifndef GAP_CONN_LE_H
+#define GAP_CONN_LE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*============================================================================*
+ * Header Files
+ *============================================================================*/
+#include "upperstack_config.h"
+#include "gap.h"
+#include "gap_le.h"
+#include "gap_msg.h"
+
+/** @defgroup GAP_LE_CONNECTION_MODULE GAP LE Connection Module
+ * @brief GAP LE connection module
+ * @{
+ */
+
+/*============================================================================*
+ * Types
+ *============================================================================*/
+/** @defgroup GAP_LE_CONNECTION_Exported_Types GAP Connection Exported Types
+ * @{
+ */
+#if F_BT_LE_GAP_CENTRAL_SUPPORT
+/** @brief GAP connection phy types*/
+typedef enum
+{
+ GAP_CONN_PARAM_1M = 0,
+#if F_BT_LE_5_0_AE_ADV_SUPPORT
+ GAP_CONN_PARAM_2M = 1,
+ GAP_CONN_PARAM_CODED = 2,
+#endif
+} T_GAP_CONN_PARAM_TYPE;
+#endif
+
+/** @brief GAP link roles */
+typedef enum
+{
+ GAP_LINK_ROLE_UNDEFINED, //!< Unknown.
+ GAP_LINK_ROLE_MASTER, //!< Role is master.
+ GAP_LINK_ROLE_SLAVE //!< Role is slave.
+} T_GAP_ROLE;
+
+/** @brief LE connection parameter types */
+typedef enum
+{
+ GAP_PARAM_CONN_BD_ADDR = 0x270,//!< Address of connected device. Read only. Size is uint8[B_MAX_ADV_LEN]. Set to all zeros when not connected.
+ GAP_PARAM_CONN_BD_ADDR_TYPE = 0x271,//!< Address type of connected device. Read only. Size is uint8. Set to zero when not connected.
+ GAP_PARAM_CONN_INTERVAL = 0x272,//!< Current connection interval. Read only. Size is uint16. Range is 7.5ms to 4 seconds (0x0006 to 0x0C80). Default is 0 (no connection).
+ GAP_PARAM_CONN_LATENCY = 0x273,//!< Current slave latency. Read only. Size is uint16. Range is 0 to 499. Default is 0 (no slave latency or no connection).
+ GAP_PARAM_CONN_TIMEOUT = 0x274,//!< Current timeout value. Read only. size is uint16. Range is 100ms to 32 seconds. Default is 0 (no connection).
+ GAP_PARAM_CONN_MTU_SIZE = 0x275,//!< MTU size. Read only. size is uint16.
+ GAP_PARAM_CONN_LOCAL_BD_TYPE = 0x276,//!< Local bluetooth address type. Read only. size is 1 byte.
+#if F_BT_LE_5_0_SET_PHYS_SUPPORT
+ GAP_PARAM_CONN_RX_PHY_TYPE = 0x277,//!< Rx phy type. Read only. size is 1 byte.
+ GAP_PARAM_CONN_TX_PHY_TYPE = 0x278,//!< Tx phy type. Read only. size is 1 byte.
+#endif
+#if F_BT_LE_READ_REMOTE_FEATS
+ GAP_PARAM_CONN_REMOTE_FEATURES = 0x279,//!< Remote supported features. Read only.
+#endif
+ GAP_PARAM_CONN_CHANN_ALGORITHM = 0x27a,//!< LE Channel Selection Algorithm used. Read only.
+ GAP_PARAM_CONN_HANDLE = 0x27b,//!< LE link connection handle. Read only.
+} T_LE_CONN_PARAM_TYPE;
+
+/** @brief Connected device information.*/
+typedef struct
+{
+ T_GAP_CONN_STATE conn_state; //!< Connection state
+ T_GAP_ROLE role; //!< Device role
+ uint8_t remote_bd[GAP_BD_ADDR_LEN]; //!< Remote address
+ uint8_t remote_bd_type; //!< Remote address type
+} T_GAP_CONN_INFO;
+
+#if F_BT_LE_GAP_CENTRAL_SUPPORT
+/** @brief Definition of LE connection request parameter.*/
+typedef struct
+{
+ uint16_t scan_interval;/**< Time interval from when the Controller started its last scan
+ until it begins the subsequent scan on the primary advertising channel.
+
+ By default @ref GAP_PARAM_USE_EXTENDED_ADV is false,
+ Range: 0x0004 to 0x4000
+ Time = N * 0.625 ms
+ Time Range: 2.5 ms to 10.24 s
+
+ If @ref GAP_PARAM_USE_EXTENDED_ADV is set as true,
+ Range: 0x0004 to 0xFFFF
+ Time = N * 0.625 ms
+ Time Range: 2.5 ms to 40.959375 s */
+ uint16_t scan_window;/**< Duration of the scan on the primary advertising channel.
+ By default @ref GAP_PARAM_USE_EXTENDED_ADV is false,
+ Range: 0x0004 to 0x4000
+ Time = N * 0.625 ms
+ Time Range: 2.5 ms to 10.24 s
+
+ If @ref GAP_PARAM_USE_EXTENDED_ADV is set as true,
+ Range: 0x0004 to 0xFFFF
+ Time = N * 0.625 ms
+ Time Range: 2.5 ms to 40.959375 s */
+ uint16_t conn_interval_min;/**< Minimum value for the connection interval. This shall be less
+ than or equal to Conn_Interval_Max[i].
+ Range: 0x0006 to 0x0C80
+ Time = N * 1.25 ms
+ Time Range: 7.5 ms to 4 s */
+ uint16_t conn_interval_max;/**< Maximum value for the connection interval. This shall be greater
+ than or equal to Conn_Interval_Max[i].
+ Range: 0x0006 to 0x0C80
+ Time = N * 1.25 ms
+ Time Range: 7.5 ms to 4 s */
+ uint16_t conn_latency;/**< Slave latency for the connection in number of connection events.
+ Range: 0x0000 to 0x01F3
+ This shall be less than or equal to (((supv_tout * 10 ms) / (conn_interval_max * 1.25 ms * 2)) - 1) */
+ uint16_t supv_tout;/**< Supervision timeout for the LE Link.
+ Range: 0x000A to 0x0C80
+ Time = N * 10 ms
+ Time Range: 100 ms to 32 s */
+ uint16_t ce_len_min;/**< Informative parameter recommending the minimum length of connection
+ event needed for this LE connection.
+ Range: 0x0000 - 0xFFFF
+ Time = N * 0.625 ms */
+ uint16_t ce_len_max;/**< Informative parameter recommending the maximum length of connection
+ event needed for this LE connection.
+ Range: 0x0000 - 0xFFFF
+ Time = N * 0.625 ms */
+} T_GAP_LE_CONN_REQ_PARAM;
+#endif
+
+/** End of GAP_LE_CONNECTION_Exported_Types
+ * @}
+ */
+
+/*============================================================================*
+ * Functions
+ *============================================================================*/
+/**
+ * @defgroup GAP_CONNECTION_COMMON_EXPORT_Functions GAP Connection Exported Functions
+ *
+ * @{
+ */
+
+/**
+ * @brief Get a GAP connection parameter.
+ *
+ * NOTE: You can call this function with a GAP connection parameter type and it will get a
+ * GAP connection parameter. GAP connection parameters are defined in @ref T_LE_CONN_PARAM_TYPE. Also, the
+ * "p_value" field must point to a data with type "uint16_t".
+ *
+ * @param[in] param Connection parameter type: @ref T_LE_CONN_PARAM_TYPE
+ * @param[in,out] p_value Pointer to location to get the value. This is dependent on
+ * the parameter type and will be cast to the appropriate
+ * data type (For example: if data type param is uint16_t, p_value will be cast to
+ * pointer of uint16_t).
+ * @param[in] conn_id Connection id.
+ *
+ * @return Get result
+ * @retval GAP_CAUSE_SUCCESS Get parameter success.
+ * @retval other Get parameter failed.
+ */
+T_GAP_CAUSE le_get_conn_param(T_LE_CONN_PARAM_TYPE param, void *p_value, uint8_t conn_id);
+
+/**
+ * @brief Get connection information.
+ * @param[in] conn_id Connection ID
+ * @param[in,out] p_conn_info Connection information @ref T_GAP_CONN_INFO
+ * @return Get result
+ * @retval true Success
+ * @retval false Get failed
+ */
+bool le_get_conn_info(uint8_t conn_id, T_GAP_CONN_INFO *p_conn_info);
+
+/**
+ * @brief Get connection address information.
+ * @param[in] conn_id Connection ID
+ * @param[in,out] bd_addr Remote bluetooth device address
+ * @param[in,out] bd_type Remote bluetooth device address type
+ * @return Get result
+ * @retval true Success
+ * @retval false Get failed
+ */
+bool le_get_conn_addr(uint8_t conn_id, uint8_t *bd_addr, uint8_t *bd_type);
+
+/**
+ * @brief Get connection ID.
+ * @param[in] bd_addr Remote bluetooth device address
+ * @param[in] bd_type Remote bluetooth device address type
+ * @param[in, out] p_conn_id Connection ID
+ * @return Get result
+ * @retval true Success
+ * @retval false Get failed
+ */
+bool le_get_conn_id(uint8_t *bd_addr, uint8_t bd_type, uint8_t *p_conn_id);
+
+/**
+ * @brief Get connection ID from connection handle.
+ * @param[in] conn_handle Connection handle
+ * @param[in, out] p_conn_id Connection ID
+ * @return Get result
+ * @retval true Success
+ * @retval false Get failed
+ */
+bool le_get_conn_id_by_handle(uint16_t conn_handle, uint8_t *p_conn_id);
+
+/**
+ * @brief Get connection local address by connection ID.
+ * @param[in] conn_handle Connection handle
+ * @param[in, out] bd_addr Local bluetooth device address
+ * @param[in, out] bd_type Local bluetooth device address type
+ * @return Get result
+ * @retval true Success
+ * @retval false Get failed
+ */
+bool le_get_conn_local_addr_by_conn_id(uint8_t conn_id, uint8_t *bd_addr, uint8_t *bd_type);
+
+/**
+* @brief Get the active link number.
+*
+* @return Active link number
+* @retval 0 No connection created
+* @retval other Connected links number
+*/
+uint8_t le_get_active_link_num(void);
+
+/**
+* @brief Get the idle link number.
+*
+* @return Idle link number.
+* @retval 0 Can't create new connection
+* @retval other Can create new connection
+*/
+uint8_t le_get_idle_link_num(void);
+
+/**
+ * @brief Terminates the existing connection. When link is disconnected, @ref app_handle_conn_state_evt will be
+ * called with new_state as @ref GAP_CONN_STATE_DISCONNECTED.
+ * The disconnection reason is HCI_ERR_REMOTE_USER_TERMINATE.
+ *
+ * @param[in] conn_id connection ID to be disconnected.
+ * @return Operation result.
+ * @retval GAP_CAUSE_SUCCESS Send request success
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection
+ * @retval GAP_CAUSE_INVALID_PARAM Failed. Invalid parameter
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ le_disconnect(conn_id);
+ }
+
+ void app_handle_conn_state_evt(uint8_t conn_id, T_GAP_CONN_STATE new_state, uint16_t disc_cause)
+ {
+ APP_PRINT_INFO4("app_handle_conn_state_evt: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
+ conn_id, gap_conn_state, new_state, disc_cause);
+ switch (new_state)
+ {
+ case GAP_CONN_STATE_DISCONNECTED:
+ {
+ if ((disc_cause != (HCI_ERR | HCI_ERR_REMOTE_USER_TERMINATE))
+ && (disc_cause != (HCI_ERR | HCI_ERR_LOCAL_HOST_TERMINATE)))
+ {
+ APP_PRINT_ERROR1("app_handle_conn_state_evt: connection lost cause 0x%x", disc_cause);
+ }
+
+ le_adv_start();
+ }
+ break;
+
+ case GAP_CONN_STATE_CONNECTED:
+ {
+ uint16_t conn_interval;
+ uint16_t conn_latency;
+ uint16_t conn_supervision_timeout;
+ uint8_t remote_bd[6];
+ T_GAP_REMOTE_ADDR_TYPE remote_bd_type;
+
+ le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_latency, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
+ le_get_conn_addr(conn_id, remote_bd, &remote_bd_type);
+ APP_PRINT_INFO5("GAP_CONN_STATE_CONNECTED:remote_bd %s, remote_addr_type %d, conn_interval 0x%x, conn_latency 0x%x, conn_supervision_timeout 0x%x",
+ TRACE_BDADDR(remote_bd), remote_bd_type,
+ conn_interval, conn_latency, conn_supervision_timeout);
+ }
+ break;
+
+ default:
+ break;
+ }
+ gap_conn_state = new_state;
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_disconnect(uint8_t conn_id);
+
+/**
+ * @brief Terminates the existing connection with reason. When link is disconnected, app_handle_conn_state_evt will be
+ * called with new_state as @ref GAP_CONN_STATE_DISCONNECTED.
+ *
+ * @param[in] conn_id connection ID to be disconnected.
+ * @param[in] reason disconnection reason.
+ * @arg HCI_ERR_REMOTE_USER_TERMINATE: 0x13
+ * @arg HCI_ERR_REMOTE_LOW_RESOURCE: 0x14
+ * @arg HCI_ERR_REMOTE_POWER_OFF: 0x15
+ * @arg HCI_ERR_UNSUPPORTED_REMOTE_FEAT: 0x1A
+ * @arg HCI_ERR_UNACCEPTABLE_CONN_INTERVAL: 0x3B
+ * @return Operation result.
+ * @retval GAP_CAUSE_SUCCESS Send request success
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection
+ * @retval GAP_CAUSE_INVALID_PARAM Failed. Invalid parameter
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0x01;
+ le_disconnect_with_reason(conn_id, HCI_ERR_REMOTE_USER_TERMINATE);
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_disconnect_with_reason(uint8_t conn_id, uint8_t reason);
+
+#if F_BT_LE_READ_REMOTE_VERSION_INFO_SUPPORT
+/**
+ * @brief Obtain the values for the version information for the remote device identified by the conn_id parameter.
+ * Remote version information will be returned by @ref app_gap_callback with cb_type @ref GAP_MSG_LE_READ_REMOTE_VERSION.
+ *
+ * @param[in] conn_id Connection ID
+ * @return Read request result.
+ * @retval GAP_CAUSE_SUCCESS: Send request success.
+ * @retval GAP_CAUSE_SEND_REQ_FAILED: Send request sent fail.
+ * @retval GAP_CAUSE_NON_CONN: Failed. No connection
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ le_read_remote_version(conn_id);
+ }
+
+ 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 is %d", cb_type);
+ switch (cb_type)
+ {
+ ...
+ case GAP_MSG_LE_READ_REMOTE_VERSION:
+ APP_PRINT_INFO5("GAP_MSG_LE_READ_REMOTE_VERSION: conn_id %d, cause 0x%x, version 0x%x, manufacturer_name 0x%x, subversion 0x%x",
+ p_data->p_le_read_remote_version_rsp->conn_id,
+ p_data->p_le_read_remote_version_rsp->cause,
+ p_data->p_le_read_remote_version_rsp->version,
+ p_data->p_le_read_remote_version_rsp->manufacturer_name,
+ p_data->p_le_read_remote_version_rsp->subversion);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_read_remote_version(uint8_t conn_id);
+#endif
+
+/**
+ * @brief Read rssi value of the connection. RSSI value will be returned by
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_READ_RSSI.
+ *
+ * @param[in] conn_id Connection ID
+ * @return Read request result.
+ * @retval GAP_CAUSE_SUCCESS: Read request sent success.<BR>
+ * @retval GAP_CAUSE_NON_CONN: Read request sent fail.<BR>
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ le_read_rssi(conn_id);
+ }
+
+ 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_READ_RSSI:
+ APP_PRINT_INFO3("GAP_MSG_LE_READ_RSSI: conn_id %d, cause 0x%x, rssi %d",
+ cb_data.p_le_read_rssi_rsp->conn_id,
+ cb_data.p_le_read_rssi_rsp->cause,
+ cb_data.p_le_read_rssi_rsp->rssi);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_read_rssi(uint8_t conn_id);
+
+#if F_BT_LE_READ_CHANN_MAP
+/**
+ * @brief Read the used channel map of the connection. Channel map value will be returned by
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_READ_CHANN_MAP.
+ *
+ * @param[in] conn_id Connection ID
+ * @return Read request result.
+ * @retval GAP_CAUSE_SUCCESS: Read request sent success.<BR>
+ * @retval GAP_CAUSE_NON_CONN: Read request sent fail.<BR>
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ le_read_chann_map(conn_id);
+ }
+
+ 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_READ_CHANN_MAP:
+ APP_PRINT_INFO7("GAP_MSG_LE_READ_CHANN_MAP: conn_id %d, cause 0x%x, map[0x%x:0x%x:0x%x:0x%x:0x%x]",
+ cb_data.p_le_read_chann_map_rsp->conn_id,
+ cb_data.p_le_read_chann_map_rsp->cause,
+ cb_data.p_le_read_chann_map_rsp->channel_map[0],
+ cb_data.p_le_read_chann_map_rsp->channel_map[1],
+ cb_data.p_le_read_chann_map_rsp->channel_map[2],
+ cb_data.p_le_read_chann_map_rsp->channel_map[3],
+ cb_data.p_le_read_chann_map_rsp->channel_map[4]);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_read_chann_map(uint8_t conn_id);
+#endif
+
+#if F_BT_LE_4_2_DATA_LEN_EXT_SUPPORT
+/**
+ * @brief Set the data length used in LL for data length extension. LE set data length response will be returned by
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_SET_DATA_LEN. And if data length was changed,
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_DATA_LEN_CHANGE_INFO will be called.
+ *
+ * @param[in] conn_id Connection ID
+ * @param[in] tx_octets Preferred maximum number of payload octets that the local Controller
+ * should include in a single Link Layer packet on this connection.
+ Range 0x001B-0x00FB (all other values reserved for future use)
+ * @param[in] tx_time Preferred maximum number of microseconds that the local Controller
+ should use to transmit a single Link Layer packet on this connection.
+ Range 0x0148-0x4290 (all other values reserved for future use)
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS: Set request sent success.<BR>
+ * @retval GAP_CAUSE_NON_CONN: Set request sent fail.<BR>
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ uint16_t tx_octets = 251;
+ uint16_t tx_time = 2120;
+ le_set_data_len(conn_id, tx_octets, tx_time);
+ }
+
+ 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_SET_DATA_LEN:
+ APP_PRINT_INFO2("GAP_MSG_LE_SET_DATA_LEN: conn_id %d, cause 0x%x",
+ cb_data.p_le_set_data_len_rsp->conn_id,
+ cb_data.p_le_set_data_len_rsp->cause);
+ break;
+ case GAP_MSG_LE_DATA_LEN_CHANGE_INFO:
+ APP_PRINT_INFO5("GAP_MSG_LE_DATA_LEN_CHANGE_INFO: conn_id %d, max_tx_octets 0x%x, max_tx_time 0x%x,
+ max_rx_octets 0x%x, max_rx_time 0x%x",
+ cb_data.p_le_data_len_change_info->conn_id,
+ cb_data.p_le_data_len_change_info->max_tx_octets,
+ cb_data.p_le_data_len_change_info->max_tx_time,
+ cb_data.p_le_data_len_change_info->max_rx_octets,
+ cb_data.p_le_data_len_change_info->max_rx_time);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_set_data_len(uint8_t conn_id, uint16_t tx_octets, uint16_t tx_time);
+#endif
+
+#if F_BT_LE_5_0_SET_PHYS_SUPPORT
+/**
+ * @brief Set the PHY preferences for the connection identified by the Connection_Handle.
+ * The Controller might not be able to make the change (e.g. because the peer does
+ * not support the requested PHY) or may decide that the current PHY is preferable.
+ * If the phy used was changed, @ref app_gap_callback with cb_type @ref GAP_MSG_LE_PHY_UPDATE_INFO will be called.
+ *
+ * @param[in] conn_id Connection ID
+ * @param[in] all_phys A bit field that allows the Host to specify, for each direction,
+ * whether it has no preference among the PHYs that the Controller
+ * supports in a given direction or whether it has specified particular PHYs that it
+ * prefers in the TX_PHYS or RX_PHYS parameter.
+ * @param[in] tx_phys A bit field that indicates the transmitter PHYs that
+ * the Host prefers the Controller to use. If the ALL_PHYS parameter specifies
+ * that the Host has no preference, the TX_PHYS parameter is ignored;
+ * otherwise at least one bit shall be set to 1.
+ * @param[in] rx_phys A bit field that indicates the receiver PHYs that the
+ * Host prefers the Controller to use. If the ALL_PHYS parameter specifies that
+ * the Host has no preference, the RX_PHYS parameter is ignored; otherwise at
+ * least one bit shall be set to 1.
+ * @param[in] phy_options A bit field that allows the Host to specify options
+ * for PHYs. The default value for a new connection shall be all zero bits. The
+ * Controller may override any preferred coding for transmitting on the LE Coded
+ * PHY.
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS: Set request sent success.<BR>
+ * @retval GAP_CAUSE_NON_CONN: Set request sent fail.<BR>
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ uint8_t all_phys = GAP_PHYS_NO_PREFER_TX_BIT;
+ uint8_t tx_phys = GAP_PHYS_PREFER_CODED_BIT;
+ uint8_t rx_phys = GAP_PHYS_PREFER_CODED_BIT;
+ uint16_t phy_options = GAP_PHYS_OPTIONS_CODED_PREFER_S8;
+ le_set_phy(conn_id, all_phys, tx_phys, rx_phys, phy_options);
+ }
+
+ 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_PHY_UPDATE_INFO:
+ APP_PRINT_INFO4("GAP_MSG_LE_PHY_UPDATE_INFO:conn %d, cause 0x%x, rx_phy %d, tx_phy %d",
+ cb_data.p_le_phy_update_info->conn_id,
+ cb_data.p_le_phy_update_info->cause,
+ cb_data.p_le_phy_update_info->rx_phy,
+ cb_data.p_le_phy_update_info->tx_phy);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_set_phy(uint8_t conn_id, uint8_t all_phys, uint8_t tx_phys, uint8_t rx_phys,
+ T_GAP_PHYS_OPTIONS phy_options);
+#endif
+
+/**
+ * @brief Disable the slave latency used in slave role. LE disable slave latency response will be returned by
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_DISABLE_SLAVE_LATENCY.
+ *
+ * NOTE: When slave latency is not 0, and user disable slave latency, the slave will listen to pkts in
+ * every connection interval.
+ *
+ * @param[in] conn_id Connection ID
+ * @param[in] disable Disable/enable slave latency
+ * \arg \c true disable slave latency
+ * \arg \c false enable slave latency
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS: Set request sent success.<BR>
+ * @retval GAP_CAUSE_NON_CONN: Set request sent fail.<BR>
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ bool disable = true;
+ le_disable_slave_latency(conn_id);
+ }
+
+ 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_DISABLE_SLAVE_LATENCY:
+ APP_PRINT_INFO1("GAP_MSG_LE_DISABLE_SLAVE_LATENCY: cause 0x%x",
+ cb_data.p_le_disable_slave_latency_rsp->cause);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_disable_slave_latency(uint8_t conn_id, bool disable);
+
+/**
+ * @brief Update instant passed channel map. LE update passed channel map response will be returned by
+ * @ref app_gap_callback with cb_type @ref GAP_MSG_LE_UPDATE_PASSED_CHANN_MAP.
+ *
+ * When this feature is enabled, if we receive a instant passed channel map req, we will not disconnect
+ * the link.
+ *
+ * @param[in] enable Enable/disable instant update passed channel map feature.
+ * \arg \c true enable instant update passed channel map feature
+ * \arg \c false disable instant update passed channel map feature
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS Send request success
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ bool enable = true;
+ le_update_passed_chann_map(enable);
+ }
+ 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_UPDATE_PASSED_CHANN_MAP:
+ APP_PRINT_INFO1("GAP_MSG_LE_UPDATE_PASSED_CHANN_MAP:cause 0x%x",
+ cb_data.p_le_update_passed_chann_map_rsp->cause);
+ break;
+ }
+ ...
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_update_passed_chann_map(bool enable);
+
+#if F_BT_LE_GAP_CENTRAL_SUPPORT
+/**
+ * @brief Set connection parameter.
+ *
+ * App can call this api to modify connection interval, latency and supervision timeout value.
+ *
+ * @param[in] type Connection ID for this link.
+ * @param[in] p_conn_param Connection parameters @ref T_GAP_LE_CONN_REQ_PARAM.
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS Send request success
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ T_GAP_LE_CONN_REQ_PARAM conn_req_param;
+ T_GAP_REMOTE_ADDR_TYPE bd_type = GAP_REMOTE_ADDR_LE_PUBLIC;
+ uint8_t bd_addr[BD_ADDR_SIZE] = {0x00, 0xe0, x04c, 0x23, 0x99, 0x87};
+ conn_req_param.scan_interval = 0x10;
+ conn_req_param.scan_window = 0x10;
+ conn_req_param.conn_interval_min = 80;
+ conn_req_param.conn_interval_max = 80;
+ conn_req_param.conn_latency = 0;
+ conn_req_param.supv_tout = 1000;
+ conn_req_param.ce_len_min = 2 * (conn_req_param.conn_interval_min - 1);
+ conn_req_param.ce_len_max = 2 * (conn_req_param.conn_interval_max - 1);
+ le_set_conn_param(GAP_CONN_PARAM_1M, &conn_req_param);
+
+ le_connect(0, bd_addr,
+ bd_type,
+ GAP_LOCAL_ADDR_LE_PUBLIC,
+ 1000);
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_set_conn_param(T_GAP_CONN_PARAM_TYPE type,
+ T_GAP_LE_CONN_REQ_PARAM *p_conn_param);
+
+/**
+ * @brief Create a connection to a connectable advertiser. @ref le_set_conn_param shall be called first to set connection parameters.
+ *
+ * @param[in] init_phys The PHY(s) on which the advertising packets should be received on the primary advertising channel and the PHYs
+ * for which connection parameters have been specified.
+ * @param[in] remote_bd The Peer's Public Device Address, Random (static) Device Address, Non-Resolvable Private Address, or
+ Resolvable Private Address depending on the Peer_Address_Type parameter.
+ * @param[in] remote_bd_type The type of address used in the connectable advertisement sent by the peer.
+ * @param[in] local_bd_type The type of address being used in the connection request packets.
+ * @param[in] scan_timeout Scan timeout value.
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS Send request success
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ T_GAP_LE_CONN_REQ_PARAM conn_req_param;
+ T_GAP_REMOTE_ADDR_TYPE bd_type = GAP_REMOTE_ADDR_LE_PUBLIC;
+ uint8_t bd_addr[BD_ADDR_SIZE] = {0x00, 0xe0, x04c, 0x23, 0x99, 0x87};
+ conn_req_param.scan_interval = 0x10;
+ conn_req_param.scan_window = 0x10;
+ conn_req_param.conn_interval_min = 80;
+ conn_req_param.conn_interval_max = 80;
+ conn_req_param.conn_latency = 0;
+ conn_req_param.supv_tout = 1000;
+ conn_req_param.ce_len_min = 2 * (conn_req_param.conn_interval_min - 1);
+ conn_req_param.ce_len_max = 2 * (conn_req_param.conn_interval_max - 1);
+ le_set_conn_param(GAP_CONN_PARAM_1M, &conn_req_param);
+
+ le_connect(0, bd_addr,
+ bd_type,
+ GAP_LOCAL_ADDR_LE_PUBLIC,
+ 1000);
+ }
+
+ void app_handle_conn_state_evt(uint8_t conn_id, T_GAP_CONN_STATE new_state, uint16_t disc_cause)
+ {
+ APP_PRINT_INFO4("app_handle_conn_state_evt: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
+ conn_id, gap_conn_state, new_state, disc_cause);
+ switch (new_state)
+ {
+ case GAP_CONN_STATE_DISCONNECTED:
+ {
+ if ((disc_cause != (HCI_ERR | HCI_ERR_REMOTE_USER_TERMINATE))
+ && (disc_cause != (HCI_ERR | HCI_ERR_LOCAL_HOST_TERMINATE)))
+ {
+ APP_PRINT_ERROR1("app_handle_conn_state_evt: connection lost cause 0x%x", disc_cause);
+ }
+
+ le_adv_start();
+ }
+ break;
+
+ case GAP_CONN_STATE_CONNECTED:
+ {
+ uint16_t conn_interval;
+ uint16_t conn_latency;
+ uint16_t conn_supervision_timeout;
+ uint8_t remote_bd[6];
+ T_GAP_REMOTE_ADDR_TYPE remote_bd_type;
+
+ le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_latency, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
+ le_get_conn_addr(conn_id, remote_bd, &remote_bd_type);
+ APP_PRINT_INFO5("GAP_CONN_STATE_CONNECTED:remote_bd %s, remote_addr_type %d, conn_interval 0x%x, conn_latency 0x%x, conn_supervision_timeout 0x%x",
+ TRACE_BDADDR(remote_bd), remote_bd_type,
+ conn_interval, conn_latency, conn_supervision_timeout);
+ }
+ break;
+
+ default:
+ break;
+ }
+ gap_conn_state = new_state;
+ }
+
+ //When link is connected, stack will read remote used feaures, and the result will be notified by msg GAP_MSG_LE_REMOTE_FEATS_INFO
+ 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_REMOTE_FEATS_INFO:
+ APP_PRINT_INFO3("GAP_MSG_LE_REMOTE_FEATS_INFO: conn id %d, cause 0x%x, remote_feats %b",
+ cb_data.p_le_remote_feats_info->conn_id,
+ cb_data.p_le_remote_feats_info->cause,
+ TRACE_BINARY(8, cb_data.p_le_remote_feats_info->remote_feats));
+ break;
+ }
+ ...
+ }
+ *
+ * \endcode
+ */
+T_GAP_CAUSE le_connect(uint8_t init_phys, uint8_t *remote_bd,
+ T_GAP_REMOTE_ADDR_TYPE remote_bd_type,
+ T_GAP_LOCAL_ADDR_TYPE local_bd_type, uint16_t scan_timeout);
+#endif
+/**
+ * @brief Send connection parameter update request msg to bt stack. Connection parameter update result will be returned
+ * by @ref app_handle_conn_param_update_evt.
+ *
+ * App can call this api to modify connection interval, latency and supervision timeout value.
+ *
+ * @param[in] conn_id Connection ID for this link.
+ * @param[in] conn_interval_min Value range: 0x0006 - 0x0C80 (7.5ms - 4000ms, 1.25ms/step).
+ * @param[in] conn_interval_max Value range: 0x0006 - 0x0C80 (7.5ms - 4000ms, 1.25ms/step).
+ * @param[in] conn_latency Value range: 0x0000 - 0x01F3
+ This shall be less than or equal to (((supervision_timeout * 10ms) / (conn_interval_max * 1.25ms * 2)) - 1).
+ * @param[in] supervision_timeout Value range: 0x000A - 0x0C80 (100ms - 32000ms, 10ms/step).
+ * @param[in] ce_length_min Value range: 0x0006 - 0x0C80 (7.5ms - 4000ms, 1.25ms/step).
+ * @param[in] ce_length_max Value range: 0x0006 - 0x0C80 (7.5ms - 4000ms, 1.25ms/step).
+ * @return result.
+ * @retval GAP_CAUSE_SUCCESS Send request success.
+ * @retval GAP_CAUSE_NON_CONN Failed. No connection.
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void test()
+ {
+ uint8_t conn_id = 0;
+ T_GAP_CAUSE cause;
+ uint16_t conn_interval_min = 0x10;
+ uint16_t conn_interval_max = 0x10;
+ uint16_t conn_latency = 50;
+ uint16_t supervision_timeout = 1000;
+ uint16_t ce_length_min = 2 * (conn_interval_min - 1);
+ uint16_t ce_length_max = 2 * (conn_interval_max - 1);
+
+
+ cause = le_update_conn_param(conn_id,
+ conn_interval_min,
+ conn_interval_max,
+ conn_latency,
+ supervision_timeout,
+ ce_length_min,
+ ce_length_max
+ );
+
+ }
+
+ void app_handle_conn_param_update_evt(uint8_t conn_id, uint8_t status, uint16_t cause)
+ {
+ switch (status)
+ {
+ case GAP_CONN_PARAM_UPDATE_STATUS_SUCCESS:
+ {
+ uint16_t conn_interval;
+ uint16_t conn_slave_latency;
+ uint16_t conn_supervision_timeout;
+
+ le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_slave_latency, conn_id);
+ le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
+ APP_PRINT_INFO3("app_handle_conn_param_update_evt update success:conn_interval 0x%x, conn_slave_latency 0x%x, conn_supervision_timeout 0x%x",
+ conn_interval, conn_slave_latency, conn_supervision_timeout);
+ }
+ break;
+
+ case GAP_CONN_PARAM_UPDATE_STATUS_FAIL:
+ {
+ APP_PRINT_ERROR1("app_handle_conn_param_update_evt update failed: cause 0x%x", cause);
+ }
+ break;
+
+ case GAP_CONN_PARAM_UPDATE_STATUS_PENDING:
+ {
+ APP_PRINT_INFO0("app_handle_conn_param_update_evt update pending.");
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+ //If app receive connection parameter update request from remote device, app will receive GAP_MSG_LE_CONN_UPDATE_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_CONN_UPDATE_IND:
+ APP_PRINT_INFO4("GAP_MSG_LE_CONN_UPDATE_IND: conn_interval_max 0x%x, conn_interval_min 0x%x, conn_latency 0x%x
+ , supervision_timeout 0x%x",
+ cb_data.p_le_conn_update_ind->conn_interval_max,
+ cb_data.p_le_conn_update_ind->conn_interval_min,
+ cb_data.p_le_conn_update_ind->conn_latency,
+ cb_data.p_le_conn_update_ind->supervision_timeout);
+ if (cb_data.p_le_conn_update_ind->conn_latency > 60)
+ {
+ result = APP_RESULT_REJECT;
+ }
+ else
+ {
+ result = APP_RESULT_ACCEPT;
+ }
+ break;
+ ...
+ }
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_update_conn_param(uint8_t conn_id,
+ uint16_t conn_interval_min,
+ uint16_t conn_interval_max,
+ uint16_t conn_latency,
+ uint16_t supervision_timeout,
+ uint16_t ce_length_min,
+ uint16_t ce_length_max);
+
+/**
+ * @brief Set the link tx power for the device.
+ *
+ * Set LE link tx power. Or reset link tx power to default value.
+ * Tx power is set to default every time a link is connect. Use this command
+ * after the link is connected.
+ *
+ * @param[in] conn_id Connection ID for this link.
+ * @param[in] reset Whether to reset to default value.
+ * @param[in] tx_power index for power level. NOTE: The following tx power 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 conn_id = 0;
+ bool reset = false;
+ uint8_t tx_pwr = 0x80;
+
+ cause = le_set_conn_tx_power(conn_id, reset, tx_pwr);
+
+ 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: msgType = %d", cb_type);
+ switch (cb_type)
+ {
+ ...
+ case GAP_MSG_LE_SET_CONN_TX_PWR:
+ APP_PRINT_INFO1("GAP_MSG_LE_SET_CONN_TX_PWR: cause 0x%x",
+ p_data->le_cause.cause);
+ break;
+ ...
+ }
+ }
+ * \endcode
+ */
+T_GAP_CAUSE le_set_conn_tx_power(uint8_t conn_id, bool reset, uint8_t tx_power);
+/** @} */ /* End of group GAP_CONNECTION_COMMON_EXPORT_Functions */
+/** @} */ /* End of group GAP_LE_CONNECTION_MODULE */
+
+
+/*-------------------------------------------------------------------
+-------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GAP_CONN_LE_H */
+
+