No changes

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:26 2015 +0100
Revision:
284:29fb6af6671d
Parent:
280:cbaa4cb83548
Child:
286:042b01e59cf8
Synchronized with git rev acb585e0
Author: Rohit Grover
terminate service discovery upon reaching the end handle.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 239:693a1f145b5a 1 /* mbed Microcontroller Library
rgrover1 239:693a1f145b5a 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 239:693a1f145b5a 3 *
rgrover1 239:693a1f145b5a 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 239:693a1f145b5a 5 * you may not use this file except in compliance with the License.
rgrover1 239:693a1f145b5a 6 * You may obtain a copy of the License at
rgrover1 239:693a1f145b5a 7 *
rgrover1 239:693a1f145b5a 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 239:693a1f145b5a 9 *
rgrover1 239:693a1f145b5a 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 239:693a1f145b5a 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 239:693a1f145b5a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 239:693a1f145b5a 13 * See the License for the specific language governing permissions and
rgrover1 239:693a1f145b5a 14 * limitations under the License.
rgrover1 239:693a1f145b5a 15 */
rgrover1 239:693a1f145b5a 16
rgrover1 239:693a1f145b5a 17 #ifndef _BTLE_DISCOVERY_H_
rgrover1 239:693a1f145b5a 18 #define _BTLE_DISCOVERY_H_
rgrover1 239:693a1f145b5a 19
rgrover1 247:df37e7bb3f71 20 #include "ble.h"
rgrover1 263:d5da37e9a93b 21 #include "ServiceDiscovery.h"
rgrover1 247:df37e7bb3f71 22
rgrover1 247:df37e7bb3f71 23 void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
rgrover1 239:693a1f145b5a 24
rgrover1 250:db3c51656388 25 class NordicServiceDiscovery : public ServiceDiscovery
rgrover1 250:db3c51656388 26 {
rgrover1 248:71ef03789dd3 27 public:
rgrover1 260:ea2798f615e5 28 static const uint16_t SRV_DISC_START_HANDLE = 0x0001; /**< The start handle value used during service discovery. */
rgrover1 284:29fb6af6671d 29 static const uint16_t SRV_DISC_END_HANDLE = 0xFFFF; /**< The end handle value used during service discovery. */
rgrover1 260:ea2798f615e5 30
rgrover1 260:ea2798f615e5 31 private:
rgrover1 248:71ef03789dd3 32 static const unsigned BLE_DB_DISCOVERY_MAX_SRV = 4; /**< Maximum number of services we can retain information for after a single discovery. */
rgrover1 248:71ef03789dd3 33 static const unsigned BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV = 4; /**< Maximum number of characteristics per service we can retain information for. */
rgrover1 260:ea2798f615e5 34
rgrover1 260:ea2798f615e5 35 public:
rgrover1 260:ea2798f615e5 36 ble_error_t launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle);
rgrover1 239:693a1f145b5a 37
rgrover1 239:693a1f145b5a 38 public:
rgrover1 248:71ef03789dd3 39 void setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response);
rgrover1 248:71ef03789dd3 40 void setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response);
rgrover1 248:71ef03789dd3 41
rgrover1 248:71ef03789dd3 42 void terminateServiceDiscovery(void) {
rgrover1 280:cbaa4cb83548 43 bool wasActive = isActive();
rgrover1 280:cbaa4cb83548 44
rgrover1 242:73fc02cc20b1 45 sDiscoveryActive = false;
rgrover1 248:71ef03789dd3 46 cDiscoveryActive = false;
rgrover1 280:cbaa4cb83548 47
rgrover1 280:cbaa4cb83548 48 if (wasActive && onTerminationCallback) {
rgrover1 280:cbaa4cb83548 49 onTerminationCallback(connHandle);
rgrover1 280:cbaa4cb83548 50 }
rgrover1 239:693a1f145b5a 51 }
rgrover1 239:693a1f145b5a 52
rgrover1 245:3abc61d38db3 53 void terminateCharacteristicDiscovery(void) {
rgrover1 245:3abc61d38db3 54 cDiscoveryActive = false;
rgrover1 245:3abc61d38db3 55 sDiscoveryActive = true;
rgrover1 245:3abc61d38db3 56 serviceIndex++; /* Progress service index to keep discovery alive. */
rgrover1 245:3abc61d38db3 57 }
rgrover1 245:3abc61d38db3 58
rgrover1 279:6e5e79f1fb61 59 bool isActive(void) const {
rgrover1 279:6e5e79f1fb61 60 return (sDiscoveryActive || cDiscoveryActive);
rgrover1 279:6e5e79f1fb61 61 }
rgrover1 279:6e5e79f1fb61 62
rgrover1 280:cbaa4cb83548 63 void setOnTermination(TerminationCallback_t callback) {
rgrover1 280:cbaa4cb83548 64 onTerminationCallback = callback;
rgrover1 280:cbaa4cb83548 65 }
rgrover1 280:cbaa4cb83548 66
rgrover1 260:ea2798f615e5 67 private:
rgrover1 239:693a1f145b5a 68 void resetDiscoveredServices(void) {
rgrover1 242:73fc02cc20b1 69 numServices = 0;
rgrover1 242:73fc02cc20b1 70 serviceIndex = 0;
rgrover1 239:693a1f145b5a 71 memset(services, 0, sizeof(DiscoveredService) * BLE_DB_DISCOVERY_MAX_SRV);
rgrover1 239:693a1f145b5a 72 }
rgrover1 239:693a1f145b5a 73
rgrover1 245:3abc61d38db3 74 void resetDiscoveredCharacteristics(void) {
rgrover1 245:3abc61d38db3 75 numCharacteristics = 0;
rgrover1 245:3abc61d38db3 76 characteristicIndex = 0;
rgrover1 245:3abc61d38db3 77 memset(characteristics, 0, sizeof(DiscoveredCharacteristic) * BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV);
rgrover1 245:3abc61d38db3 78 }
rgrover1 245:3abc61d38db3 79
rgrover1 245:3abc61d38db3 80 public:
rgrover1 243:a966506d1e5b 81 void serviceDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 243:a966506d1e5b 82 connHandle = connectionHandle;
rgrover1 243:a966506d1e5b 83 resetDiscoveredServices();
rgrover1 243:a966506d1e5b 84 sDiscoveryActive = true;
rgrover1 243:a966506d1e5b 85 cDiscoveryActive = false;
rgrover1 243:a966506d1e5b 86 }
rgrover1 243:a966506d1e5b 87
rgrover1 260:ea2798f615e5 88 private:
rgrover1 245:3abc61d38db3 89 void characteristicDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 245:3abc61d38db3 90 connHandle = connectionHandle;
rgrover1 245:3abc61d38db3 91 resetDiscoveredCharacteristics();
rgrover1 245:3abc61d38db3 92 cDiscoveryActive = true;
rgrover1 245:3abc61d38db3 93 sDiscoveryActive = false;
rgrover1 245:3abc61d38db3 94 }
rgrover1 245:3abc61d38db3 95
rgrover1 251:d4e0cf5e8751 96 private:
rgrover1 251:d4e0cf5e8751 97 friend void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
rgrover1 251:d4e0cf5e8751 98 void progressCharacteristicDiscovery(void);
rgrover1 251:d4e0cf5e8751 99 void progressServiceDiscovery(void);
rgrover1 239:693a1f145b5a 100
rgrover1 248:71ef03789dd3 101 private:
rgrover1 248:71ef03789dd3 102 uint8_t serviceIndex; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
rgrover1 248:71ef03789dd3 103 uint8_t numServices; /**< Number of services at the peers GATT database.*/
rgrover1 248:71ef03789dd3 104 uint8_t characteristicIndex; /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/
rgrover1 248:71ef03789dd3 105 uint8_t numCharacteristics; /**< Number of characteristics within the service.*/
rgrover1 248:71ef03789dd3 106
rgrover1 248:71ef03789dd3 107 bool sDiscoveryActive;
rgrover1 248:71ef03789dd3 108 bool cDiscoveryActive;
rgrover1 248:71ef03789dd3 109
rgrover1 248:71ef03789dd3 110 DiscoveredService services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered.
rgrover1 248:71ef03789dd3 111 * This is intended for internal use during service discovery. */
rgrover1 248:71ef03789dd3 112 DiscoveredCharacteristic characteristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
rgrover1 280:cbaa4cb83548 113
rgrover1 280:cbaa4cb83548 114 TerminationCallback_t onTerminationCallback;
rgrover1 240:75b69581d1dd 115 };
rgrover1 240:75b69581d1dd 116
rgrover1 239:693a1f145b5a 117 #endif /*_BTLE_DISCOVERY_H_*/