For MAX32630FTHR Demo Board: Controls LEDs on the demo board interfaced through BLE peripheral testing apps like LightBlue for iOS. Debug output on serial port.

Dependencies:   max32630fthr

Committer:
Lugs
Date:
Sat Nov 09 01:44:19 2019 +0000
Revision:
20:efe8deed8f74
Parent:
0:c671a4833315
For MAX32630FTHR Demo Board:; Controls LEDs on the demo board using BLE GATT interfaced through BLE testing apps on phones (lightblue for iOS)

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