<?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>Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/16781/example-to-set-up-adapter-for-pc-ble-driver</link><description>Is there an example like the PC-BLE-Driver 0.5.0 multi-link example, but using the new serialization interface with &amp;quot;adapter_t * adapter&amp;quot; from git hub</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 03 Oct 2016 14:09:28 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/16781/example-to-set-up-adapter-for-pc-ble-driver" /><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64207?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 14:09:28 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9b4955c4-1c51-4ac1-a410-ed97fb4578f1</guid><dc:creator>Christian Waldmann</dc:creator><description>&lt;p&gt;With setting &lt;code&gt;ble_enable_params.gap_enable_params.central_conn_count = 1;&lt;/code&gt; before calling sd_ble_enable() my dongle connects to my peripheral.
I have to do some more reading in the doc...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64204?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 13:21:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ab25d8ef-2298-4313-af26-a68c7c93afc3</guid><dc:creator>Christopher</dc:creator><description>&lt;p&gt;I am not sure where you will get more help (on Github or here)...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64203?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 13:18:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b277b4dd-82b4-4e15-862b-e7ca9df3ab6b</guid><dc:creator>Christian Waldmann</dc:creator><description>&lt;p&gt;Thanks for your information. &lt;em&gt;SwissKnife&lt;/em&gt; is my identity on GitHub, and now I have updated there too...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64202?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 13:02:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4e73f9ba-554c-4947-84b6-4b0b888a820c</guid><dc:creator>Christopher</dc:creator><description>&lt;p&gt;FYI, there is an open issue related to this on Github: &lt;a href="https://github.com/NordicSemiconductor/pc-ble-driver/issues/17"&gt;github.com/.../17&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64205?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 12:24:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:06af0584-d33e-4ed4-b6c1-dba3322881fa</guid><dc:creator>Christian Waldmann</dc:creator><description>&lt;p&gt;This is my adapted Multi-Link main.c to use the pc-ble-driver 1.0.0. Advertising packets are received, but connecting to my connectivity chip with up to date firmware (S130 2.0.0.1 with patch from github) fails with error code 18....&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* Copyright (c) 2015 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;quot;ble.h&amp;quot;
#include &amp;quot;ble_gap.h&amp;quot;
#include &amp;quot;ble_gattc.h&amp;quot;
#include &amp;quot;ble_types.h&amp;quot;
#include &amp;quot;nrf_error.h&amp;quot;

#include &amp;quot;sd_rpc.h&amp;quot;

#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;conio.h&amp;gt;

#ifdef _WIN32
#define UART_PORT_NAME &amp;quot;COM7&amp;quot;
#define UART_BAUD_RATE  115200
//#define UART_BAUD_RATE 1000000
#endif
#ifdef __APPLE__
#define UART_PORT_NAME &amp;quot;/dev/tty.usbmodem00000&amp;quot;
#endif
#ifdef __linux__
#define UART_PORT_NAME &amp;quot;/dev/ttyACM0&amp;quot;
#endif

#define ADVERTISING_INTERVAL_40_MS  64 // * 0.625 ms = 40 ms
#define ADVERTISING_TIMEOUT_3_MIN   180 // * 1 sec = 3 min

enum
{
    UNIT_0_625_MS = 625,                                /**&amp;lt; Number of microseconds in 0.625 milliseconds. */
    UNIT_1_25_MS  = 1250,                               /**&amp;lt; Number of microseconds in 1.25 milliseconds. */
    UNIT_10_MS    = 10000                               /**&amp;lt; Number of microseconds in 10 milliseconds. */
};

#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))

#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 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                    0                                              /**&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_DEV_NAME                  &amp;quot;PT-9&amp;quot;                                         /**&amp;lt; Target device name that application is looking for. */
#define MAX_PEER_COUNT                   8                                              /**&amp;lt; Maximum number of peer&amp;#39;s application intends to manage. */

#define HRM_SERVICE_UUID                 0x180D
#define HRM_MEAS_CHAR_UUID               0x2A37
#define CCCD_UUID                        0x2902
#define CCCD_NOTIFY                      0x01

// Power Tool UUID base: 1B59xxxx-1D5C-4829-8BCE-BF626B394318
#define PWRTOOLSRV_UUID_BASE        {0x18, 0x43, 0x39, 0x6B, 0x62, 0xBF, 0x8B, 0xCE, 0x48, 0x29, 0x5C, 0x1D, 0x00, 0x00, 0x59, 0x1B}

#define PWRTOOLSRV_UUID_SERVICE                                 0x1600

/* reserved
#define PWRTOOLSRV_UUID_STATUS_CHAR                             0x1601
*/

#define PWRTOOLSRV_UUID_OBJECT_REQUEST_CHAR                     0x1611
#define PWRTOOLSRV_UUID_OBJECT_PAYLOAD_CHAR                     0x1612

#define PWRTOOLSRV_UUID_MEMORY_REQUEST_CHAR                     0x1621

#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_HISTORY_HEADER_CHAR      0x1622
#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_HISTORY_ENTRY_CHAR       0x1623

#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_LOGGER_HEADER_CHAR       0x1624
#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_LOGGER_ENTRY_INFO_CHAR   0x1625
#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_LOGGER_ENTRY_CHAR        0x1626

#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_MANUFACTURER_READY_CHAR  0x1627
#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_MANUFACTURER_CHAR        0x1628

#define PWRTOOLSRV_UUID_MEMORY_PAYLOAD_SERVICE_CHAR             0x1629



#define STRING_BUFFER_SIZE               50

typedef struct
{
    uint8_t     * p_data;                                                      /**&amp;lt; Pointer to data. */
    uint16_t      data_len;                                                    /**&amp;lt; Length of data. */
} data_t;

static uint8_t  m_connected_devices = 0;
static uint16_t m_connection_handle = 0;
static uint16_t m_service_start_handle = 0;
static uint16_t m_service_end_handle = 0;
static uint16_t m_hrm_char_handle = 0;
static uint16_t m_hrm_cccd_handle = 0;
static bool     m_connection_is_in_progress = false;

static const ble_gap_scan_params_t m_scan_param =
{
     0,                       // Active scanning set.
     0,                       // Selective scanning not set.
     NULL,                    // White-list not set.
     (uint16_t)SCAN_INTERVAL, // Scan interval.
     (uint16_t)SCAN_WINDOW,   // Scan window.
     0                        // Never stop scanning unless explicit asked to.
};

static const ble_gap_conn_params_t m_connection_param =
{
    (uint16_t)MIN_CONNECTION_INTERVAL,   // Minimum connection
    (uint16_t)MAX_CONNECTION_INTERVAL,   // Maximum connection
    0,                                   // Slave latency
    (uint16_t)SUPERVISION_TIMEOUT        // Supervision time-out
};


/* Local function declarations */
static void log_handler(adapter_t * adapter, sd_rpc_log_severity_t severity, const char * message);
static uint32_t ble_stack_init(adapter_t * adapter );
static void on_connected(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt);
static void on_adv_report(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt);
static void on_timeout(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt);
static void on_service_discovery_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt);
static void on_characteristic_discover_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt);
static void on_descriptor_discover_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt);
static void on_write_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt);
static uint32_t adv_report_parse( uint8_t type, data_t * p_advdata, data_t * p_typedata);
static uint32_t scan_start(adapter_t * adapter );
static uint32_t service_discovery_start(adapter_t * adapter );
static uint32_t char_discovery_start(adapter_t * adapter );
static uint32_t descr_discovery_start(adapter_t * adapter );
static uint32_t hrm_cccd_set(adapter_t * adapter, uint8_t value);
static void ble_address_to_string_convert(ble_gap_addr_t address, uint8_t * string_buffer);

static void status_handler(adapter_t *adapter, sd_rpc_app_status_t code, const char * message) {
		switch (code)
		{
		case PKT_SEND_MAX_RETRIES_REACHED:
			printf(&amp;quot;PKT_SEND_MAX_RETRIES_REACHED: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case PKT_UNEXPECTED:
			printf(&amp;quot;PKT_UNEXPECTED: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case PKT_ENCODE_ERROR:
			printf(&amp;quot;PKT_ENCODE_ERROR: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case PKT_DECODE_ERROR:
			printf(&amp;quot;PKT_DECODE_ERROR: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case PKT_SEND_ERROR:
			printf(&amp;quot;PKT_SEND_ERROR: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case IO_RESOURCES_UNAVAILABLE:
			printf(&amp;quot;IO_RESOURCES_UNAVAILABLE: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case RESET_PERFORMED:
			printf(&amp;quot;RESET_PERFORMED: %s\n&amp;quot;, message); fflush(stdout);
			break;
		case CONNECTION_ACTIVE:
			printf(&amp;quot;CONNECTION_ACTIVE: %s\n&amp;quot;, message); fflush(stdout);
			break;
		}
}

static void log_handler(adapter_t * adapter, sd_rpc_log_severity_t severity, const char * message)
{
	switch (severity)
    {
	case SD_RPC_LOG_TRACE:
		printf(&amp;quot;Trace: %s\n&amp;quot;, message); fflush(stdout);
		break;

	case SD_RPC_LOG_DEBUG:
		printf(&amp;quot;Debug: %s\n&amp;quot;, message); fflush(stdout);
		break;

	case SD_RPC_LOG_INFO:
		printf(&amp;quot;Info: %s\n&amp;quot;, message); fflush(stdout);
		break;

	case SD_RPC_LOG_WARNING:
		printf(&amp;quot;Warning: %s\n&amp;quot;, message); fflush(stdout);
		break;

	case SD_RPC_LOG_ERROR:
        printf(&amp;quot;Error: %s\n&amp;quot;, message); fflush(stdout);
        break;

	case SD_RPC_LOG_FATAL:
		printf(&amp;quot;Fatal: %s\n&amp;quot;, message); fflush(stdout);
		break;

	default:
        printf(&amp;quot;Log: %s\n&amp;quot;, message); fflush(stdout);
        break;
    }
}

static void on_connected(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt)
{
    printf(&amp;quot;Connection established\n&amp;quot;); fflush(stdout);
    m_connected_devices++;
    m_connection_handle = p_ble_gap_evt-&amp;gt;conn_handle;
    m_connection_is_in_progress = false;
    service_discovery_start( adapter );
}

static void on_adv_report(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt)
{
    uint32_t    err_code;
    data_t      adv_data;
    data_t      type_data;
    uint8_t     str[STRING_BUFFER_SIZE] = {0};

    ble_address_to_string_convert(p_ble_gap_evt-&amp;gt;params.adv_report.peer_addr, str);
    printf(&amp;quot;Received advertisment report, address: 0x%s\n&amp;quot;, str); fflush(stdout);

    adv_data.p_data     = (uint8_t *)(p_ble_gap_evt-&amp;gt;params.adv_report.data);
    adv_data.data_len   = p_ble_gap_evt-&amp;gt;params.adv_report.dlen;

    err_code = adv_report_parse(BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
                                &amp;amp;adv_data,
                                &amp;amp;type_data);
    if (err_code != NRF_SUCCESS)
    {
        // Compare short local name in case complete name does not match.
        err_code = adv_report_parse(BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME,
                                    &amp;amp;adv_data,
                                    &amp;amp;type_data);

        if (err_code != NRF_SUCCESS)
        {
            return;
        }
    }

    if (0 == memcmp(TARGET_DEV_NAME, type_data.p_data, type_data.data_len))
    {
        if (m_connected_devices &amp;gt;= MAX_PEER_COUNT)
        {
            return;
        }

        if (m_connection_is_in_progress)
        {
            return;
        }

		err_code = sd_ble_gap_connect(adapter, &amp;amp;(p_ble_gap_evt-&amp;gt;params.adv_report.peer_addr),
                                      &amp;amp;m_scan_param,
                                      &amp;amp;m_connection_param);

        if (err_code != NRF_SUCCESS)
        {
            printf(&amp;quot;Connection Request Failed, reason %d\n&amp;quot;, err_code); fflush(stdout);
            return;
        }

        m_connection_is_in_progress = true;
    }
}

static void on_timeout(adapter_t * adapter, const ble_gap_evt_t * const p_ble_gap_evt)
{
    if (p_ble_gap_evt-&amp;gt;params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
    {
        m_connection_is_in_progress = false;
    }
    else if (p_ble_gap_evt-&amp;gt;params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN)
    {
        scan_start( adapter );
    }
}

static void on_service_discovery_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt)
{
    int count;
    int service_index;
    const ble_gattc_service_t * service;

    if (p_ble_gattc_evt-&amp;gt;gatt_status != NRF_SUCCESS)
    {
        printf(&amp;quot;Error. Service discovery failed. Error code 0x%X\n&amp;quot;,
                p_ble_gattc_evt-&amp;gt;gatt_status);
        fflush(stdout);
        return;
    }

    count = p_ble_gattc_evt-&amp;gt;params.prim_srvc_disc_rsp.count;

    if (count == 0)
    {
        printf(&amp;quot;Error. Service not found\n&amp;quot;); fflush(stdout);
        return;
    }

    printf(&amp;quot;Received service discovery response\n&amp;quot;); fflush(stdout);

    service_index = 0; /* We specifically requested to discover Heart Rate service, so we can
                        * safely select the first returned service. */

    service = &amp;amp;(p_ble_gattc_evt-&amp;gt;params.prim_srvc_disc_rsp.services[service_index]);

    m_service_start_handle  = service-&amp;gt;handle_range.start_handle;
    m_service_end_handle    = service-&amp;gt;handle_range.end_handle;

    printf(&amp;quot;UUID: 0x%04X, start handle: 0x%04X, end handle: 0x%04X\n&amp;quot;,
        service-&amp;gt;uuid.uuid, m_service_start_handle, m_service_end_handle);
    fflush(stdout);

    char_discovery_start( adapter );
}

static void on_characteristic_discover_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt)
{
    int i;
    int count;
    ble_gattc_char_t * p_characteristic;

    if (p_ble_gattc_evt-&amp;gt;gatt_status != NRF_SUCCESS)
    {
        printf(&amp;quot;Error. Characteristic discovery failed. Error code 0x%X\n&amp;quot;,
               p_ble_gattc_evt-&amp;gt;gatt_status);
        fflush(stdout);
        return;
    }

    count = p_ble_gattc_evt-&amp;gt;params.char_disc_rsp.count;

    printf(&amp;quot;Received characteristic discovery response, characteristics count: %d\n&amp;quot;, count);
    fflush(stdout);

    for (i = 0; i &amp;lt; count; i++)
    {
        p_characteristic = (ble_gattc_char_t *)&amp;amp;(p_ble_gattc_evt-&amp;gt;params.char_disc_rsp.chars[i]);
        printf(&amp;quot;Handle: 0x%04X, UUID: 0x%04X\n&amp;quot;,
            p_characteristic-&amp;gt;handle_decl,
            p_characteristic-&amp;gt;uuid.uuid);
        fflush(stdout);

        if (p_characteristic-&amp;gt;uuid.uuid == HRM_MEAS_CHAR_UUID)
        {
            m_hrm_char_handle = p_characteristic-&amp;gt;handle_decl;
        }
    }

    descr_discovery_start( adapter );
}

static void on_descriptor_discover_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt)
{
    int i;
    int count;
    ble_gattc_desc_t * p_descriptor;

    if (p_ble_gattc_evt-&amp;gt;gatt_status != NRF_SUCCESS)
    {
        printf(&amp;quot;Error. Descriptor discovery failed. Error code 0x%X\n&amp;quot;,
                p_ble_gattc_evt-&amp;gt;gatt_status);
        fflush(stdout);
        return;
    }

    count = p_ble_gattc_evt-&amp;gt;params.desc_disc_rsp.count;

    printf(&amp;quot;Received descriptor discovery response, descriptor count: %d\n&amp;quot;, count);
    fflush(stdout);

    for (i = 0; i &amp;lt; count; i++)
    {
        p_descriptor = (ble_gattc_desc_t *)&amp;amp;(p_ble_gattc_evt-&amp;gt;params.desc_disc_rsp.descs[i]);
        printf(&amp;quot;Handle: 0x%04X, UUID: 0x%04X\n&amp;quot;, p_descriptor-&amp;gt;handle, p_descriptor-&amp;gt;uuid.uuid);
        fflush(stdout);

        if (p_descriptor-&amp;gt;uuid.uuid == CCCD_UUID)
        {
            m_hrm_cccd_handle = p_descriptor-&amp;gt;handle;
        }
    }

    printf(&amp;quot;Press enter to toggle notifications\n&amp;quot;); fflush(stdout);
}

static void on_write_response(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt)
{
    printf(&amp;quot;Received write response.\n&amp;quot;); fflush(stdout);

    if (p_ble_gattc_evt-&amp;gt;gatt_status != NRF_SUCCESS)
    {
        printf(&amp;quot;Error. Write operation failed. Error code 0x%X\n&amp;quot;,
                p_ble_gattc_evt-&amp;gt;gatt_status);
        fflush(stdout);
        return;
    }
}

static void on_hvx(adapter_t * adapter, const ble_gattc_evt_t * const p_ble_gattc_evt)
{
    int i = 0;
    int length = p_ble_gattc_evt-&amp;gt;params.hvx.len;

    printf(&amp;quot;Received handle value notification, handle: 0x%04X, value: 0x&amp;quot;,
           p_ble_gattc_evt-&amp;gt;params.hvx.handle);
    fflush(stdout);

    for (i = 0; i &amp;lt; length; i++)
    {
        printf(&amp;quot;%02X&amp;quot;, p_ble_gattc_evt-&amp;gt;params.hvx.data[i]);
        fflush(stdout);
    }

    printf(&amp;quot;\n&amp;quot;); fflush(stdout);
}

static void ble_address_to_string_convert(ble_gap_addr_t address, uint8_t * string_buffer)
{
    const int address_length = 6;
    char temp_str[3];
    int i = 0;

    for (i = address_length - 1; i &amp;gt;= 0; --i)
    {
        sprintf(temp_str, &amp;quot;%02X&amp;quot;, address.addr[i]);
        strcat((char *)string_buffer, temp_str);
    }
}

static uint32_t adv_report_parse(uint8_t type, data_t * p_advdata, data_t * p_typedata)
{
    uint8_t * p_data;
    uint32_t  index;

    p_data = p_advdata-&amp;gt;p_data;
    index = 0;

    while (index &amp;lt; p_advdata-&amp;gt;data_len)
    {
        uint8_t field_length = p_data[index];
        uint8_t field_type   = p_data[index+1];

        if (field_type == type)
        {
            p_typedata-&amp;gt;p_data   = &amp;amp;p_data[index+2];
            p_typedata-&amp;gt;data_len = field_length-1;
            return NRF_SUCCESS;
        }
        index += field_length+1;
    }
    return NRF_ERROR_NOT_FOUND;
}

static uint32_t ble_stack_init(adapter_t * adapter )
{
    uint32_t err_code;
    ble_enable_params_t ble_enable_params;

    memset(&amp;amp;ble_enable_params, 0, sizeof(ble_enable_params));

    ble_enable_params.gatts_enable_params.attr_tab_size   = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT;
    ble_enable_params.gatts_enable_params.service_changed = false;

	err_code = sd_ble_enable(adapter, &amp;amp;ble_enable_params, 0); // TODO set APP RAM BASE

    if (err_code == NRF_SUCCESS)
    {
        return err_code;
    }

    if (err_code == NRF_ERROR_INVALID_STATE)
    {
        printf(&amp;quot;BLE stack already enabled\n&amp;quot;); fflush(stdout);
        return NRF_SUCCESS;
    }

    printf(&amp;quot;Failed to enable BLE stack.\n&amp;quot;); fflush(stdout);
    return err_code;
}

static uint32_t scan_start(adapter_t * adapter )
{
    uint32_t error_code = sd_ble_gap_scan_start(adapter, &amp;amp;m_scan_param);

    if (error_code != NRF_SUCCESS)
    {
        printf(&amp;quot;Scan start failed\n&amp;quot;); fflush(stdout);
        return error_code;
    }

    printf(&amp;quot;Scan started\n&amp;quot;); fflush(stdout);

    return NRF_SUCCESS;
}

static uint32_t service_discovery_start( adapter_t * adapter )
{
	ble_uuid128_t base_uuid = { PWRTOOLSRV_UUID_BASE };

	uint16_t start_handle;
    uint32_t err_code;
    ble_uuid_t srvc_uuid;

	uint8_t vs_uuid_type;

    printf(&amp;quot;Discovering primary services\n&amp;quot;); fflush(stdout);
    start_handle = 0x0001;

	err_code = sd_ble_uuid_vs_add(adapter, &amp;amp;base_uuid, &amp;amp;vs_uuid_type);

	srvc_uuid.type = vs_uuid_type;
	srvc_uuid.uuid = PWRTOOLSRV_UUID_SERVICE;

    err_code = sd_ble_gattc_primary_services_discover(adapter, m_connection_handle, start_handle,
                                                      &amp;amp;srvc_uuid);
    if (err_code != NRF_SUCCESS)
    {
        printf(&amp;quot;Failed to discover primary services\n&amp;quot;); fflush(stdout);
        return err_code;
    }

    return NRF_SUCCESS;
}

static uint32_t char_discovery_start(adapter_t * adapter )
{
    uint32_t err_code;
    ble_gattc_handle_range_t handle_range;

    printf(&amp;quot;Discovering characteristics\n&amp;quot;); fflush(stdout);

    handle_range.start_handle = m_service_start_handle;
    handle_range.end_handle = m_service_end_handle;

    err_code = sd_ble_gattc_characteristics_discover(adapter, m_connection_handle, &amp;amp;handle_range);

    return err_code;
}

static uint32_t descr_discovery_start(adapter_t * adapter )
{
    uint32_t err_code;
    ble_gattc_handle_range_t handle_range;

    printf(&amp;quot;Discovering descriptors\n&amp;quot;); fflush(stdout);

    if (m_hrm_char_handle == 0)
    {
        printf(&amp;quot;Error. No HRM characteristic handle has been found\n&amp;quot;); fflush(stdout);
        return NRF_ERROR_INVALID_STATE;
    }

    handle_range.start_handle = m_hrm_char_handle;
    handle_range.end_handle = m_service_end_handle;

    err_code = sd_ble_gattc_descriptors_discover(adapter, m_connection_handle, &amp;amp;handle_range);
    return err_code;
}

static uint32_t hrm_cccd_set(adapter_t * adapter, uint8_t value)
{
    uint32_t err_code;
    ble_gattc_write_params_t write_params;
    uint8_t cccd_value[2] = {value, 0};

    printf(&amp;quot;Setting HRM CCCD\n&amp;quot;); fflush(stdout);

    if (m_hrm_cccd_handle == 0)
    {
        printf(&amp;quot;Error. No CCCD handle has been found\n&amp;quot;); fflush(stdout);
        return NRF_ERROR_INVALID_STATE;
    }

    write_params.handle = m_hrm_cccd_handle;
    write_params.len = 2;
    write_params.p_value = cccd_value;
    write_params.write_op = BLE_GATT_OP_WRITE_REQ;
    write_params.offset = 0;
    err_code = sd_ble_gattc_write(adapter, m_connection_handle, &amp;amp;write_params);

    return err_code;
}

static void ble_evt_dispatch(adapter_t *adapter, ble_evt_t * p_ble_evt)
{
    if (p_ble_evt == NULL)
    {
        printf(&amp;quot;Received empty ble_event\n&amp;quot;); fflush(stdout);
        return;
    }

    switch (p_ble_evt-&amp;gt;header.evt_id)
    {
    case BLE_GAP_EVT_CONNECTED:
        on_connected(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gap_evt));
        break;

    case BLE_GAP_EVT_DISCONNECTED:
        printf(&amp;quot;Disconnected, reason: 0x%02X\n&amp;quot;, p_ble_evt-&amp;gt;evt.gap_evt.params.disconnected.reason);
        fflush(stdout);
        m_connected_devices--;
        m_connection_handle = 0;
        break;

    case BLE_GAP_EVT_ADV_REPORT:
		on_adv_report(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gap_evt));
        break;

    case BLE_GAP_EVT_TIMEOUT:
        on_timeout(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gap_evt));
        break;

    case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
        on_service_discovery_response(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gattc_evt));
        break;

    case BLE_GATTC_EVT_CHAR_DISC_RSP:
		on_characteristic_discover_response(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gattc_evt));
        break;

    case BLE_GATTC_EVT_DESC_DISC_RSP:
		on_descriptor_discover_response(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gattc_evt));
        break;

    case BLE_GATTC_EVT_WRITE_RSP:
		on_write_response(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gattc_evt));
        break;

    case BLE_GATTC_EVT_HVX:
		on_hvx(adapter, &amp;amp;(p_ble_evt-&amp;gt;evt.gattc_evt));
        break;

    default:
        printf(&amp;quot;Unhandled event with ID: %d\n&amp;quot;, p_ble_evt-&amp;gt;header.evt_id); fflush(stdout);
        break;
    }
}

int main(int argc, char *argv[])
{
	bool menuActive = true;

    uint32_t error_code;
    uint8_t cccd_value;
    char* serial_port;

	physical_layer_t * physical_layer;
	data_link_layer_t * data_link_layer;
	transport_layer_t * transport_layer;
	adapter_t * adapter;

    cccd_value = 0;

    if (argc &amp;gt; 1)
    {
        serial_port = argv[1];
    }
    else
    {
        serial_port = UART_PORT_NAME;
    }

    printf(&amp;quot;Serial port used: %s\n&amp;quot;, serial_port); fflush(stdout);

	physical_layer = sd_rpc_physical_layer_create_uart(serial_port, UART_BAUD_RATE, SD_RPC_FLOW_CONTROL_HARDWARE, SD_RPC_PARITY_NONE);
	data_link_layer = sd_rpc_data_link_layer_create_bt_three_wire(physical_layer, 250);
	transport_layer = sd_rpc_transport_layer_create(data_link_layer, 250);
	adapter = sd_rpc_adapter_create(transport_layer);

	error_code = sd_rpc_open(adapter, status_handler, ble_evt_dispatch, log_handler);

    if (error_code != NRF_SUCCESS)
    {
        printf(&amp;quot;Failed to open the nRF51 BLE Driver. Error code: 0x%02X\n&amp;quot;, error_code);
        fflush(stdout);
        return error_code;
    }

    error_code = ble_stack_init( adapter );

    if (error_code != NRF_SUCCESS)
    {
        return error_code;
    }

    scan_start( adapter );

    while (menuActive)
    {
        int ch = _getch();

		switch (ch) {
			case &amp;#39;q&amp;#39;:
			case &amp;#39;x&amp;#39;:
				menuActive = false;
				break;

		}
    }

    error_code = sd_rpc_close( adapter );

    if (error_code != NRF_SUCCESS)
    {
        printf(&amp;quot;Failed to close the nRF51 BLE Driver. Error code: 0x%02X\n&amp;quot;, error_code);
        fflush(stdout);
        return error_code;
    }

    printf(&amp;quot;Closed\n&amp;quot;); fflush(stdout);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Example to set up adapter for PC-BLE-Driver</title><link>https://devzone.nordicsemi.com/thread/64206?ContentTypeID=1</link><pubDate>Mon, 03 Oct 2016 12:08:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b1ee5237-1310-4d49-86ae-0c72ce17a4e4</guid><dc:creator>Hung Bui</dc:creator><description>&lt;p&gt;Hi Christian,&lt;/p&gt;
&lt;p&gt;I assume you are trying to use the &lt;a href="https://github.com/NordicSemiconductor/pc-ble-driver/tree/master"&gt;pc-ble-driver&lt;/a&gt; on our github ?
We only have examples in python &lt;a href="https://github.com/NordicSemiconductor/pc-ble-driver-py/tree/master/python/pc_ble_driver_py/examples"&gt;here&lt;/a&gt;. Maybe it would help ?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>