| /* |
| * 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), |
| /** Angle of Departure mode with 1 us antenna switching slots. |
| * Antenna switching done on transmitter site. |
| */ |
| BT_DF_CTE_TYPE_AOD_1US = BIT(1), |
| /** 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; |
| /** CTE Type: AoA, AoD 1us slots, AoD 2us slots. */ |
| 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 { |
| /* Bitmap with allowed CTE types (@ref bt_df_cte_type). */ |
| uint8_t cte_type; |
| /** 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; |
| /** Number of IQ samples in report. */ |
| uint8_t sample_count; |
| /** Pinter to IQ samples data. */ |
| struct bt_hci_le_iq_sample const *sample; |
| }; |
| |
| /** |
| * @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); |
| |
| #endif /* ZEPHYR_INCLUDE_BLUETOOTH_DF_H_ */ |