<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/45193/connect-a-device-and-disconnect-and-try-to-connect-another-cannot-connect</link><description>hi , 
 I&amp;#39;m a newer , using nRF5_SDK_15.3.0_59ac345. we are using nrf52832 to get about 100 of heart rate sensors. 
 so first we do a scan ,and get all of there addrs. and than ,try to connect one ,get hrs value and disconnect this one, and connect next</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 25 Mar 2019 13:30:34 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/45193/connect-a-device-and-disconnect-and-try-to-connect-another-cannot-connect" /><item><title>RE: connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/thread/178120?ContentTypeID=1</link><pubDate>Mon, 25 Mar 2019 13:30:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5349a655-581c-43a8-94ce-3e04e8cb24a4</guid><dc:creator>Hung Bui</dc:creator><description>&lt;p&gt;It&amp;#39;s better to do a scan again before you connect so you have the most updated list of device advertising.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you want to stop connecting you can call&amp;nbsp;sd_ble_gap_connect_cancel()&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/thread/177929?ContentTypeID=1</link><pubDate>Sat, 23 Mar 2019 01:06:28 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7596b67f-5aad-45ba-ae8a-21d79ed87383</guid><dc:creator>KinBird</dc:creator><description>&lt;p&gt;hi , nothing happened when trying to connect to 2nd device.&amp;nbsp; we do not scan again, because we scan and store the available addr.&amp;nbsp; and not close these devices.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; By the way , what kindly of method to do ? if&amp;nbsp;&lt;span&gt;Connecting is on the way , it seems no connect timeout event . and we alao&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;can not disconnect it by &amp;quot;sd_ble_gap_disconnect&amp;quot;,&amp;nbsp; for no &amp;quot;conn_handle&amp;quot;.&amp;nbsp; how to cancel it ?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/thread/177911?ContentTypeID=1</link><pubDate>Fri, 22 Mar 2019 17:29:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8216de90-4869-4469-9af0-f85b87fda223</guid><dc:creator>Hung Bui</dc:creator><description>&lt;p&gt;Hi, Please clarify what happened when you try to connect to 2nd device after disconnected from the first one?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Have you tried to scan again before you connect ? There could be a chance that the other device stopped advertising. And the scan list you have is no longer up to date.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/thread/177855?ContentTypeID=1</link><pubDate>Fri, 22 Mar 2019 14:06:10 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0b55d516-5ff5-4457-82f0-ef8250cfe023</guid><dc:creator>KinBird</dc:creator><description>&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;quot;nordic_common.h&amp;quot;
#include &amp;quot;nrf_sdm.h&amp;quot;
#include &amp;quot;ble.h&amp;quot;
#include &amp;quot;ble_hci.h&amp;quot;
#include &amp;quot;ble_db_discovery.h&amp;quot;
#include &amp;quot;ble_srv_common.h&amp;quot;
#include &amp;quot;nrf_sdh.h&amp;quot;
#include &amp;quot;nrf_sdh_ble.h&amp;quot;
#include &amp;quot;nrf_sdh_soc.h&amp;quot;
#include &amp;quot;nrf_pwr_mgmt.h&amp;quot;
#include &amp;quot;app_util.h&amp;quot;
#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;peer_manager.h&amp;quot;
#include &amp;quot;peer_manager_handler.h&amp;quot;
#include &amp;quot;ble_hrs_c.h&amp;quot;
#include &amp;quot;ble_bas_c.h&amp;quot;
#include &amp;quot;app_util.h&amp;quot;
#include &amp;quot;app_timer.h&amp;quot;
#include &amp;quot;fds.h&amp;quot;
#include &amp;quot;nrf_fstorage.h&amp;quot;
#include &amp;quot;ble_conn_state.h&amp;quot;
#include &amp;quot;nrf_ble_gatt.h&amp;quot;
#include &amp;quot;nrf_ble_lesc.h&amp;quot;
#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;
#include &amp;quot;nrf_ble_scan.h&amp;quot;
#include &amp;quot;protocol.h&amp;quot;

#define APP_BLE_CONN_CFG_TAG        1                                   /**&amp;lt; A tag identifying the SoftDevice BLE configuration. */

#define APP_BLE_OBSERVER_PRIO       3                                   /**&amp;lt; Application&amp;#39;s BLE observer priority. You shouldn&amp;#39;t need to modify this value. */
#define APP_SOC_OBSERVER_PRIO       1                                   /**&amp;lt; Applications&amp;#39; SoC observer priority. You shouldn&amp;#39;t need to modify this value. */

#define LESC_DEBUG_MODE             0                                   /**&amp;lt; Set to 1 to use LESC debug keys, allows you to use a sniffer to inspect traffic. */

#define SEC_PARAM_BOND              1                                   /**&amp;lt; Perform bonding. */
#define SEC_PARAM_MITM              0                                   /**&amp;lt; Man In The Middle protection not required. */
#define SEC_PARAM_LESC              1                                   /**&amp;lt; LE Secure Connections enabled. */
#define SEC_PARAM_KEYPRESS          0                                   /**&amp;lt; Keypress notifications not enabled. */
#define SEC_PARAM_IO_CAPABILITIES   BLE_GAP_IO_CAPS_NONE                /**&amp;lt; No I/O capabilities. */
#define SEC_PARAM_OOB               0                                   /**&amp;lt; Out Of Band data not available. */
#define SEC_PARAM_MIN_KEY_SIZE      7                                   /**&amp;lt; Minimum encryption key size in octets. */
#define SEC_PARAM_MAX_KEY_SIZE      16                                  /**&amp;lt; Maximum encryption key size in octets. */

#define SCAN_DURATION_WITELIST      60000                     			/**&amp;lt; Duration of the scanning in units of 10 milliseconds. */

#define MIN_CONNECTION_INTERVAL             MSEC_TO_UNITS(30, UNIT_1_25_MS)                         /**&amp;lt; Determines maximum connection interval in millisecond. */
#define MAX_CONNECTION_INTERVAL             MSEC_TO_UNITS(60, UNIT_1_25_MS)                         /**&amp;lt; Determines maximum connection interval in millisecond. */
#define SLAVE_LATENCY                       6                                                       /**&amp;lt; Determines slave latency in counts of connection events. */
#define SUPERVISION_TIMEOUT                 MSEC_TO_UNITS(4000, UNIT_10_MS)                         /**&amp;lt; Determines supervision time-out in units of 10 millisecond. */



#define TARGET_UUID                 BLE_UUID_HEART_RATE_SERVICE         /**&amp;lt; Target device uuid that application is looking for. */

BLE_HRS_C_DEF(m_hrs_c);                                             /**&amp;lt; Structure used to identify the heart rate client module. */
BLE_BAS_C_DEF(m_bas_c);                                             /**&amp;lt; Structure used to identify the Battery Service client module. */
NRF_BLE_GATT_DEF(m_gatt);                                           /**&amp;lt; GATT module instance. */
BLE_DB_DISCOVERY_DEF(m_db_disc);                                    /**&amp;lt; DB discovery module instance. */
NRF_BLE_SCAN_DEF(m_scan);                                           /**&amp;lt; Scanning module instance. */

static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;            /**&amp;lt; Current connection handle. */
static bool     m_memory_access_in_progress;                        /**&amp;lt; Flag to keep track of ongoing operations on persistent memory. */

/**&amp;lt; Scan parameters requested for scanning and connection. */
static ble_gap_scan_params_t const m_scan_param =
{
    .active        = 0x01,
    .interval      = NRF_BLE_SCAN_SCAN_INTERVAL,
    .window        = NRF_BLE_SCAN_SCAN_WINDOW,
    .filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL,
    .timeout       = SCAN_DURATION_WITELIST,
    .scan_phys     = BLE_GAP_PHY_AUTO,
};

static ble_gap_conn_params_t const m_conn_params =
{
	.min_conn_interval = (uint16_t)MIN_CONNECTION_INTERVAL,   // Minimum connection
    .max_conn_interval = (uint16_t)MAX_CONNECTION_INTERVAL,   // Maximum connection
    .slave_latency     = SLAVE_LATENCY,                                   // Slave latency
    .conn_sup_timeout  = (uint16_t)SUPERVISION_TIMEOUT        // Supervision time-out
};

void connect_current_addr(void)
{
	 int ret;
	ret_code_t err_code;
    scan_evt_t scan_evt;

    // For readability.
  	ble_gap_addr_t         peer_addr;
	
	// Stop scanning.
    nrf_ble_scan_stop();
	DBGPRINT(DEBUG_TRACE,&amp;quot;connect_current_addr ++ \n&amp;quot;);
	
	ret = GetNextActiveAddr(&amp;amp;peer_addr);
	
	if(ret != 0)
	{
		DBGPRINT(DEBUG_ERROR,&amp;quot;No active device !\n&amp;quot;);
		return;
	}

    memset(&amp;amp;scan_evt, 0, sizeof(scan_evt));

    // Establish connection.
    err_code = sd_ble_gap_connect(&amp;amp;peer_addr,
                                  &amp;amp;m_scan_param,
                                  &amp;amp;m_conn_params,
                                  1);

 //   DBGPRINT(DEBUG_TRACE,&amp;quot;Connecting\n&amp;quot;);
	DBGPRINT(DEBUG_TRACE,&amp;quot;Connecting: %02X:%02X:%02X:%02X:%02X:%02X\n&amp;quot;,
				peer_addr.addr[5],
				peer_addr.addr[4],
				peer_addr.addr[3],
				peer_addr.addr[2],
				peer_addr.addr[1],
				peer_addr.addr[0]);
 	SetCurBtState(BSP_INDICATE_BONDING);		//connectting ,just use bonding instand
}

void disconnect_current_addr(void)
{
    ret_code_t            err_code;
	if(m_conn_handle != BLE_CONN_HANDLE_INVALID)
	{
		err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);

	    APP_ERROR_CHECK(err_code);
		m_conn_handle = BLE_CONN_HANDLE_INVALID;
	}
}

void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
{
    app_error_handler(0xDEADBEEF, line_num, p_file_name);
}

static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
    ble_hrs_on_db_disc_evt(&amp;amp;m_hrs_c, p_evt);
    ble_bas_on_db_disc_evt(&amp;amp;m_bas_c, p_evt);
}

static void pm_evt_handler(pm_evt_t const * p_evt)
{
    pm_handler_on_pm_evt(p_evt);
    pm_handler_flash_clean(p_evt);

    switch (p_evt-&amp;gt;evt_id)
    {
        case PM_EVT_PEERS_DELETE_SUCCEEDED:
            DBGPRINT(DEBUG_TRACE,&amp;quot;PM_EVT_PEERS_DELETE_SUCCEEDED\n&amp;quot;);
            // Bonds are deleted. Start scanning.
   	        //  scan_start();
            break;

        default:
            break;
    }
}

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t            err_code;
    ble_gap_evt_t const * p_gap_evt = &amp;amp;p_ble_evt-&amp;gt;evt.gap_evt;

    switch (p_ble_evt-&amp;gt;header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
        {
   //       DBGPRINT(DEBUG_TRACE,&amp;quot;Connected\n&amp;quot;);
			DBGPRINT(DEBUG_INFO,&amp;quot;Connected: %02X:%02X:%02X:%02X:%02X:%02X\n&amp;quot;,
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[5],
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[4],
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[3],
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[2],
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[1],
				p_ble_evt-&amp;gt;evt.gap_evt.params.connected.peer_addr.addr[0]);
			
			m_conn_handle = p_ble_evt-&amp;gt;evt.gap_evt.conn_handle;

            // Discover peer&amp;#39;s services.
            err_code = ble_db_discovery_start(&amp;amp;m_db_disc, p_ble_evt-&amp;gt;evt.gap_evt.conn_handle);
            APP_ERROR_CHECK(err_code);

			SetCurBtState(BSP_INDICATE_CONNECTED);

            if (ble_conn_state_central_conn_count() &amp;lt; NRF_SDH_BLE_CENTRAL_LINK_COUNT)
            {
 //               scan_start();
            }
        } break;

        case BLE_GAP_EVT_DISCONNECTED:
        {
            DBGPRINT(DEBUG_TRACE,&amp;quot;Disconnected, reason 0x%x\n&amp;quot;,
                         p_gap_evt-&amp;gt;params.disconnected.reason);

			SetCurBtState(BSP_INDICATE_IDLE);

            if (ble_conn_state_central_conn_count() &amp;lt; NRF_SDH_BLE_CENTRAL_LINK_COUNT)
            {
 //               scan_start();
            }
			if(bRefreshStart)
			{
		//		connect_current_addr();
			}

        } break;

        case BLE_GAP_EVT_TIMEOUT:
        {
            if (p_gap_evt-&amp;gt;params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
            {
                DBGPRINT(DEBUG_TRACE,&amp;quot;Connection Request timed out\n&amp;quot;);
            }
			if(bRefreshStart)
			{
	//			connect_current_addr();
			}
			SetCurBtState(BSP_INDICATE_IDLE);
        } break;

        case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
            // Accepting parameters requested by peer.
            err_code = sd_ble_gap_conn_param_update(p_gap_evt-&amp;gt;conn_handle,
                                                    &amp;amp;p_gap_evt-&amp;gt;params.conn_param_update_request.conn_params);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
        {
            DBGPRINT(DEBUG_TRACE,&amp;quot;PHY update request\n&amp;quot;);
            ble_gap_phys_t const phys =
            {
                .rx_phys = BLE_GAP_PHY_AUTO,
                .tx_phys = BLE_GAP_PHY_AUTO,
            };
            err_code = sd_ble_gap_phy_update(p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);
            APP_ERROR_CHECK(err_code);
        } break;

        case BLE_GATTC_EVT_TIMEOUT:
            // Disconnect on GATT Client timeout event.
            DBGPRINT(DEBUG_TRACE,&amp;quot;GATT Client Timeout\n&amp;quot;);
            err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gattc_evt.conn_handle,
                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GATTS_EVT_TIMEOUT:
            // Disconnect on GATT Server timeout event.
            DBGPRINT(DEBUG_TRACE,&amp;quot;GATT Server Timeout\n&amp;quot;);
            err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle,
                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
            APP_ERROR_CHECK(err_code);
            break;
    
        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
            DBGPRINT(DEBUG_TRACE,&amp;quot;BLE_GAP_EVT_SEC_PARAMS_REQUEST\n&amp;quot;);
            break;

        case BLE_GAP_EVT_AUTH_KEY_REQUEST:
            DBGPRINT(DEBUG_TRACE,&amp;quot;BLE_GAP_EVT_AUTH_KEY_REQUEST\n&amp;quot;);
            break;

        case BLE_GAP_EVT_LESC_DHKEY_REQUEST:
            DBGPRINT(DEBUG_TRACE,&amp;quot;BLE_GAP_EVT_LESC_DHKEY_REQUEST\n&amp;quot;);
            break;

         case BLE_GAP_EVT_AUTH_STATUS:
             DBGPRINT(DEBUG_TRACE,&amp;quot;BLE_GAP_EVT_AUTH_STATUS: status=0x%x bond=0x%x lv4: %d kdist_own:0x%x kdist_peer:0x%x\n&amp;quot;,
                          p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.auth_status,
                          p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.bonded,
                          p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.sm1_levels.lv4,
                          *((uint8_t *)&amp;amp;p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.kdist_own),
                          *((uint8_t *)&amp;amp;p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.kdist_peer));
            break;

        default:
            break;
    }
}

static void soc_evt_handler(uint32_t evt_id, void * p_context)
{
    switch (evt_id)
    {
        case NRF_EVT_FLASH_OPERATION_SUCCESS:
            /* fall through */
        case NRF_EVT_FLASH_OPERATION_ERROR:

            if (m_memory_access_in_progress)
            {
                m_memory_access_in_progress = false;
  //              scan_start();
            }
            break;

        default:
            // No implementation needed.
            break;
    }
}

static void ble_stack_init(void)
{
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    // Fetch the start address of the application RAM.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);
    APP_ERROR_CHECK(err_code);

    // Register handlers for BLE and SoC events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
    NRF_SDH_SOC_OBSERVER(m_soc_observer, APP_SOC_OBSERVER_PRIO, soc_evt_handler, NULL);
}

static void peer_manager_init(void)
{
    ble_gap_sec_params_t sec_param;
    ret_code_t err_code;

    err_code = pm_init();
    APP_ERROR_CHECK(err_code);

    memset(&amp;amp;sec_param, 0, sizeof(ble_gap_sec_params_t));

    // Security parameters to be used for all security procedures.
    sec_param.bond           = SEC_PARAM_BOND;
    sec_param.mitm           = SEC_PARAM_MITM;
    sec_param.lesc           = SEC_PARAM_LESC;
    sec_param.keypress       = SEC_PARAM_KEYPRESS;
    sec_param.io_caps        = SEC_PARAM_IO_CAPABILITIES;
    sec_param.oob            = SEC_PARAM_OOB;
    sec_param.min_key_size   = SEC_PARAM_MIN_KEY_SIZE;
    sec_param.max_key_size   = SEC_PARAM_MAX_KEY_SIZE;
    sec_param.kdist_own.enc  = 1;
    sec_param.kdist_own.id   = 1;
    sec_param.kdist_peer.enc = 1;
    sec_param.kdist_peer.id  = 1;

    err_code = pm_sec_params_set(&amp;amp;sec_param);
    APP_ERROR_CHECK(err_code);

    err_code = pm_register(pm_evt_handler);
    APP_ERROR_CHECK(err_code);
}

static void hrs_c_evt_handler(ble_hrs_c_t * p_hrs_c, ble_hrs_c_evt_t * p_hrs_c_evt)
{
    ret_code_t err_code;

    switch (p_hrs_c_evt-&amp;gt;evt_type)
    {
        case BLE_HRS_C_EVT_DISCOVERY_COMPLETE:
        {
            DBGPRINT(DEBUG_TRACE,&amp;quot;Heart rate service discovered\n&amp;quot;);

            err_code = ble_hrs_c_handles_assign(p_hrs_c,
                                                p_hrs_c_evt-&amp;gt;conn_handle,
                                                &amp;amp;p_hrs_c_evt-&amp;gt;params.peer_db);
            APP_ERROR_CHECK(err_code);

            // Initiate bonding.
            err_code = pm_conn_secure(p_hrs_c_evt-&amp;gt;conn_handle, false);
            if (err_code != NRF_ERROR_BUSY)
            {
                APP_ERROR_CHECK(err_code);
            }

            // Heart rate service discovered. Enable notification of Heart Rate Measurement.
            err_code = ble_hrs_c_hrm_notif_enable(p_hrs_c);
            APP_ERROR_CHECK(err_code);
        } break;

        case BLE_HRS_C_EVT_HRM_NOTIFICATION:
        {
			uint32_t rr_avg = 0;
            DBGPRINT(DEBUG_TRACE,&amp;quot;Heart Rate = %d\n&amp;quot;, p_hrs_c_evt-&amp;gt;params.hrm.hr_value);

            if (p_hrs_c_evt-&amp;gt;params.hrm.rr_intervals_cnt != 0)
            {
                for (uint32_t i = 0; i &amp;lt; p_hrs_c_evt-&amp;gt;params.hrm.rr_intervals_cnt; i++)
                {
                    rr_avg += p_hrs_c_evt-&amp;gt;params.hrm.rr_intervals[i];
                }
                rr_avg = rr_avg / p_hrs_c_evt-&amp;gt;params.hrm.rr_intervals_cnt;
                DBGPRINT(DEBUG_TRACE,&amp;quot;rr_interval (avg) = %d\n&amp;quot;, rr_avg);
            }
			if(p_hrs_c_evt-&amp;gt;params.hrm.hr_value != 0x00)
			{
				//we get the valid data ,and then try to store it and disconnect
				UpdateCurrentSensorHst(p_hrs_c_evt-&amp;gt;params.hrm.hr_value,rr_avg);
				disconnect_current_addr();
			}
        } break;

        default:
            break;
    }
}

static void bas_c_evt_handler(ble_bas_c_t * p_bas_c, ble_bas_c_evt_t * p_bas_c_evt)
{
    ret_code_t err_code;

    switch (p_bas_c_evt-&amp;gt;evt_type)
    {
        case BLE_BAS_C_EVT_DISCOVERY_COMPLETE:
        {
            err_code = ble_bas_c_handles_assign(p_bas_c,
                                                p_bas_c_evt-&amp;gt;conn_handle,
                                                &amp;amp;p_bas_c_evt-&amp;gt;params.bas_db);
            APP_ERROR_CHECK(err_code);

            // Battery service discovered. Enable notification of Battery Level.
            DBGPRINT(DEBUG_TRACE,&amp;quot;Battery Service discovered. Reading battery level\n&amp;quot;);

            err_code = ble_bas_c_bl_read(p_bas_c);
            APP_ERROR_CHECK(err_code);

            DBGPRINT(DEBUG_TRACE,&amp;quot;Enabling Battery Level Notification\n&amp;quot;);
            err_code = ble_bas_c_bl_notif_enable(p_bas_c);
            APP_ERROR_CHECK(err_code);

        } break;

        case BLE_BAS_C_EVT_BATT_NOTIFICATION:
            DBGPRINT(DEBUG_TRACE,&amp;quot;Battery Level received %d %%\n&amp;quot;, p_bas_c_evt-&amp;gt;params.battery_level);
			UpdateCurrentSensorPower(p_bas_c_evt-&amp;gt;params.battery_level);
            break;

        case BLE_BAS_C_EVT_BATT_READ_RESP:
            DBGPRINT(DEBUG_TRACE,&amp;quot;Battery Level Read as %d %%\n&amp;quot;, p_bas_c_evt-&amp;gt;params.battery_level);
			UpdateCurrentSensorPower(p_bas_c_evt-&amp;gt;params.battery_level);
			break;

        default:
            break;
    }
}

static void hrs_c_init(void)
{
    ble_hrs_c_init_t hrs_c_init_obj;

    hrs_c_init_obj.evt_handler = hrs_c_evt_handler;

    ret_code_t err_code = ble_hrs_c_init(&amp;amp;m_hrs_c, &amp;amp;hrs_c_init_obj);
    APP_ERROR_CHECK(err_code);
}

static void bas_c_init(void)
{
    ble_bas_c_init_t bas_c_init_obj;

    bas_c_init_obj.evt_handler = bas_c_evt_handler;

    ret_code_t err_code = ble_bas_c_init(&amp;amp;m_bas_c, &amp;amp;bas_c_init_obj);
    APP_ERROR_CHECK(err_code);
}

static void db_discovery_init(void)
{
    ret_code_t err_code = ble_db_discovery_init(db_disc_handler);
    APP_ERROR_CHECK(err_code);
}

void scan_start(void)
{
    ret_code_t err_code;

    DBGPRINT(DEBUG_INFO,&amp;quot;Starting scan\n&amp;quot;);

    err_code = nrf_ble_scan_start(&amp;amp;m_scan);
    APP_ERROR_CHECK(err_code);

 	SetCurBtState(BSP_INDICATE_SCANNING);
}

void scan_stop(void)
{
	DBGPRINT(DEBUG_INFO,&amp;quot;Stop scan\n&amp;quot;);
	nrf_ble_scan_stop();
}

static void log_init(void)
{
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}

static void power_management_init(void)
{
    ret_code_t err_code;
    err_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(err_code);
}

static void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
{
    switch (p_evt-&amp;gt;evt_id)
    {
        case NRF_BLE_GATT_EVT_ATT_MTU_UPDATED:
        {
            DBGPRINT(DEBUG_TRACE,&amp;quot;GATT ATT MTU on connection 0x%x changed to %d\n&amp;quot;,
                         p_evt-&amp;gt;conn_handle,
                         p_evt-&amp;gt;params.att_mtu_effective);
        } break;

        case NRF_BLE_GATT_EVT_DATA_LENGTH_UPDATED:
        {
            DBGPRINT(DEBUG_TRACE,&amp;quot;Data length for connection 0x%x updated to %d\n&amp;quot;,
                         p_evt-&amp;gt;conn_handle,
                         p_evt-&amp;gt;params.data_length);
        } break;

        default:
            break;
    }
}


static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
		uint8_t i;

    ret_code_t err_code;
    switch(p_scan_evt-&amp;gt;scan_evt_id)
    {
        case NRF_BLE_SCAN_EVT_WHITELIST_REQUEST:
        {
			DBGPRINT(DEBUG_TRACE,&amp;quot;NRF_BLE_SCAN_EVT_WHITELIST_REQUEST\n&amp;quot;);
        } break;

        case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:
        {
            err_code = p_scan_evt-&amp;gt;params.connecting_err.err_code;
            APP_ERROR_CHECK(err_code);
        } break;

        case NRF_BLE_SCAN_EVT_SCAN_TIMEOUT:
        {
          DBGPRINT(DEBUG_TRACE,&amp;quot;Scan timed out\n&amp;quot;);
          scan_start();
        } break;

        case NRF_BLE_SCAN_EVT_FILTER_MATCH:
//			DBGPRINT(DEBUG_TRACE,&amp;quot;NRF_BLE_SCAN_EVT_FILTER_MATCH\n&amp;quot;);
			
			DBGPRINT(DEBUG_INFO,&amp;quot;%02X:%02X:%02X:%02X:%02X:%02X\n&amp;quot;,
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[5],
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[4],
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[3],
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[2],
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[1],
				p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr[0]);

			//check the mac addr if match polar
			for(i=0;i&amp;lt;user_sensor_list.totol_num;i++)
			{
				//mac addr is the same
				if(compareArray((uint8_t *)p_scan_evt-&amp;gt;params.filter_match.p_adv_report-&amp;gt;peer_addr.addr,user_sensor_list.sensor_info[i].addr,6))
				{
					SetUserSensorState(i,1);
				}
			}
            break;
        case NRF_BLE_SCAN_EVT_WHITELIST_ADV_REPORT:
			DBGPRINT(DEBUG_TRACE,&amp;quot;NRF_BLE_SCAN_EVT_WHITELIST_ADV_REPORT\n&amp;quot;);
			
            break;

        default:
          break;
    }
}

static void timer_init(void)
{
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
}

static void gatt_init(void)
{
    ret_code_t err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, gatt_evt_handler);
    APP_ERROR_CHECK(err_code);
}

static void scan_init(void)
{
    ret_code_t          err_code;
    nrf_ble_scan_init_t init_scan;

    memset(&amp;amp;init_scan, 0, sizeof(init_scan));

    init_scan.p_scan_param     = &amp;amp;m_scan_param;
    init_scan.connect_if_match = false;
    init_scan.conn_cfg_tag     = APP_BLE_CONN_CFG_TAG;

    err_code = nrf_ble_scan_init(&amp;amp;m_scan, &amp;amp;init_scan, scan_evt_handler);
    APP_ERROR_CHECK(err_code);

    ble_uuid_t uuid =
    {
        .uuid = TARGET_UUID,
        .type = BLE_UUID_TYPE_BLE,
    };

    err_code = nrf_ble_scan_filter_set(&amp;amp;m_scan,
                                       SCAN_UUID_FILTER,
                                       &amp;amp;uuid);
    APP_ERROR_CHECK(err_code);

   
    err_code = nrf_ble_scan_filters_enable(&amp;amp;m_scan,
                                           NRF_BLE_SCAN_UUID_FILTER,//NRF_BLE_SCAN_ALL_FILTER,
                                           false);
    APP_ERROR_CHECK(err_code);

}

static void idle_state_handle(void)
{
    ret_code_t err_code;
    
    err_code = nrf_ble_lesc_request_handler();
    APP_ERROR_CHECK(err_code);
    
    NRF_LOG_FLUSH();
    nrf_pwr_mgmt_run();
}

void bt_reset(void)
{
	 NVIC_SystemReset();
}

int main(void)
{
    // Initialize.
    log_init();
	timer_init();
	protocol_init();
	
	DBGPRINT(DEBUG_INFO,&amp;quot;KinBird Hrs built : %s %s\n&amp;quot;,__DATE__,__TIME__);
    power_management_init();
    ble_stack_init();
    gatt_init();
    peer_manager_init();
    db_discovery_init();
    hrs_c_init();
    bas_c_init();
    scan_init();
    // Enter main loop.
    for (;;)
    {
        idle_state_handle();
    }
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: connect a device and disconnect and try to connect another ,cannot connect</title><link>https://devzone.nordicsemi.com/thread/177612?ContentTypeID=1</link><pubDate>Thu, 21 Mar 2019 14:13:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:66fc776a-f3fb-4c2e-a75f-221522ff3888</guid><dc:creator>awneil</dc:creator><description>&lt;p&gt;How to properly post source code:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/0181._5F00_Insert-Code-_2D00_-Nordic.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>