Rtos API example

Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /* mbed Microcontroller Library
marcozecchini 0:9fca2b23d0ba 2 * Copyright (c) 2006-2013 ARM Limited
marcozecchini 0:9fca2b23d0ba 3 *
marcozecchini 0:9fca2b23d0ba 4 * Licensed under the Apache License, Version 2.0 (the "License");
marcozecchini 0:9fca2b23d0ba 5 * you may not use this file except in compliance with the License.
marcozecchini 0:9fca2b23d0ba 6 * You may obtain a copy of the License at
marcozecchini 0:9fca2b23d0ba 7 *
marcozecchini 0:9fca2b23d0ba 8 * http://www.apache.org/licenses/LICENSE-2.0
marcozecchini 0:9fca2b23d0ba 9 *
marcozecchini 0:9fca2b23d0ba 10 * Unless required by applicable law or agreed to in writing, software
marcozecchini 0:9fca2b23d0ba 11 * distributed under the License is distributed on an "AS IS" BASIS,
marcozecchini 0:9fca2b23d0ba 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
marcozecchini 0:9fca2b23d0ba 13 * See the License for the specific language governing permissions and
marcozecchini 0:9fca2b23d0ba 14 * limitations under the License.
marcozecchini 0:9fca2b23d0ba 15 */
marcozecchini 0:9fca2b23d0ba 16
marcozecchini 0:9fca2b23d0ba 17 #ifndef MBED_DISCOVERED_CHARACTERISTIC_H__
marcozecchini 0:9fca2b23d0ba 18 #define MBED_DISCOVERED_CHARACTERISTIC_H__
marcozecchini 0:9fca2b23d0ba 19
marcozecchini 0:9fca2b23d0ba 20 #include "UUID.h"
marcozecchini 0:9fca2b23d0ba 21 #include "Gap.h"
marcozecchini 0:9fca2b23d0ba 22 #include "GattAttribute.h"
marcozecchini 0:9fca2b23d0ba 23 #include "GattClient.h"
marcozecchini 0:9fca2b23d0ba 24 #include "CharacteristicDescriptorDiscovery.h"
marcozecchini 0:9fca2b23d0ba 25 #include "DiscoveredCharacteristicDescriptor.h"
marcozecchini 0:9fca2b23d0ba 26
marcozecchini 0:9fca2b23d0ba 27 /**
marcozecchini 0:9fca2b23d0ba 28 * @addtogroup ble
marcozecchini 0:9fca2b23d0ba 29 * @{
marcozecchini 0:9fca2b23d0ba 30 * @addtogroup gatt
marcozecchini 0:9fca2b23d0ba 31 * @{
marcozecchini 0:9fca2b23d0ba 32 * @addtogroup client
marcozecchini 0:9fca2b23d0ba 33 * @{
marcozecchini 0:9fca2b23d0ba 34 */
marcozecchini 0:9fca2b23d0ba 35
marcozecchini 0:9fca2b23d0ba 36 /**
marcozecchini 0:9fca2b23d0ba 37 * Representation of a characteristic discovered.
marcozecchini 0:9fca2b23d0ba 38 *
marcozecchini 0:9fca2b23d0ba 39 * The GattClient discovery procedure initiated with
marcozecchini 0:9fca2b23d0ba 40 * GattClient::launchServiceDiscovery() generates instances of this class.
marcozecchini 0:9fca2b23d0ba 41 *
marcozecchini 0:9fca2b23d0ba 42 * It exposes the main attributes of the discovered characteristic:
marcozecchini 0:9fca2b23d0ba 43 * - The UUID of the characteristic, it can be retrieved by a call to the
marcozecchini 0:9fca2b23d0ba 44 * function getUUID(). This UUID is the type of the characteristic.
marcozecchini 0:9fca2b23d0ba 45 * - Attribute Handles of the characteristic are present as the triplet
marcozecchini 0:9fca2b23d0ba 46 * declaration handle, value handle and last handle. The value handle is
marcozecchini 0:9fca2b23d0ba 47 * used to read or write the content of the characteristic.
marcozecchini 0:9fca2b23d0ba 48 * - The properties contain the set of operations the characteristic can
marcozecchini 0:9fca2b23d0ba 49 * handle, for instance being read or written.
marcozecchini 0:9fca2b23d0ba 50 *
marcozecchini 0:9fca2b23d0ba 51 * It important to note that the value of the characteristic - if it is
marcozecchini 0:9fca2b23d0ba 52 * accessible - is not fetched at discovery time.
marcozecchini 0:9fca2b23d0ba 53 *
marcozecchini 0:9fca2b23d0ba 54 * The main operations the class offers are reading, writing and discovering
marcozecchini 0:9fca2b23d0ba 55 * the descriptors of the characteristic discovered.
marcozecchini 0:9fca2b23d0ba 56 *
marcozecchini 0:9fca2b23d0ba 57 * Reading a discovered characteristic can be accomplished in two different
marcozecchini 0:9fca2b23d0ba 58 * fashions:
marcozecchini 0:9fca2b23d0ba 59 *
marcozecchini 0:9fca2b23d0ba 60 * If the user has a callback registered for the data read operation in the
marcozecchini 0:9fca2b23d0ba 61 * GattClient, then a call to the read(uint16_t) function will initiate a read of
marcozecchini 0:9fca2b23d0ba 62 * the characteristic. Results of the operation will be pass on the callback
marcozecchini 0:9fca2b23d0ba 63 * registered by GattClient::onDataRead(), which processes all the responses to
marcozecchini 0:9fca2b23d0ba 64 * read requests. The read request for a given characteristic can be identified
marcozecchini 0:9fca2b23d0ba 65 * by the connection handle and the attribute handle, which are present in
marcozecchini 0:9fca2b23d0ba 66 * GattReadCallbackParams.
marcozecchini 0:9fca2b23d0ba 67 *
marcozecchini 0:9fca2b23d0ba 68 * Another overload (read(uint16_t, const GattClient::ReadCallback_t&)) of the
marcozecchini 0:9fca2b23d0ba 69 * read function accepts a completion callback as a last parameter. That
marcozecchini 0:9fca2b23d0ba 70 * completion callback will be invoked automatically once the response to the
marcozecchini 0:9fca2b23d0ba 71 * read request for that given characteristic has been received. However,
marcozecchini 0:9fca2b23d0ba 72 * convenience came at the expense of dynamic memory usage for the time of the
marcozecchini 0:9fca2b23d0ba 73 * transaction.
marcozecchini 0:9fca2b23d0ba 74 *
marcozecchini 0:9fca2b23d0ba 75 * Similarly, two versions of the write() API are exposed. One where the user
marcozecchini 0:9fca2b23d0ba 76 * has to register a callback handling write response through the function
marcozecchini 0:9fca2b23d0ba 77 * GattClient::onDataWritten() and another one that accepts a completion
marcozecchini 0:9fca2b23d0ba 78 * callback in input.
marcozecchini 0:9fca2b23d0ba 79 *
marcozecchini 0:9fca2b23d0ba 80 * It is also possible to send a write command, which is not acknowledged by the
marcozecchini 0:9fca2b23d0ba 81 * peer server by using the function writeWoResponse().
marcozecchini 0:9fca2b23d0ba 82 *
marcozecchini 0:9fca2b23d0ba 83 * Finally, descriptors of the characteristic can be discovered by invoking the
marcozecchini 0:9fca2b23d0ba 84 * function discoverDescriptors, which is shorthand for calling
marcozecchini 0:9fca2b23d0ba 85 * GattClient::discoverCharacteristicDescriptors. That discovery is necessary to
marcozecchini 0:9fca2b23d0ba 86 * enable or disable characteristic notification or indication that is achieved
marcozecchini 0:9fca2b23d0ba 87 * by writing on the Client Characteristic Configuration Descriptor (CCCD).
marcozecchini 0:9fca2b23d0ba 88 */
marcozecchini 0:9fca2b23d0ba 89 class DiscoveredCharacteristic {
marcozecchini 0:9fca2b23d0ba 90 public:
marcozecchini 0:9fca2b23d0ba 91 /**
marcozecchini 0:9fca2b23d0ba 92 * Properties of a discovered characteristic.
marcozecchini 0:9fca2b23d0ba 93 */
marcozecchini 0:9fca2b23d0ba 94 struct Properties_t {
marcozecchini 0:9fca2b23d0ba 95 /**
marcozecchini 0:9fca2b23d0ba 96 * Permits broadcasts of the characteristic value using the character
marcozecchini 0:9fca2b23d0ba 97 * the Server Characteristic Configuration Descriptor.
marcozecchini 0:9fca2b23d0ba 98 *
marcozecchini 0:9fca2b23d0ba 99 * @note If set, descriptors of the characteristic contain a Server
marcozecchini 0:9fca2b23d0ba 100 * Characteristic Configuration Descriptor.
marcozecchini 0:9fca2b23d0ba 101 */
marcozecchini 0:9fca2b23d0ba 102 uint8_t _broadcast :1;
marcozecchini 0:9fca2b23d0ba 103
marcozecchini 0:9fca2b23d0ba 104 /**
marcozecchini 0:9fca2b23d0ba 105 * If set, the value of the characteristic can be read.
marcozecchini 0:9fca2b23d0ba 106 */
marcozecchini 0:9fca2b23d0ba 107 uint8_t _read :1;
marcozecchini 0:9fca2b23d0ba 108
marcozecchini 0:9fca2b23d0ba 109 /**
marcozecchini 0:9fca2b23d0ba 110 * If set, a write command can write the characteristic value
marcozecchini 0:9fca2b23d0ba 111 * (write without response).
marcozecchini 0:9fca2b23d0ba 112 */
marcozecchini 0:9fca2b23d0ba 113 uint8_t _writeWoResp :1;
marcozecchini 0:9fca2b23d0ba 114
marcozecchini 0:9fca2b23d0ba 115 /**
marcozecchini 0:9fca2b23d0ba 116 * If set, clients can issue requests to write the characteristic.
marcozecchini 0:9fca2b23d0ba 117 */
marcozecchini 0:9fca2b23d0ba 118 uint8_t _write :1;
marcozecchini 0:9fca2b23d0ba 119
marcozecchini 0:9fca2b23d0ba 120 /**
marcozecchini 0:9fca2b23d0ba 121 * If set, the server can emit notifications of the Characteristic Value
marcozecchini 0:9fca2b23d0ba 122 * (without client acknowledgment).
marcozecchini 0:9fca2b23d0ba 123 *
marcozecchini 0:9fca2b23d0ba 124 * @note If set, descriptors of the characteristic contain a Client
marcozecchini 0:9fca2b23d0ba 125 * Characteristic Configuration Descriptor.
marcozecchini 0:9fca2b23d0ba 126 */
marcozecchini 0:9fca2b23d0ba 127 uint8_t _notify :1;
marcozecchini 0:9fca2b23d0ba 128
marcozecchini 0:9fca2b23d0ba 129 /**
marcozecchini 0:9fca2b23d0ba 130 * If set, the server can emit indication of the Characteristic Value
marcozecchini 0:9fca2b23d0ba 131 * (with client acknowledgement).
marcozecchini 0:9fca2b23d0ba 132 *
marcozecchini 0:9fca2b23d0ba 133 * @note If set, descriptors of the characteristic contain a Client
marcozecchini 0:9fca2b23d0ba 134 * Characteristic Configuration Descriptor.
marcozecchini 0:9fca2b23d0ba 135 */
marcozecchini 0:9fca2b23d0ba 136 uint8_t _indicate :1;
marcozecchini 0:9fca2b23d0ba 137
marcozecchini 0:9fca2b23d0ba 138 /**
marcozecchini 0:9fca2b23d0ba 139 * If set, signed write of the Characteristic Value is supported.
marcozecchini 0:9fca2b23d0ba 140 */
marcozecchini 0:9fca2b23d0ba 141 uint8_t _authSignedWrite :1;
marcozecchini 0:9fca2b23d0ba 142
marcozecchini 0:9fca2b23d0ba 143 public:
marcozecchini 0:9fca2b23d0ba 144 /**
marcozecchini 0:9fca2b23d0ba 145 * Return the value of the broadcast propertie.
marcozecchini 0:9fca2b23d0ba 146 *
marcozecchini 0:9fca2b23d0ba 147 * @return true if the Server Characteristic Configuration Descriptor
marcozecchini 0:9fca2b23d0ba 148 * of the characteristic can be configured to broadcast the
marcozecchini 0:9fca2b23d0ba 149 * characteristic value during broadcast procedure.
marcozecchini 0:9fca2b23d0ba 150 *
marcozecchini 0:9fca2b23d0ba 151 * @see _broadcast
marcozecchini 0:9fca2b23d0ba 152 */
marcozecchini 0:9fca2b23d0ba 153 bool broadcast(void) const
marcozecchini 0:9fca2b23d0ba 154 {
marcozecchini 0:9fca2b23d0ba 155 return _broadcast;
marcozecchini 0:9fca2b23d0ba 156 }
marcozecchini 0:9fca2b23d0ba 157
marcozecchini 0:9fca2b23d0ba 158 /**
marcozecchini 0:9fca2b23d0ba 159 * Return the value of the read property
marcozecchini 0:9fca2b23d0ba 160 *
marcozecchini 0:9fca2b23d0ba 161 * @return true if the characteristic value can be read and false
marcozecchini 0:9fca2b23d0ba 162 * otherwise.
marcozecchini 0:9fca2b23d0ba 163 *
marcozecchini 0:9fca2b23d0ba 164 * @see _read
marcozecchini 0:9fca2b23d0ba 165 */
marcozecchini 0:9fca2b23d0ba 166 bool read(void) const
marcozecchini 0:9fca2b23d0ba 167 {
marcozecchini 0:9fca2b23d0ba 168 return _read;
marcozecchini 0:9fca2b23d0ba 169 }
marcozecchini 0:9fca2b23d0ba 170
marcozecchini 0:9fca2b23d0ba 171 /**
marcozecchini 0:9fca2b23d0ba 172 * Return the value of the write without response property.
marcozecchini 0:9fca2b23d0ba 173 *
marcozecchini 0:9fca2b23d0ba 174 * @return true if the characteristic accepts write without response
marcozecchini 0:9fca2b23d0ba 175 * commands and false otherwise.
marcozecchini 0:9fca2b23d0ba 176 *
marcozecchini 0:9fca2b23d0ba 177 * @see _writeWoResp
marcozecchini 0:9fca2b23d0ba 178 */
marcozecchini 0:9fca2b23d0ba 179 bool writeWoResp(void) const
marcozecchini 0:9fca2b23d0ba 180 {
marcozecchini 0:9fca2b23d0ba 181 return _writeWoResp;
marcozecchini 0:9fca2b23d0ba 182 }
marcozecchini 0:9fca2b23d0ba 183
marcozecchini 0:9fca2b23d0ba 184 /**
marcozecchini 0:9fca2b23d0ba 185 * Return the value of the write property.
marcozecchini 0:9fca2b23d0ba 186 *
marcozecchini 0:9fca2b23d0ba 187 * @return true if writing the characteristic accepts write requests and
marcozecchini 0:9fca2b23d0ba 188 * false otherwise.
marcozecchini 0:9fca2b23d0ba 189 *
marcozecchini 0:9fca2b23d0ba 190 * @see _write
marcozecchini 0:9fca2b23d0ba 191 */
marcozecchini 0:9fca2b23d0ba 192 bool write(void) const
marcozecchini 0:9fca2b23d0ba 193 {
marcozecchini 0:9fca2b23d0ba 194 return _write;
marcozecchini 0:9fca2b23d0ba 195 }
marcozecchini 0:9fca2b23d0ba 196
marcozecchini 0:9fca2b23d0ba 197 /**
marcozecchini 0:9fca2b23d0ba 198 * Return the value of the notification property.
marcozecchini 0:9fca2b23d0ba 199 *
marcozecchini 0:9fca2b23d0ba 200 * @return true if the Client Characteristic Configuration Descriptor
marcozecchini 0:9fca2b23d0ba 201 * can be configured to notify the characteristic value to a given
marcozecchini 0:9fca2b23d0ba 202 * client and false otherwise.
marcozecchini 0:9fca2b23d0ba 203 *
marcozecchini 0:9fca2b23d0ba 204 * @note unlike indication, the notification procedure does not require
marcozecchini 0:9fca2b23d0ba 205 * acknowledgement from the client.
marcozecchini 0:9fca2b23d0ba 206 *
marcozecchini 0:9fca2b23d0ba 207 * @see _notify
marcozecchini 0:9fca2b23d0ba 208 */
marcozecchini 0:9fca2b23d0ba 209 bool notify(void) const
marcozecchini 0:9fca2b23d0ba 210 {
marcozecchini 0:9fca2b23d0ba 211 return _notify;
marcozecchini 0:9fca2b23d0ba 212 }
marcozecchini 0:9fca2b23d0ba 213
marcozecchini 0:9fca2b23d0ba 214 /**
marcozecchini 0:9fca2b23d0ba 215 * Return the value of the indicate property.
marcozecchini 0:9fca2b23d0ba 216 *
marcozecchini 0:9fca2b23d0ba 217 * @return true if the Client Characteristic Configuration Descriptor
marcozecchini 0:9fca2b23d0ba 218 * can be configured to indicate the characteristic value to a given
marcozecchini 0:9fca2b23d0ba 219 * client and false otherwise.
marcozecchini 0:9fca2b23d0ba 220 *
marcozecchini 0:9fca2b23d0ba 221 * @note unlike notification the indication procedure does require
marcozecchini 0:9fca2b23d0ba 222 * acknowledgment from the client.
marcozecchini 0:9fca2b23d0ba 223 *
marcozecchini 0:9fca2b23d0ba 224 * @see _indicate
marcozecchini 0:9fca2b23d0ba 225 */
marcozecchini 0:9fca2b23d0ba 226 bool indicate(void) const
marcozecchini 0:9fca2b23d0ba 227 {
marcozecchini 0:9fca2b23d0ba 228 return _indicate;
marcozecchini 0:9fca2b23d0ba 229 }
marcozecchini 0:9fca2b23d0ba 230
marcozecchini 0:9fca2b23d0ba 231 /**
marcozecchini 0:9fca2b23d0ba 232 * Return the value of the authenticated signed writes property.
marcozecchini 0:9fca2b23d0ba 233 *
marcozecchini 0:9fca2b23d0ba 234 * @return true if the characteristic accepts authenticated signed write
marcozecchini 0:9fca2b23d0ba 235 * and false otherwise.
marcozecchini 0:9fca2b23d0ba 236 */
marcozecchini 0:9fca2b23d0ba 237 bool authSignedWrite(void) const
marcozecchini 0:9fca2b23d0ba 238 {
marcozecchini 0:9fca2b23d0ba 239 return _authSignedWrite;
marcozecchini 0:9fca2b23d0ba 240 }
marcozecchini 0:9fca2b23d0ba 241
marcozecchini 0:9fca2b23d0ba 242 /**
marcozecchini 0:9fca2b23d0ba 243 * Equal to operator for DiscoveredCharacteristic::Properties_t.
marcozecchini 0:9fca2b23d0ba 244 *
marcozecchini 0:9fca2b23d0ba 245 * @param[in] lhs The left hand side of the equality expression.
marcozecchini 0:9fca2b23d0ba 246 * @param[in] rhs The right hand side of the equality expression.
marcozecchini 0:9fca2b23d0ba 247 *
marcozecchini 0:9fca2b23d0ba 248 * @return true if operands are equals and false otherwise.
marcozecchini 0:9fca2b23d0ba 249 */
marcozecchini 0:9fca2b23d0ba 250 friend bool operator==(Properties_t lhs, Properties_t rhs)
marcozecchini 0:9fca2b23d0ba 251 {
marcozecchini 0:9fca2b23d0ba 252 return lhs._broadcast == rhs._broadcast &&
marcozecchini 0:9fca2b23d0ba 253 lhs._read == rhs._read &&
marcozecchini 0:9fca2b23d0ba 254 lhs._writeWoResp == rhs._writeWoResp &&
marcozecchini 0:9fca2b23d0ba 255 lhs._write == rhs._write &&
marcozecchini 0:9fca2b23d0ba 256 lhs._notify == rhs._notify &&
marcozecchini 0:9fca2b23d0ba 257 lhs._indicate == rhs._indicate &&
marcozecchini 0:9fca2b23d0ba 258 lhs._authSignedWrite == rhs._authSignedWrite;
marcozecchini 0:9fca2b23d0ba 259 }
marcozecchini 0:9fca2b23d0ba 260
marcozecchini 0:9fca2b23d0ba 261 /**
marcozecchini 0:9fca2b23d0ba 262 * Not equal to operator for DiscoveredCharacteristic::Properties_t.
marcozecchini 0:9fca2b23d0ba 263 *
marcozecchini 0:9fca2b23d0ba 264 * @param lhs The left hand side of the expression.
marcozecchini 0:9fca2b23d0ba 265 * @param rhs The right hand side of the expression.
marcozecchini 0:9fca2b23d0ba 266 *
marcozecchini 0:9fca2b23d0ba 267 * @return true if operands are not equals, false otherwise.
marcozecchini 0:9fca2b23d0ba 268 */
marcozecchini 0:9fca2b23d0ba 269 friend bool operator!=(Properties_t lhs, Properties_t rhs)
marcozecchini 0:9fca2b23d0ba 270 {
marcozecchini 0:9fca2b23d0ba 271 return !(lhs == rhs);
marcozecchini 0:9fca2b23d0ba 272 }
marcozecchini 0:9fca2b23d0ba 273
marcozecchini 0:9fca2b23d0ba 274 private:
marcozecchini 0:9fca2b23d0ba 275 /* Disallow implicit conversion to integer types. */
marcozecchini 0:9fca2b23d0ba 276 operator uint8_t() const;
marcozecchini 0:9fca2b23d0ba 277 operator unsigned() const;
marcozecchini 0:9fca2b23d0ba 278 };
marcozecchini 0:9fca2b23d0ba 279
marcozecchini 0:9fca2b23d0ba 280 /**
marcozecchini 0:9fca2b23d0ba 281 * Initiate a read of the characteristic value.
marcozecchini 0:9fca2b23d0ba 282 *
marcozecchini 0:9fca2b23d0ba 283 * The characteristic value is read in its entirety from the value attribute
marcozecchini 0:9fca2b23d0ba 284 * of the characteristic.
marcozecchini 0:9fca2b23d0ba 285 *
marcozecchini 0:9fca2b23d0ba 286 * Read responses will be passed to the callback registered in
marcozecchini 0:9fca2b23d0ba 287 * GattClient::onDataRead(). Read responses to read requests that this function
marcozecchini 0:9fca2b23d0ba 288 * call initiates will have their GattReadCallbackParams::connHandle
marcozecchini 0:9fca2b23d0ba 289 * field equal to the value returned by getConnectionHandle() and their
marcozecchini 0:9fca2b23d0ba 290 * GattReadCallbackParams::handle field equal to the value returned by
marcozecchini 0:9fca2b23d0ba 291 * getValueHandle().
marcozecchini 0:9fca2b23d0ba 292 *
marcozecchini 0:9fca2b23d0ba 293 * @param[in] offset The position - in the characteristic value bytes stream
marcozecchini 0:9fca2b23d0ba 294 * - where the read operation begin. This parameter is optional.
marcozecchini 0:9fca2b23d0ba 295 *
marcozecchini 0:9fca2b23d0ba 296 * @return BLE_ERROR_NONE if a read has been initiated.
marcozecchini 0:9fca2b23d0ba 297 * @return BLE_ERROR_INVALID_STATE if some internal state about the
marcozecchini 0:9fca2b23d0ba 298 * connection is invalid.
marcozecchini 0:9fca2b23d0ba 299 * @return BLE_STACK_BUSY if some client procedure is already in progress.
marcozecchini 0:9fca2b23d0ba 300 * @return BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's
marcozecchini 0:9fca2b23d0ba 301 * properties.
marcozecchini 0:9fca2b23d0ba 302 */
marcozecchini 0:9fca2b23d0ba 303 ble_error_t read(uint16_t offset = 0) const;
marcozecchini 0:9fca2b23d0ba 304
marcozecchini 0:9fca2b23d0ba 305 /**
marcozecchini 0:9fca2b23d0ba 306 * Initiate a read of the characteristic value and pass the response to its
marcozecchini 0:9fca2b23d0ba 307 * completion callback.
marcozecchini 0:9fca2b23d0ba 308 *
marcozecchini 0:9fca2b23d0ba 309 * @param[in] offset The position - in the characteristic value bytes stream
marcozecchini 0:9fca2b23d0ba 310 * - where the read operation begin.
marcozecchini 0:9fca2b23d0ba 311 *
marcozecchini 0:9fca2b23d0ba 312 * @param[in] onRead Completion callback which will accept the response of
marcozecchini 0:9fca2b23d0ba 313 * the read request. The callback is copied; it is unnecessary to keep it
marcozecchini 0:9fca2b23d0ba 314 * in memory after the call.
marcozecchini 0:9fca2b23d0ba 315 *
marcozecchini 0:9fca2b23d0ba 316 * @return BLE_ERROR_NONE if a read has been initiated.
marcozecchini 0:9fca2b23d0ba 317 * @return BLE_ERROR_INVALID_STATE if some internal state about the
marcozecchini 0:9fca2b23d0ba 318 * connection is invalid.
marcozecchini 0:9fca2b23d0ba 319 * @return BLE_STACK_BUSY if some client procedure is already in progress.
marcozecchini 0:9fca2b23d0ba 320 * @return BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's
marcozecchini 0:9fca2b23d0ba 321 * properties.
marcozecchini 0:9fca2b23d0ba 322 *
marcozecchini 0:9fca2b23d0ba 323 * @note This function is similar to read(uint16_t) const; however, it uses
marcozecchini 0:9fca2b23d0ba 324 * dynamic memory to store the use completion callback.
marcozecchini 0:9fca2b23d0ba 325 */
marcozecchini 0:9fca2b23d0ba 326 ble_error_t read(
marcozecchini 0:9fca2b23d0ba 327 uint16_t offset,
marcozecchini 0:9fca2b23d0ba 328 const GattClient::ReadCallback_t &onRead
marcozecchini 0:9fca2b23d0ba 329 ) const;
marcozecchini 0:9fca2b23d0ba 330
marcozecchini 0:9fca2b23d0ba 331 /**
marcozecchini 0:9fca2b23d0ba 332 * Perform a write without response procedure.
marcozecchini 0:9fca2b23d0ba 333 *
marcozecchini 0:9fca2b23d0ba 334 * @note The server does not acknowledge write without responses.
marcozecchini 0:9fca2b23d0ba 335 * Therefore, they won't generate any event on the client side.
marcozecchini 0:9fca2b23d0ba 336 *
marcozecchini 0:9fca2b23d0ba 337 * @param[in] length The amount of data being written.
marcozecchini 0:9fca2b23d0ba 338 * @param[in] value The bytes being written.
marcozecchini 0:9fca2b23d0ba 339 *
marcozecchini 0:9fca2b23d0ba 340 * @return BLE_ERROR_NONE Successfully started the Write procedure.
marcozecchini 0:9fca2b23d0ba 341 * @return BLE_ERROR_INVALID_STATE if some internal state about the
marcozecchini 0:9fca2b23d0ba 342 * connection is invalid.
marcozecchini 0:9fca2b23d0ba 343 * @return BLE_STACK_BUSY if some client procedure is already in progress.
marcozecchini 0:9fca2b23d0ba 344 * @return BLE_ERROR_NO_MEM if there are no available buffers left to
marcozecchini 0:9fca2b23d0ba 345 * process the request.
marcozecchini 0:9fca2b23d0ba 346 * @return BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's
marcozecchini 0:9fca2b23d0ba 347 * properties.
marcozecchini 0:9fca2b23d0ba 348 */
marcozecchini 0:9fca2b23d0ba 349 ble_error_t writeWoResponse(uint16_t length, const uint8_t *value) const;
marcozecchini 0:9fca2b23d0ba 350
marcozecchini 0:9fca2b23d0ba 351 /**
marcozecchini 0:9fca2b23d0ba 352 * Initiate a discovery of the characteristic descriptors.
marcozecchini 0:9fca2b23d0ba 353 *
marcozecchini 0:9fca2b23d0ba 354 * When a descriptor is discovered, the callback onDescriptorDiscovered is
marcozecchini 0:9fca2b23d0ba 355 * invoked with the descriptor discovered as parameter. When the process
marcozecchini 0:9fca2b23d0ba 356 * ends, the callback onTermination is invoked.
marcozecchini 0:9fca2b23d0ba 357 *
marcozecchini 0:9fca2b23d0ba 358 * @param[in] onDescriptorDiscovered Callback is invoked when a descriptor is
marcozecchini 0:9fca2b23d0ba 359 * discovered.
marcozecchini 0:9fca2b23d0ba 360 *
marcozecchini 0:9fca2b23d0ba 361 * @param[in] onTermination Callback is invoked when the discovery process ends.
marcozecchini 0:9fca2b23d0ba 362 *
marcozecchini 0:9fca2b23d0ba 363 * @return BLE_ERROR_NONE if descriptor discovery is launched successfully;
marcozecchini 0:9fca2b23d0ba 364 * else an appropriate error.
marcozecchini 0:9fca2b23d0ba 365 *
marcozecchini 0:9fca2b23d0ba 366 * @note This function is shorthand for
marcozecchini 0:9fca2b23d0ba 367 * GattClient::discoverCharacteristicDescriptors; therefore,
marcozecchini 0:9fca2b23d0ba 368 * GattClient::isCharacteristicDescriptorDiscoveryActive can be used to
marcozecchini 0:9fca2b23d0ba 369 * determine the descriptor discovery and
marcozecchini 0:9fca2b23d0ba 370 * GattClient::terminateCharacteristicDescriptorDiscovery can be used to
marcozecchini 0:9fca2b23d0ba 371 * end the discovery process.
marcozecchini 0:9fca2b23d0ba 372 */
marcozecchini 0:9fca2b23d0ba 373 ble_error_t discoverDescriptors(
marcozecchini 0:9fca2b23d0ba 374 const CharacteristicDescriptorDiscovery::DiscoveryCallback_t &onDescriptorDiscovered,
marcozecchini 0:9fca2b23d0ba 375 const CharacteristicDescriptorDiscovery::TerminationCallback_t &onTermination
marcozecchini 0:9fca2b23d0ba 376 ) const;
marcozecchini 0:9fca2b23d0ba 377
marcozecchini 0:9fca2b23d0ba 378 /**
marcozecchini 0:9fca2b23d0ba 379 * Initiate a write procedure of the characteristic value.
marcozecchini 0:9fca2b23d0ba 380 *
marcozecchini 0:9fca2b23d0ba 381 * Unlike write without responses (see writeWoResponse()), an acknowledgment
marcozecchini 0:9fca2b23d0ba 382 * is expected for this procedure. The response of the peer GATT server to
marcozecchini 0:9fca2b23d0ba 383 * the write request is passed to callbacks registered in
marcozecchini 0:9fca2b23d0ba 384 * GattClient::onDataWritten().
marcozecchini 0:9fca2b23d0ba 385 *
marcozecchini 0:9fca2b23d0ba 386 * Similarly to read responses, responses to write request of this
marcozecchini 0:9fca2b23d0ba 387 * characteristic can be identified by their connection handle (
marcozecchini 0:9fca2b23d0ba 388 * GattWriteCallbackParams::connHandle), which is equal to the value
marcozecchini 0:9fca2b23d0ba 389 * returned by getConnectionHandle() and their attribute handle (
marcozecchini 0:9fca2b23d0ba 390 * GattWriteCallbackParams::handle), which is equal to the value
marcozecchini 0:9fca2b23d0ba 391 * returned by getValueHandle().
marcozecchini 0:9fca2b23d0ba 392 *
marcozecchini 0:9fca2b23d0ba 393 * @param[in] length The amount of data being written.
marcozecchini 0:9fca2b23d0ba 394 * @param[in] value The bytes being written.
marcozecchini 0:9fca2b23d0ba 395 *
marcozecchini 0:9fca2b23d0ba 396 * @return BLE_ERROR_NONE Successfully started the Write procedure.
marcozecchini 0:9fca2b23d0ba 397 * @return BLE_ERROR_INVALID_STATE If some internal state about the
marcozecchini 0:9fca2b23d0ba 398 * connection is invalid.
marcozecchini 0:9fca2b23d0ba 399 * @return BLE_STACK_BUSY If some client procedure is already in progress.
marcozecchini 0:9fca2b23d0ba 400 * @return BLE_ERROR_NO_MEM If there are no available buffers left to
marcozecchini 0:9fca2b23d0ba 401 * process the request.
marcozecchini 0:9fca2b23d0ba 402 * @return BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's
marcozecchini 0:9fca2b23d0ba 403 * properties.
marcozecchini 0:9fca2b23d0ba 404 *
marcozecchini 0:9fca2b23d0ba 405 * @note Internally, the API uses the write or long write procedure, depending
marcozecchini 0:9fca2b23d0ba 406 * on the number of bytes to write and the MTU size.
marcozecchini 0:9fca2b23d0ba 407 */
marcozecchini 0:9fca2b23d0ba 408 ble_error_t write(uint16_t length, const uint8_t *value) const;
marcozecchini 0:9fca2b23d0ba 409
marcozecchini 0:9fca2b23d0ba 410 /**
marcozecchini 0:9fca2b23d0ba 411 * Initiate a write procedure of the characteristic value.
marcozecchini 0:9fca2b23d0ba 412 *
marcozecchini 0:9fca2b23d0ba 413 * Same as write(uint16_t, const uint8_t *) const but accepts a completion
marcozecchini 0:9fca2b23d0ba 414 * callback, which is invoked when the server response is received.
marcozecchini 0:9fca2b23d0ba 415 *
marcozecchini 0:9fca2b23d0ba 416 * @param[in] length The amount of bytes to write.
marcozecchini 0:9fca2b23d0ba 417 * @param[in] value The bytes to write.
marcozecchini 0:9fca2b23d0ba 418 * @param[in] onWrite Continuation callback of the write procedure.
marcozecchini 0:9fca2b23d0ba 419 *
marcozecchini 0:9fca2b23d0ba 420 * @return BLE_ERROR_NONE Successfully started the Write procedure.
marcozecchini 0:9fca2b23d0ba 421 * @return BLE_ERROR_INVALID_STATE if some internal state about the
marcozecchini 0:9fca2b23d0ba 422 * connection is invalid.
marcozecchini 0:9fca2b23d0ba 423 * @return BLE_STACK_BUSY if some client procedure is already in progress.
marcozecchini 0:9fca2b23d0ba 424 * @return BLE_ERROR_NO_MEM if there are no available buffers left to
marcozecchini 0:9fca2b23d0ba 425 * process the request.
marcozecchini 0:9fca2b23d0ba 426 * @return BLE_ERROR_OPERATION_NOT_PERMITTED due to the characteristic's
marcozecchini 0:9fca2b23d0ba 427 * properties.
marcozecchini 0:9fca2b23d0ba 428 */
marcozecchini 0:9fca2b23d0ba 429 ble_error_t write(
marcozecchini 0:9fca2b23d0ba 430 uint16_t length,
marcozecchini 0:9fca2b23d0ba 431 const uint8_t *value,
marcozecchini 0:9fca2b23d0ba 432 const GattClient::WriteCallback_t &onWrite
marcozecchini 0:9fca2b23d0ba 433 ) const;
marcozecchini 0:9fca2b23d0ba 434
marcozecchini 0:9fca2b23d0ba 435 void setupLongUUID(UUID::LongUUIDBytes_t longUUID, UUID::ByteOrder_t order = UUID::MSB) {
marcozecchini 0:9fca2b23d0ba 436 uuid.setupLong(longUUID, order);
marcozecchini 0:9fca2b23d0ba 437 }
marcozecchini 0:9fca2b23d0ba 438
marcozecchini 0:9fca2b23d0ba 439 public:
marcozecchini 0:9fca2b23d0ba 440 /**
marcozecchini 0:9fca2b23d0ba 441 * Get the UUID of the discovered characteristic.
marcozecchini 0:9fca2b23d0ba 442 *
marcozecchini 0:9fca2b23d0ba 443 * @return The UUID of this characteristic.
marcozecchini 0:9fca2b23d0ba 444 */
marcozecchini 0:9fca2b23d0ba 445 const UUID &getUUID(void) const
marcozecchini 0:9fca2b23d0ba 446 {
marcozecchini 0:9fca2b23d0ba 447 return uuid;
marcozecchini 0:9fca2b23d0ba 448 }
marcozecchini 0:9fca2b23d0ba 449
marcozecchini 0:9fca2b23d0ba 450 /**
marcozecchini 0:9fca2b23d0ba 451 * Get the properties of this characteristic.
marcozecchini 0:9fca2b23d0ba 452 *
marcozecchini 0:9fca2b23d0ba 453 * @return The set of properties of this characteristic.
marcozecchini 0:9fca2b23d0ba 454 */
marcozecchini 0:9fca2b23d0ba 455 const Properties_t &getProperties(void) const
marcozecchini 0:9fca2b23d0ba 456 {
marcozecchini 0:9fca2b23d0ba 457 return props;
marcozecchini 0:9fca2b23d0ba 458 }
marcozecchini 0:9fca2b23d0ba 459
marcozecchini 0:9fca2b23d0ba 460 /**
marcozecchini 0:9fca2b23d0ba 461 * Get the declaration handle of this characteristic.
marcozecchini 0:9fca2b23d0ba 462 *
marcozecchini 0:9fca2b23d0ba 463 * The declaration handle is the first handle of a characteristic
marcozecchini 0:9fca2b23d0ba 464 * definition. The value accessible at this handle contains the following
marcozecchini 0:9fca2b23d0ba 465 * informations:
marcozecchini 0:9fca2b23d0ba 466 * - The characteristics properties (see Properties_t). This value can
marcozecchini 0:9fca2b23d0ba 467 * be accessed by using #getProperties .
marcozecchini 0:9fca2b23d0ba 468 * - The characteristic value attribute handle. This field can be accessed
marcozecchini 0:9fca2b23d0ba 469 * by using #getValueHandle .
marcozecchini 0:9fca2b23d0ba 470 * - The characteristic UUID, this value can be accessed by using the
marcozecchini 0:9fca2b23d0ba 471 * function #getUUID .
marcozecchini 0:9fca2b23d0ba 472 *
marcozecchini 0:9fca2b23d0ba 473 * @return the declaration handle of this characteristic.
marcozecchini 0:9fca2b23d0ba 474 */
marcozecchini 0:9fca2b23d0ba 475 GattAttribute::Handle_t getDeclHandle(void) const
marcozecchini 0:9fca2b23d0ba 476 {
marcozecchini 0:9fca2b23d0ba 477 return declHandle;
marcozecchini 0:9fca2b23d0ba 478 }
marcozecchini 0:9fca2b23d0ba 479
marcozecchini 0:9fca2b23d0ba 480 /**
marcozecchini 0:9fca2b23d0ba 481 * Get the attribute handle of the characteristic value.
marcozecchini 0:9fca2b23d0ba 482 *
marcozecchini 0:9fca2b23d0ba 483 * This handle is used to read or write the value of the characteristic.
marcozecchini 0:9fca2b23d0ba 484 *
marcozecchini 0:9fca2b23d0ba 485 * @return The handle to access the value of this characteristic.
marcozecchini 0:9fca2b23d0ba 486 */
marcozecchini 0:9fca2b23d0ba 487 GattAttribute::Handle_t getValueHandle(void) const
marcozecchini 0:9fca2b23d0ba 488 {
marcozecchini 0:9fca2b23d0ba 489 return valueHandle;
marcozecchini 0:9fca2b23d0ba 490 }
marcozecchini 0:9fca2b23d0ba 491
marcozecchini 0:9fca2b23d0ba 492 /**
marcozecchini 0:9fca2b23d0ba 493 * Return the last attribute handle of the characteristic definition.
marcozecchini 0:9fca2b23d0ba 494 *
marcozecchini 0:9fca2b23d0ba 495 * The attribute layout of a characteristic definition is:
marcozecchini 0:9fca2b23d0ba 496 * - Declaration attribute (see #getDeclHandle).
marcozecchini 0:9fca2b23d0ba 497 * - Value attribute (see #getValueHandle).
marcozecchini 0:9fca2b23d0ba 498 * - Zero or more characteristic descriptors attribute.
marcozecchini 0:9fca2b23d0ba 499 *
marcozecchini 0:9fca2b23d0ba 500 * The last attribute handle is used internally to discover characteristic
marcozecchini 0:9fca2b23d0ba 501 * descriptors. The discovery operates on the range [ValueHandle + 1 :
marcozecchini 0:9fca2b23d0ba 502 * LastHandle].
marcozecchini 0:9fca2b23d0ba 503 *
marcozecchini 0:9fca2b23d0ba 504 * @return The last handle of this characteristic definition.
marcozecchini 0:9fca2b23d0ba 505 *
marcozecchini 0:9fca2b23d0ba 506 * @note This function is public for informative purposes.
marcozecchini 0:9fca2b23d0ba 507 */
marcozecchini 0:9fca2b23d0ba 508 GattAttribute::Handle_t getLastHandle(void) const
marcozecchini 0:9fca2b23d0ba 509 {
marcozecchini 0:9fca2b23d0ba 510 return lastHandle;
marcozecchini 0:9fca2b23d0ba 511 }
marcozecchini 0:9fca2b23d0ba 512
marcozecchini 0:9fca2b23d0ba 513 /**
marcozecchini 0:9fca2b23d0ba 514 * Get the GattClient, which can operate on this characteristic.
marcozecchini 0:9fca2b23d0ba 515 *
marcozecchini 0:9fca2b23d0ba 516 * @return The GattClient, which can operate on this characteristic.
marcozecchini 0:9fca2b23d0ba 517 */
marcozecchini 0:9fca2b23d0ba 518 GattClient* getGattClient()
marcozecchini 0:9fca2b23d0ba 519 {
marcozecchini 0:9fca2b23d0ba 520 return gattc;
marcozecchini 0:9fca2b23d0ba 521 }
marcozecchini 0:9fca2b23d0ba 522
marcozecchini 0:9fca2b23d0ba 523 /**
marcozecchini 0:9fca2b23d0ba 524 * Get the GattClient, which can operate on this characteristic.
marcozecchini 0:9fca2b23d0ba 525 *
marcozecchini 0:9fca2b23d0ba 526 * @return The GattClient, which can operate on this characteristic.
marcozecchini 0:9fca2b23d0ba 527 */
marcozecchini 0:9fca2b23d0ba 528 const GattClient* getGattClient() const
marcozecchini 0:9fca2b23d0ba 529 {
marcozecchini 0:9fca2b23d0ba 530 return gattc;
marcozecchini 0:9fca2b23d0ba 531 }
marcozecchini 0:9fca2b23d0ba 532
marcozecchini 0:9fca2b23d0ba 533 /**
marcozecchini 0:9fca2b23d0ba 534 * @brief Get the connection handle to the GattServer containing this
marcozecchini 0:9fca2b23d0ba 535 * characteristic.
marcozecchini 0:9fca2b23d0ba 536 *
marcozecchini 0:9fca2b23d0ba 537 * @return Connection handle to the GattServer, which contains this
marcozecchini 0:9fca2b23d0ba 538 * characteristic.
marcozecchini 0:9fca2b23d0ba 539 */
marcozecchini 0:9fca2b23d0ba 540 Gap::Handle_t getConnectionHandle() const
marcozecchini 0:9fca2b23d0ba 541 {
marcozecchini 0:9fca2b23d0ba 542 return connHandle;
marcozecchini 0:9fca2b23d0ba 543 }
marcozecchini 0:9fca2b23d0ba 544
marcozecchini 0:9fca2b23d0ba 545 /**
marcozecchini 0:9fca2b23d0ba 546 * "Equal to" operator for DiscoveredCharacteristic.
marcozecchini 0:9fca2b23d0ba 547 *
marcozecchini 0:9fca2b23d0ba 548 * @param[in] lhs The left hand side of the equality expression.
marcozecchini 0:9fca2b23d0ba 549 * @param[in] rhs The right hand side of the equality expression.
marcozecchini 0:9fca2b23d0ba 550 *
marcozecchini 0:9fca2b23d0ba 551 * @return true if operands are equals and false otherwise.
marcozecchini 0:9fca2b23d0ba 552 */
marcozecchini 0:9fca2b23d0ba 553 friend bool operator==(
marcozecchini 0:9fca2b23d0ba 554 const DiscoveredCharacteristic& lhs, const DiscoveredCharacteristic& rhs
marcozecchini 0:9fca2b23d0ba 555 ) {
marcozecchini 0:9fca2b23d0ba 556 return lhs.gattc == rhs.gattc &&
marcozecchini 0:9fca2b23d0ba 557 lhs.uuid == rhs.uuid &&
marcozecchini 0:9fca2b23d0ba 558 lhs.props == rhs.props &&
marcozecchini 0:9fca2b23d0ba 559 lhs.declHandle == rhs.declHandle &&
marcozecchini 0:9fca2b23d0ba 560 lhs.valueHandle == rhs.valueHandle &&
marcozecchini 0:9fca2b23d0ba 561 lhs.lastHandle == rhs.lastHandle &&
marcozecchini 0:9fca2b23d0ba 562 lhs.connHandle == rhs.connHandle;
marcozecchini 0:9fca2b23d0ba 563 }
marcozecchini 0:9fca2b23d0ba 564
marcozecchini 0:9fca2b23d0ba 565 /**
marcozecchini 0:9fca2b23d0ba 566 * "Not equal to" operator for DiscoveredCharacteristic.
marcozecchini 0:9fca2b23d0ba 567 *
marcozecchini 0:9fca2b23d0ba 568 * @param[in] lhs The right hand side of the expression.
marcozecchini 0:9fca2b23d0ba 569 * @param[in] rhs The left hand side of the expression.
marcozecchini 0:9fca2b23d0ba 570 *
marcozecchini 0:9fca2b23d0ba 571 * @return true if operands are not equal and false otherwise.
marcozecchini 0:9fca2b23d0ba 572 */
marcozecchini 0:9fca2b23d0ba 573 friend bool operator !=(
marcozecchini 0:9fca2b23d0ba 574 const DiscoveredCharacteristic& lhs, const DiscoveredCharacteristic& rhs
marcozecchini 0:9fca2b23d0ba 575 ) {
marcozecchini 0:9fca2b23d0ba 576 return !(lhs == rhs);
marcozecchini 0:9fca2b23d0ba 577 }
marcozecchini 0:9fca2b23d0ba 578
marcozecchini 0:9fca2b23d0ba 579 public:
marcozecchini 0:9fca2b23d0ba 580 DiscoveredCharacteristic() :
marcozecchini 0:9fca2b23d0ba 581 gattc(NULL),
marcozecchini 0:9fca2b23d0ba 582 uuid(UUID::ShortUUIDBytes_t(0)),
marcozecchini 0:9fca2b23d0ba 583 props(),
marcozecchini 0:9fca2b23d0ba 584 declHandle(GattAttribute::INVALID_HANDLE),
marcozecchini 0:9fca2b23d0ba 585 valueHandle(GattAttribute::INVALID_HANDLE),
marcozecchini 0:9fca2b23d0ba 586 lastHandle(GattAttribute::INVALID_HANDLE),
marcozecchini 0:9fca2b23d0ba 587 connHandle() {
marcozecchini 0:9fca2b23d0ba 588 }
marcozecchini 0:9fca2b23d0ba 589
marcozecchini 0:9fca2b23d0ba 590 protected:
marcozecchini 0:9fca2b23d0ba 591 /**
marcozecchini 0:9fca2b23d0ba 592 * Pointer to the underlying GattClient for this DiscoveredCharacteristic
marcozecchini 0:9fca2b23d0ba 593 * object.
marcozecchini 0:9fca2b23d0ba 594 */
marcozecchini 0:9fca2b23d0ba 595 GattClient *gattc;
marcozecchini 0:9fca2b23d0ba 596
marcozecchini 0:9fca2b23d0ba 597 protected:
marcozecchini 0:9fca2b23d0ba 598 /**
marcozecchini 0:9fca2b23d0ba 599 * Discovered characteristic's UUID.
marcozecchini 0:9fca2b23d0ba 600 */
marcozecchini 0:9fca2b23d0ba 601 UUID uuid;
marcozecchini 0:9fca2b23d0ba 602
marcozecchini 0:9fca2b23d0ba 603 /**
marcozecchini 0:9fca2b23d0ba 604 * Hold the configured properties of the discovered characteristic.
marcozecchini 0:9fca2b23d0ba 605 *
marcozecchini 0:9fca2b23d0ba 606 * @see Properties_t.
marcozecchini 0:9fca2b23d0ba 607 */
marcozecchini 0:9fca2b23d0ba 608 Properties_t props;
marcozecchini 0:9fca2b23d0ba 609
marcozecchini 0:9fca2b23d0ba 610 /**
marcozecchini 0:9fca2b23d0ba 611 * Value handle of the discovered characteristic's declaration attribute.
marcozecchini 0:9fca2b23d0ba 612 */
marcozecchini 0:9fca2b23d0ba 613 GattAttribute::Handle_t declHandle;
marcozecchini 0:9fca2b23d0ba 614
marcozecchini 0:9fca2b23d0ba 615 /**
marcozecchini 0:9fca2b23d0ba 616 * Value handle of the discovered characteristic's value attribute.
marcozecchini 0:9fca2b23d0ba 617 */
marcozecchini 0:9fca2b23d0ba 618 GattAttribute::Handle_t valueHandle;
marcozecchini 0:9fca2b23d0ba 619
marcozecchini 0:9fca2b23d0ba 620 /**
marcozecchini 0:9fca2b23d0ba 621 * Value handle of the discovered characteristic's last attribute.
marcozecchini 0:9fca2b23d0ba 622 */
marcozecchini 0:9fca2b23d0ba 623 GattAttribute::Handle_t lastHandle;
marcozecchini 0:9fca2b23d0ba 624
marcozecchini 0:9fca2b23d0ba 625 /**
marcozecchini 0:9fca2b23d0ba 626 * Handle of the connection where the characteristic was discovered.
marcozecchini 0:9fca2b23d0ba 627 */
marcozecchini 0:9fca2b23d0ba 628 Gap::Handle_t connHandle;
marcozecchini 0:9fca2b23d0ba 629 };
marcozecchini 0:9fca2b23d0ba 630
marcozecchini 0:9fca2b23d0ba 631 /**
marcozecchini 0:9fca2b23d0ba 632 * @}
marcozecchini 0:9fca2b23d0ba 633 * @}
marcozecchini 0:9fca2b23d0ba 634 * @}
marcozecchini 0:9fca2b23d0ba 635 */
marcozecchini 0:9fca2b23d0ba 636
marcozecchini 0:9fca2b23d0ba 637 #endif /*MBED_DISCOVERED_CHARACTERISTIC_H__*/