adding an initial prototype for a yotta-config based initialization for BLE transports
This commit is contained in:
parent
ce4821076f
commit
ad8e92acd5
2 changed files with 111 additions and 6 deletions
44
ble/BLE.h
44
ble/BLE.h
|
@ -154,6 +154,43 @@ public:
|
|||
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 @@ public:
|
|||
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
|
||||
|
|
|
@ -36,3 +36,76 @@ BLE::init()
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue