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: LinkNode_SimpleChatwithSerial
Fork of BLE_API by
Diff: ble/UUID.h
- Revision:
- 1035:d8ba3cb5a39a
- Parent:
- 1023:a072b59caddb
- Child:
- 1037:ec64da75c9ee
diff -r 947f5cf8884f -r d8ba3cb5a39a ble/UUID.h
--- a/ble/UUID.h Thu Dec 10 09:15:04 2015 +0000
+++ b/ble/UUID.h Thu Dec 10 09:15:04 2015 +0000
@@ -22,6 +22,18 @@
#include "blecommon.h"
+static uint8_t char2int(char c) {
+ if ((c >= '0') && (c <= '9')) {
+ return c - '0';
+ } else if ((c >= 'a') && (c <= 'f')) {
+ return c - 'a' + 10;
+ } else if ((c >= 'A') && (c <= 'F')) {
+ return c - 'A' + 10;
+ } else {
+ return 0;
+ }
+}
+
class UUID {
public:
enum UUID_Type_t {
@@ -29,12 +41,72 @@
UUID_TYPE_LONG = 1 // Full 128-bit UUID.
};
+ typedef enum {
+ MSB,
+ LSB
+ } BitOrder_t;
+
typedef uint16_t ShortUUIDBytes_t;
static const unsigned LENGTH_OF_LONG_UUID = 16;
typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID];
+ static const unsigned MAX_UUID_STRING_LENGTH = LENGTH_OF_LONG_UUID * 2 + 4;
+
public:
+
+ /**
+ * Creates a new 128-bit UUID.
+ *
+ * @note The UUID is a unique 128-bit (16 byte) ID used to identify
+ * different service or characteristics on the BLE device.
+ *
+ * @param stringUUID
+ * The 128-bit (16-byte) UUID as a human readable const-string.
+ * Format: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ * Upper and lower case supported. Hyphens are optional, but only
+ * upto four of them. The UUID is stored internally as a 16 byte
+ * array, LSB (little endian), which is opposite from the string.
+ */
+ UUID(const char* stringUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
+ bool nibble = false;
+ uint8_t byte = 0;
+ size_t baseIndex = 0;
+ uint8_t tempUUID[LENGTH_OF_LONG_UUID];
+
+ // Iterate through string, abort if NULL is encountered prematurely.
+ // Ignore upto four hyphens.
+ for (size_t index = 0; (index < MAX_UUID_STRING_LENGTH) && (baseIndex < LENGTH_OF_LONG_UUID); index++) {
+ if (stringUUID[index] == '\0') {
+ // error abort
+ break;
+ } else if (stringUUID[index] == '-') {
+ // ignore hyphen
+ continue;
+ } else if (nibble) {
+ // got second nibble
+ byte |= char2int(stringUUID[index]);
+ nibble = false;
+
+ // store copy
+ tempUUID[baseIndex++] = byte;
+ } else {
+ // got first nibble
+ byte = char2int(stringUUID[index]) << 4;
+ nibble = true;
+ }
+ }
+
+ // populate internal variables if string was successfully parsed
+ if (baseIndex == LENGTH_OF_LONG_UUID) {
+ setupLong(tempUUID, UUID::MSB);
+ } else {
+ const uint8_t sig[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
+ setupLong(sig, UUID::MSB);
+ }
+ }
+
/**
* Creates a new 128-bit UUID.
*
@@ -42,10 +114,12 @@
* different service or characteristics on the BLE device.
*
* @param longUUID
- * The 128-bit (16-byte) UUID value, MSB first (big-endian).
+ * The 128-bit (16-byte) UUID value.
+ * @param order
+ * The bit order of the UUID, MSB by default.
*/
- UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
- setupLong(longUUID);
+ UUID(const LongUUIDBytes_t longUUID, BitOrder_t order = UUID::MSB) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
+ setupLong(longUUID, order);
}
/**
@@ -91,10 +165,17 @@
/**
* Fill in a 128-bit UUID; this is useful when the UUID isn't known at the time of the object construction.
*/
- void setupLong(const LongUUIDBytes_t longUUID) {
+ void setupLong(const LongUUIDBytes_t longUUID, BitOrder_t order = UUID::MSB) {
type = UUID_TYPE_LONG;
- memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
- shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3]));
+ if (order == UUID::MSB) {
+ // Switch endian. Input is big-endian, internal representation is little endian.
+ for (size_t index = 0; index < LENGTH_OF_LONG_UUID; index++) {
+ baseUUID[LENGTH_OF_LONG_UUID - 1 - index] = longUUID[index];
+ }
+ } else {
+ memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
+ }
+ shortUUID = (uint16_t)((baseUUID[13] << 8) | (baseUUID[12]));
}
public:
@@ -132,12 +213,8 @@
private:
UUID_Type_t type; // UUID_TYPE_SHORT or UUID_TYPE_LONG
- LongUUIDBytes_t baseUUID; /* The base of the long UUID (if
- * used). Note: bytes 12 and 13 (counting from LSB)
- * are zeroed out to allow comparison with other long
- * UUIDs, which differ only in the 16-bit relative
- * part.*/
- ShortUUIDBytes_t shortUUID; // 16 bit UUID (byte 2-3 using with base).
+ LongUUIDBytes_t baseUUID; // The long UUID
+ ShortUUIDBytes_t shortUUID; // 16 bit UUID
};
#endif // ifndef __UUID_H__
\ No newline at end of file
