Bluetooth: Shell: add pa_ad_init for cmd_per_adv_data
Similar to the ad_init that automatically adds advertising data from other modules, pa_ad_init has been added to do the same for periodic advertising. The only use case so far is the BAP broadcast source data, if enabled. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
d115bafd40
commit
5357bd5d0f
3 changed files with 80 additions and 11 deletions
|
@ -2286,3 +2286,34 @@ ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_si
|
||||||
return nonconnectable_ad_data_add(data_array, data_array_size);
|
return nonconnectable_ad_data_add(data_array, data_array_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t audio_pa_data_add(struct bt_data *data_array,
|
||||||
|
const size_t data_array_size)
|
||||||
|
{
|
||||||
|
size_t ad_len = 0;
|
||||||
|
|
||||||
|
#if defined(CONFIG_BT_AUDIO_BROADCAST_SOURCE)
|
||||||
|
if (default_source) {
|
||||||
|
/* Required size of the buffer depends on what has been
|
||||||
|
* configured. We just use the maximum size possible.
|
||||||
|
*/
|
||||||
|
NET_BUF_SIMPLE_DEFINE_STATIC(base_buf, UINT8_MAX);
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = bt_audio_broadcast_source_get_base(default_source,
|
||||||
|
&base_buf);
|
||||||
|
if (err != 0) {
|
||||||
|
printk("Unable to get BASE: %d\n", err);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
data_array[ad_len].type = BT_DATA_SVC_DATA16;
|
||||||
|
data_array[ad_len].data_len = base_buf.len;
|
||||||
|
data_array[ad_len].data = base_buf.data;
|
||||||
|
ad_len++;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_BT_AUDIO_BROADCAST_SOURCE */
|
||||||
|
|
||||||
|
return ad_len;
|
||||||
|
}
|
||||||
|
|
|
@ -1977,12 +1977,33 @@ static int cmd_per_adv_param(const struct shell *sh, size_t argc,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t pa_ad_init(struct bt_data *data_array,
|
||||||
|
const size_t data_array_size)
|
||||||
|
{
|
||||||
|
size_t ad_len = 0;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_BT_AUDIO)) {
|
||||||
|
ssize_t audio_pa_ad_len;
|
||||||
|
|
||||||
|
audio_pa_ad_len = audio_pa_data_add(&data_array[ad_len],
|
||||||
|
data_array_size - ad_len);
|
||||||
|
if (audio_pa_ad_len < 0U) {
|
||||||
|
return audio_pa_ad_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
ad_len += audio_pa_ad_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ad_len;
|
||||||
|
}
|
||||||
|
|
||||||
static int cmd_per_adv_data(const struct shell *sh, size_t argc,
|
static int cmd_per_adv_data(const struct shell *sh, size_t argc,
|
||||||
char *argv[])
|
char *argv[])
|
||||||
{
|
{
|
||||||
struct bt_le_ext_adv *adv = adv_sets[selected_adv];
|
struct bt_le_ext_adv *adv = adv_sets[selected_adv];
|
||||||
static struct bt_data ad;
|
|
||||||
static uint8_t hex_data[256];
|
static uint8_t hex_data[256];
|
||||||
|
static struct bt_data ad[2U];
|
||||||
|
ssize_t stack_ad_len;
|
||||||
uint8_t ad_len = 0;
|
uint8_t ad_len = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1991,19 +2012,34 @@ static int cmd_per_adv_data(const struct shell *sh, size_t argc,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(hex_data, 0, sizeof(hex_data));
|
if (argc > 1) {
|
||||||
ad_len = hex2bin(argv[1], strlen(argv[1]), hex_data, sizeof(hex_data));
|
size_t hex_len = 0U;
|
||||||
|
|
||||||
if (!ad_len) {
|
(void)memset(hex_data, 0, sizeof(hex_data));
|
||||||
shell_error(sh, "Could not parse adv data");
|
hex_len = hex2bin(argv[1U], strlen(argv[1U]), hex_data,
|
||||||
return -ENOEXEC;
|
sizeof(hex_data));
|
||||||
|
|
||||||
|
if (hex_len == 0U) {
|
||||||
|
shell_error(sh, "Could not parse adv data");
|
||||||
|
|
||||||
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
ad[ad_len].data_len = hex_data[0U];
|
||||||
|
ad[ad_len].type = hex_data[1U];
|
||||||
|
ad[ad_len].data = &hex_data[2U];
|
||||||
|
ad_len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ad.data_len = hex_data[0];
|
stack_ad_len = pa_ad_init(&ad[ad_len], ARRAY_SIZE(ad) - ad_len);
|
||||||
ad.type = hex_data[1];
|
if (stack_ad_len < 0) {
|
||||||
ad.data = &hex_data[2];
|
shell_error(sh, "Failed to get stack PA data");
|
||||||
|
|
||||||
err = bt_le_per_adv_set_data(adv, &ad, 1);
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
ad_len += stack_ad_len;
|
||||||
|
|
||||||
|
err = bt_le_per_adv_set_data(adv, ad, ad_len);
|
||||||
if (err) {
|
if (err) {
|
||||||
shell_error(sh,
|
shell_error(sh,
|
||||||
"Failed to set periodic advertising data (%d)",
|
"Failed to set periodic advertising data (%d)",
|
||||||
|
@ -3670,7 +3706,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(bt_cmds,
|
||||||
SHELL_CMD_ARG(per-adv-param, NULL,
|
SHELL_CMD_ARG(per-adv-param, NULL,
|
||||||
"[<interval-min> [<interval-max> [tx_power]]]",
|
"[<interval-min> [<interval-max> [tx_power]]]",
|
||||||
cmd_per_adv_param, 1, 3),
|
cmd_per_adv_param, 1, 3),
|
||||||
SHELL_CMD_ARG(per-adv-data, NULL, "<data>", cmd_per_adv_data, 2, 0),
|
SHELL_CMD_ARG(per-adv-data, NULL, "[data]", cmd_per_adv_data, 1, 1),
|
||||||
#endif /* CONFIG_BT_PER_ADV */
|
#endif /* CONFIG_BT_PER_ADV */
|
||||||
#endif /* CONFIG_BT_EXT_ADV */
|
#endif /* CONFIG_BT_EXT_ADV */
|
||||||
#endif /* CONFIG_BT_BROADCASTER */
|
#endif /* CONFIG_BT_BROADCASTER */
|
||||||
|
|
|
@ -35,6 +35,8 @@ extern struct bt_le_per_adv_sync *per_adv_syncs[CONFIG_BT_PER_ADV_SYNC_MAX];
|
||||||
void conn_addr_str(struct bt_conn *conn, char *addr, size_t len);
|
void conn_addr_str(struct bt_conn *conn, char *addr, size_t len);
|
||||||
ssize_t audio_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable,
|
ssize_t audio_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable,
|
||||||
const bool connectable);
|
const bool connectable);
|
||||||
|
ssize_t audio_pa_data_add(struct bt_data *data_array,
|
||||||
|
const size_t data_array_size);
|
||||||
ssize_t csis_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable);
|
ssize_t csis_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable);
|
||||||
|
|
||||||
#endif /* __BT_H */
|
#endif /* __BT_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue