BT_GAP_ADV_SLOW_INT_MIN and BT_GAP_ADV_SLOW_INT_MAX represent 1s and 1.2s, respectively, in the extended advertising context, where the bit interval is 0.625 ms. Using them for periodic advertising will result in a range of [2s, 2.4s], as the bit interval for periodic advertising is 1.25ms. Instead, BT_GAP_PER_ADV_SLOW_INT_MIN and BT_GAP_PER_ADV_SLOW_INT_MAX should be used in this sample, and the range will become [1s, 1.2s]. Signed-off-by: Yuxuan Cai <yuxuan.cai@nordicsemi.no>
162 lines
3.9 KiB
C
162 lines
3.9 KiB
C
/*
|
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/types.h>
|
|
#include <stddef.h>
|
|
#include <errno.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/printk.h>
|
|
|
|
#include <zephyr/bluetooth/bluetooth.h>
|
|
#include <zephyr/bluetooth/direction.h>
|
|
#include <zephyr/sys/byteorder.h>
|
|
#include <zephyr/sys/util.h>
|
|
|
|
/* Length of CTE in unit of 8[us] */
|
|
#define CTE_LEN (0x14U)
|
|
/* Number of CTE send in single periodic advertising train */
|
|
#define PER_ADV_EVENT_CTE_COUNT 5
|
|
|
|
static void adv_sent_cb(struct bt_le_ext_adv *adv,
|
|
struct bt_le_ext_adv_sent_info *info);
|
|
|
|
static struct bt_le_ext_adv_cb adv_callbacks = {
|
|
.sent = adv_sent_cb,
|
|
};
|
|
|
|
static struct bt_le_ext_adv *adv_set;
|
|
|
|
static struct bt_le_adv_param param =
|
|
BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_EXT_ADV |
|
|
BT_LE_ADV_OPT_USE_IDENTITY,
|
|
BT_GAP_ADV_FAST_INT_MIN_2,
|
|
BT_GAP_ADV_FAST_INT_MAX_2,
|
|
NULL);
|
|
|
|
static struct bt_le_ext_adv_start_param ext_adv_start_param = {
|
|
.timeout = 0,
|
|
.num_events = 0,
|
|
};
|
|
|
|
static struct bt_le_per_adv_param per_adv_param = {
|
|
.interval_min = BT_GAP_PER_ADV_SLOW_INT_MIN,
|
|
.interval_max = BT_GAP_PER_ADV_SLOW_INT_MAX,
|
|
.options = BT_LE_ADV_OPT_USE_TX_POWER,
|
|
};
|
|
|
|
#if defined(CONFIG_BT_DF_CTE_TX_AOD)
|
|
static uint8_t ant_patterns[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA };
|
|
#endif /* CONFIG_BT_DF_CTE_TX_AOD */
|
|
|
|
struct bt_df_adv_cte_tx_param cte_params = { .cte_len = CTE_LEN,
|
|
.cte_count = PER_ADV_EVENT_CTE_COUNT,
|
|
#if defined(CONFIG_BT_DF_CTE_TX_AOD)
|
|
.cte_type = BT_DF_CTE_TYPE_AOD_2US,
|
|
.num_ant_ids = ARRAY_SIZE(ant_patterns),
|
|
.ant_ids = ant_patterns
|
|
#else
|
|
.cte_type = BT_DF_CTE_TYPE_AOA,
|
|
.num_ant_ids = 0,
|
|
.ant_ids = NULL
|
|
#endif /* CONFIG_BT_DF_CTE_TX_AOD */
|
|
};
|
|
|
|
static const struct bt_data ad[] = {
|
|
BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1),
|
|
};
|
|
|
|
static void adv_sent_cb(struct bt_le_ext_adv *adv,
|
|
struct bt_le_ext_adv_sent_info *info)
|
|
{
|
|
printk("Advertiser[%d] %p sent %d\n", bt_le_ext_adv_get_index(adv),
|
|
adv, info->num_sent);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
char addr_s[BT_ADDR_LE_STR_LEN];
|
|
struct bt_le_oob oob_local;
|
|
int err;
|
|
|
|
printk("Starting Direction Finding periodic advertising Beacon Demo\n");
|
|
|
|
/* Initialize the Bluetooth Subsystem */
|
|
printk("Bluetooth initialization...");
|
|
err = bt_enable(NULL);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Advertising set create...");
|
|
err = bt_le_ext_adv_create(¶m, &adv_callbacks, &adv_set);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
err = bt_le_ext_adv_set_data(adv_set, ad, ARRAY_SIZE(ad), NULL, 0);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
|
|
printk("Update CTE params...");
|
|
err = bt_df_set_adv_cte_tx_param(adv_set, &cte_params);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Periodic advertising params set...");
|
|
err = bt_le_per_adv_set_param(adv_set, &per_adv_param);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Enable CTE...");
|
|
err = bt_df_adv_cte_tx_enable(adv_set);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Periodic advertising enable...");
|
|
err = bt_le_per_adv_start(adv_set);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Extended advertising enable...");
|
|
err = bt_le_ext_adv_start(adv_set, &ext_adv_start_param);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
printk("Get extended advertising address...");
|
|
err = bt_le_ext_adv_oob_get_local(adv_set, &oob_local);
|
|
if (err) {
|
|
printk("failed (err %d)\n", err);
|
|
return 0;
|
|
}
|
|
printk("success\n");
|
|
|
|
bt_addr_le_to_str(&oob_local.addr, addr_s, sizeof(addr_s));
|
|
|
|
printk("Started extended advertising as %s\n", addr_s);
|
|
return 0;
|
|
}
|