No changes

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Jun 19 15:55:24 2015 +0100
Revision:
261:09e21ff74153
Parent:
260:ea2798f615e5
Child:
262:d6682155f833
Synchronized with git rev 0aae8c60
Author: Rohit Grover
move DiscoveredService and DiscoveredCharacteristic within ServiceDiscovery

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 239:693a1f145b5a 21 #include "UUID.h"
rgrover1 239:693a1f145b5a 22 #include "Gap.h"
rgrover1 247:df37e7bb3f71 23
rgrover1 247:df37e7bb3f71 24 void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
rgrover1 239:693a1f145b5a 25
rgrover1 261:09e21ff74153 26 class ServiceDiscovery {
rgrover1 261:09e21ff74153 27 public:
rgrover1 261:09e21ff74153 28 /**@brief Structure for holding information about the service and the characteristics found during
rgrover1 261:09e21ff74153 29 * the discovery process.
rgrover1 261:09e21ff74153 30 */
rgrover1 261:09e21ff74153 31 struct DiscoveredService {
rgrover1 261:09e21ff74153 32 void setup(ShortUUIDBytes_t uuidIn, Gap::Handle_t start, Gap::Handle_t end) {
rgrover1 261:09e21ff74153 33 uuid = uuidIn;
rgrover1 261:09e21ff74153 34 startHandle = start;
rgrover1 261:09e21ff74153 35 endHandle = end;
rgrover1 239:693a1f145b5a 36 }
rgrover1 239:693a1f145b5a 37
rgrover1 261:09e21ff74153 38 ShortUUIDBytes_t uuid; /**< UUID of the service. */
rgrover1 261:09e21ff74153 39 Gap::Handle_t startHandle; /**< Service Handle Range. */
rgrover1 261:09e21ff74153 40 Gap::Handle_t endHandle; /**< Service Handle Range. */
rgrover1 261:09e21ff74153 41 };
rgrover1 261:09e21ff74153 42
rgrover1 261:09e21ff74153 43 /**@brief Structure for holding information about the service and the characteristics found during
rgrover1 261:09e21ff74153 44 * the discovery process.
rgrover1 261:09e21ff74153 45 */
rgrover1 261:09e21ff74153 46 struct DiscoveredCharacteristic {
rgrover1 261:09e21ff74153 47 struct Properties_t {
rgrover1 261:09e21ff74153 48 static const uint8_t BROADCAST_PROPERTY_MASK = 0x01;
rgrover1 261:09e21ff74153 49 static const uint8_t READ_PROPERTY_MASK = 0x02;
rgrover1 261:09e21ff74153 50 static const uint8_t WRITE_WO_RESPONSE_PROPERTY_MASK = 0x04;
rgrover1 261:09e21ff74153 51 static const uint8_t WRITE_PROPERTY_MASK = 0x08;
rgrover1 261:09e21ff74153 52 static const uint8_t NOTIFY_PROPERTY_MASK = 0x10;
rgrover1 261:09e21ff74153 53 static const uint8_t INDICATE_PROPERTY_MASK = 0x20;
rgrover1 261:09e21ff74153 54 static const uint8_t AUTH_SIGNED_PROPERTY_MASK = 0x40;
rgrover1 261:09e21ff74153 55
rgrover1 261:09e21ff74153 56 Properties_t() : broadcast(0), read(0), write_wo_resp(0), write(0), notify(0), indicate(0), auth_signed_wr(0) {
rgrover1 261:09e21ff74153 57 /* empty */
rgrover1 261:09e21ff74153 58 }
rgrover1 261:09e21ff74153 59
rgrover1 261:09e21ff74153 60 Properties_t(uint8_t props) :
rgrover1 261:09e21ff74153 61 broadcast(props & BROADCAST_PROPERTY_MASK),
rgrover1 261:09e21ff74153 62 read(props & READ_PROPERTY_MASK),
rgrover1 261:09e21ff74153 63 write_wo_resp(props & WRITE_WO_RESPONSE_PROPERTY_MASK),
rgrover1 261:09e21ff74153 64 write(props & WRITE_PROPERTY_MASK),
rgrover1 261:09e21ff74153 65 notify(props & NOTIFY_PROPERTY_MASK),
rgrover1 261:09e21ff74153 66 indicate(props & INDICATE_PROPERTY_MASK),
rgrover1 261:09e21ff74153 67 auth_signed_wr(props & AUTH_SIGNED_PROPERTY_MASK) {
rgrover1 261:09e21ff74153 68 /* empty*/
rgrover1 261:09e21ff74153 69 }
rgrover1 261:09e21ff74153 70
rgrover1 261:09e21ff74153 71 uint8_t broadcast :1; /**< Broadcasting of the value permitted. */
rgrover1 261:09e21ff74153 72 uint8_t read :1; /**< Reading the value permitted. */
rgrover1 261:09e21ff74153 73 uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */
rgrover1 261:09e21ff74153 74 uint8_t write :1; /**< Writing the value with Write Request permitted. */
rgrover1 261:09e21ff74153 75 uint8_t notify :1; /**< Notications of the value permitted. */
rgrover1 261:09e21ff74153 76 uint8_t indicate :1; /**< Indications of the value permitted. */
rgrover1 261:09e21ff74153 77 uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */
rgrover1 261:09e21ff74153 78 };
rgrover1 261:09e21ff74153 79
rgrover1 261:09e21ff74153 80 void setup(ShortUUIDBytes_t uuidIn, Properties_t propsIn, Gap::Handle_t declHandleIn, Gap::Handle_t valueHandleIn) {
rgrover1 261:09e21ff74153 81 uuid = uuidIn;
rgrover1 261:09e21ff74153 82 props = propsIn;
rgrover1 261:09e21ff74153 83 declHandle = declHandleIn;
rgrover1 261:09e21ff74153 84 valueHandle = valueHandleIn;
rgrover1 239:693a1f145b5a 85 }
rgrover1 239:693a1f145b5a 86
rgrover1 261:09e21ff74153 87 ShortUUIDBytes_t uuid;
rgrover1 261:09e21ff74153 88 Properties_t props;
rgrover1 261:09e21ff74153 89 Gap::Handle_t declHandle;
rgrover1 261:09e21ff74153 90 Gap::Handle_t valueHandle;
rgrover1 239:693a1f145b5a 91 };
rgrover1 239:693a1f145b5a 92
rgrover1 239:693a1f145b5a 93 public:
rgrover1 253:f30c1233e9db 94 typedef void (*ServiceCallback_t)(const DiscoveredService &);
rgrover1 253:f30c1233e9db 95 typedef void (*CharacteristicCallback_t)(const DiscoveredCharacteristic &);
rgrover1 239:693a1f145b5a 96
rgrover1 239:693a1f145b5a 97 public:
rgrover1 239:693a1f145b5a 98 static ble_error_t launch(Gap::Handle_t connectionHandle,
rgrover1 239:693a1f145b5a 99 ServiceCallback_t sc,
rgrover1 239:693a1f145b5a 100 CharacteristicCallback_t cc = NULL);
rgrover1 239:693a1f145b5a 101 static ble_error_t launch(Gap::Handle_t connectionHandle,
rgrover1 256:2f2e9f1d6275 102 UUID matchingServiceUUIDIn,
rgrover1 239:693a1f145b5a 103 ServiceCallback_t sc,
rgrover1 256:2f2e9f1d6275 104 UUID matchingCharacteristicUUIDIn = ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
rgrover1 239:693a1f145b5a 105 CharacteristicCallback_t cc = NULL);
rgrover1 239:693a1f145b5a 106
rgrover1 248:71ef03789dd3 107 static void terminate(void);
rgrover1 248:71ef03789dd3 108
rgrover1 248:71ef03789dd3 109 protected:
rgrover1 248:71ef03789dd3 110 Gap::Handle_t connHandle; /**< Connection handle as provided by the SoftDevice. */
rgrover1 256:2f2e9f1d6275 111 UUID matchingServiceUUID;
rgrover1 248:71ef03789dd3 112 ServiceCallback_t serviceCallback;
rgrover1 256:2f2e9f1d6275 113 UUID matchingCharacteristicUUID;
rgrover1 248:71ef03789dd3 114 CharacteristicCallback_t characteristicCallback;
rgrover1 248:71ef03789dd3 115 };
rgrover1 248:71ef03789dd3 116
rgrover1 250:db3c51656388 117 class NordicServiceDiscovery : public ServiceDiscovery
rgrover1 250:db3c51656388 118 {
rgrover1 248:71ef03789dd3 119 public:
rgrover1 260:ea2798f615e5 120 static const uint16_t SRV_DISC_START_HANDLE = 0x0001; /**< The start handle value used during service discovery. */
rgrover1 260:ea2798f615e5 121
rgrover1 260:ea2798f615e5 122 private:
rgrover1 248:71ef03789dd3 123 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 124 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 125
rgrover1 260:ea2798f615e5 126 public:
rgrover1 260:ea2798f615e5 127 ble_error_t launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle);
rgrover1 239:693a1f145b5a 128
rgrover1 239:693a1f145b5a 129 public:
rgrover1 248:71ef03789dd3 130 void setupDiscoveredServices(const ble_gattc_evt_prim_srvc_disc_rsp_t *response);
rgrover1 248:71ef03789dd3 131 void setupDiscoveredCharacteristics(const ble_gattc_evt_char_disc_rsp_t *response);
rgrover1 248:71ef03789dd3 132
rgrover1 248:71ef03789dd3 133 void terminateServiceDiscovery(void) {
rgrover1 242:73fc02cc20b1 134 sDiscoveryActive = false;
rgrover1 248:71ef03789dd3 135 cDiscoveryActive = false;
rgrover1 239:693a1f145b5a 136 }
rgrover1 239:693a1f145b5a 137
rgrover1 245:3abc61d38db3 138 void terminateCharacteristicDiscovery(void) {
rgrover1 245:3abc61d38db3 139 cDiscoveryActive = false;
rgrover1 245:3abc61d38db3 140 sDiscoveryActive = true;
rgrover1 245:3abc61d38db3 141 serviceIndex++; /* Progress service index to keep discovery alive. */
rgrover1 245:3abc61d38db3 142 }
rgrover1 245:3abc61d38db3 143
rgrover1 260:ea2798f615e5 144 private:
rgrover1 239:693a1f145b5a 145 void resetDiscoveredServices(void) {
rgrover1 242:73fc02cc20b1 146 numServices = 0;
rgrover1 242:73fc02cc20b1 147 serviceIndex = 0;
rgrover1 239:693a1f145b5a 148 memset(services, 0, sizeof(DiscoveredService) * BLE_DB_DISCOVERY_MAX_SRV);
rgrover1 239:693a1f145b5a 149 }
rgrover1 239:693a1f145b5a 150
rgrover1 245:3abc61d38db3 151 void resetDiscoveredCharacteristics(void) {
rgrover1 245:3abc61d38db3 152 numCharacteristics = 0;
rgrover1 245:3abc61d38db3 153 characteristicIndex = 0;
rgrover1 245:3abc61d38db3 154 memset(characteristics, 0, sizeof(DiscoveredCharacteristic) * BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV);
rgrover1 245:3abc61d38db3 155 }
rgrover1 245:3abc61d38db3 156
rgrover1 245:3abc61d38db3 157 public:
rgrover1 243:a966506d1e5b 158 void serviceDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 243:a966506d1e5b 159 connHandle = connectionHandle;
rgrover1 243:a966506d1e5b 160 resetDiscoveredServices();
rgrover1 243:a966506d1e5b 161 sDiscoveryActive = true;
rgrover1 243:a966506d1e5b 162 cDiscoveryActive = false;
rgrover1 243:a966506d1e5b 163 }
rgrover1 243:a966506d1e5b 164
rgrover1 260:ea2798f615e5 165 private:
rgrover1 245:3abc61d38db3 166 void characteristicDiscoveryStarted(Gap::Handle_t connectionHandle) {
rgrover1 245:3abc61d38db3 167 connHandle = connectionHandle;
rgrover1 245:3abc61d38db3 168 resetDiscoveredCharacteristics();
rgrover1 245:3abc61d38db3 169 cDiscoveryActive = true;
rgrover1 245:3abc61d38db3 170 sDiscoveryActive = false;
rgrover1 245:3abc61d38db3 171 }
rgrover1 245:3abc61d38db3 172
rgrover1 251:d4e0cf5e8751 173 private:
rgrover1 251:d4e0cf5e8751 174 friend void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
rgrover1 251:d4e0cf5e8751 175 void progressCharacteristicDiscovery(void);
rgrover1 251:d4e0cf5e8751 176 void progressServiceDiscovery(void);
rgrover1 239:693a1f145b5a 177
rgrover1 248:71ef03789dd3 178 private:
rgrover1 248:71ef03789dd3 179 uint8_t serviceIndex; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/
rgrover1 248:71ef03789dd3 180 uint8_t numServices; /**< Number of services at the peers GATT database.*/
rgrover1 248:71ef03789dd3 181 uint8_t characteristicIndex; /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/
rgrover1 248:71ef03789dd3 182 uint8_t numCharacteristics; /**< Number of characteristics within the service.*/
rgrover1 248:71ef03789dd3 183
rgrover1 248:71ef03789dd3 184 bool sDiscoveryActive;
rgrover1 248:71ef03789dd3 185 bool cDiscoveryActive;
rgrover1 248:71ef03789dd3 186
rgrover1 248:71ef03789dd3 187 DiscoveredService services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered.
rgrover1 248:71ef03789dd3 188 * This is intended for internal use during service discovery. */
rgrover1 248:71ef03789dd3 189 DiscoveredCharacteristic characteristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
rgrover1 240:75b69581d1dd 190 };
rgrover1 240:75b69581d1dd 191
rgrover1 239:693a1f145b5a 192 #endif /*_BTLE_DISCOVERY_H_*/