Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: microbit-dal microbit-dal microbit-ble-open microbit-dal ... more
Fork of BLE_API by
Revision 811:059ed1c7b128, committed 2015-09-29
- Comitter:
- rgrover1
- Date:
- Tue Sep 29 09:49:21 2015 +0100
- Parent:
- 810:c91bc1f5e035
- Child:
- 812:aba49f3176a2
- Commit message:
- Synchronized with git rev 603dae31
Author: Rohit Grover
Release 0.4.6
=============
Enhancements
~~~~~~~~~~~~
* Add connection handle to GATT callback parameters. This paves the way for
applications requiring multiple concurrent connections: read/write/HVX
callbacks will be able to distinguish between peripherals by comparing per-
device connection handles.
* Revert to an older, working version of eddystone. This is temporary, and
will only help with demos. We will provide a mature Eddystone offering
shortly.
Changed in this revision
--- a/ble/BLE.h Tue Sep 29 09:47:52 2015 +0100
+++ b/ble/BLE.h Tue Sep 29 09:49:21 2015 +0100
@@ -154,6 +154,43 @@
transport->waitForEvent();
}
+public:
+ typedef unsigned InstanceID_t;
+ static const InstanceID_t DEFAULT_INSTANCE = 0;
+#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
+ static const InstanceID_t NUM_INSTANCES = 1;
+#else
+ static const InstanceID_t NUM_INSTANCES = YOTTA_CFG_BLE_INSTANCES_COUNT;
+#endif
+
+ /**
+ * Get a reference to the BLE singleton corresponding to a given interface.
+ * There is a static array of BLE singletons.
+ *
+ * @Note: Calling Instance() is preferred over constructing a BLE object
+ * directly, as it returns references to singletons.
+ *
+ * @param[in] id
+ * Instance-ID. This should be less than NUM_INSTANCES in order
+ * for the returned BLE singleton to be useful.
+ *
+ * @return a reference to a single object
+ */
+ static BLE &Instance(InstanceID_t id = DEFAULT_INSTANCE);
+
+ /**
+ * Constructor for a handle to a BLE instance (i.e. BLE stack). BLE handles
+ * are thin wrappers around a transport object (i.e. ptr. to
+ * BLEInstanceBase).
+ *
+ * BLE objects are are better created as singletons accessed through the
+ * Instance() method. If multiple BLE handles are constructed for the same
+ * interface (using this constructor), they will share the same underlying
+ * transport object.
+ */
+ BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
+
+
/*
* Deprecation alert!
* All of the following are deprecated and may be dropped in a future
@@ -1362,17 +1399,12 @@
return securityManager().onPasskeyDisplay(callback);
}
-public:
- BLE() : transport(createBLEInstance()) {
- /* empty */
- }
-
private:
BLE(const BLE&);
BLE &operator=(const BLE &);
private:
- BLEInstanceBase *const transport; /* the device specific backend */
+ BLEInstanceBase *transport; /* the device specific backend */
};
typedef BLE BLEDevice; /* DEPRECATED. This type alias is retained for the sake of compatibility with older
--- a/module.json Tue Sep 29 09:47:52 2015 +0100
+++ b/module.json Tue Sep 29 09:49:21 2015 +0100
@@ -1,6 +1,6 @@
{
"name": "ble",
- "version": "0.4.7",
+ "version": "0.4.6",
"description": "The BLE module offers a high level abstraction for using Bluetooth Low Energy on multiple platforms.",
"keywords": [
"Bluetooth",
@@ -21,12 +21,12 @@
"dependencies": {},
"targetDependencies": {
"nrf51822": {
- "ble-nrf51822": "~0.4.7"
+ "ble-nrf51822": "~0.4.6"
},
"mbed-classic": {
"mbed-classic": "~0.0.1"
},
- "mbed-os": {
+ "mbed": {
"mbed-drivers": "*"
}
}
--- a/source/BLE.cpp Tue Sep 29 09:47:52 2015 +0100
+++ b/source/BLE.cpp Tue Sep 29 09:49:21 2015 +0100
@@ -35,4 +35,77 @@
#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::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;
+ }
}
\ No newline at end of file
