test

Dependencies:   nrf51-sdk

Dependents:   microbit-dal

Fork of nRF51822 by Lancaster University

Committer:
rgrover1
Date:
Fri Jun 19 15:55:21 2015 +0100
Revision:
243:a966506d1e5b
Parent:
242:73fc02cc20b1
Child:
247:df37e7bb3f71
Synchronized with git rev 0882a19d
Author: Rohit Grover
move more stuff into NordicServiceDiscovery

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 243:a966506d1e5b 1 /* mbed Microcontroller Library
rgrover1 243:a966506d1e5b 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 243:a966506d1e5b 3 *
rgrover1 243:a966506d1e5b 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 243:a966506d1e5b 5 * you may not use this file except in compliance with the License.
rgrover1 243:a966506d1e5b 6 * You may obtain a copy of the License at
rgrover1 243:a966506d1e5b 7 *
rgrover1 243:a966506d1e5b 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 243:a966506d1e5b 9 *
rgrover1 243:a966506d1e5b 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 243:a966506d1e5b 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 243:a966506d1e5b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 243:a966506d1e5b 13 * See the License for the specific language governing permissions and
rgrover1 243:a966506d1e5b 14 * limitations under the License.
rgrover1 243:a966506d1e5b 15 */
rgrover1 243:a966506d1e5b 16
rgrover1 239:693a1f145b5a 17 #include "blecommon.h"
rgrover1 239:693a1f145b5a 18 #include "UUID.h"
rgrover1 239:693a1f145b5a 19 #include "Gap.h"
rgrover1 239:693a1f145b5a 20 #include "nrf_error.h"
rgrover1 239:693a1f145b5a 21 #include "btle_discovery.h"
rgrover1 239:693a1f145b5a 22 #include "ble_err.h"
rgrover1 243:a966506d1e5b 23 #include "btle_gattc.h"
rgrover1 243:a966506d1e5b 24
rgrover1 243:a966506d1e5b 25 static NordicServiceDiscovery discoverySingleton;
rgrover1 243:a966506d1e5b 26 ServiceDiscovery *ServiceDiscovery::getSingleton(void) {
rgrover1 243:a966506d1e5b 27 return &discoverySingleton;
rgrover1 243:a966506d1e5b 28 }
rgrover1 239:693a1f145b5a 29
rgrover1 239:693a1f145b5a 30 ble_error_t
rgrover1 239:693a1f145b5a 31 ServiceDiscovery::launch(Gap::Handle_t connectionHandle, ServiceCallback_t sc, CharacteristicCallback_t cc)
rgrover1 239:693a1f145b5a 32 {
rgrover1 239:693a1f145b5a 33 ServiceDiscovery *singleton = getSingleton();
rgrover1 243:a966506d1e5b 34 discoverySingleton.serviceDiscoveryStarted(connectionHandle);
rgrover1 239:693a1f145b5a 35
rgrover1 239:693a1f145b5a 36 uint32_t rc;
rgrover1 239:693a1f145b5a 37 if ((rc = sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL)) != NRF_SUCCESS) {
rgrover1 239:693a1f145b5a 38 singleton->terminate();
rgrover1 239:693a1f145b5a 39 switch (rc) {
rgrover1 239:693a1f145b5a 40 case NRF_ERROR_INVALID_PARAM:
rgrover1 239:693a1f145b5a 41 case BLE_ERROR_INVALID_CONN_HANDLE:
rgrover1 239:693a1f145b5a 42 return BLE_ERROR_INVALID_PARAM;
rgrover1 239:693a1f145b5a 43 case NRF_ERROR_BUSY:
rgrover1 239:693a1f145b5a 44 return BLE_STACK_BUSY;
rgrover1 239:693a1f145b5a 45 default:
rgrover1 239:693a1f145b5a 46 case NRF_ERROR_INVALID_STATE:
rgrover1 239:693a1f145b5a 47 return BLE_ERROR_INVALID_STATE;
rgrover1 239:693a1f145b5a 48 }
rgrover1 239:693a1f145b5a 49 }
rgrover1 239:693a1f145b5a 50
rgrover1 239:693a1f145b5a 51 return BLE_ERROR_NONE;
rgrover1 239:693a1f145b5a 52 }
rgrover1 239:693a1f145b5a 53
rgrover1 243:a966506d1e5b 54 ble_error_t
rgrover1 243:a966506d1e5b 55 NordicServiceDiscovery::launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle) {
rgrover1 243:a966506d1e5b 56 discoverySingleton.characteristicDiscoveryStarted(connectionHandle);
rgrover1 239:693a1f145b5a 57
rgrover1 239:693a1f145b5a 58 ble_gattc_handle_range_t handleRange = {
rgrover1 239:693a1f145b5a 59 .start_handle = startHandle,
rgrover1 239:693a1f145b5a 60 .end_handle = endHandle
rgrover1 239:693a1f145b5a 61 };
rgrover1 239:693a1f145b5a 62 uint32_t rc;
rgrover1 239:693a1f145b5a 63 if ((rc = sd_ble_gattc_characteristics_discover(connectionHandle, &handleRange)) != NRF_SUCCESS) {
rgrover1 243:a966506d1e5b 64 discoverySingleton.terminateCharacteristicDiscovery();
rgrover1 239:693a1f145b5a 65 switch (rc) {
rgrover1 239:693a1f145b5a 66 case BLE_ERROR_INVALID_CONN_HANDLE:
rgrover1 239:693a1f145b5a 67 case NRF_ERROR_INVALID_ADDR:
rgrover1 239:693a1f145b5a 68 return BLE_ERROR_INVALID_PARAM;
rgrover1 239:693a1f145b5a 69 case NRF_ERROR_BUSY:
rgrover1 239:693a1f145b5a 70 return BLE_STACK_BUSY;
rgrover1 239:693a1f145b5a 71 default:
rgrover1 239:693a1f145b5a 72 case NRF_ERROR_INVALID_STATE:
rgrover1 239:693a1f145b5a 73 return BLE_ERROR_INVALID_STATE;
rgrover1 239:693a1f145b5a 74 }
rgrover1 239:693a1f145b5a 75 }
rgrover1 239:693a1f145b5a 76
rgrover1 239:693a1f145b5a 77 return BLE_ERROR_NONE;
rgrover1 239:693a1f145b5a 78 }
rgrover1 239:693a1f145b5a 79
rgrover1 239:693a1f145b5a 80 void
rgrover1 240:75b69581d1dd 81 NordicServiceDiscovery::setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response)
rgrover1 239:693a1f145b5a 82 {
rgrover1 242:73fc02cc20b1 83 serviceIndex = 0;
rgrover1 242:73fc02cc20b1 84 numServices = response->count;
rgrover1 239:693a1f145b5a 85
rgrover1 239:693a1f145b5a 86 /* Account for the limitation on the number of discovered services we can handle at a time. */
rgrover1 242:73fc02cc20b1 87 if (numServices > BLE_DB_DISCOVERY_MAX_SRV) {
rgrover1 242:73fc02cc20b1 88 numServices = BLE_DB_DISCOVERY_MAX_SRV;
rgrover1 239:693a1f145b5a 89 }
rgrover1 239:693a1f145b5a 90
rgrover1 242:73fc02cc20b1 91 for (unsigned serviceIndex = 0; serviceIndex < numServices; serviceIndex++) {
rgrover1 239:693a1f145b5a 92 services[serviceIndex].setup(response->services[serviceIndex].uuid.uuid,
rgrover1 239:693a1f145b5a 93 response->services[serviceIndex].handle_range.start_handle,
rgrover1 239:693a1f145b5a 94 response->services[serviceIndex].handle_range.end_handle);
rgrover1 239:693a1f145b5a 95 }
rgrover1 239:693a1f145b5a 96 }
rgrover1 239:693a1f145b5a 97
rgrover1 239:693a1f145b5a 98 void
rgrover1 240:75b69581d1dd 99 NordicServiceDiscovery::setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response)
rgrover1 239:693a1f145b5a 100 {
rgrover1 242:73fc02cc20b1 101 characteristicIndex = 0;
rgrover1 242:73fc02cc20b1 102 numCharacteristics = response->count;
rgrover1 239:693a1f145b5a 103
rgrover1 239:693a1f145b5a 104 /* Account for the limitation on the number of discovered characteristics we can handle at a time. */
rgrover1 242:73fc02cc20b1 105 if (numCharacteristics > BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV) {
rgrover1 242:73fc02cc20b1 106 numCharacteristics = BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV;
rgrover1 239:693a1f145b5a 107 }
rgrover1 239:693a1f145b5a 108
rgrover1 242:73fc02cc20b1 109 for (unsigned charIndex = 0; charIndex < numCharacteristics; charIndex++) {
rgrover1 239:693a1f145b5a 110 characteristics[charIndex].setup(response->chars[charIndex].uuid.uuid,
rgrover1 239:693a1f145b5a 111 *(const uint8_t *)(&response->chars[charIndex].char_props),
rgrover1 239:693a1f145b5a 112 response->chars[charIndex].handle_decl,
rgrover1 239:693a1f145b5a 113 response->chars[charIndex].handle_value);
rgrover1 239:693a1f145b5a 114 }
rgrover1 243:a966506d1e5b 115 }
rgrover1 243:a966506d1e5b 116
rgrover1 243:a966506d1e5b 117 void bleGattcEventHandler(const ble_evt_t *p_ble_evt)
rgrover1 243:a966506d1e5b 118 {
rgrover1 243:a966506d1e5b 119 switch (p_ble_evt->header.evt_id) {
rgrover1 243:a966506d1e5b 120 case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
rgrover1 243:a966506d1e5b 121 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 243:a966506d1e5b 122 case BLE_GATT_STATUS_SUCCESS:
rgrover1 243:a966506d1e5b 123 discoverySingleton.setupDiscoveredServices(&p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp);
rgrover1 243:a966506d1e5b 124 break;
rgrover1 243:a966506d1e5b 125
rgrover1 243:a966506d1e5b 126 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND:
rgrover1 243:a966506d1e5b 127 default:
rgrover1 243:a966506d1e5b 128 discoverySingleton.terminate();
rgrover1 243:a966506d1e5b 129 break;
rgrover1 243:a966506d1e5b 130 }
rgrover1 243:a966506d1e5b 131 break;
rgrover1 243:a966506d1e5b 132
rgrover1 243:a966506d1e5b 133 case BLE_GATTC_EVT_CHAR_DISC_RSP:
rgrover1 243:a966506d1e5b 134 switch (p_ble_evt->evt.gattc_evt.gatt_status) {
rgrover1 243:a966506d1e5b 135 case BLE_GATT_STATUS_SUCCESS:
rgrover1 243:a966506d1e5b 136 discoverySingleton.setupDiscoveredCharacteristics(&p_ble_evt->evt.gattc_evt.params.char_disc_rsp);
rgrover1 243:a966506d1e5b 137 break;
rgrover1 243:a966506d1e5b 138
rgrover1 243:a966506d1e5b 139 case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND:
rgrover1 243:a966506d1e5b 140 default:
rgrover1 243:a966506d1e5b 141 discoverySingleton.terminateCharacteristicDiscovery();
rgrover1 243:a966506d1e5b 142 break;
rgrover1 243:a966506d1e5b 143 }
rgrover1 243:a966506d1e5b 144 break;
rgrover1 243:a966506d1e5b 145 }
rgrover1 243:a966506d1e5b 146
rgrover1 243:a966506d1e5b 147 discoverySingleton.progressCharacteristicDiscovery();
rgrover1 243:a966506d1e5b 148 discoverySingleton.progressServiceDiscovery();
rgrover1 239:693a1f145b5a 149 }