Goran Mahovlic / nRF51822_BLE_MIDI

Dependents:   BLE_MIDI

Fork of nRF51822 by Nordic Semiconductor

btle/btle_gattc.cpp

Committer:
rgrover1
Date:
2015-06-19
Revision:
194:c99fc3160091
Child:
195:061ed80ffbcf

File content as of revision 194:c99fc3160091:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2013 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "btle_gattc.h"

#define BLE_DB_DISCOVERY_MAX_SRV          4  /**< Maximum number of services supported by this module. This also indicates the maximum number of users allowed to be registered to this module. (one user per service). */
#define BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV 4  /**< Maximum number of characteristics per service supported by this module. */

#define SRV_DISC_START_HANDLE  0x0001                    /**< The start handle value used during service discovery. */


/**@brief Structure for holding information about the service and the characteristics found during
 *        the discovery process.
 */
typedef struct
{
    ble_uuid_t               srvUUID;                                           /**< UUID of the service. */
    // uint8_t                  char_count;                                         /**< Number of characteristics present in the service. */
    // ble_db_discovery_char_t  charateristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];  /**< Array of information related to the characteristics present in the service. */
    ble_gattc_handle_range_t handleRange;                                       /**< Service Handle Range. */
} ble_db_discovery_srv_t;

typedef struct
{
    ble_db_discovery_srv_t services[BLE_DB_DISCOVERY_MAX_SRV];  /**< Information related to the current service being discovered. This is intended for internal use during service discovery.*/
    uint16_t               connHandle;                         /**< Connection handle as provided by the SoftDevice. */
    uint8_t                srvCount;                           /**< Number of services at the peers GATT database.*/
    // uint8_t                currCharInd;                       /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/
    uint8_t                currSrvInd;                        /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
    // bool                   discoveryInProgress;               /**< Variable to indicate if there is a service discovery in progress. */
} ble_db_discovery_t;

void launchServiceDiscovery(Gap::Handle_t connectionHandle)
{
    // printf("connectionHandle %u\r\n", connectionHandle);
    printf("launch service discovery returned %u\r\n", sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL));
}

void bleGattcEventHandler(const ble_evt_t *p_ble_evt)
{
    switch (p_ble_evt->header.evt_id) {
        case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
            switch (p_ble_evt->evt.gattc_evt.gatt_status) {
                case BLE_GATT_STATUS_SUCCESS: {
                    printf("count of primary services: %u\r\n", p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count);

                    unsigned index;
                    for (index = 0; index < p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count; index++) {
                        printf("%x [%u %u]\r\n",
                            p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].uuid.uuid,
                            p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle,
                            p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle);

                        ble_gattc_handle_range_t handleRange = {
                            .start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle,
                            .end_handle   = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle
                        };
                        printf("characteristics_discover returned %u\r\n",
                               sd_ble_gattc_characteristics_discover(p_ble_evt->evt.gattc_evt.conn_handle, &handleRange));
                    }
                    printf("services discover returned %u\r\n",
                        sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gattc_evt.conn_handle,
                                                               p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index -1].handle_range.end_handle,
                                                               NULL));
                        break;
                }
                case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND: {
                    printf("end of service discovery\r\n");
                    break;
                }
                default: {
                    printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
                    break;
                }
            }
            break;

        case BLE_GATTC_EVT_CHAR_DISC_RSP: {
            switch (p_ble_evt->evt.gattc_evt.gatt_status) {
                default:
                    printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
                    break;
            }
            break;
        }
    }
}