extend
Fork of BLE_API by
source/BLE.cpp
- Committer:
- rgrover1
- Date:
- 2015-09-29
- Revision:
- 822:a0f080d1e836
- Parent:
- 821:86038b69609c
- Child:
- 823:3253c3910b82
File content as of revision 822:a0f080d1e836:
/* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ble/BLE.h" #if defined(TARGET_OTA_ENABLED) #include "ble/services/DFUService.h" #endif ble_error_t BLE::init() { ble_error_t err = transport->init(); if (err != BLE_ERROR_NONE) { return err; } /* Platforms enabled for DFU should introduce the DFU Service into * applications automatically. */ #if defined(TARGET_OTA_ENABLED) static DFUService dfu(*this); // defined static so that the object remains alive #endif // TARGET_OTA_ENABLED return BLE_ERROR_NONE; } /** * BLE::Instance() and BLE constructor rely upon a static array of initializers * to create actual BLE transport instances. A description of these instances * and initializers is supposed to be put in some .json file contributing to * yotta's configuration (typically the target.json). Here's a sample: * * "config": { * ... * "ble_instances": { * "count": 1, * "0" : { * "initializer" : "createBLEInstance" * } * } * } * * The following macros result in translating the above config into a static * array: instanceConstructors. */ #ifdef YOTTA_CFG_BLE_INSTANCES_COUNT #define CONCATENATE(A, B) A ## B #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). */ #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1 YOTTA_CFG_BLE_INSTANCES_0_INITIALIZER #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1, YOTTA_CFG_BLE_INSTANCES_1_INITIALIZER #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2, YOTTA_CFG_BLE_INSTANCES_2_INITIALIZER #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3, YOTTA_CFG_BLE_INSTANCES_3_INITIALIZER #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_5 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4, YOTTA_CFG_BLE_INSTANCES_4_INITIALIZER /* ... add more of the above if ever needed */ #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(N) EXPAND(CONCATENATE(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_, N)) #endif /* YOTTA_CFG_BLE_INSTANCES_COUNT */ typedef BLEInstanceBase *(*InstanceConstructor_t)(void); static const InstanceConstructor_t instanceConstructors[BLE::NUM_INSTANCES] = { #ifndef YOTTA_CFG_BLE_INSTANCES_COUNT createBLEInstance #else INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(YOTTA_CFG_BLE_INSTANCES_COUNT) #endif }; BLE::BLE & BLE::Instance(InstanceID_t id) { static BLE *singletons[NUM_INSTANCES]; if (id < NUM_INSTANCES) { if (singletons[id] == NULL) { singletons[id] = new BLE(id); /* This object will never be freed. */ } return *singletons[id]; } /* we come here only in the case of a bad interfaceID. */ static BLE badSingleton(NUM_INSTANCES /* this is a bad index; and will result in a NULL transport. */); return badSingleton; } BLE::BLE(InstanceID_t instanceID) : transport() { static BLEInstanceBase *transportInstances[NUM_INSTANCES]; if (instanceID < NUM_INSTANCES) { if (!transportInstances[instanceID]) { transportInstances[instanceID] = instanceConstructors[instanceID](); /* Call the stack's initializer for the transport object. */ } transport = transportInstances[instanceID]; } else { transport = NULL; } }