The CTE type is used in two ways by HCI layer: 1) single value representing particular CTE type: AoA, AoD 1 us, AoD 2 us 2) bit-filed where bits 0-2 represent particular CTE types AoA AoD 1 us, AoD 2 us The bit-field is used to inform Controller about allowed types of CTE, hence single value carries more than one value. To avoid confusion between these use cases in code that refers to case 1) all named cte_type (singular form). For case 2) cte_types (plural form) is used. There is an enumeration that is used for both cases: bt_df_cte_type. For cte_type only single value from the enumeration may be assigned to variable except BT_DF_CTE_TYPE_NONE and BT_DF_CTE_TYPE_ALL. For cte_types all enum members may be used. Ocasionally BT_DF_CTE_TYPE_NONE may be excluded. If that is true, it is described in code documentation. Thanks to that applications are released from requirement to include hci.h header file. Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no>
330 lines
11 KiB
C
330 lines
11 KiB
C
/*
|
|
* Copyright (c) 2020 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_DF_H_
|
|
#define ZEPHYR_INCLUDE_BLUETOOTH_DF_H_
|
|
|
|
/** Constant Tone Extension (CTE) types. */
|
|
enum bt_df_cte_type {
|
|
/** Convenience value for purposes where non of CTE types is allowed. */
|
|
BT_DF_CTE_TYPE_NONE = 0,
|
|
/** Angle of Arrival mode. Antenna switching done on receiver site. */
|
|
BT_DF_CTE_TYPE_AOA = BIT(0),
|
|
/**
|
|
* @brief Angle of Departure mode with 1 us antenna switching slots.
|
|
*
|
|
* Antenna switching done on transmitter site.
|
|
*/
|
|
BT_DF_CTE_TYPE_AOD_1US = BIT(1),
|
|
/**
|
|
* @brief Angle of Departure mode with 2 us antenna switching slots.
|
|
*
|
|
* Antenna switching done on transmitter site.
|
|
*/
|
|
BT_DF_CTE_TYPE_AOD_2US = BIT(2),
|
|
/** Convenience value that collects all possible CTE types in one entry. */
|
|
BT_DF_CTE_TYPE_ALL = (BT_DF_CTE_TYPE_AOA | BT_DF_CTE_TYPE_AOD_1US | BT_DF_CTE_TYPE_AOD_2US)
|
|
};
|
|
|
|
/** Allowed antenna switching slots: 1 us or 2 us */
|
|
enum bt_df_antenna_switching_slot {
|
|
BT_DF_ANTENNA_SWITCHING_SLOT_1US = 0x1,
|
|
BT_DF_ANTENNA_SWITCHING_SLOT_2US = 0x2
|
|
};
|
|
|
|
/** Possible statuses of PDU that contained reported CTE. */
|
|
enum bt_df_packet_status {
|
|
/** Received PDU had CRC OK */
|
|
BT_DF_CTE_CRC_OK = 0x0,
|
|
/** Received PDU had incorrect CRC, but Radio peripheral
|
|
* was able to parse CTEInfo field of the PDU and process
|
|
* sampling of CTE.
|
|
*/
|
|
BT_DF_CTE_CRC_ERR_CTE_BASED_TIME = 0x1,
|
|
/** Received PDU had incorrect CRC, but Radio peripheral
|
|
* was able to process sampling of CTE in some other way.
|
|
*/
|
|
BT_DF_CTE_CRC_ERR_CTE_BASED_OTHER = 0x2,
|
|
/** There were no sufficient resources to sample CTE. */
|
|
BT_DF_CTE_INSUFFICIENT_RESOURCES = 0xFF
|
|
};
|
|
|
|
/** @brief Constant Tone Extension parameters for connectionless
|
|
* transmission.
|
|
*
|
|
* The structure holds information required to setup CTE transmission
|
|
* in periodic advertising.
|
|
*/
|
|
struct bt_df_adv_cte_tx_param {
|
|
/** Length of CTE in 8us units. */
|
|
uint8_t cte_len;
|
|
/**
|
|
* @brief CTE type.
|
|
*
|
|
* Allowed values are defined by @ref bt_df_cte_type, except BT_DF_CTE_TYPE_NONE and
|
|
* BT_DF_CTE_TYPE_ALL.
|
|
*/
|
|
uint8_t cte_type;
|
|
/** Number of CTE to transmit in each periodic adv interval. */
|
|
uint8_t cte_count;
|
|
/** Number of Antenna IDs in the switch pattern. */
|
|
uint8_t num_ant_ids;
|
|
/** List of antenna IDs in the pattern. */
|
|
uint8_t *ant_ids;
|
|
};
|
|
|
|
/**
|
|
* @brief Constant Tone Extension parameters for connectionless reception.
|
|
*
|
|
* @note cte_type is a bit field that provides information about type of CTE an application
|
|
* expects (@ref bt_df_cte_type). In case cte_type bit BT_DF_CTE_TYPE_AOA is not set, members:
|
|
* slot_durations, num_ant_ids and ant_ids are not required and their values will be not verified
|
|
* for correctness.
|
|
*/
|
|
struct bt_df_per_adv_sync_cte_rx_param {
|
|
/**
|
|
* @brief Bitfield with allowed CTE types.
|
|
*
|
|
* Allowed values are defined by @ref bt_df_cte_type, except BT_DF_CTE_TYPE_NONE.
|
|
*/
|
|
uint8_t cte_types;
|
|
/** Antenna switching slots (@ref bt_df_antenna_switching_slot). */
|
|
uint8_t slot_durations;
|
|
/** Max number of CTEs to receive. Min is 1, max is 10, 0 means receive continuously. */
|
|
uint8_t max_cte_count;
|
|
/** Length of antenna switch pattern. */
|
|
uint8_t num_ant_ids;
|
|
/** Antenna switch pattern. */
|
|
const uint8_t *ant_ids;
|
|
};
|
|
|
|
struct bt_df_per_adv_sync_iq_samples_report {
|
|
/** Channel index used to receive PDU with CTE that was sampled. */
|
|
uint8_t chan_idx;
|
|
/** The RSSI of the PDU with CTE (excluding CTE). */
|
|
int16_t rssi;
|
|
/** Id of antenna used to measure the RSSI. */
|
|
uint8_t rssi_ant_id;
|
|
/** Type of CTE (@ref bt_df_cte_type). */
|
|
uint8_t cte_type;
|
|
/** Duration of slots when received CTE type is AoA (@ref bt_df_antenna_switching_slot). */
|
|
uint8_t slot_durations;
|
|
/** Status of received PDU with CTE (@ref bt_df_packet_status). */
|
|
uint8_t packet_status;
|
|
/** Value of the paEventCounter of the AUX_SYNC_IND PDU. */
|
|
uint16_t per_evt_counter;
|
|
/** Number of IQ samples in report. */
|
|
uint8_t sample_count;
|
|
/** Pinter to IQ samples data. */
|
|
struct bt_hci_le_iq_sample const *sample;
|
|
};
|
|
|
|
struct bt_df_conn_cte_rx_param {
|
|
/**
|
|
* @brief Bitfield with allowed CTE types.
|
|
*
|
|
* Allowed values are defined by @ref bt_df_cte_type, except BT_DF_CTE_TYPE_NONE.
|
|
*/
|
|
uint8_t cte_types;
|
|
/** Antenna switching slots (@ref bt_df_antenna_switching_slot). */
|
|
uint8_t slot_durations;
|
|
/** Length of antenna switch pattern. */
|
|
uint8_t num_ant_ids;
|
|
/** Antenna switch pattern. */
|
|
const uint8_t *ant_ids;
|
|
};
|
|
|
|
struct bt_df_conn_iq_samples_report {
|
|
/** PHY that was used to receive PDU with CTE that was sampled. */
|
|
uint8_t rx_phy;
|
|
/** Channel index used to receive PDU with CTE that was sampled. */
|
|
uint8_t chan_idx;
|
|
/** The RSSI of the PDU with CTE (excluding CTE). */
|
|
int16_t rssi;
|
|
/** Id of antenna used to measure the RSSI. */
|
|
uint8_t rssi_ant_id;
|
|
/** Type of CTE (@ref bt_df_cte_type). */
|
|
uint8_t cte_type;
|
|
/** Duration of slots when received CTE type is AoA (@ref bt_df_antenna_switching_slot). */
|
|
uint8_t slot_durations;
|
|
/** Status of received PDU with CTE (@ref bt_df_packet_status). */
|
|
uint8_t packet_status;
|
|
/** Value of connection event counter when the CTE was received and sampled. */
|
|
uint16_t conn_evt_counter;
|
|
/** Number of IQ samples in report. */
|
|
uint8_t sample_count;
|
|
/** Pinter to IQ samples data. */
|
|
struct bt_hci_le_iq_sample const *sample;
|
|
};
|
|
/** Constant Tone Extension parameters for CTE transmission in connected mode. */
|
|
struct bt_df_conn_cte_tx_param {
|
|
/**
|
|
* Bitfield with allowed CTE types (@ref bt_df_cte_type. All enum members may be used except
|
|
* BT_DF_CTE_TYPE_NONE).
|
|
*/
|
|
uint8_t cte_types;
|
|
/** Number of antenna switch pattern. */
|
|
uint8_t num_ant_ids;
|
|
/** Antenna switch pattern. */
|
|
const uint8_t *ant_ids;
|
|
};
|
|
|
|
struct bt_df_conn_cte_req_params {
|
|
/**
|
|
* @brief Requested interval for initiating the CTE Request procedure.
|
|
*
|
|
* Value 0x0 means, run the procedure once. Other values are intervals in number of
|
|
* connection events, to run the command periodically.
|
|
*/
|
|
uint8_t interval;
|
|
/** Requested length of the CTE in 8 us units. */
|
|
uint8_t cte_length;
|
|
/**
|
|
* @brief Requested type of the CTE.
|
|
*
|
|
* Allowed values are defined by @ref bt_df_cte_type, except BT_DF_CTE_TYPE_NONE and
|
|
* BT_DF_CTE_TYPE_ALL.
|
|
*/
|
|
uint8_t cte_type;
|
|
};
|
|
|
|
/**
|
|
* @brief Set or update the Constant Tone Extension parameters for periodic advertising set.
|
|
*
|
|
* @param[in] adv Advertising set object.
|
|
* @param[in] params Constant Tone Extension parameters.
|
|
*
|
|
* @return Zero on success or (negative) error code otherwise.
|
|
*/
|
|
int bt_df_set_adv_cte_tx_param(struct bt_le_ext_adv *adv,
|
|
const struct bt_df_adv_cte_tx_param *params);
|
|
|
|
/**
|
|
* @brief Enable transmission of Constant Tone Extension for the given advertising set.
|
|
*
|
|
* Transmission of Constant Tone Extension may be enabled only after setting periodic advertising
|
|
* parameters (@ref bt_le_per_adv_set_param) and Constant Tone Extension parameters
|
|
* (@ref bt_df_set_adv_cte_tx_param).
|
|
*
|
|
* @param[in] adv Advertising set object.
|
|
*
|
|
* @return Zero on success or (negative) error code otherwise.
|
|
*/
|
|
int bt_df_adv_cte_tx_enable(struct bt_le_ext_adv *adv);
|
|
|
|
/**
|
|
* @brief Disable transmission of Constant Tone Extension for the given advertising set.
|
|
*
|
|
* @param[in] adv Advertising set object.
|
|
*
|
|
* @return Zero on success or (negative) error code otherwise.
|
|
*/
|
|
int bt_df_adv_cte_tx_disable(struct bt_le_ext_adv *adv);
|
|
|
|
/**
|
|
* @brief Enable receive and sampling of Constant Tone Extension for the given sync set.
|
|
*
|
|
* Receive and sampling of Constant Tone Extension may be enabled only after periodic advertising
|
|
* sync is established.
|
|
*
|
|
* @param sync Periodic advertising sync object.
|
|
* @param params CTE receive and sampling parameters.
|
|
*
|
|
* @return Zero on success or (negative) error code otherwise.
|
|
*/
|
|
int bt_df_per_adv_sync_cte_rx_enable(struct bt_le_per_adv_sync *sync,
|
|
const struct bt_df_per_adv_sync_cte_rx_param *params);
|
|
|
|
/**
|
|
* @brief Disable receive and sampling of Constant Tone Extension for the given sync set.
|
|
*
|
|
* @param sync Periodic advertising sync object.
|
|
*
|
|
* @return Zero on success or (negative) error code otherwise.
|
|
*/
|
|
int bt_df_per_adv_sync_cte_rx_disable(struct bt_le_per_adv_sync *sync);
|
|
|
|
/**
|
|
* @brief Enable receive and sampling of Constant Tone Extension for the connection object.
|
|
*
|
|
* @param conn Connection object.
|
|
* @param params CTE receive and sampling parameters.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_rx_enable(struct bt_conn *conn, const struct bt_df_conn_cte_rx_param *params);
|
|
|
|
/**
|
|
* @brief Disable receive and sampling of Constant Tone Extension for the connection object.
|
|
*
|
|
* @param conn Connection object.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_rx_disable(struct bt_conn *conn);
|
|
|
|
/**
|
|
* @brief Set Constant Tone Extension transmission parameters for a connection.
|
|
*
|
|
* The function is available if @kconfig{CONFIG_BT_DF_CONNECTION_CTE_TX} is enabled.
|
|
*
|
|
* @note If neither BT_DF_CTE_TYPE_AOD_1US or BT_DF_CTE_TYPE_AOD_2US are set
|
|
* in the bitfield, then the bt_df_conn_cte_tx_param.num_ant_ids and
|
|
* bt_df_conn_cte_tx_param.ant_ids parameters will be ignored.
|
|
*
|
|
* @param conn Connection object.
|
|
* @param params CTE transmission parameters.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_set_conn_cte_tx_param(struct bt_conn *conn, const struct bt_df_conn_cte_tx_param *params);
|
|
|
|
/**
|
|
* @brief Enable Constant Tone Extension request procedure for a connection.
|
|
*
|
|
* The function is available if @kconfig{CONFIG_BT_DF_CONNECTION_CTE_REQ} is enabled.
|
|
*
|
|
* @param conn Connection object.
|
|
* @param params CTE receive and sampling parameters.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_req_enable(struct bt_conn *conn, const struct bt_df_conn_cte_req_params *params);
|
|
|
|
/**
|
|
* @brief Disable Constant Tone Extension request procedure for a connection.
|
|
*
|
|
* The function is available if @kconfig{CONFIG_BT_DF_CONNECTION_CTE_REQ} is enabled.
|
|
*
|
|
* @param conn Connection object.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_req_disable(struct bt_conn *conn);
|
|
|
|
/**
|
|
* @brief Enable Constant Tone Extension response procedure for a connection.
|
|
*
|
|
* The function is available if @kconfig{CONFIG_BT_DF_CONNECTION_CTE_RSP} is enabled.
|
|
*
|
|
* @param conn Connection object.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_rsp_enable(struct bt_conn *conn);
|
|
|
|
/**
|
|
* @brief Disable Constant Tone Extension response procedure for a connection.
|
|
*
|
|
* The function is available if @kconfig{CONFIG_BT_DF_CONNECTION_CTE_RSP} is enabled.
|
|
*
|
|
* @param conn Connection object.
|
|
*
|
|
* @return Zero in case of success, other value in case of failure.
|
|
*/
|
|
int bt_df_conn_cte_rsp_disable(struct bt_conn *conn);
|
|
|
|
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_DF_H_ */
|