Use composition to hide the transport functionality behind an interface object.
The underlying target BLE library must implement the function which creates this object.master
parent
c4e1f43b1a
commit
4480ea28e7
|
@ -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__
|
||||
|
|
Loading…
Reference in New Issue