Demonstration of possible usage of the GattServer

Dependents:   mbed-os-example-ble-GattServer_ECG

Committer:
mbed_official
Date:
Mon Mar 25 15:01:13 2019 +0000
Revision:
19:622c672f6d5f
Parent:
14:de95c96e3305
Merge pull request #225 from paul-szczepanek-arm/master

fix using mixed APIs in Gattserver example
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 14:de95c96e3305 1 /* mbed Microcontroller Library
mbed_official 14:de95c96e3305 2 * Copyright (c) 2017 ARM Limited
mbed_official 14:de95c96e3305 3 *
mbed_official 14:de95c96e3305 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 14:de95c96e3305 5 * you may not use this file except in compliance with the License.
mbed_official 14:de95c96e3305 6 * You may obtain a copy of the License at
mbed_official 14:de95c96e3305 7 *
mbed_official 14:de95c96e3305 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 14:de95c96e3305 9 *
mbed_official 14:de95c96e3305 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 14:de95c96e3305 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 14:de95c96e3305 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 14:de95c96e3305 13 * See the License for the specific language governing permissions and
mbed_official 14:de95c96e3305 14 * limitations under the License.
mbed_official 14:de95c96e3305 15 */
mbed_official 14:de95c96e3305 16
mbed_official 14:de95c96e3305 17 #ifndef GATT_SERVER_EXAMPLE_BLE_PROCESS_H_
mbed_official 14:de95c96e3305 18 #define GATT_SERVER_EXAMPLE_BLE_PROCESS_H_
mbed_official 14:de95c96e3305 19
mbed_official 14:de95c96e3305 20 #include <stdint.h>
mbed_official 14:de95c96e3305 21 #include <stdio.h>
mbed_official 14:de95c96e3305 22
mbed_official 14:de95c96e3305 23 #include "events/EventQueue.h"
mbed_official 14:de95c96e3305 24 #include "platform/Callback.h"
mbed_official 14:de95c96e3305 25 #include "platform/NonCopyable.h"
mbed_official 14:de95c96e3305 26
mbed_official 14:de95c96e3305 27 #include "ble/BLE.h"
mbed_official 14:de95c96e3305 28 #include "ble/Gap.h"
mbed_official 14:de95c96e3305 29 #include "ble/GapAdvertisingParams.h"
mbed_official 14:de95c96e3305 30 #include "ble/GapAdvertisingData.h"
mbed_official 14:de95c96e3305 31 #include "ble/FunctionPointerWithContext.h"
mbed_official 14:de95c96e3305 32
mbed_official 14:de95c96e3305 33 /**
mbed_official 14:de95c96e3305 34 * Handle initialization adn shutdown of the BLE Instance.
mbed_official 14:de95c96e3305 35 *
mbed_official 14:de95c96e3305 36 * Setup advertising payload and manage advertising state.
mbed_official 14:de95c96e3305 37 * Delegate to GattClientProcess once the connection is established.
mbed_official 14:de95c96e3305 38 */
mbed_official 14:de95c96e3305 39 class BLEProcess : private mbed::NonCopyable<BLEProcess> {
mbed_official 14:de95c96e3305 40 public:
mbed_official 14:de95c96e3305 41 /**
mbed_official 14:de95c96e3305 42 * Construct a BLEProcess from an event queue and a ble interface.
mbed_official 14:de95c96e3305 43 *
mbed_official 14:de95c96e3305 44 * Call start() to initiate ble processing.
mbed_official 14:de95c96e3305 45 */
mbed_official 14:de95c96e3305 46 BLEProcess(events::EventQueue &event_queue, BLE &ble_interface) :
mbed_official 14:de95c96e3305 47 _event_queue(event_queue),
mbed_official 14:de95c96e3305 48 _ble_interface(ble_interface),
mbed_official 14:de95c96e3305 49 _post_init_cb() {
mbed_official 14:de95c96e3305 50 }
mbed_official 14:de95c96e3305 51
mbed_official 14:de95c96e3305 52 ~BLEProcess()
mbed_official 14:de95c96e3305 53 {
mbed_official 14:de95c96e3305 54 stop();
mbed_official 14:de95c96e3305 55 }
mbed_official 14:de95c96e3305 56
mbed_official 14:de95c96e3305 57 /**
mbed_official 14:de95c96e3305 58 * Subscription to the ble interface initialization event.
mbed_official 14:de95c96e3305 59 *
mbed_official 14:de95c96e3305 60 * @param[in] cb The callback object that will be called when the ble
mbed_official 14:de95c96e3305 61 * interface is initialized.
mbed_official 14:de95c96e3305 62 */
mbed_official 14:de95c96e3305 63 void on_init(mbed::Callback<void(BLE&, events::EventQueue&)> cb)
mbed_official 14:de95c96e3305 64 {
mbed_official 14:de95c96e3305 65 _post_init_cb = cb;
mbed_official 14:de95c96e3305 66 }
mbed_official 14:de95c96e3305 67
mbed_official 14:de95c96e3305 68 /**
mbed_official 14:de95c96e3305 69 * Initialize the ble interface, configure it and start advertising.
mbed_official 14:de95c96e3305 70 */
mbed_official 14:de95c96e3305 71 bool start()
mbed_official 14:de95c96e3305 72 {
mbed_official 14:de95c96e3305 73 printf("Ble process started.\r\n");
mbed_official 14:de95c96e3305 74
mbed_official 14:de95c96e3305 75 if (_ble_interface.hasInitialized()) {
mbed_official 14:de95c96e3305 76 printf("Error: the ble instance has already been initialized.\r\n");
mbed_official 14:de95c96e3305 77 return false;
mbed_official 14:de95c96e3305 78 }
mbed_official 14:de95c96e3305 79
mbed_official 14:de95c96e3305 80 _ble_interface.onEventsToProcess(
mbed_official 14:de95c96e3305 81 makeFunctionPointer(this, &BLEProcess::schedule_ble_events)
mbed_official 14:de95c96e3305 82 );
mbed_official 14:de95c96e3305 83
mbed_official 14:de95c96e3305 84 ble_error_t error = _ble_interface.init(
mbed_official 14:de95c96e3305 85 this, &BLEProcess::when_init_complete
mbed_official 14:de95c96e3305 86 );
mbed_official 14:de95c96e3305 87
mbed_official 14:de95c96e3305 88 if (error) {
mbed_official 14:de95c96e3305 89 printf("Error: %u returned by BLE::init.\r\n", error);
mbed_official 14:de95c96e3305 90 return false;
mbed_official 14:de95c96e3305 91 }
mbed_official 14:de95c96e3305 92
mbed_official 14:de95c96e3305 93 return true;
mbed_official 14:de95c96e3305 94 }
mbed_official 14:de95c96e3305 95
mbed_official 14:de95c96e3305 96 /**
mbed_official 14:de95c96e3305 97 * Close existing connections and stop the process.
mbed_official 14:de95c96e3305 98 */
mbed_official 14:de95c96e3305 99 void stop()
mbed_official 14:de95c96e3305 100 {
mbed_official 14:de95c96e3305 101 if (_ble_interface.hasInitialized()) {
mbed_official 14:de95c96e3305 102 _ble_interface.shutdown();
mbed_official 14:de95c96e3305 103 printf("Ble process stopped.");
mbed_official 14:de95c96e3305 104 }
mbed_official 14:de95c96e3305 105 }
mbed_official 14:de95c96e3305 106
mbed_official 14:de95c96e3305 107 private:
mbed_official 14:de95c96e3305 108
mbed_official 14:de95c96e3305 109 /**
mbed_official 14:de95c96e3305 110 * Schedule processing of events from the BLE middleware in the event queue.
mbed_official 14:de95c96e3305 111 */
mbed_official 14:de95c96e3305 112 void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *event)
mbed_official 14:de95c96e3305 113 {
mbed_official 14:de95c96e3305 114 _event_queue.call(mbed::callback(&event->ble, &BLE::processEvents));
mbed_official 14:de95c96e3305 115 }
mbed_official 14:de95c96e3305 116
mbed_official 14:de95c96e3305 117 /**
mbed_official 14:de95c96e3305 118 * Sets up adverting payload and start advertising.
mbed_official 14:de95c96e3305 119 *
mbed_official 14:de95c96e3305 120 * This function is invoked when the ble interface is initialized.
mbed_official 14:de95c96e3305 121 */
mbed_official 14:de95c96e3305 122 void when_init_complete(BLE::InitializationCompleteCallbackContext *event)
mbed_official 14:de95c96e3305 123 {
mbed_official 14:de95c96e3305 124 if (event->error) {
mbed_official 14:de95c96e3305 125 printf("Error %u during the initialization\r\n", event->error);
mbed_official 14:de95c96e3305 126 return;
mbed_official 14:de95c96e3305 127 }
mbed_official 14:de95c96e3305 128 printf("Ble instance initialized\r\n");
mbed_official 14:de95c96e3305 129
mbed_official 14:de95c96e3305 130 Gap &gap = _ble_interface.gap();
mbed_official 19:622c672f6d5f 131 gap.onConnection(this, &BLEProcess::when_connection);
mbed_official 19:622c672f6d5f 132 gap.onDisconnection(this, &BLEProcess::when_disconnection);
mbed_official 19:622c672f6d5f 133
mbed_official 19:622c672f6d5f 134 if (!set_advertising_parameters()) {
mbed_official 14:de95c96e3305 135 return;
mbed_official 14:de95c96e3305 136 }
mbed_official 14:de95c96e3305 137
mbed_official 19:622c672f6d5f 138 if (!set_advertising_data()) {
mbed_official 19:622c672f6d5f 139 return;
mbed_official 19:622c672f6d5f 140 }
mbed_official 14:de95c96e3305 141
mbed_official 19:622c672f6d5f 142 if (!start_advertising()) {
mbed_official 19:622c672f6d5f 143 return;
mbed_official 19:622c672f6d5f 144 }
mbed_official 14:de95c96e3305 145
mbed_official 19:622c672f6d5f 146 if (_post_init_cb) {
mbed_official 14:de95c96e3305 147 _post_init_cb(_ble_interface, _event_queue);
mbed_official 14:de95c96e3305 148 }
mbed_official 14:de95c96e3305 149 }
mbed_official 14:de95c96e3305 150
mbed_official 14:de95c96e3305 151 void when_connection(const Gap::ConnectionCallbackParams_t *connection_event)
mbed_official 14:de95c96e3305 152 {
mbed_official 14:de95c96e3305 153 printf("Connected.\r\n");
mbed_official 14:de95c96e3305 154 }
mbed_official 14:de95c96e3305 155
mbed_official 14:de95c96e3305 156 void when_disconnection(const Gap::DisconnectionCallbackParams_t *event)
mbed_official 14:de95c96e3305 157 {
mbed_official 14:de95c96e3305 158 printf("Disconnected.\r\n");
mbed_official 14:de95c96e3305 159 start_advertising();
mbed_official 14:de95c96e3305 160 }
mbed_official 14:de95c96e3305 161
mbed_official 19:622c672f6d5f 162 bool start_advertising(void)
mbed_official 14:de95c96e3305 163 {
mbed_official 19:622c672f6d5f 164 Gap &gap = _ble_interface.gap();
mbed_official 19:622c672f6d5f 165
mbed_official 19:622c672f6d5f 166 /* Start advertising the set */
mbed_official 19:622c672f6d5f 167 ble_error_t error = gap.startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
mbed_official 19:622c672f6d5f 168
mbed_official 14:de95c96e3305 169 if (error) {
mbed_official 14:de95c96e3305 170 printf("Error %u during gap.startAdvertising.\r\n", error);
mbed_official 19:622c672f6d5f 171 return false;
mbed_official 14:de95c96e3305 172 } else {
mbed_official 14:de95c96e3305 173 printf("Advertising started.\r\n");
mbed_official 19:622c672f6d5f 174 return true;
mbed_official 14:de95c96e3305 175 }
mbed_official 14:de95c96e3305 176 }
mbed_official 14:de95c96e3305 177
mbed_official 19:622c672f6d5f 178 bool set_advertising_parameters()
mbed_official 14:de95c96e3305 179 {
mbed_official 19:622c672f6d5f 180 Gap &gap = _ble_interface.gap();
mbed_official 14:de95c96e3305 181
mbed_official 19:622c672f6d5f 182 ble_error_t error = gap.setAdvertisingParameters(
mbed_official 19:622c672f6d5f 183 ble::LEGACY_ADVERTISING_HANDLE,
mbed_official 19:622c672f6d5f 184 ble::AdvertisingParameters()
mbed_official 14:de95c96e3305 185 );
mbed_official 14:de95c96e3305 186
mbed_official 19:622c672f6d5f 187 if (error) {
mbed_official 19:622c672f6d5f 188 printf("Gap::setAdvertisingParameters() failed with error %d", error);
mbed_official 19:622c672f6d5f 189 return false;
mbed_official 19:622c672f6d5f 190 }
mbed_official 19:622c672f6d5f 191
mbed_official 19:622c672f6d5f 192 return true;
mbed_official 19:622c672f6d5f 193 }
mbed_official 19:622c672f6d5f 194
mbed_official 19:622c672f6d5f 195 bool set_advertising_data()
mbed_official 19:622c672f6d5f 196 {
mbed_official 19:622c672f6d5f 197 Gap &gap = _ble_interface.gap();
mbed_official 19:622c672f6d5f 198
mbed_official 19:622c672f6d5f 199 /* Use the simple builder to construct the payload; it fails at runtime
mbed_official 19:622c672f6d5f 200 * if there is not enough space left in the buffer */
mbed_official 19:622c672f6d5f 201 ble_error_t error = gap.setAdvertisingPayload(
mbed_official 19:622c672f6d5f 202 ble::LEGACY_ADVERTISING_HANDLE,
mbed_official 19:622c672f6d5f 203 ble::AdvertisingDataSimpleBuilder<ble::LEGACY_ADVERTISING_MAX_SIZE>()
mbed_official 19:622c672f6d5f 204 .setFlags()
mbed_official 19:622c672f6d5f 205 .setName("GattServer")
mbed_official 19:622c672f6d5f 206 .getAdvertisingData()
mbed_official 14:de95c96e3305 207 );
mbed_official 14:de95c96e3305 208
mbed_official 19:622c672f6d5f 209 if (error) {
mbed_official 19:622c672f6d5f 210 printf("Gap::setAdvertisingPayload() failed with error %d", error);
mbed_official 19:622c672f6d5f 211 return false;
mbed_official 19:622c672f6d5f 212 }
mbed_official 14:de95c96e3305 213
mbed_official 19:622c672f6d5f 214 return true;
mbed_official 14:de95c96e3305 215 }
mbed_official 14:de95c96e3305 216
mbed_official 14:de95c96e3305 217 events::EventQueue &_event_queue;
mbed_official 14:de95c96e3305 218 BLE &_ble_interface;
mbed_official 14:de95c96e3305 219 mbed::Callback<void(BLE&, events::EventQueue&)> _post_init_cb;
mbed_official 14:de95c96e3305 220 };
mbed_official 14:de95c96e3305 221
mbed_official 14:de95c96e3305 222 #endif /* GATT_SERVER_EXAMPLE_BLE_PROCESS_H_ */