Skip to content

Commit

Permalink
Add BASS in bttester & BASS fixes
Browse files Browse the repository at this point in the history
Adding BASS support in bttester

This commit fixes various BASS issues found during testing against PTS.
  • Loading branch information
szymon-czapracki committed Jul 29, 2024
1 parent a9400d7 commit daaf152
Show file tree
Hide file tree
Showing 14 changed files with 560 additions and 55 deletions.
2 changes: 2 additions & 0 deletions apps/bttester/pkg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ pkg.deps:
- "@apache-mynewt-core/sys/stats"
- "@apache-mynewt-core/sys/shell"
- "@apache-mynewt-nimble/nimble/host"
- "@apache-mynewt-nimble/nimble/host/audio"
- "@apache-mynewt-nimble/nimble/host/util"
- "@apache-mynewt-nimble/nimble/host/services/gap"
- "@apache-mynewt-nimble/nimble/host/services/gatt"
- "@apache-mynewt-nimble/nimble/host/services/dis"
- "@apache-mynewt-nimble/nimble/host/audio/services/bass"
- "@apache-mynewt-nimble/nimble/host/store/config"
- "@apache-mynewt-core/hw/drivers/uart"
- "@apache-mynewt-core/hw/drivers/rtt"
Expand Down
1 change: 1 addition & 0 deletions apps/bttester/src/btp/btp.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#define BTP_SERVICE_ID_MESH 4
#define BTP_SERVICE_ID_GATTC 6
#define BTP_SERVICE_ID_BAP 14
#define BTP_SERVICE_ID_BASS 14

#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_BAP

Expand Down
19 changes: 17 additions & 2 deletions apps/bttester/src/btp/btp_bap.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,27 @@ struct bap_bap_broadcast_source_stop_cmd {
uint8_t broadcast_id[3];
} __packed;

#define BTP_BAP_BROADCAST_SINK_SETUP 0x0a
#define BTP_BAP_BROADCAST_SINK_SETUP 0xa
struct btp_bap_broadcast_sink_setup_cmd {
} __packed;

#define BTP_BAP_BROADCAST_SINK_STOP 0x0f
struct btp_bap_broadcast_sink_stop_cmd {
ble_addr_t address;
uint8_t broadcast_id[3];
} __packed;

#define BTP_BAP_SET_BROADCAST_CODE 0x17
struct btp_bap_set_broadcast_code_cmd {
ble_addr_t addr;
uint8_t source_id;
uint8_t broadcast_code[16];
} __packed;

#define BTP_BAP_BROADCAST_SINK_RELEASE 0x0b
#define BTP_BAP_BROADCAST_SCAN_START 0x0c
#define BTP_BAP_BROADCAST_SCAN_STOP 0x0d
#define BTP_BAP_BROADCAST_SINK_SYNC 0x0e
#define BTP_BAP_BROADCAST_SINK_STOP 0x0f
#define BTP_BAP_BROADCAST_SINK_BIS_SYNC 0x10
#define BTP_BAP_DISCOVER_SCAN_DELEGATOR 0x11
#define BTP_BAP_BROADCAST_ASSISTANT_SCAN_START 0x12
Expand Down
37 changes: 37 additions & 0 deletions apps/bttester/src/btp/btp_bass.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

#ifndef H_BTP_BASS_
#define H_BTP_BASS_

#include "nimble/ble.h"
#include <stdint.h>

#ifndef __packed
#define __packed __attribute__((__packed__))
#endif

/* BAS Service */
/* commands */
#define BTP_BASS_READ_SUPPORTED_COMMANDS 0x01
struct btp_bass_read_supported_commands_rp {
uint8_t data[0];
} __packed;

#endif /* H_BTP_BASS_ */
10 changes: 10 additions & 0 deletions apps/bttester/src/btp/btp_gap.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct btp_gap_read_controller_index_list_rp {
#define BTP_GAP_SETTINGS_PRIVACY 13
#define BTP_GAP_SETTINGS_CONTROLLER_CONFIG 14
#define BTP_GAP_SETTINGS_STATIC_ADDRESS 15
#define BTP_GAP_SETTINGS_EXTENDED_ADVERTISING 17
#define BTP_GAP_SETTINGS_PERIODIC_ADVERTISING 18

#define BTP_GAP_READ_CONTROLLER_INFO 0x03
Expand Down Expand Up @@ -258,6 +259,15 @@ struct btp_gap_set_filter_accept_list_cmd {
ble_addr_t addrs[];
} __packed;

#define GAP_SET_EXT_ADV 0x21
struct btp_gap_set_ext_advertising_cmd {
uint8_t flags;
} __packed;

struct btp_gap_set_ext_advertising_rp {
uint32_t current_settings;
} __packed;

#define GAP_PADV_CONFIGURE 0x22
struct gap_periodic_adv_configure_cmd {
uint8_t flags;
Expand Down
7 changes: 5 additions & 2 deletions apps/bttester/src/btp/bttester.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ tester_init_bap(void);
uint8_t
tester_unregister_bap(void);
#endif /* MYNEWT_VAL(BLE_ISO_BROADCAST_SOURCE) */

#endif /* __BTTESTER_H__ */
uint8_t
tester_init_bass(void);
uint8_t
tester_unregister_bass(void);
#endif /* MYNEWT_VAL(BLE_ISO_BROADCASTER) */

212 changes: 210 additions & 2 deletions apps/bttester/src/btp_bap.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@

/* btp_bap.c - Bluetooth Basic Audio Profile Tester */

#include "btp/bttester.h"
#include "syscfg/syscfg.h"
#include <string.h>


#if MYNEWT_VAL(BLE_ISO_BROADCAST_SOURCE)

#include "btp/btp_bap.h"


#include "btp/btp.h"
#include "console/console.h"

#include "nimble/ble.h"
#include "host/ble_hs.h"
#include "host/util/util.h"
#include "math.h"

#include "audio/ble_audio_broadcast_source.h"
#include "audio/ble_audio_broadcast_sink.h"
#include "audio/ble_audio.h"
#include "host/ble_iso.h"

Expand Down Expand Up @@ -319,6 +321,32 @@ broadcast_source_start(const void *cmd, uint16_t cmd_len, void *rsp,
return BTP_STATUS_SUCCESS;
}

static uint8_t broadcast_code_set(const void *cmd, uint16_t cmd_len, void *rsp,
uint16_t *rsp_len)
{
return BTP_STATUS_SUCCESS;
}

static uint8_t broadcast_sink_setup(const void *cmd, uint16_t cmd_len, void *rsp,
uint16_t *rsp_len)
{
return BTP_STATUS_SUCCESS;
}

static uint8_t broadcast_sink_stop(const void *cmd, uint16_t cmd_len, void *rsp,
uint16_t *rsp_len)
{
int rc;
//const struct btp_bap_broadcast_sink_stop_cmd *cp = cmd;

rc = ble_audio_broadcast_sink_stop(0);
if (rc) {
return BTP_STATUS_FAILED;
}

return rc;
}

static uint8_t
broadcast_source_stop(const void *cmd, uint16_t cmd_len, void *rsp,
uint16_t *rsp_len)
Expand Down Expand Up @@ -371,8 +399,171 @@ static const struct btp_handler handlers[] = {
.expect_len = sizeof(struct bap_bap_broadcast_source_stop_cmd),
.func = broadcast_source_stop,
},
{
.opcode = BTP_BAP_SET_BROADCAST_CODE,
.index = BTP_INDEX,
.expect_len = sizeof(struct btp_bap_set_broadcast_code_cmd),
.func = broadcast_code_set,
},
{
.opcode = BTP_BAP_BROADCAST_SINK_SETUP,
.index = BTP_INDEX,
.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
.func = broadcast_sink_setup,
},
{
.opcode = BTP_BAP_BROADCAST_SINK_STOP,
.index = BTP_INDEX,
.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
.func = broadcast_sink_stop,
},
};

#define BROADCAST_SINK_PA_SYNC_TIMEOUT_DEFAULT 0x07D0

static int
broadcast_sink_pa_sync_params_get(struct ble_gap_periodic_sync_params *params)
{
params->skip = 0;
params->sync_timeout = BROADCAST_SINK_PA_SYNC_TIMEOUT_DEFAULT;
params->reports_disabled = false;

return 0;
}

static int
broadcast_sink_disc_start(const struct ble_gap_ext_disc_params *params)
{
uint8_t own_addr_type;
int rc;

/* Figure out address to use while scanning. */
rc = ble_hs_id_infer_auto(0, &own_addr_type);
if (rc != 0) {
console_printf("determining own address type failed (%d)", rc);
assert(0);
}

rc = ble_gap_ext_disc(own_addr_type, 0, 0, 0, 0, 0, params, NULL, NULL, NULL);
if (rc != 0) {
console_printf("ext disc failed (%d)", rc);
}

return rc;
}

static int
broadcast_sink_disc_stop(void)
{
int rc;

rc = ble_gap_disc_cancel();
if (rc != 0) {
console_printf("disc cancel failed (%d)", rc);
}

return rc;
}

static int
broadcast_sink_action_fn(struct ble_audio_broadcast_sink_action *action, void *arg)
{
switch (action->type) {
case BLE_AUDIO_BROADCAST_SINK_ACTION_PA_SYNC:
return broadcast_sink_pa_sync_params_get(action->pa_sync.out_params);
case BLE_AUDIO_BROADCAST_SINK_ACTION_BIG_SYNC:
break;
case BLE_AUDIO_BROADCAST_SINK_ACTION_BIS_SYNC:
return 0;
case BLE_AUDIO_BROADCAST_SINK_ACTION_DISC_START:
return broadcast_sink_disc_start(action->disc_start.params_preferred);
case BLE_AUDIO_BROADCAST_SINK_ACTION_DISC_STOP:
return broadcast_sink_disc_stop();
default:
assert(false);
return BLE_HS_ENOTSUP;
}

return 0;
}

static int
broadcast_sink_audio_event_handler(struct ble_audio_event *event, void *arg)
{
switch (event->type) {
case BLE_AUDIO_EVENT_BROADCAST_SINK_PA_SYNC_STATE:
console_printf("source_id=0x%02x PA sync: %s\n",
event->broadcast_sink_pa_sync_state.source_id,
ble_audio_broadcast_sink_sync_state_str(
event->broadcast_sink_pa_sync_state.state));
break;
case BLE_AUDIO_EVENT_BROADCAST_SINK_BIS_SYNC_STATE:
console_printf("source_id=0x%02x bis_index=0x%02x BIS sync: %s\n",
event->broadcast_sink_bis_sync_state.source_id,
event->broadcast_sink_bis_sync_state.bis_index,
ble_audio_broadcast_sink_sync_state_str(
event->broadcast_sink_bis_sync_state.state));
if (event->broadcast_sink_bis_sync_state.state ==
BLE_AUDIO_BROADCAST_SINK_SYNC_STATE_ESTABLISHED) {
console_printf("conn_handle=0x%04x\n",
event->broadcast_sink_bis_sync_state.conn_handle);
}
break;
default:
break;
}

return 0;
}

static int
scan_delegator_pick_source_id_to_swap(uint8_t *out_source_id_to_swap)
{
/* TODO: Add some logic here */
*out_source_id_to_swap = 0;

return 0;
}

static int
scan_delegator_action_fn(struct ble_audio_scan_delegator_action *action, void *arg)
{
switch (action->type) {
case BLE_AUDIO_SCAN_DELEGATOR_ACTION_SOURCE_ADD:
console_printf("Source Add:\nsource_id=%u\n", action->source_add.source_id);
if (action->source_add.out_source_id_to_swap == NULL) {
return 0;
} else {
return scan_delegator_pick_source_id_to_swap(action->source_add.out_source_id_to_swap);
}
case BLE_AUDIO_SCAN_DELEGATOR_ACTION_SOURCE_MODIFY:
console_printf("Source Modify:\nsource_id=%u\n", action->source_modify.source_id);
break;
case BLE_AUDIO_SCAN_DELEGATOR_ACTION_SOURCE_REMOVE:
console_printf("Source Remove:\nsource_id=%u\n", action->source_remove.source_id);
break;
default:
assert(false);
return BLE_HS_ENOTSUP;
}

return 0;
}

static int
scan_delegator_audio_event_handler(struct ble_audio_event *event, void *arg)
{
switch (event->type) {
case BLE_AUDIO_EVENT_BROADCAST_ANNOUNCEMENT:
console_printf("\n");
break;
default:
break;
}

return 0;
}

uint8_t
tester_init_bap(void)
{
Expand Down Expand Up @@ -405,6 +596,23 @@ tester_init_bap(void)
return BTP_STATUS_FAILED;
}

static struct ble_audio_event_listener broadcast_sink_listener;

rc = ble_audio_broadcast_sink_cb_set(broadcast_sink_action_fn, NULL);
assert(rc == 0);

rc = ble_audio_event_listener_register(&broadcast_sink_listener,
broadcast_sink_audio_event_handler, NULL);

static struct ble_audio_event_listener scan_delegator_listener;

rc = ble_audio_scan_delegator_action_fn_set(scan_delegator_action_fn, NULL);
assert(rc == 0);

rc = ble_audio_event_listener_register(&scan_delegator_listener,
scan_delegator_audio_event_handler, NULL);
assert(rc == 0);

tester_register_command_handlers(BTP_SERVICE_ID_BAP, handlers,
ARRAY_SIZE(handlers));

Expand Down
Loading

0 comments on commit daaf152

Please sign in to comment.