Shuta Nakamae / nRF51822

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:16 2015 +0100
Revision:
199:c2c831c55f3d
Parent:
198:a69d3d4797e8
Child:
200:be560f1834c0
Synchronized with git rev 32c473cc
Author: Rohit Grover
better use of serviceDiscoveryInProgress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 194:c99fc3160091 1 /* mbed Microcontroller Library
rgrover1 194:c99fc3160091 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 194:c99fc3160091 3 *
rgrover1 194:c99fc3160091 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 194:c99fc3160091 5 * you may not use this file except in compliance with the License.
rgrover1 194:c99fc3160091 6 * You may obtain a copy of the License at
rgrover1 194:c99fc3160091 7 *
rgrover1 194:c99fc3160091 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 194:c99fc3160091 9 *
rgrover1 194:c99fc3160091 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 194:c99fc3160091 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 194:c99fc3160091 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 194:c99fc3160091 13 * See the License for the specific language governing permissions and
rgrover1 194:c99fc3160091 14 * limitations under the License.
rgrover1 194:c99fc3160091 15 */
rgrover1 194:c99fc3160091 16
rgrover1 194:c99fc3160091 17 #include "btle_gattc.h"
rgrover1 195:061ed80ffbcf 18 #include "UUID.h"
rgrover1 194:c99fc3160091 19
rgrover1 194:c99fc3160091 20 #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). */
rgrover1 194:c99fc3160091 21 #define BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV 4 /**< Maximum number of characteristics per service supported by this module. */
rgrover1 194:c99fc3160091 22
rgrover1 194:c99fc3160091 23 #define SRV_DISC_START_HANDLE 0x0001 /**< The start handle value used during service discovery. */
rgrover1 194:c99fc3160091 24
rgrover1 194:c99fc3160091 25
rgrover1 194:c99fc3160091 26 /**@brief Structure for holding information about the service and the characteristics found during
rgrover1 194:c99fc3160091 27 * the discovery process.
rgrover1 194:c99fc3160091 28 */
rgrover1 195:061ed80ffbcf 29 struct DiscoveredService {
rgrover1 195:061ed80ffbcf 30 ShortUUIDBytes_t uuid; /**< UUID of the service. */
rgrover1 194:c99fc3160091 31 // uint8_t char_count; /**< Number of characteristics present in the service. */
rgrover1 194:c99fc3160091 32 // ble_db_discovery_char_t charateristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV]; /**< Array of information related to the characteristics present in the service. */
rgrover1 195:061ed80ffbcf 33 Gap::Handle_t startHandle; /**< Service Handle Range. */
rgrover1 195:061ed80ffbcf 34 Gap::Handle_t endHandle; /**< Service Handle Range. */
rgrover1 195:061ed80ffbcf 35
rgrover1 195:061ed80ffbcf 36 DiscoveredService() {
rgrover1 195:061ed80ffbcf 37 /* empty */
rgrover1 195:061ed80ffbcf 38 }
rgrover1 195:061ed80ffbcf 39 DiscoveredService(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 195:061ed80ffbcf 40 setup(uuidIn, start, end);
rgrover1 195:061ed80ffbcf 41 }
rgrover1 195:061ed80ffbcf 42
rgrover1 195:061ed80ffbcf 43 void setup(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 195:061ed80ffbcf 44 uuid = uuidIn;
rgrover1 195:061ed80ffbcf 45 startHandle = start;
rgrover1 195:061ed80ffbcf 46 endHandle = end;
rgrover1 195:061ed80ffbcf 47 }
rgrover1 195:061ed80ffbcf 48 };
rgrover1 194:c99fc3160091 49
rgrover1 198:a69d3d4797e8 50 struct ble_db_discovery_t {
rgrover1 195:061ed80ffbcf 51 DiscoveredService services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered. This is intended for internal use during service discovery.*/
rgrover1 198:a69d3d4797e8 52 uint16_t connHandle; /**< Connection handle as provided by the SoftDevice. */
rgrover1 198:a69d3d4797e8 53 uint8_t srvCount; /**< Number of services at the peers GATT database.*/
rgrover1 198:a69d3d4797e8 54 // uint8_t currCharInd; /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/
rgrover1 198:a69d3d4797e8 55 uint8_t currSrvInd; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
rgrover1 197:de757ae3358b 56 bool serviceDiscoveryInProgress; /**< Variable to indicate if there is a service discovery in progress. */
rgrover1 198:a69d3d4797e8 57 };
rgrover1 194:c99fc3160091 58
rgrover1 195:061ed80ffbcf 59 static ble_db_discovery_t discoveryStatus;
rgrover1 195:061ed80ffbcf 60
rgrover1 194:c99fc3160091 61 void launchServiceDiscovery(Gap::Handle_t connectionHandle)
rgrover1 194:c99fc3160091 62 {
rgrover1 194:c99fc3160091 63 // printf("connectionHandle %u\r\n", connectionHandle);
rgrover1 197:de757ae3358b 64 discoveryStatus.serviceDiscoveryInProgress = true;
rgrover1 194:c99fc3160091 65 printf("launch service discovery returned %u\r\n", sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL));
rgrover1 194:c99fc3160091 66 }
rgrover1 194:c99fc3160091 67
rgrover1 194:c99fc3160091 68 void bleGattcEventHandler(const ble_evt_t *p_ble_evt)
rgrover1 194:c99fc3160091 69 {
rgrover1 194:c99fc3160091 70 switch (p_ble_evt->header.evt_id) {
rgrover1 194:c99fc3160091 71 case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
rgrover1 194:c99fc3160091 72 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 194:c99fc3160091 73 case BLE_GATT_STATUS_SUCCESS: {
rgrover1 194:c99fc3160091 74 printf("count of primary services: %u\r\n", p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count);
rgrover1 195:061ed80ffbcf 75 discoveryStatus.connHandle = p_ble_evt->evt.gattc_evt.conn_handle;
rgrover1 195:061ed80ffbcf 76 discoveryStatus.currSrvInd = 0;
rgrover1 195:061ed80ffbcf 77 discoveryStatus.srvCount = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count;
rgrover1 194:c99fc3160091 78
rgrover1 195:061ed80ffbcf 79 for (unsigned serviceIndex = 0; serviceIndex < discoveryStatus.srvCount; serviceIndex++) {
rgrover1 195:061ed80ffbcf 80 discoveryStatus.services[serviceIndex].
rgrover1 195:061ed80ffbcf 81 setup(p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].uuid.uuid,
rgrover1 195:061ed80ffbcf 82 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 83 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].handle_range.end_handle);
rgrover1 194:c99fc3160091 84 }
rgrover1 195:061ed80ffbcf 85 break;
rgrover1 194:c99fc3160091 86 }
rgrover1 195:061ed80ffbcf 87
rgrover1 194:c99fc3160091 88 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND: {
rgrover1 197:de757ae3358b 89 discoveryStatus.serviceDiscoveryInProgress = false;
rgrover1 194:c99fc3160091 90 printf("end of service discovery\r\n");
rgrover1 194:c99fc3160091 91 break;
rgrover1 194:c99fc3160091 92 }
rgrover1 195:061ed80ffbcf 93
rgrover1 194:c99fc3160091 94 default: {
rgrover1 197:de757ae3358b 95 discoveryStatus.serviceDiscoveryInProgress = false;
rgrover1 194:c99fc3160091 96 printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
rgrover1 194:c99fc3160091 97 break;
rgrover1 194:c99fc3160091 98 }
rgrover1 194:c99fc3160091 99 }
rgrover1 194:c99fc3160091 100 break;
rgrover1 194:c99fc3160091 101
rgrover1 194:c99fc3160091 102 case BLE_GATTC_EVT_CHAR_DISC_RSP: {
rgrover1 194:c99fc3160091 103 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 194:c99fc3160091 104 default:
rgrover1 194:c99fc3160091 105 printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
rgrover1 194:c99fc3160091 106 break;
rgrover1 194:c99fc3160091 107 }
rgrover1 194:c99fc3160091 108 break;
rgrover1 194:c99fc3160091 109 }
rgrover1 194:c99fc3160091 110 }
rgrover1 195:061ed80ffbcf 111
rgrover1 199:c2c831c55f3d 112 while (discoveryStatus.serviceDiscoveryInProgress && (discoveryStatus.currSrvInd < discoveryStatus.srvCount)) {
rgrover1 195:061ed80ffbcf 113 printf("%x [%u %u]\r\n",
rgrover1 195:061ed80ffbcf 114 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].uuid.uuid,
rgrover1 195:061ed80ffbcf 115 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 116 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.end_handle);
rgrover1 195:061ed80ffbcf 117
rgrover1 195:061ed80ffbcf 118 // ble_gattc_handle_range_t handleRange = {
rgrover1 195:061ed80ffbcf 119 // .start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 120 // .end_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.end_handle
rgrover1 195:061ed80ffbcf 121 // };
rgrover1 195:061ed80ffbcf 122 // printf("characteristics_discover returned %u\r\n",
rgrover1 195:061ed80ffbcf 123 // sd_ble_gattc_characteristics_discover(p_ble_evt->evt.gattc_evt.conn_handle, &handleRange));
rgrover1 195:061ed80ffbcf 124
rgrover1 195:061ed80ffbcf 125 discoveryStatus.currSrvInd++;
rgrover1 195:061ed80ffbcf 126 }
rgrover1 199:c2c831c55f3d 127 if (discoveryStatus.serviceDiscoveryInProgress && (discoveryStatus.srvCount > 0)) {
rgrover1 196:70f1b8354d57 128 printf("services discover returned %u\r\n",
rgrover1 196:70f1b8354d57 129 sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gattc_evt.conn_handle,
rgrover1 196:70f1b8354d57 130 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd -1].handle_range.end_handle,
rgrover1 196:70f1b8354d57 131 NULL));
rgrover1 196:70f1b8354d57 132 }
rgrover1 194:c99fc3160091 133 }