<?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>s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/59604/s140-central-and-timeslots</link><description>Hello, 
 is it possible to use use timeslot API on s140 while BLE is in &amp;quot;central&amp;quot; mode? 
 I was able to use timeslot API when BLE was running as peripheral. However, same timeslot code does nothing in BLE central mode. 
 I am using &amp;quot;ble_app_blinky&amp;quot; as</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 08 Apr 2020 11:35:39 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/59604/s140-central-and-timeslots" /><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/244064?ContentTypeID=1</link><pubDate>Wed, 08 Apr 2020 11:35:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e42d5c84-4561-4001-945c-ba6e84b45514</guid><dc:creator>EGM dev</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;From your changes i figured out the thing that makes timeslots work again is use of NRF_SDH_SOC_OBSERVER.&lt;/p&gt;
&lt;p&gt;There is no issue with log messages. It works even without LEDs.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you for your help.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/243907?ContentTypeID=1</link><pubDate>Tue, 07 Apr 2020 13:11:57 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:660c8e24-8e5d-4549-aaf1-174330b6737f</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;The timeslot feature should not be dependent on what BLE role you have implemented in your application.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&amp;#39;m seeing some inconsistent behavior of the logger module, as logs are printed only occasionally. I see that you have configured the logger module in deferred mode which means that the application will process the logger in Idle mode. It doesn&amp;#39;t seem like the application has enough time to process the logs which makes it unpractical to debug with, turning off deferred mode would make the application process the logs in-place, which I also don&amp;#39;t recommend for real time applications. Instead, I recommend using something as simple as the LEDS on the DK and toggle them each time the application increments one of the callback counters. I&amp;#39;ve implemented this in the included files. LED3 and LED4 is used for cb_counter and ev_counter respectively.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The original project &amp;quot;nrf51-ble-gzll-device-uart&amp;quot; was written for SDK 10. Since then we have done some major changes in how modules subscribe to Softdevice events.&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v14.0.0/migration.html?cp=7_5_5_1_7_0_0#migration_ble_sdhandler"&gt;From the SDK 14.0 migration guide:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;em&gt;The scheme for dispatching events from the SoftDevice to the libraries and services has changed: the&amp;nbsp;ble_evt_dispatch&amp;nbsp;and&amp;nbsp;sys_evt_dispatch&amp;nbsp;functions have been removed, in favor of registering BLE and SoC event observers using the&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v14.0.0/group__nrf__sdh__ble.html#gad162c1f4d4c248e4d4567dfa70e0e10e"&gt;NRF_SDH_BLE_OBSERVER&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v14.0.0/group__nrf__sdh__soc.html#ga61b74435c52e1527c8802d0e4b2436bb"&gt;NRF_SDH_SOC_OBSERVER&lt;/a&gt;&amp;nbsp;macros, respectively&amp;quot;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Which means that you should register a observer with&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v14.0.0/group__nrf__sdh__ble.html#gad162c1f4d4c248e4d4567dfa70e0e10e"&gt;NRF_SDH_BLE_OBSERVER&lt;/a&gt;&amp;nbsp;for the&amp;nbsp;&lt;span&gt;&lt;span&gt;m_radio_callback and&amp;nbsp;&lt;/span&gt;&lt;/span&gt;sys_evt_dispatch callback handlers to be called. I&amp;#39;ve implemented these changes in the included files below. The result is that the callback handlers are called which is shown by the toggling of LEDS.&lt;/p&gt;
&lt;p&gt;best regards&lt;/p&gt;
&lt;p&gt;Jared&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;/* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 */
 
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;quot;nrf_assert.h&amp;quot;
#include &amp;quot;nrf_soc.h&amp;quot;
#include &amp;quot;nrf_gzll.h&amp;quot;
#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;wireless_debug.h&amp;quot;
#include &amp;quot;app_util_platform.h&amp;quot;
#include &amp;quot;nrf_sdh_soc.h&amp;quot;

void sys_evt_dispatch(uint32_t evt_id,void * p_context); //Forward declaration
NRF_SDH_SOC_OBSERVER(m_sys_radio_signal_obs, 0, sys_evt_dispatch, NULL);//registering of observer for events

 
//void notification_cb(nrf_impl_notification_t notification);
/*lint -e526 &amp;quot;Symbol RADIO_IRQHandler not defined&amp;quot; */
void RADIO_IRQHandler(void);

#define PIPE_NUMBER          0
#define TX_PAYLOAD_LENGTH   32
#define ACK_PAYLOAD_LENGTH  32

static nrf_radio_request_t  m_timeslot_request;
static uint32_t             m_slot_length;
static volatile bool        m_cmd_received = false;
static volatile bool        m_gzll_initialized = false;

volatile uint32_t cb_counter;
volatile uint32_t ev_counter;

static nrf_radio_signal_callback_return_param_t signal_callback_return_param;
static uint8_t ack_payload[ACK_PAYLOAD_LENGTH];

void HardFault_Handler(uint32_t program_counter, uint32_t link_register)
{
}

void m_configure_next_event(void)
{
    m_slot_length                                  = 25000;
    m_timeslot_request.request_type                = NRF_RADIO_REQ_TYPE_EARLIEST;
    m_timeslot_request.params.earliest.hfclk       = NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED;
    m_timeslot_request.params.earliest.priority    = NRF_RADIO_PRIORITY_NORMAL;
    m_timeslot_request.params.earliest.length_us   = m_slot_length;
    m_timeslot_request.params.earliest.timeout_us  = 1000000;
}

void sys_evt_dispatch(uint32_t evt_id,void * p_context)
{
    uint32_t err_code;

    ev_counter++;
    
    switch (evt_id)
    {
        case NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN:
            ASSERT(false);
            break;
        
        case NRF_EVT_RADIO_SESSION_IDLE:
            ASSERT(false);
            break;

        case NRF_EVT_RADIO_SESSION_CLOSED:
            ASSERT(false);
            break;

        case NRF_EVT_RADIO_BLOCKED:
            m_configure_next_event();
            err_code = sd_radio_request(&amp;amp;m_timeslot_request);
            APP_ERROR_CHECK(err_code);
            break;

        case NRF_EVT_RADIO_CANCELED:
            m_configure_next_event();
            err_code = sd_radio_request(&amp;amp;m_timeslot_request);
            APP_ERROR_CHECK(err_code);
            break;

        default:
            break;
    }
}

static void m_on_start(void)
{
    bool res;
    signal_callback_return_param.params.request.p_next = NULL;
    signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE;
    
    if (!m_gzll_initialized)
    {
        res = nrf_gzll_init(NRF_GZLL_MODE_DEVICE);
        ASSERT(res);
        res = nrf_gzll_set_device_channel_selection_policy(NRF_GZLL_DEVICE_CHANNEL_SELECTION_POLICY_USE_CURRENT);
        ASSERT(res);
        res = nrf_gzll_set_xosc_ctl(NRF_GZLL_XOSC_CTL_MANUAL);
        ASSERT(res);
        /*res = */nrf_gzll_set_max_tx_attempts(0);
        //ASSERT(res);
        res = nrf_gzll_set_base_address_0(0xE7E7E7E7);
        ASSERT(res);
        res = nrf_gzll_enable();
        ASSERT(res);
        m_gzll_initialized = true;
    }
    else
    {
        res = nrf_gzll_set_mode(NRF_GZLL_MODE_DEVICE);
        ASSERT(res);
    }
    NRF_TIMER0-&amp;gt;INTENSET = TIMER_INTENSET_COMPARE0_Msk;
    NRF_TIMER0-&amp;gt;CC[0] = m_slot_length - 4000; // TODO: Use define instead of magic number
    NVIC_EnableIRQ(TIMER0_IRQn);    
}

static void m_on_multitimer(void)
{
    NRF_TIMER0-&amp;gt;EVENTS_COMPARE[0] = 0;
    if (nrf_gzll_get_mode() != NRF_GZLL_MODE_SUSPEND)
    {
        signal_callback_return_param.params.request.p_next = NULL;
        signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE;
        (void)nrf_gzll_set_mode(NRF_GZLL_MODE_SUSPEND);
        NRF_TIMER0-&amp;gt;INTENSET = TIMER_INTENSET_COMPARE0_Msk;
        NRF_TIMER0-&amp;gt;CC[0] = m_slot_length - 1000;
    }
    else
    {
        ASSERT(nrf_gzll_get_mode() == NRF_GZLL_MODE_SUSPEND);
        m_configure_next_event();
        signal_callback_return_param.params.request.p_next = &amp;amp;m_timeslot_request;
        signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END;
    }
}

nrf_radio_signal_callback_return_param_t * m_radio_callback(uint8_t signal_type)
{
    cb_counter++;
    switch(signal_type)
    {
        case NRF_RADIO_CALLBACK_SIGNAL_TYPE_START:
            m_on_start();
            break;

        case NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO:
            signal_callback_return_param.params.request.p_next = NULL;
            signal_callback_return_param.callback_action = NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE;
            RADIO_IRQHandler();
            break;

        case NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0:
            m_on_multitimer();
            break;
    }
    return (&amp;amp;signal_callback_return_param);
}

uint32_t gazell_sd_radio_init(void)
{
    uint32_t err_code;

    err_code = sd_radio_session_open(m_radio_callback);
    if (err_code != NRF_SUCCESS)
        return err_code;
    m_configure_next_event();
    err_code = sd_radio_request(&amp;amp;m_timeslot_request);
    if (err_code != NRF_SUCCESS)
    {
        (void)sd_radio_session_close();
        return err_code;
    }
    return NRF_SUCCESS;
}


void nrf_gzll_device_tx_success(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info)
{
    uint32_t ack_payload_length = ACK_PAYLOAD_LENGTH; 
    if (tx_info.payload_received_in_ack)
    {      
        if (nrf_gzll_fetch_packet_from_rx_fifo(pipe, ack_payload, &amp;amp;ack_payload_length))
        {
            ASSERT(ack_payload_length == 1);
            m_cmd_received = true;
        }
    }
}

void nrf_gzll_device_tx_failed(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info)
{
}

void nrf_gzll_host_rx_data_ready(uint32_t pipe, nrf_gzll_host_rx_info_t rx_info)
{
}

void nrf_gzll_disabled(void)
{
}

bool debug_cmd_available(void)
{
    return m_cmd_received;
}

char get_debug_cmd(void)
{
    char cmd = ack_payload[0];
    m_cmd_received = false;
    return cmd;
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;/**
 * Copyright (c) 2014 - 2019, Nordic Semiconductor ASA
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *
 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * 4. This software, with or without modification, must only be used with a
 *    Nordic Semiconductor ASA integrated circuit.
 *
 * 5. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA &amp;quot;AS IS&amp;quot; AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
/**
 * @brief BLE LED Button Service central and client application main file.
 *
 * This file contains the source code for a sample client application using the LED Button service.
 */

#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#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_timer.h&amp;quot;
#include &amp;quot;boards.h&amp;quot;
#include &amp;quot;bsp.h&amp;quot;
#include &amp;quot;bsp_btn_ble.h&amp;quot;
#include &amp;quot;ble.h&amp;quot;
#include &amp;quot;ble_hci.h&amp;quot;
#include &amp;quot;ble_advertising.h&amp;quot;
#include &amp;quot;ble_conn_params.h&amp;quot;
#include &amp;quot;ble_db_discovery.h&amp;quot;
#include &amp;quot;ble_lbs_c.h&amp;quot;
#include &amp;quot;nrf_ble_gatt.h&amp;quot;
#include &amp;quot;nrf_ble_scan.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;wireless_debug.h&amp;quot;


#define CENTRAL_SCANNING_LED            BSP_BOARD_LED_0                     /**&amp;lt; Scanning LED will be on when the device is scanning. */
#define CENTRAL_CONNECTED_LED           BSP_BOARD_LED_1                     /**&amp;lt; Connected LED will be on when the device is connected. */
#define LEDBUTTON_LED                   BSP_BOARD_LED_2                     /**&amp;lt; LED to indicate a change of state of the the Button characteristic on the peer. */

#define SCAN_INTERVAL                   0x00A0                              /**&amp;lt; Determines scan interval in units of 0.625 millisecond. */
#define SCAN_WINDOW                     0x0050                              /**&amp;lt; Determines scan window in units of 0.625 millisecond. */
#define SCAN_DURATION                   0x0000                              /**&amp;lt; Timout when scanning. 0x0000 disables timeout. */

#define MIN_CONNECTION_INTERVAL         MSEC_TO_UNITS(7.5, UNIT_1_25_MS)    /**&amp;lt; Determines minimum connection interval in milliseconds. */
#define MAX_CONNECTION_INTERVAL         MSEC_TO_UNITS(30, UNIT_1_25_MS)     /**&amp;lt; Determines maximum connection interval in milliseconds. */
#define SLAVE_LATENCY                   0                                   /**&amp;lt; Determines slave latency in terms of connection events. */
#define SUPERVISION_TIMEOUT             MSEC_TO_UNITS(4000, UNIT_10_MS)     /**&amp;lt; Determines supervision time-out in units of 10 milliseconds. */

#define LEDBUTTON_BUTTON_PIN            BSP_BUTTON_0                        /**&amp;lt; Button that will write to the LED characteristic of the peer */
#define BUTTON_DETECTION_DELAY          APP_TIMER_TICKS(50)                 /**&amp;lt; Delay from a GPIOTE event until a button is reported as pushed (in number of timer ticks). */

#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. */

NRF_BLE_SCAN_DEF(m_scan);                                       /**&amp;lt; Scanning module instance. */
BLE_LBS_C_DEF(m_ble_lbs_c);                                     /**&amp;lt; Main structure used by the LBS 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_GQ_DEF(m_ble_gatt_queue,                                /**&amp;lt; BLE GATT Queue instance. */
               NRF_SDH_BLE_CENTRAL_LINK_COUNT,
               NRF_BLE_GQ_QUEUE_SIZE);

static char const m_target_periph_name[] = &amp;quot;Nordic_Blinky&amp;quot;;     /**&amp;lt; Name of the device we try to connect to. This name is searched in the scan report data*/

static uint32_t old_cb_counter;
static uint32_t old_ev_counter;

/**@brief Function to handle asserts in the SoftDevice.
 *
 * @details This function will be called in case of an assert in the SoftDevice.
 *
 * @warning This handler is an example only and does not fit a final product. You need to analyze
 *          how your product is supposed to react in case of Assert.
 * @warning On assert from the SoftDevice, the system can only recover on reset.
 *
 * @param[in] line_num     Line number of the failing ASSERT call.
 * @param[in] p_file_name  File name of the failing ASSERT call.
 */
void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
{
    app_error_handler(0xDEADBEEF, line_num, p_file_name);
}


/**@brief Function for handling the LED Button Service client errors.
 *
 * @param[in]   nrf_error   Error code containing information about what went wrong.
 */
static void lbs_error_handler(uint32_t nrf_error)
{
    APP_ERROR_HANDLER(nrf_error);
}


/**@brief Function for the LEDs initialization.
 *
 * @details Initializes all LEDs used by the application.
 */
static void leds_init(void)
{
    bsp_board_init(BSP_INIT_LEDS);
}


/**@brief Function to start scanning.
 */
static void scan_start(void)
{
    ret_code_t err_code;

    err_code = nrf_ble_scan_start(&amp;amp;m_scan);
    APP_ERROR_CHECK(err_code);

    bsp_board_led_off(CENTRAL_CONNECTED_LED);
    bsp_board_led_on(CENTRAL_SCANNING_LED);
}


/**@brief Handles events coming from the LED Button central module.
 */
static void lbs_c_evt_handler(ble_lbs_c_t * p_lbs_c, ble_lbs_c_evt_t * p_lbs_c_evt)
{
    switch (p_lbs_c_evt-&amp;gt;evt_type)
    {
        case BLE_LBS_C_EVT_DISCOVERY_COMPLETE:
        {
            ret_code_t err_code;

            err_code = ble_lbs_c_handles_assign(&amp;amp;m_ble_lbs_c,
                                                p_lbs_c_evt-&amp;gt;conn_handle,
                                                &amp;amp;p_lbs_c_evt-&amp;gt;params.peer_db);
            NRF_LOG_INFO(&amp;quot;LED Button service discovered on conn_handle 0x%x.&amp;quot;, p_lbs_c_evt-&amp;gt;conn_handle);

            err_code = app_button_enable();
            APP_ERROR_CHECK(err_code);

            // LED Button service discovered. Enable notification of Button.
            err_code = ble_lbs_c_button_notif_enable(p_lbs_c);
            APP_ERROR_CHECK(err_code);
        } break; // BLE_LBS_C_EVT_DISCOVERY_COMPLETE

        case BLE_LBS_C_EVT_BUTTON_NOTIFICATION:
        {
            NRF_LOG_INFO(&amp;quot;Button state changed on peer to 0x%x.&amp;quot;, p_lbs_c_evt-&amp;gt;params.button.button_state);
            if (p_lbs_c_evt-&amp;gt;params.button.button_state)
            {
                bsp_board_led_on(LEDBUTTON_LED);
            }
            else
            {
                bsp_board_led_off(LEDBUTTON_LED);
            }
        } break; // BLE_LBS_C_EVT_BUTTON_NOTIFICATION

        default:
            // No implementation needed.
            break;
    }
}


/**@brief Function for handling BLE events.
 *
 * @param[in]   p_ble_evt   Bluetooth stack event.
 * @param[in]   p_context   Unused.
 */
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t err_code;

    // For readability.
    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)
    {
        // Upon connection, check which peripheral has connected (HR or RSC), initiate DB
        // discovery, update LEDs status and resume scanning if necessary. */
        case BLE_GAP_EVT_CONNECTED:
        {
            NRF_LOG_INFO(&amp;quot;Connected.&amp;quot;);
            err_code = ble_lbs_c_handles_assign(&amp;amp;m_ble_lbs_c, p_gap_evt-&amp;gt;conn_handle, NULL);
            APP_ERROR_CHECK(err_code);

            err_code = ble_db_discovery_start(&amp;amp;m_db_disc, p_gap_evt-&amp;gt;conn_handle);
            APP_ERROR_CHECK(err_code);

            // Update LEDs status, and check if we should be looking for more
            // peripherals to connect to.
            bsp_board_led_on(CENTRAL_CONNECTED_LED);
            bsp_board_led_off(CENTRAL_SCANNING_LED);
        } break;

        // Upon disconnection, reset the connection handle of the peer which disconnected, update
        // the LEDs status and start scanning again.
        case BLE_GAP_EVT_DISCONNECTED:
        {
            NRF_LOG_INFO(&amp;quot;Disconnected.&amp;quot;);
            scan_start();
        } break;

        case BLE_GAP_EVT_TIMEOUT:
        {
            // We have not specified a timeout for scanning, so only connection attemps can timeout.
            if (p_gap_evt-&amp;gt;params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
            {
                NRF_LOG_DEBUG(&amp;quot;Connection request timed out.&amp;quot;);
            }
        } break;

        case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
        {
            // Accept 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:
        {
            NRF_LOG_DEBUG(&amp;quot;PHY update request.&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.
            NRF_LOG_DEBUG(&amp;quot;GATT Client Timeout.&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.
            NRF_LOG_DEBUG(&amp;quot;GATT Server Timeout.&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;

        default:
            // No implementation needed.
            break;
    }
}


/**@brief LED Button client initialization.
 */
static void lbs_c_init(void)
{
    ret_code_t       err_code;
    ble_lbs_c_init_t lbs_c_init_obj;

    lbs_c_init_obj.evt_handler   = lbs_c_evt_handler;
    lbs_c_init_obj.p_gatt_queue  = &amp;amp;m_ble_gatt_queue;
    lbs_c_init_obj.error_handler = lbs_error_handler;

    err_code = ble_lbs_c_init(&amp;amp;m_ble_lbs_c, &amp;amp;lbs_c_init_obj);
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for initializing the BLE stack.
 *
 * @details Initializes the SoftDevice and the BLE event interrupts.
 */
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 a handler for BLE events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}


/**@brief Function for handling events from the button handler module.
 *
 * @param[in] pin_no        The pin that the event applies to.
 * @param[in] button_action The button action (press/release).
 */
static void button_event_handler(uint8_t pin_no, uint8_t button_action)
{
    ret_code_t err_code;

    switch (pin_no)
    {
        case LEDBUTTON_BUTTON_PIN:
            err_code = ble_lbs_led_status_send(&amp;amp;m_ble_lbs_c, button_action);
            if (err_code != NRF_SUCCESS &amp;amp;&amp;amp;
                err_code != BLE_ERROR_INVALID_CONN_HANDLE &amp;amp;&amp;amp;
                err_code != NRF_ERROR_INVALID_STATE)
            {
                APP_ERROR_CHECK(err_code);
            }
            if (err_code == NRF_SUCCESS)
            {
                NRF_LOG_INFO(&amp;quot;LBS write LED state %d&amp;quot;, button_action);
            }
            break;

        default:
            APP_ERROR_HANDLER(pin_no);
            break;
    }
}


/**@brief Function for handling Scaning events.
 *
 * @param[in]   p_scan_evt   Scanning event.
 */
static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
    ret_code_t err_code;

    switch(p_scan_evt-&amp;gt;scan_evt_id)
    {
        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;
        default:
          break;
    }
}



/**@brief Function for initializing the button handler module.
 */
static void buttons_init(void)
{
    ret_code_t err_code;

    //The array must be static because a pointer to it will be saved in the button handler module.
    static app_button_cfg_t buttons[] =
    {
        {LEDBUTTON_BUTTON_PIN, false, BUTTON_PULL, button_event_handler}
    };

    err_code = app_button_init(buttons, ARRAY_SIZE(buttons),
                               BUTTON_DETECTION_DELAY);
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for handling database discovery events.
 *
 * @details This function is callback function to handle events from the database discovery module.
 *          Depending on the UUIDs that are discovered, this function should forward the events
 *          to their respective services.
 *
 * @param[in] p_event  Pointer to the database discovery event.
 */
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
    ble_lbs_on_db_disc_evt(&amp;amp;m_ble_lbs_c, p_evt);
}


/**@brief Database discovery initialization.
 */
static void db_discovery_init(void)
{
    ble_db_discovery_init_t db_init;

    memset(&amp;amp;db_init, 0, sizeof(db_init));

    db_init.evt_handler  = db_disc_handler;
    db_init.p_gatt_queue = &amp;amp;m_ble_gatt_queue;

    ret_code_t err_code = ble_db_discovery_init(&amp;amp;db_init);
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for initializing the log.
 */
static void log_init(void)
{
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}


/**@brief Function for initializing the timer.
 */
static void timer_init(void)
{
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for initializing the Power manager. */
static void power_management_init(void)
{
    ret_code_t err_code;
    err_code = nrf_pwr_mgmt_init();
    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.connect_if_match = true;
    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);

    // Setting filters for scanning.
    err_code = nrf_ble_scan_filters_enable(&amp;amp;m_scan, NRF_BLE_SCAN_NAME_FILTER, false);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_scan_filter_set(&amp;amp;m_scan, SCAN_NAME_FILTER, m_target_periph_name);
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for initializing the GATT module.
 */
static void gatt_init(void)
{
    ret_code_t err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, NULL);
    APP_ERROR_CHECK(err_code);
}


/**@brief Function for handling the idle state (main loop).
 *
 * @details Handle any pending log operation(s), then sleep until the next event occurs.
 */
static void idle_state_handle(void)
{
    NRF_LOG_FLUSH();
    nrf_pwr_mgmt_run();
}


int main(void)
{
    // Initialize.
    log_init();
    NRF_LOG_INFO(&amp;quot;Her&amp;quot;);
    timer_init();
    leds_init();
    buttons_init();
    power_management_init();
    ble_stack_init();
    scan_init();
    gatt_init();
    db_discovery_init();
    lbs_c_init();

    if(gazell_sd_radio_init())
        NRF_LOG_ERROR(&amp;quot;gazell_sd_radio_init&amp;quot;);

    // Start execution.
    NRF_LOG_INFO(&amp;quot;Blinky CENTRAL example started.&amp;quot;);
    scan_start();

    // Turn on the LED to signal scanning.
    bsp_board_led_on(CENTRAL_SCANNING_LED);

    // Enter main loop.
    for (;;)
    {
	bool updated = false;
	if(old_cb_counter != cb_counter)
	{
        bsp_board_led_invert(BSP_BOARD_LED_2);
		old_cb_counter = cb_counter;
		NRF_LOG_INFO(&amp;quot;CB count %d&amp;quot;, old_cb_counter);
		updated = true;
	}
	if(old_ev_counter != ev_counter)
	{
        bsp_board_led_invert(BSP_BOARD_LED_3);
		old_ev_counter = ev_counter;
		NRF_LOG_INFO(&amp;quot;CB count %d&amp;quot;, old_ev_counter);
		updated = true;
	}
	if(updated)
		NRF_LOG_FLUSH();

        idle_state_handle();
    }
}

&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/243794?ContentTypeID=1</link><pubDate>Tue, 07 Apr 2020 06:54:18 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0794fe28-3c46-449e-90b9-ff6fdb19573d</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Ah yes, my bad. Seems the whole project didn&amp;#39;t get downloaded the first time. I&amp;#39;ll return with more info.&lt;/p&gt;
&lt;p&gt;Thank you&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/243709?ContentTypeID=1</link><pubDate>Mon, 06 Apr 2020 14:23:03 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b07260ed-3be4-4db3-a49a-3ac20e945a3a</guid><dc:creator>EGM dev</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Everything you need except SDK itself should be already included. Provided zip file already contains makefile and sdk_config.&lt;/p&gt;
&lt;p&gt;We use GCC and SDK 16.0.0. Path to SDK is specified in makefile. If you change it you can just use &amp;quot;make&amp;quot; to compile this project.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/243604?ContentTypeID=1</link><pubDate>Mon, 06 Apr 2020 10:46:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d13818b5-35e2-43b9-af2b-0caa1adc7391</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Thanks for sharing.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Which SDK are you using?&lt;/p&gt;
&lt;p&gt;I can&amp;#39;t see anything obvious from your main file. Could you share the whole project as a zip that includes your SDK config file and makefile if you use GCC etc.. I would like to debug your project.&lt;/p&gt;
&lt;p&gt;regards&lt;/p&gt;
&lt;p&gt;Jared&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/243123?ContentTypeID=1</link><pubDate>Thu, 02 Apr 2020 09:18:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0bc46fd7-2c98-4074-80d6-c7f13fb94ecc</guid><dc:creator>EGM dev</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I have uploaded project to first random file sharing website &lt;a href="https://files.fm/f/3k6udxpu"&gt;https://files.fm/f/3k6udxpu&lt;/a&gt;. If you nave any issues i can upload it somewhere else.&lt;/p&gt;
&lt;p&gt;It is only combination of older &amp;quot;nrf51-ble-gzll-device-uart&amp;quot; and latest &amp;quot;ble_app_blinky_c&amp;quot; examples. There is nothing private included.&lt;/p&gt;
&lt;p&gt;As you can see. i have added two (volatile) variables for callback tracking, &amp;quot;cb_counter&amp;quot; and &amp;quot;ev_counter&amp;quot;. Those do not seem to change at all however. Like no callback is called.&lt;/p&gt;
&lt;p&gt;I have also added error check for &amp;quot;gazell_sd_radio_init&amp;quot; which initializes timeslot API. No error is reported.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: s140 Central and timeslots</title><link>https://devzone.nordicsemi.com/thread/242705?ContentTypeID=1</link><pubDate>Tue, 31 Mar 2020 13:00:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b7188f2b-521e-4bbd-be86-a0d414e8cb28</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Could you share your project? I can make the case private if you prefer it.&lt;/p&gt;
&lt;p&gt;regards&lt;/p&gt;
&lt;p&gt;Jared&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>