diff --git a/hw/BLEDevice.h b/hw/BLEDevice.h index 5488103..a8391e8 100644 --- a/hw/BLEDevice.h +++ b/hw/BLEDevice.h @@ -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__