This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Connecting and disconnecting to various peripherals

Hello everyone,

Right now I am working on a demo showing some functionalities of 2 smartwatches: Colmi P8B and PineTime. I am using nRF52840 for that purpose.

I had the idea the following idea:

  • When BSP_EVENT_KEY_1 is pressed, a name filter is set for one of the smartwatches (Colmi) and a new scan with that parameter is launched. This part is working fine and a connection with the smartwatch I'm looking for is happening.
  • When BSP_EVENT_KEY_3 is pressed, the previously started connection is broken as I trigger a disconnection event. This part is also working fine.
  • When BSP_EVENT_KEY_2 is pressed, another name filter is set, now for the other smartwatch (PiniTime) and a new scan with that parameter is launched.

Here is the problem: Sometimes I am able to connect to the smartwatch (PineTime) I'm requesting when pressing BSP_EVENT_KEY_2 ; however, most of the times the connection is re-established with the other smartwatch.

Following is the code of the implementation of the part of the buttons.

void bsp_event_handler(bsp_event_t event)
{
    ret_code_t err_code;
    char m_target_periph_name_1[] = "InfiniTime";
    char m_target_periph_name_2[] = "P8b";

    switch (event)
    {
        case BSP_EVENT_SLEEP:
            nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
            break;

        case BSP_EVENT_DISCONNECT:
            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
            if (err_code != NRF_ERROR_INVALID_STATE)
            {
                APP_ERROR_CHECK(err_code);
            }
            break;

        case BSP_EVENT_WHITELIST_OFF:
            whitelist_disable();
            break;

        case BSP_EVENT_KEY_1:

            err_code = nrf_ble_scan_filter_set(&m_scan,
                                           SCAN_NAME_FILTER,
                                           m_target_periph_name_2);
            NRF_LOG_INFO("Scanning for COLMI PB8 Smartwatch");
            scan_start();
            APP_ERROR_CHECK(err_code);
            break;

        case BSP_EVENT_KEY_2:
            err_code = nrf_ble_scan_filter_set(&m_scan,
                                           SCAN_NAME_FILTER,
                                           m_target_periph_name_1);
            NRF_LOG_INFO("Scanning for Pinetime Smartwatch");
            scan_start();
            APP_ERROR_CHECK(err_code);
            break;
        
        case BSP_EVENT_KEY_3:
            err_code =sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
            if (err_code != NRF_ERROR_INVALID_STATE)
            {
                APP_ERROR_CHECK(err_code);
            } 	
            NRF_LOG_INFO("Disconnected from smartwatch. ");
            break;


        default:
            break;
    }
}


Any suggestions are welcome Slight smile

Thanks in advance!

PS: I can´t just turn off one of the smartwatches so it stops advertising. 

Parents
  • Hello

    Please note that we are very short staffed here in Norway due to Easter Holidays this week (and Monday next week). This will lead to a longer than usual response time. I am sorry for the inconvenience.

    I guess I would recommend you to implement this filter yourself in the ble_evt_handler. You can add the event BLE_GAP_EVT_ADV_REPORT in your ble_evt_handler(), and then, based on what you do in the bsp event handler, you can search for different devices in the advertising reports, and then select whether you want to connect to it using sd_ble_gap_connect(), or not.

    Best regards,

    Edvin

  • Hello Edvin,

    Thank you for taking some time to reply. This is also an interesting approach. I will try it out too.

    Happy Easter!

Reply Children
No Data
Related