Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions ports/zephyr-cp/common-hal/_bleio/Adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,13 +328,16 @@ mp_int_t common_hal_bleio_adapter_get_tx_power(bleio_adapter_obj_t *self) {
return power;
}

void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power) {
// Returns a Zephyr error code rather than raising, so callers can treat setting
// Tx power as best-effort. BT_HCI_OP_VS_WRITE_TX_POWER_LEVEL is a Zephyr
// vendor-specific command that not every controller implements.
static int _try_set_tx_power(mp_int_t tx_power) {
struct bt_hci_cp_vs_write_tx_power_level *cp;
struct net_buf *buf, *rsp = NULL;

buf = bt_hci_cmd_alloc(K_MSEC(3000));
if (!buf) {
mp_raise_msg(&mp_type_MemoryError, NULL);
return -ENOMEM;
}
cp = net_buf_add(buf, sizeof(*cp));
cp->handle_type = BT_HCI_VS_LL_HANDLE_TYPE_ADV;
Expand All @@ -343,10 +346,19 @@ void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t t

int err = bt_hci_cmd_send_sync(BT_HCI_OP_VS_WRITE_TX_POWER_LEVEL, buf, &rsp);
if (err) {
raise_zephyr_error(err);
return err;
}

net_buf_unref(rsp);
return 0;
}

void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power) {
int err = _try_set_tx_power(tx_power);
if (err == -ENOMEM) {
mp_raise_msg(&mp_type_MemoryError, NULL);
}
raise_zephyr_error(err);
}

bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) {
Expand Down Expand Up @@ -454,7 +466,10 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self,
NULL);
}

common_hal_bleio_adapter_set_tx_power(self, tx_power);
// Best-effort: a controller that does not implement Zephyr's vendor-specific
// Tx power command must still be able to advertise. tx_power defaults to 0,
// so reporting the rejection here would print on every start_advertising().
_try_set_tx_power(tx_power);

raise_zephyr_error(bt_le_adv_start(&adv_params,
adv_data,
Expand Down
Loading