Use composition to hide the transport functionality behind an interface object.

The underlying target BLE library must implement the function which creates this object.
This commit is contained in:
Rohit Grover 2014-05-23 08:56:31 +01:00
parent c4e1f43b1a
commit 4480ea28e7

View file

@ -22,18 +22,27 @@
#include "hw/Gap.h"
#include "hw/GattServer.h"
/**************************************************************************/
/*!
\brief
The base class used to abstract away BLE capable radio transceivers
or SOCs, to enable this BLE API to work with any radio transparently.
*/
/**************************************************************************/
class BLEDeviceInstanceBase; /* forward declaration */
/**
* BLEDevice uses composition to hide an interface object encapsulating the
* backend transport.
*
* The following API is used to create the singleton interface object. An
* implementation for this function must be provided by the device-specific
* library, otherwise there will be a linker error.
*/
extern BLEDeviceInstanceBase *createBLEDeviceInstance(void);
/**
* The base class used to abstract away BLE capable radio transceivers or SOCs,
* to enable this BLE API to work with any radio transparently.
*/
class BLEDevice
{
public:
virtual ble_error_t init() = 0;
virtual ble_error_t reset(void) = 0;
ble_error_t init();
ble_error_t reset(void);
/* GAP specific APIs */
public:
@ -50,41 +59,72 @@ public:
ble_error_t stopAdvertising(void);
ble_error_t disconnect(void);
public: /* TODO: to be made private soon */
public:
BLEDevice() : transport(createBLEDeviceInstance()) {
/* empty */
}
private:
BLEDeviceInstanceBase *transport;
};
/**
* The interface for the transport object to be created by the target library's
* createBLEDeviceInstance().
*/
class BLEDeviceInstanceBase
{
public:
virtual Gap& getGap() = 0;
virtual GattServer& getGattServer() = 0;
virtual ble_error_t init(void) = 0;
virtual ble_error_t reset(void) = 0;
};
/* BLEDevice methods. Most of these simply forward the calls to the underlying
* transport.*/
inline ble_error_t
BLEDevice::init() {
return transport->init();
}
inline ble_error_t
BLEDevice::reset(void) {
return transport->reset();
}
inline ble_error_t
BLEDevice::setAddress(Gap::addr_type_t type, const uint8_t address[6]) {
return getGap().setAddress(type, address);
return transport->getGap().setAddress(type, address);
}
inline ble_error_t
BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures,
const GapAdvertisingData &scanResponse) {
return getGap().setAdvertisingData(ADStructures, scanResponse);
return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
}
inline ble_error_t
BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures) {
GapAdvertisingData scanResponse;
return getGap().setAdvertisingData(ADStructures, scanResponse);
return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
}
inline ble_error_t
BLEDevice::startAdvertising(GapAdvertisingParams &advParams) {
return getGap().startAdvertising(advParams);
return transport->getGap().startAdvertising(advParams);
}
inline ble_error_t
BLEDevice::stopAdvertising(void) {
return getGap().stopAdvertising();
return transport->getGap().stopAdvertising();
}
inline ble_error_t
BLEDevice::disconnect(void) {
return getGap().disconnect();
return transport->getGap().disconnect();
}
#endif // ifndef __BLE_DEVICE_H__