From 92e4100df197e8991dcff99223034f571055bd9c Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Thu, 1 Aug 2024 13:49:10 +0530 Subject: [PATCH] feat(nimble): Add support to allow connection during scanning --- components/bt/host/nimble/Kconfig.in | 6 ++++++ components/bt/host/nimble/nimble | 2 +- .../bt/host/nimble/port/include/esp_nimble_cfg.h | 8 ++++++++ .../bluetooth/nimble/ble_cts/cts_cent/main/main.c | 8 +++++--- .../ble_enc_adv_data/enc_adv_data_cent/main/main.c | 8 +++++--- .../bluetooth/nimble/ble_htp/htp_cent/main/main.c | 14 ++++++++------ .../nimble/ble_l2cap_coc/coc_blecent/main/main.c | 10 ++++++---- .../ble_multi_conn/ble_multi_conn_cent/main/main.c | 4 +++- .../bluetooth/nimble/ble_phy/phy_cent/main/main.c | 4 +++- .../proximity_sensor_cent/main/main.c | 10 ++++++---- .../nimble/ble_spp/spp_client/main/main.c | 8 +++++--- examples/bluetooth/nimble/blecent/main/main.c | 10 ++++++---- .../throughput_app/blecent_throughput/main/main.c | 4 +++- 13 files changed, 65 insertions(+), 31 deletions(-) diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index eb1acaead652..28b1eeaa91d6 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -940,6 +940,12 @@ config BT_NIMBLE_HIGH_DUTY_ADV_ITVL help This enable BLE high duty advertising interval feature +config BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN + bool "Allow Connections with scanning in progress" + depends on BT_NIMBLE_ENABLED + help + This enables support for user to initiate a new connection with scan in progress + config BT_NIMBLE_HOST_QUEUE_CONG_CHECK bool "BLE queue congestion check" depends on BT_NIMBLE_ENABLED diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index d47cb44f2459..50c2641a04e3 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit d47cb44f245919fcf776c5ee094ec60f28b43fce +Subproject commit 50c2641a04e356fdac9c53fae56f5004f26605e0 diff --git a/components/bt/host/nimble/port/include/esp_nimble_cfg.h b/components/bt/host/nimble/port/include/esp_nimble_cfg.h index 878b97df7b16..63c4e6ce55b8 100644 --- a/components/bt/host/nimble/port/include/esp_nimble_cfg.h +++ b/components/bt/host/nimble/port/include/esp_nimble_cfg.h @@ -1844,6 +1844,14 @@ #endif #endif +#ifndef MYNEWT_VAL_BLE_HOST_ALLOW_CONNECT_WITH_SCAN +#ifdef CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN +#define MYNEWT_VAL_BLE_HOST_ALLOW_CONNECT_WITH_SCAN CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN +#else +#define MYNEWT_VAL_BLE_HOST_ALLOW_CONNECT_WITH_SCAN (0) +#endif +#endif + #if CONFIG_BT_CONTROLLER_DISABLED && CONFIG_BT_NIMBLE_TRANSPORT_UART #ifndef MYNEWT_VAL_BLE_TRANSPORT_UART_PORT #define MYNEWT_VAL_BLE_TRANSPORT_UART_PORT CONFIG_BT_NIMBLE_TRANSPORT_UART_PORT diff --git a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c index fd235c4dfeb7..d7bb9f9c4471 100644 --- a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -303,12 +303,14 @@ ble_cts_cent_connect_if_interesting(void *disc) } #endif +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -364,7 +366,7 @@ ble_cts_cent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -482,7 +484,7 @@ ble_cts_cent_gap_event(struct ble_gap_event *event, void *arg) #if CONFIG_EXAMPLE_EXTENDED_ADV case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); ble_cts_cent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c index 5388a4f49686..6c0b421cc0cc 100644 --- a/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_enc_adv_data/enc_adv_data_cent/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -358,12 +358,14 @@ enc_adv_data_cent_connect_if_interesting(void *disc) return; } +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -416,7 +418,7 @@ enc_adv_data_cent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -514,7 +516,7 @@ enc_adv_data_cent_gap_event(struct ble_gap_event *event, void *arg) return 0; case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); enc_adv_data_cent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c index 181990700dc0..aa06dfb425d4 100644 --- a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -189,7 +189,7 @@ ble_htp_cent_on_read(uint16_t conn_handle, /** * Performs three GATT operations against the specified peer: - * 1. Reads the HTP temparature type characteristic. + * 1. Reads the HTP temperature type characteristic. * 2. After read is completed, writes the HTP temperature measurement interval characteristic. * 3. After write is completed, subscribes to notifications for the HTP intermediate temperature * and temperature measurement characteristic. @@ -205,12 +205,12 @@ ble_htp_cent_read_write_subscribe(const struct peer *peer) const struct peer_chr *chr; int rc; - /* Read the Temparature Type characteristic. */ + /* Read the Temperature Type characteristic. */ chr = peer_chr_find_uuid(peer, BLE_UUID16_DECLARE(BLE_SVC_HTP_UUID16), BLE_UUID16_DECLARE(BLE_SVC_HTP_CHR_UUID16_TEMP_TYPE)); if (chr == NULL) { - MODLOG_DFLT(ERROR, "Error: Peer doesn't support the Temparature Type" + MODLOG_DFLT(ERROR, "Error: Peer doesn't support the Temperature Type" " characteristic\n"); goto err; } @@ -418,12 +418,14 @@ ble_htp_cent_connect_if_interesting(void *disc) } #endif +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -479,7 +481,7 @@ ble_htp_cent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -613,7 +615,7 @@ ble_htp_cent_gap_event(struct ble_gap_event *event, void *arg) #if CONFIG_EXAMPLE_EXTENDED_ADV case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); ble_htp_cent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c index 6e5f7abe0e22..de102268bbf7 100644 --- a/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c +++ b/examples/bluetooth/nimble/ble_l2cap_coc/coc_blecent/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -77,7 +77,7 @@ blecent_l2cap_coc_send_data(struct ble_l2cap_chan *chan) } /** - * After connetion is established on GAP layer, service discovery is performed. On + * After connection is established on GAP layer, service discovery is performed. On * it's completion, this API is called for making a connection is on L2CAP layer. */ static void @@ -340,12 +340,14 @@ blecent_connect_if_interesting(void *disc) } #endif +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -403,7 +405,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -470,7 +472,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) #if CONFIG_EXAMPLE_EXTENDED_ADV case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); blecent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c b/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c index e0fdf4c520dc..9db3939c0e55 100644 --- a/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_multi_conn/ble_multi_conn_cent/main/main.c @@ -85,7 +85,7 @@ ble_cent_client_gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_EXT_DISC: rc = ble_hs_adv_parse_fields(&fields, event->ext_disc.data, event->ext_disc.length_data); - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ if ((rc == 0) && fields.name && (fields.name_len >= strlen(BLE_PEER_NAME)) && !strncmp((const char *)fields.name, BLE_PEER_NAME, strlen(BLE_PEER_NAME))) { ble_cent_connect(&event->ext_disc); @@ -319,12 +319,14 @@ ble_cent_connect(void *disc) return; } +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { ESP_LOGE(TAG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* We won't connect to the same device. Change our static random address to simulate * multi-connection with only one central and one peripheral. diff --git a/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c b/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c index dcd434abc6b1..9922f4ebd012 100644 --- a/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_phy/phy_cent/main/main.c @@ -288,12 +288,14 @@ blecent_connect_if_interesting(void *disc) return; } +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -438,7 +440,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) return 0; case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); blecent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c index 643cccb7c01c..28b03a387f89 100644 --- a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -25,7 +25,7 @@ static struct ble_prox_cent_link_lost_peer disconn_peer[MYNEWT_VAL(BLE_MAX_CONNE /* Note: Path loss is calculated using formula : threshold - RSSI value * by default threshold is kept -128 as per the spec * high_threshold and low_threshold are hardcoded after testing and noting - * RSSI values when distance betweeen devices are less and more. + * RSSI values when distance between devices are less and more. */ static int8_t high_threshold = -70; static int8_t low_threshold = -100; @@ -335,12 +335,14 @@ ble_prox_cent_connect_if_interesting(void *disc) } #endif +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -396,7 +398,7 @@ ble_prox_cent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -561,7 +563,7 @@ ble_prox_cent_gap_event(struct ble_gap_event *event, void *arg) #if CONFIG_EXAMPLE_EXTENDED_ADV case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); ble_prox_cent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c b/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c index 51a16165624f..a16fb52e2ef5 100644 --- a/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c +++ b/examples/bluetooth/nimble/ble_spp/spp_client/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -164,12 +164,14 @@ ble_spp_client_connect_if_interesting(const struct ble_gap_disc_desc *disc) return; } +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -221,7 +223,7 @@ ble_spp_client_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -347,7 +349,7 @@ void ble_client_uart_task(void *pvParameters) //Waiting for UART event. if (xQueueReceive(spp_common_uart_queue, (void * )&event, (TickType_t)portMAX_DELAY)) { switch (event.type) { - //Event of UART receving data + //Event of UART receiving data case UART_DATA: if (event.size) { diff --git a/examples/bluetooth/nimble/blecent/main/main.c b/examples/bluetooth/nimble/blecent/main/main.c index ef62105893e4..dd092bd90eb2 100644 --- a/examples/bluetooth/nimble/blecent/main/main.c +++ b/examples/bluetooth/nimble/blecent/main/main.c @@ -48,7 +48,7 @@ #endif #endif -/*** The UUID of the service containing the subscribable characterstic ***/ +/*** The UUID of the service containing the subscribable characteristic ***/ static const ble_uuid_t * remote_svc_uuid = BLE_UUID128_DECLARE(0x2d, 0x71, 0xa2, 0x59, 0xb4, 0x58, 0xc8, 0x12, 0x99, 0x99, 0x43, 0x95, 0x12, 0x2f, 0x46, 0x59); @@ -203,7 +203,7 @@ blecent_custom_gatt_operations(const struct peer* peer) remote_chr_uuid, BLE_UUID16_DECLARE(BLE_GATT_DSC_CLT_CFG_UUID16)); if (dsc == NULL) { - MODLOG_DFLT(ERROR, "Error: Peer lacks a CCCD for the subscribable characterstic\n"); + MODLOG_DFLT(ERROR, "Error: Peer lacks a CCCD for the subscribable characteristic\n"); goto err; } @@ -601,12 +601,14 @@ blecent_connect_if_interesting(void *disc) } #endif +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -687,7 +689,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */ @@ -840,7 +842,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) #if CONFIG_EXAMPLE_EXTENDED_ADV case BLE_GAP_EVENT_EXT_DISC: - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ ext_print_adv_report(&event->disc); blecent_connect_if_interesting(&event->disc); diff --git a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c index cf54d96fb869..de8f844f30a9 100644 --- a/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c +++ b/examples/bluetooth/nimble/throughput_app/blecent_throughput/main/main.c @@ -471,12 +471,14 @@ blecent_connect_if_interesting(const struct ble_gap_disc_desc *disc) return; } +#if !(MYNEWT_VAL(BLE_HOST_ALLOW_CONNECT_WITH_SCAN)) /* Scanning must be stopped before a connection can be initiated. */ rc = ble_gap_disc_cancel(); if (rc != 0) { MODLOG_DFLT(DEBUG, "Failed to cancel scan; rc=%d\n", rc); return; } +#endif /* Figure out address to use for connect (no privacy for now) */ rc = ble_hs_id_infer_auto(0, &own_addr_type); @@ -529,7 +531,7 @@ blecent_gap_event(struct ble_gap_event *event, void *arg) return 0; } - /* An advertisment report was received during GAP discovery. */ + /* An advertisement report was received during GAP discovery. */ print_adv_fields(&fields); /* Try to connect to the advertiser if it looks interesting. */