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 860:0d41e4eb3d0a, committed 2015-11-02
- Comitter:
- rgrover1
- Date:
- Mon Nov 02 09:09:07 2015 +0000
- Parent:
- 859:2a1cb15098ba
- Child:
- 861:2afa79e3ed0a
- Commit message:
- Synchronized with git rev 249cabae
Author: Rohit Grover
Merge pull request #82 from jrobeson/patch-1
use the github url public url in module.json
Changed in this revision
--- a/ble/BLE.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/BLE.h Mon Nov 02 09:09:07 2015 +0000
@@ -21,15 +21,9 @@
#include "Gap.h"
#include "GattServer.h"
#include "GattClient.h"
+#include "BLEInstanceBase.h"
-#ifdef YOTTA_CFG_MBED_OS
-#include "mbed-drivers/mbed_error.h"
-#else
#include "mbed_error.h"
-#endif
-
-/* forward declaration for the implementation class */
-class BLEInstanceBase;
/**
* The base class used to abstract away BLE capable radio transceivers or SOCs,
@@ -38,20 +32,6 @@
class BLE
{
public:
- typedef unsigned InstanceID_t; /** The type returned by BLE::getInstanceID(). */
-
- /**
- * The function signature for callbacks for initialization completion.
- * @param ble
- * A reference to the BLE instance being initialized.
- * @param error
- * This captures the result of initialization. It is set to
- * BLE_ERROR_NONE if initialization completed successfully. Else
- * the error value is implementation specific.
- *
- */
- typedef void (*InitializationCompleteCallback_t)(BLE &ble, ble_error_t error);
-
/**
* Initialize the BLE controller. This should be called before using
* anything else in the BLE_API.
@@ -62,44 +42,21 @@
* system startup. It may not be safe to call init() from global static
* context where ordering is compiler specific and can't be guaranteed--it
* is safe to call BLE::init() from within main().
- *
- * @param callback
- * A callback for when initialization completes for a BLE
- * instance. This is an optional parameter, if no callback is
- * setup the application can still determine the status of
- * initialization using BLE::hasInitialized() (see below).
- *
- * @return BLE_ERROR_NONE if the initialization procedure was started
- * successfully.
- *
- * @note The underlying stack must invoke the initialization completion
- * callback in response to init(). In some cases, initialization is
- * instantaneous (or blocking); if so, it is acceptable for the stack-
- * specific implementation of init() to invoke the completion callback
- * directly--i.e. within its own context.
- *
- * @note Nearly all BLE APIs would return
- * BLE_ERROR_INITIALIZATION_INCOMPLETE if used on an instance before the
- * corresponding transport is initialized.
*/
- ble_error_t init(InitializationCompleteCallback_t callback = NULL);
-
- /**
- * @return true if initialization has completed for the underlying BLE
- * transport.
- *
- * The application can setup a callback to signal completion of
- * initialization when using init(). Otherwise, this method can be used to
- * poll the state of initialization.
- */
- bool hasInitialized(void) const;
+ ble_error_t init();
/**
* Purge the BLE stack of GATT and GAP state. init() must be called
* afterwards to re-instate services and GAP state. This API offers a way to
* repopulate the GATT database with new services and characteristics.
*/
- ble_error_t shutdown(void);
+ ble_error_t shutdown(void) {
+ clearAdvertisingPayload();
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->shutdown();
+ }
/**
* This call allows the application to get the BLE stack version information.
@@ -107,36 +64,81 @@
* @return A pointer to a const string representing the version.
* Note: The string is owned by the BLE_API.
*/
- const char *getVersion(void);
+ const char *getVersion(void) {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getVersion();
+ }
/*
* Accessors to GAP. Please refer to Gap.h. All GAP related functionality requires
* going through this accessor.
*/
- const Gap &gap() const;
- Gap &gap();
+ const Gap &gap() const {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGap();
+ }
+ Gap &gap() {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGap();
+ }
/*
* Accessors to GATT Server. Please refer to GattServer.h. All GATTServer related
* functionality requires going through this accessor.
*/
- const GattServer& gattServer() const;
- GattServer& gattServer();
+ const GattServer& gattServer() const {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGattServer();
+ }
+ GattServer& gattServer() {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGattServer();
+ }
/*
* Accessors to GATT Client. Please refer to GattClient.h. All GATTClient related
* functionality requires going through this accessor.
*/
- const GattClient& gattClient() const;
- GattClient& gattClient();
+ const GattClient& gattClient() const {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGattClient();
+ }
+ GattClient& gattClient() {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getGattClient();
+ }
/*
* Accessors to Security Manager. Please refer to SecurityManager.h. All
* SecurityManager related functionality requires going through this
* accessor.
*/
- const SecurityManager& securityManager() const;
- SecurityManager& securityManager();
+ const SecurityManager& securityManager() const {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getSecurityManager();
+ }
+ SecurityManager& securityManager() {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ return transport->getSecurityManager();
+ }
/**
* Yield control to the BLE stack or to other tasks waiting for events. This
@@ -145,9 +147,15 @@
* returning (to service the stack). This is not always interchangeable with
* WFE().
*/
- void waitForEvent(void);
+ void waitForEvent(void) {
+ if (!transport) {
+ error("bad handle to underlying transport");
+ }
+ 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;
@@ -182,12 +190,6 @@
*/
BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
- /**
- * Fetch the ID of a BLE instance. Typically there would only be the DEFAULT_INSTANCE.
- */
- InstanceID_t getInstanceID(void) const {
- return instanceID;
- }
/*
* Deprecation alert!
@@ -1392,7 +1394,6 @@
BLE &operator=(const BLE &);
private:
- InstanceID_t instanceID;
BLEInstanceBase *transport; /* the device specific backend */
};
--- a/ble/BLEInstanceBase.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/BLEInstanceBase.h Mon Nov 02 09:09:07 2015 +0000
@@ -18,8 +18,6 @@
#define __BLE_DEVICE_INSTANCE_BASE__
#include "Gap.h"
-#include "ble/SecurityManager.h"
-#include "ble/BLE.h"
/* forward declarations */
class GattServer;
@@ -32,18 +30,17 @@
class BLEInstanceBase
{
public:
- virtual ble_error_t init(BLE::InstanceID_t instanceID, BLE::InitializationCompleteCallback_t) = 0;
- virtual bool hasInitialized(void) const = 0;
- virtual ble_error_t shutdown(void) = 0;
- virtual const char * getVersion(void) = 0;
- virtual Gap& getGap() = 0;
- virtual const Gap& getGap() const = 0;
- virtual GattServer& getGattServer() = 0;
- virtual const GattServer& getGattServer() const = 0;
- virtual GattClient& getGattClient() = 0;
- virtual SecurityManager& getSecurityManager() = 0;
+ virtual ble_error_t init(void) = 0;
+ virtual ble_error_t shutdown(void) = 0;
+ virtual const char *getVersion(void) = 0;
+ virtual Gap& getGap() = 0;
+ virtual const Gap& getGap() const = 0;
+ virtual GattServer& getGattServer() = 0;
+ virtual const GattServer& getGattServer() const = 0;
+ virtual GattClient& getGattClient() = 0;
+ virtual SecurityManager& getSecurityManager() = 0;
virtual const SecurityManager& getSecurityManager() const = 0;
- virtual void waitForEvent(void) = 0;
+ virtual void waitForEvent(void) = 0;
};
/**
--- a/ble/Gap.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/Gap.h Mon Nov 02 09:09:07 2015 +0000
@@ -867,8 +867,8 @@
}
private:
- virtual ble_error_t setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) = 0;
- virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
+ virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
+ virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
public:
/**
--- a/ble/UUID.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/UUID.h Mon Nov 02 09:09:07 2015 +0000
@@ -74,7 +74,7 @@
*
* @note we don't yet support 32-bit shortened UUIDs.
*/
- UUID(ShortUUIDBytes_t _shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(_shortUUID) {
+ UUID(ShortUUIDBytes_t shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(shortUUID) {
/* empty */
}
--- a/ble/blecommon.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/blecommon.h Mon Nov 02 09:09:07 2015 +0000
@@ -114,18 +114,16 @@
*/
/**************************************************************************/
enum ble_error_t {
- BLE_ERROR_NONE = 0, /**< No error */
- BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted */
- BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implement or isn't supported by the target HW */
- BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range */
- BLE_ERROR_INVALID_PARAM = 4, /**< One of the supplied parameters is invalid */
- BLE_STACK_BUSY = 5, /**< The stack is busy */
- BLE_ERROR_INVALID_STATE = 6, /**< Invalid state. */
- BLE_ERROR_NO_MEM = 7, /**< Out of Memory */
- BLE_ERROR_OPERATION_NOT_PERMITTED = 8,
- BLE_ERROR_INITIALIZATION_INCOMPLETE = 9,
- BLE_ERROR_ALREADY_INITIALIZED = 10,
- BLE_ERROR_UNSPECIFIED = 11, /**< Unknown error. */
+ BLE_ERROR_NONE = 0, /**< No error */
+ BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted */
+ BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implement or isn't supported by the target HW */
+ BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range */
+ BLE_ERROR_INVALID_PARAM = 4, /**< One of the supplied parameters is invalid */
+ BLE_STACK_BUSY = 5, /**< The stack is busy */
+ BLE_ERROR_INVALID_STATE = 6, /**< Invalid state. */
+ BLE_ERROR_NO_MEM = 7, /**< Out of Memory */
+ BLE_ERROR_OPERATION_NOT_PERMITTED = 8,
+ BLE_ERROR_UNSPECIFIED = 9, /**< Unknown error. */
};
/** @brief Default MTU size. */
--- a/ble/services/EddystoneConfigService.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/services/EddystoneConfigService.h Mon Nov 02 09:09:07 2015 +0000
@@ -285,7 +285,7 @@
ble.setTxPower(radioPowerLevels[params.txPowerMode]);
ble.setDeviceName(reinterpret_cast<const uint8_t *>(&DEVICE_NAME));
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
- ble.setAdvertisingInterval(ADVERTISING_INTERVAL_MSEC);
+ ble.setAdvertisingInterval(GapAdvertisingParams::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADVERTISING_INTERVAL_MSEC));
}
/*
@@ -306,7 +306,7 @@
eddyServ.setTLMFrameData(params.tlmVersion, params.tlmBeaconPeriod);
}
if (params.uriEnabled) {
- eddyServ.setURLFrameEncodedData(params.advPowerLevels[params.txPowerMode], (const char *) params.uriData, params.uriDataLength, params.uriBeaconPeriod);
+ eddyServ.setURLFrameData(params.advPowerLevels[params.txPowerMode], (const char *) params.uriData, params.uriBeaconPeriod);
}
if (params.uidEnabled) {
eddyServ.setUIDFrameData(params.advPowerLevels[params.txPowerMode],
@@ -340,7 +340,7 @@
} else if (handle == uriDataChar.getValueHandle()) {
params.uriDataLength = writeParams->len;
memset(params.uriData, 0x00, URI_DATA_MAX); // clear URI string
- memcpy(params.uriData, writeParams->data, writeParams->len); // set URI string
+ memcpy(params.uriData, writeParams->data, params.uriDataLength); // set URI string
params.uriEnabled = true;
INFO("URI = %s, URILen = %d", writeParams->data, writeParams->len);
} else if (handle == flagsChar.getValueHandle()) {
--- a/ble/services/EddystoneService.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/services/EddystoneService.h Mon Nov 02 09:09:07 2015 +0000
@@ -175,40 +175,16 @@
urlIsSet = false;
return false;
}
+ defaultUrlPower = power;
encodeURL(urlIn, defaultUriData, defaultUriDataLength); // encode URL to URL Formatting
if (defaultUriDataLength > URI_DATA_MAX) {
return true; // error, URL is too big
}
- defaultUrlPower = power;
urlAdvPeriod = urlAdvPeriodIn;
urlIsSet = true;
return false;
}
- /**
- * Set Eddystone URL Frame information.
- * @param[in] power TX Power in dB measured at 0 meters from the device.
- * @param[in] encodedUrlIn Encoded URL
- * @param[in] encodedUrlInLength Length of the encoded URL
- * @param[in] urlAdvPeriodIn How long to advertise the URL frame (measured in # of adv periods)
- * @return false on success, true on failure.
- */
- bool setURLFrameEncodedData(int8_t power, const char *encodedUrlIn, uint8_t encodedUrlInLength, uint32_t urlAdvPeriodIn) {
- if (0 == urlAdvPeriodIn) {
- urlIsSet = false;
- return false;
- }
- memcpy(defaultUriData, encodedUrlIn, encodedUrlInLength);
- if (defaultUriDataLength > URI_DATA_MAX) {
- return true; // error, URL is too big
- }
- defaultUrlPower = power;
- defaultUriDataLength = encodedUrlInLength;
- urlAdvPeriod = urlAdvPeriodIn;
- urlIsSet = true;
- return false;
- }
-
/*
* Construct URL frame from private variables
* @param[in/out] Data pointer to array to store constructed frame in
@@ -260,10 +236,6 @@
* @return number of bytes used. negative number indicates error message.
*/
int constructTLMFrame(uint8_t *Data, uint8_t maxSize) {
- uint32_t now = timeSinceBootTimer.read_ms();
- TlmTimeSinceBoot += (now - lastBootTimerRead) / 100;
- lastBootTimerRead = now;
-
int index = 0;
Data[index++] = FRAME_TYPE_TLM; // Eddystone frame type = Telemetry
Data[index++] = TlmVersion; // TLM Version Number
@@ -320,6 +292,14 @@
}
/*
+ * callback function, called every 0.1s, incriments the TimeSinceBoot field in the TLM frame
+ * @return nothing
+ */
+ void tsbCallback(void) {
+ TlmTimeSinceBoot++;
+ }
+
+ /*
* Update advertising data
* @return true on success, false on failure
*/
@@ -520,8 +500,7 @@
// Make double sure the PDUCount and TimeSinceBoot fields are set to zero at reset
updateTlmPduCount(0);
updateTlmTimeSinceBoot(0);
- lastBootTimerRead = 0;
- timeSinceBootTimer.start();
+ timeSinceBootTick.attach(this, &EddystoneService::tsbCallback, 0.1); // incriment the TimeSinceBoot ticker every 0.1s
tlmTicker.attach(this, &EddystoneService::tlmCallback, TlmAdvPeriod);
DBG("attached tlmCallback every %d seconds", TlmAdvPeriod);
}
@@ -540,8 +519,7 @@
BLEDevice &ble;
uint16_t advPeriodus;
uint8_t txPower;
- Timer timeSinceBootTimer;
- volatile uint32_t lastBootTimerRead;
+ Ticker timeSinceBootTick; // counter that counts time since boot
volatile bool advLock;
volatile FrameTypes frameIndex;
Timeout stopAdv;
--- a/ble/services/HealthThermometerService.h Mon Nov 02 09:09:07 2015 +0000 +++ b/ble/services/HealthThermometerService.h Mon Nov 02 09:09:07 2015 +0000 @@ -17,7 +17,7 @@ #ifndef __BLE_HEALTH_THERMOMETER_SERVICE_H__ #define __BLE_HEALTH_THERMOMETER_SERVICE_H__ -#include "ble/BLE.h" +#include "BLE.h" /** * @class HealthThermometerService
--- a/ble/services/LinkLossService.h Mon Nov 02 09:09:07 2015 +0000
+++ b/ble/services/LinkLossService.h Mon Nov 02 09:09:07 2015 +0000
@@ -17,7 +17,7 @@
#ifndef __BLE_LINK_LOSS_SERVICE_H__
#define __BLE_LINK_LOSS_SERVICE_H__
-#include "ble/Gap.h"
+#include "Gap.h"
/**
* @class LinkLossService
@@ -55,7 +55,7 @@
ble.addService(linkLossService);
serviceAdded = true;
- ble.onDisconnection(this, &LinkLossService::onDisconnectionFilter);
+ ble.addToDisconnectionCallChain(this, &LinkLossService::onDisconnectionFilter);
ble.onDataWritten(this, &LinkLossService::onDataWritten);
}
@@ -86,7 +86,7 @@
}
}
- void onDisconnectionFilter(const Gap::DisconnectionCallbackParams_t *params) {
+ void onDisconnectionFilter(void) {
if (alertLevel != NO_ALERT) {
callback(alertLevel);
}
--- a/ble/services/UARTService.h Mon Nov 02 09:09:07 2015 +0000 +++ b/ble/services/UARTService.h Mon Nov 02 09:09:07 2015 +0000 @@ -17,13 +17,8 @@ #ifndef __BLE_UART_SERVICE_H__ #define __BLE_UART_SERVICE_H__ -#ifdef YOTTA_CFG_MBED_OS -#include "mbed-drivers/mbed.h" -#include "mbed-drivers/Stream.h" -#else #include "mbed.h" #include "Stream.h" -#endif #include "ble/UUID.h" #include "ble/BLE.h"
--- a/ble/services/URIBeaconConfigService.h Mon Nov 02 09:09:07 2015 +0000 +++ b/ble/services/URIBeaconConfigService.h Mon Nov 02 09:09:07 2015 +0000 @@ -18,12 +18,7 @@ #define SERVICES_URIBEACONCONFIGSERVICE_H_ #include "ble/BLE.h" - -#ifdef YOTTA_CFG_MBED_OS -#include "mbed-drivers/mbed.h" -#else #include "mbed.h" -#endif extern const uint8_t UUID_URI_BEACON_SERVICE[UUID::LENGTH_OF_LONG_UUID]; extern const uint8_t UUID_LOCK_STATE_CHAR[UUID::LENGTH_OF_LONG_UUID];
--- a/module.json Mon Nov 02 09:09:07 2015 +0000
+++ b/module.json Mon Nov 02 09:09:07 2015 +0000
@@ -1,6 +1,6 @@
{
"name": "ble",
- "version": "1.1.0",
+ "version": "1.0.0",
"description": "The BLE module offers a high level abstraction for using Bluetooth Low Energy on multiple platforms.",
"keywords": [
"Bluetooth",
@@ -10,7 +10,7 @@
],
"author": "Rohit Grover",
"repository": {
- "url": "git@github.com:ARMmbed/ble.git",
+ "url": "https://github.com/ARMmbed/ble.git",
"type": "git"
},
"homepage": "http://mbed.org/ble",
@@ -28,9 +28,6 @@
"nrf51822": {
"ble-nrf51822": "^1.0.0"
},
- "cordio": {
- "ble-wicentric": "~0.0.0"
- },
"mbed-classic": {
"mbed-classic": "~0.0.1"
},
--- a/source/BLE.cpp Mon Nov 02 09:09:07 2015 +0000
+++ b/source/BLE.cpp Mon Nov 02 09:09:07 2015 +0000
@@ -15,16 +15,15 @@
*/
#include "ble/BLE.h"
-#include "ble/BLEInstanceBase.h"
#if defined(TARGET_OTA_ENABLED)
#include "ble/services/DFUService.h"
#endif
ble_error_t
-BLE::init(BLE::InitializationCompleteCallback_t callback)
+BLE::init()
{
- ble_error_t err = transport->init(instanceID, callback);
+ ble_error_t err = transport->init();
if (err != BLE_ERROR_NONE) {
return err;
}
@@ -106,7 +105,7 @@
return badSingleton;
}
-BLE::BLE(InstanceID_t instanceIDIn) : instanceID(instanceIDIn), transport()
+BLE::BLE(InstanceID_t instanceID) : transport()
{
static BLEInstanceBase *transportInstances[NUM_INSTANCES];
@@ -118,113 +117,4 @@
} else {
transport = NULL;
}
-}
-
-bool BLE::hasInitialized(void) const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->hasInitialized();
-}
-
-ble_error_t BLE::shutdown(void)
-{
- clearAdvertisingPayload();
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->shutdown();
-}
-
-const char *BLE::getVersion(void)
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getVersion();
-}
-
-const Gap &BLE::gap() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGap();
-}
-
-Gap &BLE::gap()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGap();
-}
-
-const GattServer& BLE::gattServer() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattServer();
-}
-
-GattServer& BLE::gattServer()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattServer();
-}
-
-const GattClient& BLE::gattClient() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattClient();
-}
-
-GattClient& BLE::gattClient()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getGattClient();
-}
-
-const SecurityManager& BLE::securityManager() const
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getSecurityManager();
-}
-
-SecurityManager& BLE::securityManager()
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- return transport->getSecurityManager();
-}
-
-void BLE::waitForEvent(void)
-{
- if (!transport) {
- error("bad handle to underlying transport");
- }
-
- transport->waitForEvent();
}
\ No newline at end of file
