The buffers for the PBP advertising data as well as the buffers for the BASE periodic advertising data were not cleared, so calling the functions multiple times would simply append the data rather than just setting the new data. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
/** @file
|
|
* @brief Bluetooth Public Broadcast Profile shell
|
|
*/
|
|
|
|
/*
|
|
* Copyright 2023 NXP
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/shell/shell.h>
|
|
#include <zephyr/sys/util.h>
|
|
#include <zephyr/bluetooth/audio/pbp.h>
|
|
|
|
#include "shell/bt.h"
|
|
|
|
#define PBS_DEMO 'P', 'B', 'P'
|
|
|
|
const uint8_t pba_metadata[] = {
|
|
BT_AUDIO_CODEC_DATA(BT_AUDIO_METADATA_TYPE_PROGRAM_INFO, PBS_DEMO)
|
|
};
|
|
|
|
/* Buffer to hold the Public Broadcast Announcement */
|
|
NET_BUF_SIMPLE_DEFINE_STATIC(pbp_ad_buf, BT_PBP_MIN_PBA_SIZE + ARRAY_SIZE(pba_metadata));
|
|
|
|
enum bt_pbp_announcement_feature pbp_features;
|
|
extern const struct shell *ctx_shell;
|
|
|
|
static int cmd_pbp_set_features(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
int err = 0;
|
|
enum bt_pbp_announcement_feature features;
|
|
|
|
features = shell_strtoul(argv[1], 16, &err);
|
|
if (err != 0) {
|
|
shell_error(sh, "Could not parse received features: %d", err);
|
|
|
|
return -ENOEXEC;
|
|
}
|
|
|
|
pbp_features = features;
|
|
|
|
return err;
|
|
}
|
|
|
|
size_t pbp_ad_data_add(struct bt_data data[], size_t data_size)
|
|
{
|
|
int err;
|
|
|
|
net_buf_simple_reset(&pbp_ad_buf);
|
|
|
|
err = bt_pbp_get_announcement(pba_metadata,
|
|
ARRAY_SIZE(pba_metadata),
|
|
pbp_features,
|
|
&pbp_ad_buf);
|
|
|
|
if (err != 0) {
|
|
shell_info(ctx_shell, "Create Public Broadcast Announcement");
|
|
} else {
|
|
shell_error(ctx_shell, "Failed to create Public Broadcast Announcement: %d", err);
|
|
}
|
|
|
|
__ASSERT(data_size > 0, "No space for Public Broadcast Announcement");
|
|
data[0].type = BT_DATA_SVC_DATA16;
|
|
data[0].data_len = pbp_ad_buf.len;
|
|
data[0].data = pbp_ad_buf.data;
|
|
|
|
return 1U;
|
|
}
|
|
|
|
static int cmd_pbp(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc > 1) {
|
|
shell_error(sh, "%s unknown parameter: %s", argv[0], argv[1]);
|
|
} else {
|
|
shell_error(sh, "%s missing subcomand", argv[0]);
|
|
}
|
|
|
|
return -ENOEXEC;
|
|
}
|
|
|
|
SHELL_STATIC_SUBCMD_SET_CREATE(pbp_cmds,
|
|
SHELL_CMD_ARG(set_features, NULL,
|
|
"Set the Public Broadcast Announcement features",
|
|
cmd_pbp_set_features, 2, 0),
|
|
SHELL_SUBCMD_SET_END
|
|
);
|
|
|
|
SHELL_CMD_ARG_REGISTER(pbp, &pbp_cmds, "Bluetooth pbp shell commands", cmd_pbp, 1, 1);
|