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.
Fork of BLE_API by
Diff: ble/UUID.h
- Revision:
- 1042:21a86ac7f5b1
- Parent:
- 1039:2ea9d52111e2
- Child:
- 1048:efb29faf12fc
--- a/ble/UUID.h Thu Dec 10 09:15:05 2015 +0000 +++ b/ble/UUID.h Mon Jan 11 08:51:25 2016 +0000 @@ -19,120 +19,37 @@ #include <stdint.h> #include <string.h> -#include <algorithm> #include "blecommon.h" -/** - * A trivial converter for single hexadecimal character to unsigned-int. - * @param c hexadecimal character. - * @return the corresponding value as unsigned int. - */ -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 { - UUID_TYPE_SHORT = 0, // Short BLE UUID. - UUID_TYPE_LONG = 1 // Full 128-bit UUID. + UUID_TYPE_SHORT = 0, // Short BLE UUID + UUID_TYPE_LONG = 1 // Full 128-bit UUID }; - /** - * An enumeration to specify byte ordering of the long version of the UUID. - */ - typedef enum { - MSB, /*!< Most-significant byte first (at the smallest address) */ - LSB /*!< least-significant byte first (at the smallest address) */ - } ByteOrder_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. + * 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 longUUID - * The 128-bit (16-byte) UUID value. - * @param order - * The bit order of the UUID, MSB by default. + * The 128-bit (16-byte) UUID value, MSB first (big-endian). */ - UUID(const LongUUIDBytes_t longUUID, ByteOrder_t order = UUID::MSB) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) { - setupLong(longUUID, order); + UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) { + setupLong(longUUID); } /** - * Creates a new 16-bit UUID. + * Creates a new 16-bit UUID * * @note The UUID is a unique 16-bit (2 byte) ID used to identify * different service or characteristics on the BLE device. @@ -141,7 +58,7 @@ * 27-byte data payload length of the Link Layer, the BLE specification adds * two additional UUID formats: 16-bit and 32-bit UUIDs. These shortened * formats can be used only with UUIDs that are defined in the Bluetooth - * specification (listed by the Bluetooth SIG as standard + * specification (i.e., that are listed by the Bluetooth SIG as standard * Bluetooth UUIDs). * * To reconstruct the full 128-bit UUID from the shortened version, insert @@ -155,10 +72,10 @@ * vendor-specific UUIDs. In these cases, you’ll need to use the full * 128-bit UUID value at all times. * - * @note We don't yet support 32-bit shortened UUIDs. + * @note we don't yet support 32-bit shortened UUIDs. */ UUID(ShortUUIDBytes_t _shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(_shortUUID) { - /* Empty */ + /* empty */ } UUID(const UUID &source) { @@ -172,17 +89,12 @@ } /** - * Fill in a 128-bit UUID; this is useful when the UUID isn't known at the time of the object construction. + * Fill in a 128-bit UUID; this is useful when UUID isn't known at the time of object construction. */ - void setupLong(const LongUUIDBytes_t longUUID, ByteOrder_t order = UUID::MSB) { + void setupLong(const LongUUIDBytes_t longUUID) { type = UUID_TYPE_LONG; - if (order == UUID::MSB) { - // Switch endian. Input is big-endian, internal representation is little endian. - std::reverse_copy(longUUID, longUUID + LENGTH_OF_LONG_UUID, baseUUID); - } else { - std::copy(longUUID, longUUID + LENGTH_OF_LONG_UUID, baseUUID); - } - shortUUID = (uint16_t)((baseUUID[13] << 8) | (baseUUID[12])); + memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID); + shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3])); } public: @@ -220,8 +132,12 @@ private: UUID_Type_t type; // UUID_TYPE_SHORT or UUID_TYPE_LONG - LongUUIDBytes_t baseUUID; // The long UUID - ShortUUIDBytes_t shortUUID; // 16 bit UUID + 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) }; #endif // ifndef __UUID_H__ \ No newline at end of file