Demonstration of possible usage of the GattServer

Dependents:   mbed-os-example-ble-GattServer_ECG

Committer:
mbed_official
Date:
Wed Jul 18 15:45:34 2018 +0100
Revision:
4:8fbed496a023
Parent:
0:c671a4833315
Merge pull request #166 from cmonr/master

Updating mbed-os to mbed-os-5.9.3
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:c671a4833315 1 /* mbed Microcontroller Library
mbed_official 0:c671a4833315 2 * Copyright (c) 2017 ARM Limited
mbed_official 0:c671a4833315 3 *
mbed_official 0:c671a4833315 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:c671a4833315 5 * you may not use this file except in compliance with the License.
mbed_official 0:c671a4833315 6 * You may obtain a copy of the License at
mbed_official 0:c671a4833315 7 *
mbed_official 0:c671a4833315 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:c671a4833315 9 *
mbed_official 0:c671a4833315 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:c671a4833315 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:c671a4833315 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:c671a4833315 13 * See the License for the specific language governing permissions and
mbed_official 0:c671a4833315 14 * limitations under the License.
mbed_official 0:c671a4833315 15 */
mbed_official 0:c671a4833315 16
mbed_official 0:c671a4833315 17 #include <stdio.h>
mbed_official 0:c671a4833315 18
mbed_official 0:c671a4833315 19 #include "platform/Callback.h"
mbed_official 0:c671a4833315 20 #include "events/EventQueue.h"
mbed_official 0:c671a4833315 21 #include "platform/NonCopyable.h"
mbed_official 0:c671a4833315 22
mbed_official 0:c671a4833315 23 #include "ble/BLE.h"
mbed_official 0:c671a4833315 24 #include "ble/Gap.h"
mbed_official 0:c671a4833315 25 #include "ble/GattClient.h"
mbed_official 0:c671a4833315 26 #include "ble/GapAdvertisingParams.h"
mbed_official 0:c671a4833315 27 #include "ble/GapAdvertisingData.h"
mbed_official 0:c671a4833315 28 #include "ble/GattServer.h"
mbed_official 0:c671a4833315 29 #include "BLEProcess.h"
mbed_official 0:c671a4833315 30
mbed_official 0:c671a4833315 31 using mbed::callback;
mbed_official 0:c671a4833315 32
mbed_official 0:c671a4833315 33 /**
mbed_official 0:c671a4833315 34 * A Clock service that demonstrate the GattServer features.
mbed_official 0:c671a4833315 35 *
mbed_official 0:c671a4833315 36 * The clock service host three characteristics that model the current hour,
mbed_official 0:c671a4833315 37 * minute and second of the clock. The value of the second characteristic is
mbed_official 0:c671a4833315 38 * incremented automatically by the system.
mbed_official 0:c671a4833315 39 *
mbed_official 0:c671a4833315 40 * A client can subscribe to updates of the clock characteristics and get
mbed_official 0:c671a4833315 41 * notified when one of the value is changed. Clients can also change value of
mbed_official 0:c671a4833315 42 * the second, minute and hour characteristric.
mbed_official 0:c671a4833315 43 */
mbed_official 0:c671a4833315 44 class ClockService {
mbed_official 0:c671a4833315 45 typedef ClockService Self;
mbed_official 0:c671a4833315 46
mbed_official 0:c671a4833315 47 public:
mbed_official 0:c671a4833315 48 ClockService() :
mbed_official 0:c671a4833315 49 _hour_char("485f4145-52b9-4644-af1f-7a6b9322490f", 0),
mbed_official 0:c671a4833315 50 _minute_char("0a924ca7-87cd-4699-a3bd-abdcd9cf126a", 0),
mbed_official 0:c671a4833315 51 _second_char("8dd6a1b7-bc75-4741-8a26-264af75807de", 0),
mbed_official 0:c671a4833315 52 _clock_service(
mbed_official 0:c671a4833315 53 /* uuid */ "51311102-030e-485f-b122-f8f381aa84ed",
mbed_official 0:c671a4833315 54 /* characteristics */ _clock_characteristics,
mbed_official 0:c671a4833315 55 /* numCharacteristics */ sizeof(_clock_characteristics) /
mbed_official 0:c671a4833315 56 sizeof(_clock_characteristics[0])
mbed_official 0:c671a4833315 57 ),
mbed_official 0:c671a4833315 58 _server(NULL),
mbed_official 0:c671a4833315 59 _event_queue(NULL)
mbed_official 0:c671a4833315 60 {
mbed_official 0:c671a4833315 61 // update internal pointers (value, descriptors and characteristics array)
mbed_official 0:c671a4833315 62 _clock_characteristics[0] = &_hour_char;
mbed_official 0:c671a4833315 63 _clock_characteristics[1] = &_minute_char;
mbed_official 0:c671a4833315 64 _clock_characteristics[2] = &_second_char;
mbed_official 0:c671a4833315 65
mbed_official 0:c671a4833315 66 // setup authorization handlers
mbed_official 0:c671a4833315 67 _hour_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
mbed_official 0:c671a4833315 68 _minute_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
mbed_official 0:c671a4833315 69 _second_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
mbed_official 0:c671a4833315 70 }
mbed_official 0:c671a4833315 71
mbed_official 0:c671a4833315 72
mbed_official 0:c671a4833315 73
mbed_official 0:c671a4833315 74 void start(BLE &ble_interface, events::EventQueue &event_queue)
mbed_official 0:c671a4833315 75 {
mbed_official 0:c671a4833315 76 if (_event_queue) {
mbed_official 0:c671a4833315 77 return;
mbed_official 0:c671a4833315 78 }
mbed_official 0:c671a4833315 79
mbed_official 0:c671a4833315 80 _server = &ble_interface.gattServer();
mbed_official 0:c671a4833315 81 _event_queue = &event_queue;
mbed_official 0:c671a4833315 82
mbed_official 0:c671a4833315 83 // register the service
mbed_official 0:c671a4833315 84 printf("Adding demo service\r\n");
mbed_official 0:c671a4833315 85 ble_error_t err = _server->addService(_clock_service);
mbed_official 0:c671a4833315 86
mbed_official 0:c671a4833315 87 if (err) {
mbed_official 0:c671a4833315 88 printf("Error %u during demo service registration.\r\n", err);
mbed_official 0:c671a4833315 89 return;
mbed_official 0:c671a4833315 90 }
mbed_official 0:c671a4833315 91
mbed_official 0:c671a4833315 92 // read write handler
mbed_official 0:c671a4833315 93 _server->onDataSent(as_cb(&Self::when_data_sent));
mbed_official 0:c671a4833315 94 _server->onDataWritten(as_cb(&Self::when_data_written));
mbed_official 0:c671a4833315 95 _server->onDataRead(as_cb(&Self::when_data_read));
mbed_official 0:c671a4833315 96
mbed_official 0:c671a4833315 97 // updates subscribtion handlers
mbed_official 0:c671a4833315 98 _server->onUpdatesEnabled(as_cb(&Self::when_update_enabled));
mbed_official 0:c671a4833315 99 _server->onUpdatesDisabled(as_cb(&Self::when_update_disabled));
mbed_official 0:c671a4833315 100 _server->onConfirmationReceived(as_cb(&Self::when_confirmation_received));
mbed_official 0:c671a4833315 101
mbed_official 0:c671a4833315 102 // print the handles
mbed_official 0:c671a4833315 103 printf("clock service registered\r\n");
mbed_official 0:c671a4833315 104 printf("service handle: %u\r\n", _clock_service.getHandle());
mbed_official 0:c671a4833315 105 printf("\thour characteristic value handle %u\r\n", _hour_char.getValueHandle());
mbed_official 0:c671a4833315 106 printf("\tminute characteristic value handle %u\r\n", _minute_char.getValueHandle());
mbed_official 0:c671a4833315 107 printf("\tsecond characteristic value handle %u\r\n", _second_char.getValueHandle());
mbed_official 0:c671a4833315 108
mbed_official 0:c671a4833315 109 _event_queue->call_every(1000 /* ms */, callback(this, &Self::increment_second));
mbed_official 0:c671a4833315 110 }
mbed_official 0:c671a4833315 111
mbed_official 0:c671a4833315 112 private:
mbed_official 0:c671a4833315 113
mbed_official 0:c671a4833315 114 /**
mbed_official 0:c671a4833315 115 * Handler called when a notification or an indication has been sent.
mbed_official 0:c671a4833315 116 */
mbed_official 0:c671a4833315 117 void when_data_sent(unsigned count)
mbed_official 0:c671a4833315 118 {
mbed_official 0:c671a4833315 119 printf("sent %u updates\r\n", count);
mbed_official 0:c671a4833315 120 }
mbed_official 0:c671a4833315 121
mbed_official 0:c671a4833315 122 /**
mbed_official 0:c671a4833315 123 * Handler called after an attribute has been written.
mbed_official 0:c671a4833315 124 */
mbed_official 0:c671a4833315 125 void when_data_written(const GattWriteCallbackParams *e)
mbed_official 0:c671a4833315 126 {
mbed_official 0:c671a4833315 127 printf("data written:\r\n");
mbed_official 0:c671a4833315 128 printf("\tconnection handle: %u\r\n", e->connHandle);
mbed_official 0:c671a4833315 129 printf("\tattribute handle: %u", e->handle);
mbed_official 0:c671a4833315 130 if (e->handle == _hour_char.getValueHandle()) {
mbed_official 0:c671a4833315 131 printf(" (hour characteristic)\r\n");
mbed_official 0:c671a4833315 132 } else if (e->handle == _minute_char.getValueHandle()) {
mbed_official 0:c671a4833315 133 printf(" (minute characteristic)\r\n");
mbed_official 0:c671a4833315 134 } else if (e->handle == _second_char.getValueHandle()) {
mbed_official 0:c671a4833315 135 printf(" (second characteristic)\r\n");
mbed_official 0:c671a4833315 136 } else {
mbed_official 0:c671a4833315 137 printf("\r\n");
mbed_official 0:c671a4833315 138 }
mbed_official 0:c671a4833315 139 printf("\twrite operation: %u\r\n", e->writeOp);
mbed_official 0:c671a4833315 140 printf("\toffset: %u\r\n", e->offset);
mbed_official 0:c671a4833315 141 printf("\tlength: %u\r\n", e->len);
mbed_official 0:c671a4833315 142 printf("\t data: ");
mbed_official 0:c671a4833315 143
mbed_official 0:c671a4833315 144 for (size_t i = 0; i < e->len; ++i) {
mbed_official 0:c671a4833315 145 printf("%02X", e->data[i]);
mbed_official 0:c671a4833315 146 }
mbed_official 0:c671a4833315 147
mbed_official 0:c671a4833315 148 printf("\r\n");
mbed_official 0:c671a4833315 149 }
mbed_official 0:c671a4833315 150
mbed_official 0:c671a4833315 151 /**
mbed_official 0:c671a4833315 152 * Handler called after an attribute has been read.
mbed_official 0:c671a4833315 153 */
mbed_official 0:c671a4833315 154 void when_data_read(const GattReadCallbackParams *e)
mbed_official 0:c671a4833315 155 {
mbed_official 0:c671a4833315 156 printf("data read:\r\n");
mbed_official 0:c671a4833315 157 printf("\tconnection handle: %u\r\n", e->connHandle);
mbed_official 0:c671a4833315 158 printf("\tattribute handle: %u", e->handle);
mbed_official 0:c671a4833315 159 if (e->handle == _hour_char.getValueHandle()) {
mbed_official 0:c671a4833315 160 printf(" (hour characteristic)\r\n");
mbed_official 0:c671a4833315 161 } else if (e->handle == _minute_char.getValueHandle()) {
mbed_official 0:c671a4833315 162 printf(" (minute characteristic)\r\n");
mbed_official 0:c671a4833315 163 } else if (e->handle == _second_char.getValueHandle()) {
mbed_official 0:c671a4833315 164 printf(" (second characteristic)\r\n");
mbed_official 0:c671a4833315 165 } else {
mbed_official 0:c671a4833315 166 printf("\r\n");
mbed_official 0:c671a4833315 167 }
mbed_official 0:c671a4833315 168 }
mbed_official 0:c671a4833315 169
mbed_official 0:c671a4833315 170 /**
mbed_official 0:c671a4833315 171 * Handler called after a client has subscribed to notification or indication.
mbed_official 0:c671a4833315 172 *
mbed_official 0:c671a4833315 173 * @param handle Handle of the characteristic value affected by the change.
mbed_official 0:c671a4833315 174 */
mbed_official 0:c671a4833315 175 void when_update_enabled(GattAttribute::Handle_t handle)
mbed_official 0:c671a4833315 176 {
mbed_official 0:c671a4833315 177 printf("update enabled on handle %d\r\n", handle);
mbed_official 0:c671a4833315 178 }
mbed_official 0:c671a4833315 179
mbed_official 0:c671a4833315 180 /**
mbed_official 0:c671a4833315 181 * Handler called after a client has cancelled his subscription from
mbed_official 0:c671a4833315 182 * notification or indication.
mbed_official 0:c671a4833315 183 *
mbed_official 0:c671a4833315 184 * @param handle Handle of the characteristic value affected by the change.
mbed_official 0:c671a4833315 185 */
mbed_official 0:c671a4833315 186 void when_update_disabled(GattAttribute::Handle_t handle)
mbed_official 0:c671a4833315 187 {
mbed_official 0:c671a4833315 188 printf("update disabled on handle %d\r\n", handle);
mbed_official 0:c671a4833315 189 }
mbed_official 0:c671a4833315 190
mbed_official 0:c671a4833315 191 /**
mbed_official 0:c671a4833315 192 * Handler called when an indication confirmation has been received.
mbed_official 0:c671a4833315 193 *
mbed_official 0:c671a4833315 194 * @param handle Handle of the characteristic value that has emitted the
mbed_official 0:c671a4833315 195 * indication.
mbed_official 0:c671a4833315 196 */
mbed_official 0:c671a4833315 197 void when_confirmation_received(GattAttribute::Handle_t handle)
mbed_official 0:c671a4833315 198 {
mbed_official 0:c671a4833315 199 printf("confirmation received on handle %d\r\n", handle);
mbed_official 0:c671a4833315 200 }
mbed_official 0:c671a4833315 201
mbed_official 0:c671a4833315 202 /**
mbed_official 0:c671a4833315 203 * Handler called when a write request is received.
mbed_official 0:c671a4833315 204 *
mbed_official 0:c671a4833315 205 * This handler verify that the value submitted by the client is valid before
mbed_official 0:c671a4833315 206 * authorizing the operation.
mbed_official 0:c671a4833315 207 */
mbed_official 0:c671a4833315 208 void authorize_client_write(GattWriteAuthCallbackParams *e)
mbed_official 0:c671a4833315 209 {
mbed_official 0:c671a4833315 210 printf("characteristic %u write authorization\r\n", e->handle);
mbed_official 0:c671a4833315 211
mbed_official 0:c671a4833315 212 if (e->offset != 0) {
mbed_official 0:c671a4833315 213 printf("Error invalid offset\r\n");
mbed_official 0:c671a4833315 214 e->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbed_official 0:c671a4833315 215 return;
mbed_official 0:c671a4833315 216 }
mbed_official 0:c671a4833315 217
mbed_official 0:c671a4833315 218 if (e->len != 1) {
mbed_official 0:c671a4833315 219 printf("Error invalid len\r\n");
mbed_official 0:c671a4833315 220 e->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
mbed_official 0:c671a4833315 221 return;
mbed_official 0:c671a4833315 222 }
mbed_official 0:c671a4833315 223
mbed_official 0:c671a4833315 224 if ((e->data[0] >= 60) ||
mbed_official 0:c671a4833315 225 ((e->data[0] >= 24) && (e->handle == _hour_char.getValueHandle()))) {
mbed_official 0:c671a4833315 226 printf("Error invalid data\r\n");
mbed_official 0:c671a4833315 227 e->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED;
mbed_official 0:c671a4833315 228 return;
mbed_official 0:c671a4833315 229 }
mbed_official 0:c671a4833315 230
mbed_official 0:c671a4833315 231 e->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbed_official 0:c671a4833315 232 }
mbed_official 0:c671a4833315 233
mbed_official 0:c671a4833315 234 /**
mbed_official 0:c671a4833315 235 * Increment the second counter.
mbed_official 0:c671a4833315 236 */
mbed_official 0:c671a4833315 237 void increment_second(void)
mbed_official 0:c671a4833315 238 {
mbed_official 0:c671a4833315 239 uint8_t second = 0;
mbed_official 0:c671a4833315 240 ble_error_t err = _second_char.get(*_server, second);
mbed_official 0:c671a4833315 241 if (err) {
mbed_official 0:c671a4833315 242 printf("read of the second value returned error %u\r\n", err);
mbed_official 0:c671a4833315 243 return;
mbed_official 0:c671a4833315 244 }
mbed_official 0:c671a4833315 245
mbed_official 0:c671a4833315 246 second = (second + 1) % 60;
mbed_official 0:c671a4833315 247
mbed_official 0:c671a4833315 248 err = _second_char.set(*_server, second);
mbed_official 0:c671a4833315 249 if (err) {
mbed_official 0:c671a4833315 250 printf("write of the second value returned error %u\r\n", err);
mbed_official 0:c671a4833315 251 return;
mbed_official 0:c671a4833315 252 }
mbed_official 0:c671a4833315 253
mbed_official 0:c671a4833315 254 if (second == 0) {
mbed_official 0:c671a4833315 255 increment_minute();
mbed_official 0:c671a4833315 256 }
mbed_official 0:c671a4833315 257 }
mbed_official 0:c671a4833315 258
mbed_official 0:c671a4833315 259 /**
mbed_official 0:c671a4833315 260 * Increment the minute counter.
mbed_official 0:c671a4833315 261 */
mbed_official 0:c671a4833315 262 void increment_minute(void)
mbed_official 0:c671a4833315 263 {
mbed_official 0:c671a4833315 264 uint8_t minute = 0;
mbed_official 0:c671a4833315 265 ble_error_t err = _minute_char.get(*_server, minute);
mbed_official 0:c671a4833315 266 if (err) {
mbed_official 0:c671a4833315 267 printf("read of the minute value returned error %u\r\n", err);
mbed_official 0:c671a4833315 268 return;
mbed_official 0:c671a4833315 269 }
mbed_official 0:c671a4833315 270
mbed_official 0:c671a4833315 271 minute = (minute + 1) % 60;
mbed_official 0:c671a4833315 272
mbed_official 0:c671a4833315 273 err = _minute_char.set(*_server, minute);
mbed_official 0:c671a4833315 274 if (err) {
mbed_official 0:c671a4833315 275 printf("write of the minute value returned error %u\r\n", err);
mbed_official 0:c671a4833315 276 return;
mbed_official 0:c671a4833315 277 }
mbed_official 0:c671a4833315 278
mbed_official 0:c671a4833315 279 if (minute == 0) {
mbed_official 0:c671a4833315 280 increment_hour();
mbed_official 0:c671a4833315 281 }
mbed_official 0:c671a4833315 282 }
mbed_official 0:c671a4833315 283
mbed_official 0:c671a4833315 284 /**
mbed_official 0:c671a4833315 285 * Increment the hour counter.
mbed_official 0:c671a4833315 286 */
mbed_official 0:c671a4833315 287 void increment_hour(void)
mbed_official 0:c671a4833315 288 {
mbed_official 0:c671a4833315 289 uint8_t hour = 0;
mbed_official 0:c671a4833315 290 ble_error_t err = _hour_char.get(*_server, hour);
mbed_official 0:c671a4833315 291 if (err) {
mbed_official 0:c671a4833315 292 printf("read of the hour value returned error %u\r\n", err);
mbed_official 0:c671a4833315 293 return;
mbed_official 0:c671a4833315 294 }
mbed_official 0:c671a4833315 295
mbed_official 0:c671a4833315 296 hour = (hour + 1) % 24;
mbed_official 0:c671a4833315 297
mbed_official 0:c671a4833315 298 err = _hour_char.set(*_server, hour);
mbed_official 0:c671a4833315 299 if (err) {
mbed_official 0:c671a4833315 300 printf("write of the hour value returned error %u\r\n", err);
mbed_official 0:c671a4833315 301 return;
mbed_official 0:c671a4833315 302 }
mbed_official 0:c671a4833315 303 }
mbed_official 0:c671a4833315 304
mbed_official 0:c671a4833315 305 private:
mbed_official 0:c671a4833315 306 /**
mbed_official 0:c671a4833315 307 * Helper that construct an event handler from a member function of this
mbed_official 0:c671a4833315 308 * instance.
mbed_official 0:c671a4833315 309 */
mbed_official 0:c671a4833315 310 template<typename Arg>
mbed_official 0:c671a4833315 311 FunctionPointerWithContext<Arg> as_cb(void (Self::*member)(Arg))
mbed_official 0:c671a4833315 312 {
mbed_official 0:c671a4833315 313 return makeFunctionPointer(this, member);
mbed_official 0:c671a4833315 314 }
mbed_official 0:c671a4833315 315
mbed_official 0:c671a4833315 316 /**
mbed_official 0:c671a4833315 317 * Read, Write, Notify, Indicate Characteristic declaration helper.
mbed_official 0:c671a4833315 318 *
mbed_official 0:c671a4833315 319 * @tparam T type of data held by the characteristic.
mbed_official 0:c671a4833315 320 */
mbed_official 0:c671a4833315 321 template<typename T>
mbed_official 0:c671a4833315 322 class ReadWriteNotifyIndicateCharacteristic : public GattCharacteristic {
mbed_official 0:c671a4833315 323 public:
mbed_official 0:c671a4833315 324 /**
mbed_official 0:c671a4833315 325 * Construct a characteristic that can be read or written and emit
mbed_official 0:c671a4833315 326 * notification or indication.
mbed_official 0:c671a4833315 327 *
mbed_official 0:c671a4833315 328 * @param[in] uuid The UUID of the characteristic.
mbed_official 0:c671a4833315 329 * @param[in] initial_value Initial value contained by the characteristic.
mbed_official 0:c671a4833315 330 */
mbed_official 0:c671a4833315 331 ReadWriteNotifyIndicateCharacteristic(const UUID & uuid, const T& initial_value) :
mbed_official 0:c671a4833315 332 GattCharacteristic(
mbed_official 0:c671a4833315 333 /* UUID */ uuid,
mbed_official 0:c671a4833315 334 /* Initial value */ &_value,
mbed_official 0:c671a4833315 335 /* Value size */ sizeof(_value),
mbed_official 0:c671a4833315 336 /* Value capacity */ sizeof(_value),
mbed_official 0:c671a4833315 337 /* Properties */ GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
mbed_official 0:c671a4833315 338 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
mbed_official 0:c671a4833315 339 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
mbed_official 0:c671a4833315 340 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE,
mbed_official 0:c671a4833315 341 /* Descriptors */ NULL,
mbed_official 0:c671a4833315 342 /* Num descriptors */ 0,
mbed_official 0:c671a4833315 343 /* variable len */ false
mbed_official 0:c671a4833315 344 ),
mbed_official 0:c671a4833315 345 _value(initial_value) {
mbed_official 0:c671a4833315 346 }
mbed_official 0:c671a4833315 347
mbed_official 0:c671a4833315 348 /**
mbed_official 0:c671a4833315 349 * Get the value of this characteristic.
mbed_official 0:c671a4833315 350 *
mbed_official 0:c671a4833315 351 * @param[in] server GattServer instance that contain the characteristic
mbed_official 0:c671a4833315 352 * value.
mbed_official 0:c671a4833315 353 * @param[in] dst Variable that will receive the characteristic value.
mbed_official 0:c671a4833315 354 *
mbed_official 0:c671a4833315 355 * @return BLE_ERROR_NONE in case of success or an appropriate error code.
mbed_official 0:c671a4833315 356 */
mbed_official 0:c671a4833315 357 ble_error_t get(GattServer &server, T& dst) const
mbed_official 0:c671a4833315 358 {
mbed_official 0:c671a4833315 359 uint16_t value_length = sizeof(dst);
mbed_official 0:c671a4833315 360 return server.read(getValueHandle(), &dst, &value_length);
mbed_official 0:c671a4833315 361 }
mbed_official 0:c671a4833315 362
mbed_official 0:c671a4833315 363 /**
mbed_official 0:c671a4833315 364 * Assign a new value to this characteristic.
mbed_official 0:c671a4833315 365 *
mbed_official 0:c671a4833315 366 * @param[in] server GattServer instance that will receive the new value.
mbed_official 0:c671a4833315 367 * @param[in] value The new value to set.
mbed_official 0:c671a4833315 368 * @param[in] local_only Flag that determine if the change should be kept
mbed_official 0:c671a4833315 369 * locally or forwarded to subscribed clients.
mbed_official 0:c671a4833315 370 */
mbed_official 0:c671a4833315 371 ble_error_t set(
mbed_official 0:c671a4833315 372 GattServer &server, const uint8_t &value, bool local_only = false
mbed_official 0:c671a4833315 373 ) const {
mbed_official 0:c671a4833315 374 return server.write(getValueHandle(), &value, sizeof(value), local_only);
mbed_official 0:c671a4833315 375 }
mbed_official 0:c671a4833315 376
mbed_official 0:c671a4833315 377 private:
mbed_official 0:c671a4833315 378 uint8_t _value;
mbed_official 0:c671a4833315 379 };
mbed_official 0:c671a4833315 380
mbed_official 0:c671a4833315 381 ReadWriteNotifyIndicateCharacteristic<uint8_t> _hour_char;
mbed_official 0:c671a4833315 382 ReadWriteNotifyIndicateCharacteristic<uint8_t> _minute_char;
mbed_official 0:c671a4833315 383 ReadWriteNotifyIndicateCharacteristic<uint8_t> _second_char;
mbed_official 0:c671a4833315 384
mbed_official 0:c671a4833315 385 // list of the characteristics of the clock service
mbed_official 0:c671a4833315 386 GattCharacteristic* _clock_characteristics[3];
mbed_official 0:c671a4833315 387
mbed_official 0:c671a4833315 388 // demo service
mbed_official 0:c671a4833315 389 GattService _clock_service;
mbed_official 0:c671a4833315 390
mbed_official 0:c671a4833315 391 GattServer* _server;
mbed_official 0:c671a4833315 392 events::EventQueue *_event_queue;
mbed_official 0:c671a4833315 393 };
mbed_official 0:c671a4833315 394
mbed_official 0:c671a4833315 395 int main() {
mbed_official 0:c671a4833315 396 BLE &ble_interface = BLE::Instance();
mbed_official 0:c671a4833315 397 events::EventQueue event_queue;
mbed_official 0:c671a4833315 398 ClockService demo_service;
mbed_official 0:c671a4833315 399 BLEProcess ble_process(event_queue, ble_interface);
mbed_official 0:c671a4833315 400
mbed_official 0:c671a4833315 401 ble_process.on_init(callback(&demo_service, &ClockService::start));
mbed_official 0:c671a4833315 402
mbed_official 0:c671a4833315 403 // bind the event queue to the ble interface, initialize the interface
mbed_official 0:c671a4833315 404 // and start advertising
mbed_official 0:c671a4833315 405 ble_process.start();
mbed_official 0:c671a4833315 406
mbed_official 0:c671a4833315 407 // Process the event queue.
mbed_official 0:c671a4833315 408 event_queue.dispatch_forever();
mbed_official 0:c671a4833315 409
mbed_official 0:c671a4833315 410 return 0;
mbed_official 0:c671a4833315 411 }