BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /* mbed Microcontroller Library
gustavatmel 1:9c5af431a1f1 2 * Copyright (c) 2006-2013 ARM Limited
gustavatmel 1:9c5af431a1f1 3 *
gustavatmel 1:9c5af431a1f1 4 * Licensed under the Apache License, Version 2.0 (the "License");
gustavatmel 1:9c5af431a1f1 5 * you may not use this file except in compliance with the License.
gustavatmel 1:9c5af431a1f1 6 * You may obtain a copy of the License at
gustavatmel 1:9c5af431a1f1 7 *
gustavatmel 1:9c5af431a1f1 8 * http://www.apache.org/licenses/LICENSE-2.0
gustavatmel 1:9c5af431a1f1 9 *
gustavatmel 1:9c5af431a1f1 10 * Unless required by applicable law or agreed to in writing, software
gustavatmel 1:9c5af431a1f1 11 * distributed under the License is distributed on an "AS IS" BASIS,
gustavatmel 1:9c5af431a1f1 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
gustavatmel 1:9c5af431a1f1 13 * See the License for the specific language governing permissions and
gustavatmel 1:9c5af431a1f1 14 * limitations under the License.
gustavatmel 1:9c5af431a1f1 15 */
gustavatmel 1:9c5af431a1f1 16
gustavatmel 1:9c5af431a1f1 17 #include <stdio.h>
gustavatmel 1:9c5af431a1f1 18 #include "ble/BLE.h"
gustavatmel 1:9c5af431a1f1 19 #include "ble/BLEInstanceBase.h"
gustavatmel 1:9c5af431a1f1 20
gustavatmel 1:9c5af431a1f1 21 #if defined(TARGET_OTA_ENABLED)
gustavatmel 1:9c5af431a1f1 22 #include "ble/services/DFUService.h"
gustavatmel 1:9c5af431a1f1 23 #endif
gustavatmel 1:9c5af431a1f1 24
gustavatmel 1:9c5af431a1f1 25 #ifdef YOTTA_CFG_MBED_OS
gustavatmel 1:9c5af431a1f1 26 #include <minar/minar.h>
gustavatmel 1:9c5af431a1f1 27 #endif
gustavatmel 1:9c5af431a1f1 28
gustavatmel 1:9c5af431a1f1 29 #if !defined(YOTTA_CFG_MBED_OS)
gustavatmel 1:9c5af431a1f1 30 #include <mbed_error.h>
gustavatmel 1:9c5af431a1f1 31 #include <toolchain.h>
gustavatmel 1:9c5af431a1f1 32 #endif
gustavatmel 1:9c5af431a1f1 33
gustavatmel 1:9c5af431a1f1 34 static const char* error_strings[] = {
gustavatmel 1:9c5af431a1f1 35 "BLE_ERROR_NONE: No error",
gustavatmel 1:9c5af431a1f1 36 "BLE_ERROR_BUFFER_OVERFLOW: The requested action would cause a buffer overflow and has been aborted",
gustavatmel 1:9c5af431a1f1 37 "BLE_ERROR_NOT_IMPLEMENTED: Requested a feature that isn't yet implement or isn't supported by the target HW",
gustavatmel 1:9c5af431a1f1 38 "BLE_ERROR_PARAM_OUT_OF_RANGE: One of the supplied parameters is outside the valid range",
gustavatmel 1:9c5af431a1f1 39 "BLE_ERROR_INVALID_PARAM: One of the supplied parameters is invalid",
gustavatmel 1:9c5af431a1f1 40 "BLE_STACK_BUSY: The stack is busy",
gustavatmel 1:9c5af431a1f1 41 "BLE_ERROR_INVALID_STATE: Invalid state",
gustavatmel 1:9c5af431a1f1 42 "BLE_ERROR_NO_MEM: Out of Memory",
gustavatmel 1:9c5af431a1f1 43 "BLE_ERROR_OPERATION_NOT_PERMITTED: The operation requested is not permitted",
gustavatmel 1:9c5af431a1f1 44 "BLE_ERROR_INITIALIZATION_INCOMPLETE: The BLE subsystem has not completed its initialisation",
gustavatmel 1:9c5af431a1f1 45 "BLE_ERROR_ALREADY_INITIALIZED: The BLE system has already been initialised",
gustavatmel 1:9c5af431a1f1 46 "BLE_ERROR_UNSPECIFIED: Unknown error",
gustavatmel 1:9c5af431a1f1 47 "BLE_ERROR_INTERNAL_STACK_FAILURE: The platform-specific stack failed"
gustavatmel 1:9c5af431a1f1 48 };
gustavatmel 1:9c5af431a1f1 49
gustavatmel 1:9c5af431a1f1 50 const char* BLE::errorToString(ble_error_t error)
gustavatmel 1:9c5af431a1f1 51 {
gustavatmel 1:9c5af431a1f1 52 if (error > BLE_ERROR_INTERNAL_STACK_FAILURE) {
gustavatmel 1:9c5af431a1f1 53 return "Illegal error code";
gustavatmel 1:9c5af431a1f1 54 }
gustavatmel 1:9c5af431a1f1 55 return error_strings[error];
gustavatmel 1:9c5af431a1f1 56 }
gustavatmel 1:9c5af431a1f1 57
gustavatmel 1:9c5af431a1f1 58 ble_error_t
gustavatmel 1:9c5af431a1f1 59 BLE::initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext*> callback)
gustavatmel 1:9c5af431a1f1 60 {
gustavatmel 1:9c5af431a1f1 61 ble_error_t err = transport->init(instanceID, callback);
gustavatmel 1:9c5af431a1f1 62 if (err != BLE_ERROR_NONE) {
gustavatmel 1:9c5af431a1f1 63 return err;
gustavatmel 1:9c5af431a1f1 64 }
gustavatmel 1:9c5af431a1f1 65
gustavatmel 1:9c5af431a1f1 66 /* Platforms enabled for DFU should introduce the DFU Service into
gustavatmel 1:9c5af431a1f1 67 * applications automatically. */
gustavatmel 1:9c5af431a1f1 68 #if defined(TARGET_OTA_ENABLED)
gustavatmel 1:9c5af431a1f1 69 static DFUService dfu(*this); // defined static so that the object remains alive
gustavatmel 1:9c5af431a1f1 70 #endif // TARGET_OTA_ENABLED
gustavatmel 1:9c5af431a1f1 71
gustavatmel 1:9c5af431a1f1 72 return BLE_ERROR_NONE;
gustavatmel 1:9c5af431a1f1 73 }
gustavatmel 1:9c5af431a1f1 74
gustavatmel 1:9c5af431a1f1 75 /**
gustavatmel 1:9c5af431a1f1 76 * BLE::Instance() and BLE constructor rely upon a static array of initializers
gustavatmel 1:9c5af431a1f1 77 * to create actual BLE transport instances. A description of these instances
gustavatmel 1:9c5af431a1f1 78 * and initializers is supposed to be put in some .json file contributing to
gustavatmel 1:9c5af431a1f1 79 * yotta's configuration (typically in the target definition described by
gustavatmel 1:9c5af431a1f1 80 * target.json). Here's a sample:
gustavatmel 1:9c5af431a1f1 81 *
gustavatmel 1:9c5af431a1f1 82 * "config": {
gustavatmel 1:9c5af431a1f1 83 * ...
gustavatmel 1:9c5af431a1f1 84 * "ble_instances": {
gustavatmel 1:9c5af431a1f1 85 * "count": 1,
gustavatmel 1:9c5af431a1f1 86 * "0" : {
gustavatmel 1:9c5af431a1f1 87 * "initializer" : "createBLEInstance"
gustavatmel 1:9c5af431a1f1 88 * }
gustavatmel 1:9c5af431a1f1 89 * }
gustavatmel 1:9c5af431a1f1 90 * ...
gustavatmel 1:9c5af431a1f1 91 * }
gustavatmel 1:9c5af431a1f1 92 *
gustavatmel 1:9c5af431a1f1 93 * The following macros result in translating the above config into a static
gustavatmel 1:9c5af431a1f1 94 * array: instanceConstructors.
gustavatmel 1:9c5af431a1f1 95 */
gustavatmel 1:9c5af431a1f1 96 #ifdef YOTTA_CFG_BLE_INSTANCES_COUNT
gustavatmel 1:9c5af431a1f1 97 #define CONCATENATE(A, B) A ## B
gustavatmel 1:9c5af431a1f1 98 #define EXPAND(X) X /* this adds a level of indirection needed to allow macro-expansion following a token-paste operation (see use of CONCATENATE() below). */
gustavatmel 1:9c5af431a1f1 99
gustavatmel 1:9c5af431a1f1 100 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1 YOTTA_CFG_BLE_INSTANCES_0_INITIALIZER
gustavatmel 1:9c5af431a1f1 101 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1, YOTTA_CFG_BLE_INSTANCES_1_INITIALIZER
gustavatmel 1:9c5af431a1f1 102 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2, YOTTA_CFG_BLE_INSTANCES_2_INITIALIZER
gustavatmel 1:9c5af431a1f1 103 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3, YOTTA_CFG_BLE_INSTANCES_3_INITIALIZER
gustavatmel 1:9c5af431a1f1 104 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_5 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4, YOTTA_CFG_BLE_INSTANCES_4_INITIALIZER
gustavatmel 1:9c5af431a1f1 105 /* ... add more of the above if ever needed */
gustavatmel 1:9c5af431a1f1 106
gustavatmel 1:9c5af431a1f1 107 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(N) EXPAND(CONCATENATE(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_, N))
gustavatmel 1:9c5af431a1f1 108 #elif !defined(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS)
gustavatmel 1:9c5af431a1f1 109 /*
gustavatmel 1:9c5af431a1f1 110 * The following applies when building without yotta. By default BLE_API provides
gustavatmel 1:9c5af431a1f1 111 * a trivial initializer list containing a single constructor: createBLEInstance.
gustavatmel 1:9c5af431a1f1 112 * This may be overridden.
gustavatmel 1:9c5af431a1f1 113 */
gustavatmel 1:9c5af431a1f1 114 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS createBLEInstance
gustavatmel 1:9c5af431a1f1 115
gustavatmel 1:9c5af431a1f1 116 // yotta unlike mbed-cli has proper dependency mechanisms
gustavatmel 1:9c5af431a1f1 117 // It is not required to defined a stub for createBLEInstance
gustavatmel 1:9c5af431a1f1 118 #if !defined(YOTTA_CFG_MBED_OS)
gustavatmel 1:9c5af431a1f1 119
gustavatmel 1:9c5af431a1f1 120 // this stub is required by ARMCC otherwise link will systematically fail
gustavatmel 1:9c5af431a1f1 121 MBED_WEAK BLEInstanceBase* createBLEInstance() {
gustavatmel 1:9c5af431a1f1 122 error("Please provide an implementation for mbed BLE");
gustavatmel 1:9c5af431a1f1 123 return NULL;
gustavatmel 1:9c5af431a1f1 124 }
gustavatmel 1:9c5af431a1f1 125
gustavatmel 1:9c5af431a1f1 126 #endif
gustavatmel 1:9c5af431a1f1 127
gustavatmel 1:9c5af431a1f1 128
gustavatmel 1:9c5af431a1f1 129 #endif /* YOTTA_CFG_BLE_INSTANCES_COUNT */
gustavatmel 1:9c5af431a1f1 130
gustavatmel 1:9c5af431a1f1 131 typedef BLEInstanceBase *(*InstanceConstructor_t)(void);
gustavatmel 1:9c5af431a1f1 132 static const InstanceConstructor_t instanceConstructors[BLE::NUM_INSTANCES] = {
gustavatmel 1:9c5af431a1f1 133 #ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
gustavatmel 1:9c5af431a1f1 134 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS
gustavatmel 1:9c5af431a1f1 135 #else
gustavatmel 1:9c5af431a1f1 136 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(YOTTA_CFG_BLE_INSTANCES_COUNT)
gustavatmel 1:9c5af431a1f1 137 #endif
gustavatmel 1:9c5af431a1f1 138 };
gustavatmel 1:9c5af431a1f1 139
gustavatmel 1:9c5af431a1f1 140 BLE &
gustavatmel 1:9c5af431a1f1 141 BLE::Instance(InstanceID_t id)
gustavatmel 1:9c5af431a1f1 142 {
gustavatmel 1:9c5af431a1f1 143 static BLE *singletons[NUM_INSTANCES];
gustavatmel 1:9c5af431a1f1 144 if (id < NUM_INSTANCES) {
gustavatmel 1:9c5af431a1f1 145 if (singletons[id] == NULL) {
gustavatmel 1:9c5af431a1f1 146 singletons[id] = new BLE(id); /* This object will never be freed. */
gustavatmel 1:9c5af431a1f1 147 }
gustavatmel 1:9c5af431a1f1 148
gustavatmel 1:9c5af431a1f1 149 return *singletons[id];
gustavatmel 1:9c5af431a1f1 150 }
gustavatmel 1:9c5af431a1f1 151
gustavatmel 1:9c5af431a1f1 152 /* we come here only in the case of a bad interfaceID. */
gustavatmel 1:9c5af431a1f1 153 static BLE badSingleton(NUM_INSTANCES /* this is a bad index; and will result in a NULL transport. */);
gustavatmel 1:9c5af431a1f1 154 return badSingleton;
gustavatmel 1:9c5af431a1f1 155 }
gustavatmel 1:9c5af431a1f1 156
gustavatmel 1:9c5af431a1f1 157 #ifdef YOTTA_CFG_MBED_OS
gustavatmel 1:9c5af431a1f1 158 void defaultSchedulingCallback(BLE::OnEventsToProcessCallbackContext* params) {
gustavatmel 1:9c5af431a1f1 159 minar::Scheduler::postCallback(&params->ble, &BLE::processEvents);
gustavatmel 1:9c5af431a1f1 160 }
gustavatmel 1:9c5af431a1f1 161 #else
gustavatmel 1:9c5af431a1f1 162 #define defaultSchedulingCallback NULL
gustavatmel 1:9c5af431a1f1 163 #endif
gustavatmel 1:9c5af431a1f1 164
gustavatmel 1:9c5af431a1f1 165
gustavatmel 1:9c5af431a1f1 166 BLE::BLE(InstanceID_t instanceIDIn) : instanceID(instanceIDIn), transport(),
gustavatmel 1:9c5af431a1f1 167 whenEventsToProcess(defaultSchedulingCallback),
gustavatmel 1:9c5af431a1f1 168 event_signaled(false)
gustavatmel 1:9c5af431a1f1 169 {
gustavatmel 1:9c5af431a1f1 170 static BLEInstanceBase *transportInstances[NUM_INSTANCES];
gustavatmel 1:9c5af431a1f1 171
gustavatmel 1:9c5af431a1f1 172 if (instanceID < NUM_INSTANCES) {
gustavatmel 1:9c5af431a1f1 173 if (!transportInstances[instanceID]) {
gustavatmel 1:9c5af431a1f1 174 transportInstances[instanceID] = instanceConstructors[instanceID](); /* Call the stack's initializer for the transport object. */
gustavatmel 1:9c5af431a1f1 175 }
gustavatmel 1:9c5af431a1f1 176 transport = transportInstances[instanceID];
gustavatmel 1:9c5af431a1f1 177 } else {
gustavatmel 1:9c5af431a1f1 178 transport = NULL;
gustavatmel 1:9c5af431a1f1 179 }
gustavatmel 1:9c5af431a1f1 180 }
gustavatmel 1:9c5af431a1f1 181
gustavatmel 1:9c5af431a1f1 182 bool BLE::hasInitialized(void) const
gustavatmel 1:9c5af431a1f1 183 {
gustavatmel 1:9c5af431a1f1 184 if (!transport) {
gustavatmel 1:9c5af431a1f1 185 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 186 }
gustavatmel 1:9c5af431a1f1 187
gustavatmel 1:9c5af431a1f1 188 return transport->hasInitialized();
gustavatmel 1:9c5af431a1f1 189 }
gustavatmel 1:9c5af431a1f1 190
gustavatmel 1:9c5af431a1f1 191 ble_error_t BLE::shutdown(void)
gustavatmel 1:9c5af431a1f1 192 {
gustavatmel 1:9c5af431a1f1 193 if (!transport) {
gustavatmel 1:9c5af431a1f1 194 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 195 }
gustavatmel 1:9c5af431a1f1 196
gustavatmel 1:9c5af431a1f1 197 event_signaled = false;
gustavatmel 1:9c5af431a1f1 198 return transport->shutdown();
gustavatmel 1:9c5af431a1f1 199 }
gustavatmel 1:9c5af431a1f1 200
gustavatmel 1:9c5af431a1f1 201 const char *BLE::getVersion(void)
gustavatmel 1:9c5af431a1f1 202 {
gustavatmel 1:9c5af431a1f1 203 if (!transport) {
gustavatmel 1:9c5af431a1f1 204 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 205 }
gustavatmel 1:9c5af431a1f1 206
gustavatmel 1:9c5af431a1f1 207 return transport->getVersion();
gustavatmel 1:9c5af431a1f1 208 }
gustavatmel 1:9c5af431a1f1 209
gustavatmel 1:9c5af431a1f1 210 const Gap &BLE::gap() const
gustavatmel 1:9c5af431a1f1 211 {
gustavatmel 1:9c5af431a1f1 212 if (!transport) {
gustavatmel 1:9c5af431a1f1 213 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 214 }
gustavatmel 1:9c5af431a1f1 215
gustavatmel 1:9c5af431a1f1 216 return transport->getGap();
gustavatmel 1:9c5af431a1f1 217 }
gustavatmel 1:9c5af431a1f1 218
gustavatmel 1:9c5af431a1f1 219 Gap &BLE::gap()
gustavatmel 1:9c5af431a1f1 220 {
gustavatmel 1:9c5af431a1f1 221 if (!transport) {
gustavatmel 1:9c5af431a1f1 222 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 223 }
gustavatmel 1:9c5af431a1f1 224
gustavatmel 1:9c5af431a1f1 225 return transport->getGap();
gustavatmel 1:9c5af431a1f1 226 }
gustavatmel 1:9c5af431a1f1 227
gustavatmel 1:9c5af431a1f1 228 const GattServer& BLE::gattServer() const
gustavatmel 1:9c5af431a1f1 229 {
gustavatmel 1:9c5af431a1f1 230 if (!transport) {
gustavatmel 1:9c5af431a1f1 231 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 232 }
gustavatmel 1:9c5af431a1f1 233
gustavatmel 1:9c5af431a1f1 234 return transport->getGattServer();
gustavatmel 1:9c5af431a1f1 235 }
gustavatmel 1:9c5af431a1f1 236
gustavatmel 1:9c5af431a1f1 237 GattServer& BLE::gattServer()
gustavatmel 1:9c5af431a1f1 238 {
gustavatmel 1:9c5af431a1f1 239 if (!transport) {
gustavatmel 1:9c5af431a1f1 240 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 241 }
gustavatmel 1:9c5af431a1f1 242
gustavatmel 1:9c5af431a1f1 243 return transport->getGattServer();
gustavatmel 1:9c5af431a1f1 244 }
gustavatmel 1:9c5af431a1f1 245
gustavatmel 1:9c5af431a1f1 246 const GattClient& BLE::gattClient() const
gustavatmel 1:9c5af431a1f1 247 {
gustavatmel 1:9c5af431a1f1 248 if (!transport) {
gustavatmel 1:9c5af431a1f1 249 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 250 }
gustavatmel 1:9c5af431a1f1 251
gustavatmel 1:9c5af431a1f1 252 return transport->getGattClient();
gustavatmel 1:9c5af431a1f1 253 }
gustavatmel 1:9c5af431a1f1 254
gustavatmel 1:9c5af431a1f1 255 GattClient& BLE::gattClient()
gustavatmel 1:9c5af431a1f1 256 {
gustavatmel 1:9c5af431a1f1 257 if (!transport) {
gustavatmel 1:9c5af431a1f1 258 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 259 }
gustavatmel 1:9c5af431a1f1 260
gustavatmel 1:9c5af431a1f1 261 return transport->getGattClient();
gustavatmel 1:9c5af431a1f1 262 }
gustavatmel 1:9c5af431a1f1 263
gustavatmel 1:9c5af431a1f1 264 const SecurityManager& BLE::securityManager() const
gustavatmel 1:9c5af431a1f1 265 {
gustavatmel 1:9c5af431a1f1 266 if (!transport) {
gustavatmel 1:9c5af431a1f1 267 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 268 }
gustavatmel 1:9c5af431a1f1 269
gustavatmel 1:9c5af431a1f1 270 return transport->getSecurityManager();
gustavatmel 1:9c5af431a1f1 271 }
gustavatmel 1:9c5af431a1f1 272
gustavatmel 1:9c5af431a1f1 273 SecurityManager& BLE::securityManager()
gustavatmel 1:9c5af431a1f1 274 {
gustavatmel 1:9c5af431a1f1 275 if (!transport) {
gustavatmel 1:9c5af431a1f1 276 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 277 }
gustavatmel 1:9c5af431a1f1 278
gustavatmel 1:9c5af431a1f1 279 return transport->getSecurityManager();
gustavatmel 1:9c5af431a1f1 280 }
gustavatmel 1:9c5af431a1f1 281
gustavatmel 1:9c5af431a1f1 282 void BLE::waitForEvent(void)
gustavatmel 1:9c5af431a1f1 283 {
gustavatmel 1:9c5af431a1f1 284 if (!transport) {
gustavatmel 1:9c5af431a1f1 285 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 286 }
gustavatmel 1:9c5af431a1f1 287
gustavatmel 1:9c5af431a1f1 288 transport->waitForEvent();
gustavatmel 1:9c5af431a1f1 289 }
gustavatmel 1:9c5af431a1f1 290
gustavatmel 1:9c5af431a1f1 291 void BLE::processEvents()
gustavatmel 1:9c5af431a1f1 292 {
gustavatmel 1:9c5af431a1f1 293 if (event_signaled == false) {
gustavatmel 1:9c5af431a1f1 294 return;
gustavatmel 1:9c5af431a1f1 295 }
gustavatmel 1:9c5af431a1f1 296
gustavatmel 1:9c5af431a1f1 297 if (!transport) {
gustavatmel 1:9c5af431a1f1 298 error("bad handle to underlying transport");
gustavatmel 1:9c5af431a1f1 299 }
gustavatmel 1:9c5af431a1f1 300
gustavatmel 1:9c5af431a1f1 301 event_signaled = false;
gustavatmel 1:9c5af431a1f1 302
gustavatmel 1:9c5af431a1f1 303 transport->processEvents();
gustavatmel 1:9c5af431a1f1 304 }
gustavatmel 1:9c5af431a1f1 305
gustavatmel 1:9c5af431a1f1 306 void BLE::onEventsToProcess(const BLE::OnEventsToProcessCallback_t& callback)
gustavatmel 1:9c5af431a1f1 307 {
gustavatmel 1:9c5af431a1f1 308 whenEventsToProcess = callback;
gustavatmel 1:9c5af431a1f1 309
gustavatmel 1:9c5af431a1f1 310 // If events were previously signaled but the handler was not in place then
gustavatmel 1:9c5af431a1f1 311 // signal immediately events availability
gustavatmel 1:9c5af431a1f1 312 if (event_signaled && whenEventsToProcess) {
gustavatmel 1:9c5af431a1f1 313 OnEventsToProcessCallbackContext params = {
gustavatmel 1:9c5af431a1f1 314 *this
gustavatmel 1:9c5af431a1f1 315 };
gustavatmel 1:9c5af431a1f1 316 whenEventsToProcess(&params);
gustavatmel 1:9c5af431a1f1 317 }
gustavatmel 1:9c5af431a1f1 318 }
gustavatmel 1:9c5af431a1f1 319
gustavatmel 1:9c5af431a1f1 320 void BLE::signalEventsToProcess()
gustavatmel 1:9c5af431a1f1 321 {
gustavatmel 1:9c5af431a1f1 322 if (event_signaled == true) {
gustavatmel 1:9c5af431a1f1 323 return;
gustavatmel 1:9c5af431a1f1 324 }
gustavatmel 1:9c5af431a1f1 325
gustavatmel 1:9c5af431a1f1 326 event_signaled = true;
gustavatmel 1:9c5af431a1f1 327
gustavatmel 1:9c5af431a1f1 328 if (whenEventsToProcess) {
gustavatmel 1:9c5af431a1f1 329 OnEventsToProcessCallbackContext params = {
gustavatmel 1:9c5af431a1f1 330 *this
gustavatmel 1:9c5af431a1f1 331 };
gustavatmel 1:9c5af431a1f1 332 whenEventsToProcess(&params);
gustavatmel 1:9c5af431a1f1 333 }
gustavatmel 1:9c5af431a1f1 334 }