BLE

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Tue Sep 29 09:54:17 2015 +0100
Revision:
825:f82180727241
Parent:
824:3253c3910b82
Child:
826:b65c6a222525
Synchronized with git rev ad8e92ac
Author: Rohit Grover
adding an initial prototype for a yotta-config based initialization for BLE transports

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 713:b04b5db36865 1 /* mbed Microcontroller Library
rgrover1 713:b04b5db36865 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 713:b04b5db36865 3 *
rgrover1 713:b04b5db36865 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 713:b04b5db36865 5 * you may not use this file except in compliance with the License.
rgrover1 713:b04b5db36865 6 * You may obtain a copy of the License at
rgrover1 713:b04b5db36865 7 *
rgrover1 713:b04b5db36865 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 713:b04b5db36865 9 *
rgrover1 713:b04b5db36865 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 713:b04b5db36865 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 713:b04b5db36865 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 713:b04b5db36865 13 * See the License for the specific language governing permissions and
rgrover1 713:b04b5db36865 14 * limitations under the License.
rgrover1 713:b04b5db36865 15 */
rgrover1 713:b04b5db36865 16
rgrover1 713:b04b5db36865 17 #include "ble/BLE.h"
rgrover1 713:b04b5db36865 18
rgrover1 713:b04b5db36865 19 #if defined(TARGET_OTA_ENABLED)
rgrover1 733:916f36dd93f8 20 #include "ble/services/DFUService.h"
rgrover1 713:b04b5db36865 21 #endif
rgrover1 713:b04b5db36865 22
rgrover1 713:b04b5db36865 23 ble_error_t
rgrover1 713:b04b5db36865 24 BLE::init()
rgrover1 713:b04b5db36865 25 {
rgrover1 713:b04b5db36865 26 ble_error_t err = transport->init();
rgrover1 713:b04b5db36865 27 if (err != BLE_ERROR_NONE) {
rgrover1 713:b04b5db36865 28 return err;
rgrover1 713:b04b5db36865 29 }
rgrover1 713:b04b5db36865 30
rgrover1 713:b04b5db36865 31 /* Platforms enabled for DFU should introduce the DFU Service into
rgrover1 713:b04b5db36865 32 * applications automatically. */
rgrover1 713:b04b5db36865 33 #if defined(TARGET_OTA_ENABLED)
rgrover1 713:b04b5db36865 34 static DFUService dfu(*this); // defined static so that the object remains alive
rgrover1 713:b04b5db36865 35 #endif // TARGET_OTA_ENABLED
rgrover1 713:b04b5db36865 36
rgrover1 713:b04b5db36865 37 return BLE_ERROR_NONE;
rgrover1 823:a0f080d1e836 38 }
rgrover1 823:a0f080d1e836 39
rgrover1 823:a0f080d1e836 40 /**
rgrover1 823:a0f080d1e836 41 * BLE::Instance() and BLE constructor rely upon a static array of initializers
rgrover1 823:a0f080d1e836 42 * to create actual BLE transport instances. A description of these instances
rgrover1 823:a0f080d1e836 43 * and initializers is supposed to be put in some .json file contributing to
rgrover1 823:a0f080d1e836 44 * yotta's configuration (typically the target.json). Here's a sample:
rgrover1 823:a0f080d1e836 45 *
rgrover1 823:a0f080d1e836 46 * "config": {
rgrover1 823:a0f080d1e836 47 * ...
rgrover1 823:a0f080d1e836 48 * "ble_instances": {
rgrover1 823:a0f080d1e836 49 * "count": 1,
rgrover1 823:a0f080d1e836 50 * "0" : {
rgrover1 823:a0f080d1e836 51 * "initializer" : "createBLEInstance"
rgrover1 823:a0f080d1e836 52 * }
rgrover1 823:a0f080d1e836 53 * }
rgrover1 823:a0f080d1e836 54 * }
rgrover1 823:a0f080d1e836 55 *
rgrover1 823:a0f080d1e836 56 * The following macros result in translating the above config into a static
rgrover1 823:a0f080d1e836 57 * array: instanceConstructors.
rgrover1 823:a0f080d1e836 58 */
rgrover1 823:a0f080d1e836 59 #ifdef YOTTA_CFG_BLE_INSTANCES_COUNT
rgrover1 823:a0f080d1e836 60 #define CONCATENATE(A, B) A ## B
rgrover1 823:a0f080d1e836 61 #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). */
rgrover1 823:a0f080d1e836 62
rgrover1 823:a0f080d1e836 63 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1 YOTTA_CFG_BLE_INSTANCES_0_INITIALIZER
rgrover1 823:a0f080d1e836 64 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_1, YOTTA_CFG_BLE_INSTANCES_1_INITIALIZER
rgrover1 823:a0f080d1e836 65 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_2, YOTTA_CFG_BLE_INSTANCES_2_INITIALIZER
rgrover1 823:a0f080d1e836 66 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_3, YOTTA_CFG_BLE_INSTANCES_3_INITIALIZER
rgrover1 823:a0f080d1e836 67 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_5 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_4, YOTTA_CFG_BLE_INSTANCES_4_INITIALIZER
rgrover1 823:a0f080d1e836 68 /* ... add more of the above if ever needed */
rgrover1 823:a0f080d1e836 69
rgrover1 823:a0f080d1e836 70 #define INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(N) EXPAND(CONCATENATE(INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS_, N))
rgrover1 823:a0f080d1e836 71 #endif /* YOTTA_CFG_BLE_INSTANCES_COUNT */
rgrover1 823:a0f080d1e836 72
rgrover1 823:a0f080d1e836 73 typedef BLEInstanceBase *(*InstanceConstructor_t)(void);
rgrover1 823:a0f080d1e836 74 static const InstanceConstructor_t instanceConstructors[BLE::NUM_INSTANCES] = {
rgrover1 823:a0f080d1e836 75 #ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
rgrover1 823:a0f080d1e836 76 createBLEInstance
rgrover1 823:a0f080d1e836 77 #else
rgrover1 823:a0f080d1e836 78 INITIALIZER_LIST_FOR_INSTANCE_CONSTRUCTORS(YOTTA_CFG_BLE_INSTANCES_COUNT)
rgrover1 823:a0f080d1e836 79 #endif
rgrover1 823:a0f080d1e836 80 };
rgrover1 823:a0f080d1e836 81
rgrover1 825:f82180727241 82 BLE::BLE &
rgrover1 823:a0f080d1e836 83 BLE::Instance(InstanceID_t id)
rgrover1 823:a0f080d1e836 84 {
rgrover1 823:a0f080d1e836 85 static BLE *singletons[NUM_INSTANCES];
rgrover1 823:a0f080d1e836 86 if (id < NUM_INSTANCES) {
rgrover1 823:a0f080d1e836 87 if (singletons[id] == NULL) {
rgrover1 823:a0f080d1e836 88 singletons[id] = new BLE(id); /* This object will never be freed. */
rgrover1 823:a0f080d1e836 89 }
rgrover1 823:a0f080d1e836 90
rgrover1 823:a0f080d1e836 91 return *singletons[id];
rgrover1 823:a0f080d1e836 92 }
rgrover1 823:a0f080d1e836 93
rgrover1 823:a0f080d1e836 94 /* we come here only in the case of a bad interfaceID. */
rgrover1 823:a0f080d1e836 95 static BLE badSingleton(NUM_INSTANCES /* this is a bad index; and will result in a NULL transport. */);
rgrover1 823:a0f080d1e836 96 return badSingleton;
rgrover1 823:a0f080d1e836 97 }
rgrover1 823:a0f080d1e836 98
rgrover1 823:a0f080d1e836 99 BLE::BLE(InstanceID_t instanceID) : transport()
rgrover1 823:a0f080d1e836 100 {
rgrover1 823:a0f080d1e836 101 static BLEInstanceBase *transportInstances[NUM_INSTANCES];
rgrover1 823:a0f080d1e836 102
rgrover1 823:a0f080d1e836 103 if (instanceID < NUM_INSTANCES) {
rgrover1 823:a0f080d1e836 104 if (!transportInstances[instanceID]) {
rgrover1 823:a0f080d1e836 105 transportInstances[instanceID] = instanceConstructors[instanceID](); /* Call the stack's initializer for the transport object. */
rgrover1 823:a0f080d1e836 106 }
rgrover1 823:a0f080d1e836 107 transport = transportInstances[instanceID];
rgrover1 823:a0f080d1e836 108 } else {
rgrover1 823:a0f080d1e836 109 transport = NULL;
rgrover1 823:a0f080d1e836 110 }
rgrover1 713:b04b5db36865 111 }