Shuta Nakamae / nRF51822

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:16 2015 +0100
Revision:
202:3ce954ce3eb8
Parent:
201:a13ada00eac7
Child:
203:fc9a565a1b2f
Synchronized with git rev 2007fdac
Author: Rohit Grover
add signature for lauchCharacteristicDiscovery()

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 DiscoveredService() {
rgrover1 195:061ed80ffbcf 31 /* empty */
rgrover1 195:061ed80ffbcf 32 }
rgrover1 195:061ed80ffbcf 33 DiscoveredService(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 195:061ed80ffbcf 34 setup(uuidIn, start, end);
rgrover1 195:061ed80ffbcf 35 }
rgrover1 195:061ed80ffbcf 36
rgrover1 195:061ed80ffbcf 37 void setup(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 195:061ed80ffbcf 38 uuid = uuidIn;
rgrover1 195:061ed80ffbcf 39 startHandle = start;
rgrover1 195:061ed80ffbcf 40 endHandle = end;
rgrover1 195:061ed80ffbcf 41 }
rgrover1 201:a13ada00eac7 42
rgrover1 201:a13ada00eac7 43 ShortUUIDBytes_t uuid; /**< UUID of the service. */
rgrover1 201:a13ada00eac7 44 // uint8_t char_count; /**< Number of characteristics present in the service. */
rgrover1 201:a13ada00eac7 45 // 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 201:a13ada00eac7 46 Gap::Handle_t startHandle; /**< Service Handle Range. */
rgrover1 201:a13ada00eac7 47 Gap::Handle_t endHandle; /**< Service Handle Range. */
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 200:be560f1834c0 56 bool serviceDiscoveryInProgress;
rgrover1 200:be560f1834c0 57 bool characteristicDiscoveryInProgress;
rgrover1 198:a69d3d4797e8 58 };
rgrover1 194:c99fc3160091 59
rgrover1 195:061ed80ffbcf 60 static ble_db_discovery_t discoveryStatus;
rgrover1 195:061ed80ffbcf 61
rgrover1 194:c99fc3160091 62 void launchServiceDiscovery(Gap::Handle_t connectionHandle)
rgrover1 194:c99fc3160091 63 {
rgrover1 194:c99fc3160091 64 // printf("connectionHandle %u\r\n", connectionHandle);
rgrover1 200:be560f1834c0 65 discoveryStatus.serviceDiscoveryInProgress = true;
rgrover1 200:be560f1834c0 66 discoveryStatus.characteristicDiscoveryInProgress = false;
rgrover1 194:c99fc3160091 67 printf("launch service discovery returned %u\r\n", sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL));
rgrover1 194:c99fc3160091 68 }
rgrover1 194:c99fc3160091 69
rgrover1 202:3ce954ce3eb8 70 void launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle) {
rgrover1 202:3ce954ce3eb8 71 /* TODO */
rgrover1 202:3ce954ce3eb8 72 }
rgrover1 202:3ce954ce3eb8 73
rgrover1 194:c99fc3160091 74 void bleGattcEventHandler(const ble_evt_t *p_ble_evt)
rgrover1 194:c99fc3160091 75 {
rgrover1 194:c99fc3160091 76 switch (p_ble_evt->header.evt_id) {
rgrover1 194:c99fc3160091 77 case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
rgrover1 194:c99fc3160091 78 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 194:c99fc3160091 79 case BLE_GATT_STATUS_SUCCESS: {
rgrover1 194:c99fc3160091 80 printf("count of primary services: %u\r\n", p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count);
rgrover1 195:061ed80ffbcf 81 discoveryStatus.connHandle = p_ble_evt->evt.gattc_evt.conn_handle;
rgrover1 195:061ed80ffbcf 82 discoveryStatus.currSrvInd = 0;
rgrover1 195:061ed80ffbcf 83 discoveryStatus.srvCount = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count;
rgrover1 194:c99fc3160091 84
rgrover1 195:061ed80ffbcf 85 for (unsigned serviceIndex = 0; serviceIndex < discoveryStatus.srvCount; serviceIndex++) {
rgrover1 195:061ed80ffbcf 86 discoveryStatus.services[serviceIndex].
rgrover1 195:061ed80ffbcf 87 setup(p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].uuid.uuid,
rgrover1 195:061ed80ffbcf 88 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 89 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[serviceIndex].handle_range.end_handle);
rgrover1 194:c99fc3160091 90 }
rgrover1 195:061ed80ffbcf 91 break;
rgrover1 194:c99fc3160091 92 }
rgrover1 195:061ed80ffbcf 93
rgrover1 194:c99fc3160091 94 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND: {
rgrover1 197:de757ae3358b 95 discoveryStatus.serviceDiscoveryInProgress = false;
rgrover1 194:c99fc3160091 96 printf("end of service discovery\r\n");
rgrover1 194:c99fc3160091 97 break;
rgrover1 194:c99fc3160091 98 }
rgrover1 195:061ed80ffbcf 99
rgrover1 194:c99fc3160091 100 default: {
rgrover1 197:de757ae3358b 101 discoveryStatus.serviceDiscoveryInProgress = false;
rgrover1 194:c99fc3160091 102 printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
rgrover1 194:c99fc3160091 103 break;
rgrover1 194:c99fc3160091 104 }
rgrover1 194:c99fc3160091 105 }
rgrover1 194:c99fc3160091 106 break;
rgrover1 194:c99fc3160091 107
rgrover1 194:c99fc3160091 108 case BLE_GATTC_EVT_CHAR_DISC_RSP: {
rgrover1 194:c99fc3160091 109 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 194:c99fc3160091 110 default:
rgrover1 194:c99fc3160091 111 printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status);
rgrover1 194:c99fc3160091 112 break;
rgrover1 194:c99fc3160091 113 }
rgrover1 194:c99fc3160091 114 break;
rgrover1 194:c99fc3160091 115 }
rgrover1 194:c99fc3160091 116 }
rgrover1 195:061ed80ffbcf 117
rgrover1 199:c2c831c55f3d 118 while (discoveryStatus.serviceDiscoveryInProgress && (discoveryStatus.currSrvInd < discoveryStatus.srvCount)) {
rgrover1 195:061ed80ffbcf 119 printf("%x [%u %u]\r\n",
rgrover1 195:061ed80ffbcf 120 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].uuid.uuid,
rgrover1 195:061ed80ffbcf 121 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 122 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.end_handle);
rgrover1 195:061ed80ffbcf 123
rgrover1 195:061ed80ffbcf 124 // ble_gattc_handle_range_t handleRange = {
rgrover1 195:061ed80ffbcf 125 // .start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.start_handle,
rgrover1 195:061ed80ffbcf 126 // .end_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd].handle_range.end_handle
rgrover1 195:061ed80ffbcf 127 // };
rgrover1 195:061ed80ffbcf 128 // printf("characteristics_discover returned %u\r\n",
rgrover1 195:061ed80ffbcf 129 // sd_ble_gattc_characteristics_discover(p_ble_evt->evt.gattc_evt.conn_handle, &handleRange));
rgrover1 195:061ed80ffbcf 130
rgrover1 195:061ed80ffbcf 131 discoveryStatus.currSrvInd++;
rgrover1 195:061ed80ffbcf 132 }
rgrover1 199:c2c831c55f3d 133 if (discoveryStatus.serviceDiscoveryInProgress && (discoveryStatus.srvCount > 0)) {
rgrover1 196:70f1b8354d57 134 printf("services discover returned %u\r\n",
rgrover1 196:70f1b8354d57 135 sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gattc_evt.conn_handle,
rgrover1 196:70f1b8354d57 136 p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[discoveryStatus.currSrvInd -1].handle_range.end_handle,
rgrover1 196:70f1b8354d57 137 NULL));
rgrover1 196:70f1b8354d57 138 }
rgrover1 194:c99fc3160091 139 }