High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:53:28 2015 +0100
Revision:
711:ea0c4bf9ec99
Parent:
710:b2e1a2660ec2
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 607:8b3210b0b55e 1 /* mbed Microcontroller Library
rgrover1 607:8b3210b0b55e 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 607:8b3210b0b55e 3 *
rgrover1 607:8b3210b0b55e 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 607:8b3210b0b55e 5 * you may not use this file except in compliance with the License.
rgrover1 607:8b3210b0b55e 6 * You may obtain a copy of the License at
rgrover1 607:8b3210b0b55e 7 *
rgrover1 607:8b3210b0b55e 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 607:8b3210b0b55e 9 *
rgrover1 607:8b3210b0b55e 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 607:8b3210b0b55e 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 607:8b3210b0b55e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 607:8b3210b0b55e 13 * See the License for the specific language governing permissions and
rgrover1 607:8b3210b0b55e 14 * limitations under the License.
rgrover1 607:8b3210b0b55e 15 */
rgrover1 607:8b3210b0b55e 16
rgrover1 607:8b3210b0b55e 17 #ifndef __UUID_H__
rgrover1 607:8b3210b0b55e 18 #define __UUID_H__
rgrover1 607:8b3210b0b55e 19
rgrover1 607:8b3210b0b55e 20 #include <string.h>
rgrover1 607:8b3210b0b55e 21
rgrover1 607:8b3210b0b55e 22 #include "blecommon.h"
rgrover1 607:8b3210b0b55e 23
rgrover1 607:8b3210b0b55e 24 class UUID {
rgrover1 607:8b3210b0b55e 25 public:
rgrover1 607:8b3210b0b55e 26 enum UUID_Type_t {
rgrover1 607:8b3210b0b55e 27 UUID_TYPE_SHORT = 0, // Short BLE UUID
rgrover1 607:8b3210b0b55e 28 UUID_TYPE_LONG = 1 // Full 128-bit UUID
rgrover1 607:8b3210b0b55e 29 };
rgrover1 607:8b3210b0b55e 30
rgrover1 607:8b3210b0b55e 31 static const unsigned LENGTH_OF_LONG_UUID = 16;
rgrover1 710:b2e1a2660ec2 32 typedef uint16_t ShortUUIDBytes_t;
rgrover1 710:b2e1a2660ec2 33 typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID];
rgrover1 607:8b3210b0b55e 34
rgrover1 607:8b3210b0b55e 35 public:
rgrover1 607:8b3210b0b55e 36 /**
rgrover1 607:8b3210b0b55e 37 * Creates a new 128-bit UUID
rgrover1 607:8b3210b0b55e 38 *
rgrover1 607:8b3210b0b55e 39 * @note The UUID is a unique 128-bit (16 byte) ID used to identify
rgrover1 607:8b3210b0b55e 40 * different service or characteristics on the BLE device.
rgrover1 607:8b3210b0b55e 41 *
rgrover1 607:8b3210b0b55e 42 * @param longUUID
rgrover1 607:8b3210b0b55e 43 * The 128-bit (16-byte) UUID value, MSB first (big-endian).
rgrover1 607:8b3210b0b55e 44 */
rgrover1 607:8b3210b0b55e 45 UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_LONG), baseUUID(), shortUUID(0) {
rgrover1 609:af4de765f47c 46 setupLong(longUUID);
rgrover1 607:8b3210b0b55e 47 }
rgrover1 607:8b3210b0b55e 48
rgrover1 607:8b3210b0b55e 49 /**
rgrover1 607:8b3210b0b55e 50 * Creates a new 16-bit UUID
rgrover1 607:8b3210b0b55e 51 *
rgrover1 607:8b3210b0b55e 52 * @note The UUID is a unique 16-bit (2 byte) ID used to identify
rgrover1 607:8b3210b0b55e 53 * different service or characteristics on the BLE device.
rgrover1 607:8b3210b0b55e 54 *
rgrover1 607:8b3210b0b55e 55 * For efficiency, and because 16 bytes would take a large chunk of the
rgrover1 607:8b3210b0b55e 56 * 27-byte data payload length of the Link Layer, the BLE specification adds
rgrover1 607:8b3210b0b55e 57 * two additional UUID formats: 16-bit and 32-bit UUIDs. These shortened
rgrover1 607:8b3210b0b55e 58 * formats can be used only with UUIDs that are defined in the Bluetooth
rgrover1 607:8b3210b0b55e 59 * specification (i.e., that are listed by the Bluetooth SIG as standard
rgrover1 607:8b3210b0b55e 60 * Bluetooth UUIDs).
rgrover1 607:8b3210b0b55e 61 *
rgrover1 607:8b3210b0b55e 62 * To reconstruct the full 128-bit UUID from the shortened version, insert
rgrover1 607:8b3210b0b55e 63 * the 16-bit short value (indicated by xxxx, including leading zeros) into
rgrover1 607:8b3210b0b55e 64 * the Bluetooth Base UUID:
rgrover1 607:8b3210b0b55e 65 *
rgrover1 607:8b3210b0b55e 66 * 0000xxxx-0000-1000-8000-00805F9B34FB
rgrover1 607:8b3210b0b55e 67 *
rgrover1 607:8b3210b0b55e 68 * @note Shortening is not available for UUIDs that are not derived from the
rgrover1 607:8b3210b0b55e 69 * Bluetooth Base UUID. Such non-standard UUIDs are commonly called
rgrover1 607:8b3210b0b55e 70 * vendor-specific UUIDs. In these cases, you’ll need to use the full
rgrover1 607:8b3210b0b55e 71 * 128-bit UUID value at all times.
rgrover1 607:8b3210b0b55e 72 *
rgrover1 607:8b3210b0b55e 73 * @note we don't yet support 32-bit shortened UUIDs.
rgrover1 607:8b3210b0b55e 74 */
rgrover1 607:8b3210b0b55e 75 UUID(ShortUUIDBytes_t shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(shortUUID) {
rgrover1 607:8b3210b0b55e 76 /* empty */
rgrover1 607:8b3210b0b55e 77 }
rgrover1 607:8b3210b0b55e 78
rgrover1 607:8b3210b0b55e 79 UUID(const UUID &source) {
rgrover1 607:8b3210b0b55e 80 type = source.type;
rgrover1 607:8b3210b0b55e 81 shortUUID = source.shortUUID;
rgrover1 607:8b3210b0b55e 82 memcpy(baseUUID, source.baseUUID, LENGTH_OF_LONG_UUID);
rgrover1 607:8b3210b0b55e 83 }
rgrover1 607:8b3210b0b55e 84
rgrover1 607:8b3210b0b55e 85 UUID(void) : type(UUID_TYPE_SHORT), shortUUID(BLE_UUID_UNKNOWN) {
rgrover1 607:8b3210b0b55e 86 /* empty */
rgrover1 607:8b3210b0b55e 87 }
rgrover1 607:8b3210b0b55e 88
rgrover1 609:af4de765f47c 89 /**
rgrover1 609:af4de765f47c 90 * Fill in a 128-bit UUID; this is useful when UUID isn't known at the time of object construction.
rgrover1 609:af4de765f47c 91 */
rgrover1 609:af4de765f47c 92 void setupLong(const LongUUIDBytes_t longUUID) {
rgrover1 609:af4de765f47c 93 type = UUID_TYPE_LONG;
rgrover1 609:af4de765f47c 94 memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
rgrover1 609:af4de765f47c 95 shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3]));
rgrover1 609:af4de765f47c 96 }
rgrover1 609:af4de765f47c 97
rgrover1 607:8b3210b0b55e 98 public:
rgrover1 607:8b3210b0b55e 99 UUID_Type_t shortOrLong(void) const {return type; }
rgrover1 607:8b3210b0b55e 100 const uint8_t *getBaseUUID(void) const {
rgrover1 607:8b3210b0b55e 101 if (type == UUID_TYPE_SHORT) {
rgrover1 607:8b3210b0b55e 102 return (const uint8_t*)&shortUUID;
rgrover1 607:8b3210b0b55e 103 } else {
rgrover1 607:8b3210b0b55e 104 return baseUUID;
rgrover1 607:8b3210b0b55e 105 }
rgrover1 607:8b3210b0b55e 106 }
rgrover1 607:8b3210b0b55e 107
rgrover1 607:8b3210b0b55e 108 ShortUUIDBytes_t getShortUUID(void) const {return shortUUID;}
rgrover1 607:8b3210b0b55e 109 uint8_t getLen(void) const {
rgrover1 607:8b3210b0b55e 110 return ((type == UUID_TYPE_SHORT) ? sizeof(ShortUUIDBytes_t) : LENGTH_OF_LONG_UUID);
rgrover1 607:8b3210b0b55e 111 }
rgrover1 607:8b3210b0b55e 112
rgrover1 607:8b3210b0b55e 113 bool operator== (const UUID &other) const {
rgrover1 607:8b3210b0b55e 114 if ((this->type == UUID_TYPE_SHORT) && (other.type == UUID_TYPE_SHORT) &&
rgrover1 607:8b3210b0b55e 115 (this->shortUUID == other.shortUUID)) {
rgrover1 607:8b3210b0b55e 116 return true;
rgrover1 607:8b3210b0b55e 117 }
rgrover1 607:8b3210b0b55e 118
rgrover1 607:8b3210b0b55e 119 if ((this->type == UUID_TYPE_LONG) && (other.type == UUID_TYPE_LONG) &&
rgrover1 607:8b3210b0b55e 120 (memcmp(this->baseUUID, other.baseUUID, LENGTH_OF_LONG_UUID) == 0)) {
rgrover1 607:8b3210b0b55e 121 return true;
rgrover1 607:8b3210b0b55e 122 }
rgrover1 607:8b3210b0b55e 123
rgrover1 607:8b3210b0b55e 124 return false;
rgrover1 607:8b3210b0b55e 125 }
rgrover1 607:8b3210b0b55e 126
rgrover1 625:3882ae21df26 127 bool operator!= (const UUID &other) const {
rgrover1 625:3882ae21df26 128 return !(*this == other);
rgrover1 625:3882ae21df26 129 }
rgrover1 625:3882ae21df26 130
rgrover1 607:8b3210b0b55e 131 private:
rgrover1 607:8b3210b0b55e 132 UUID_Type_t type; // UUID_TYPE_SHORT or UUID_TYPE_LONG
rgrover1 607:8b3210b0b55e 133 LongUUIDBytes_t baseUUID; /* the base of the long UUID (if
rgrover1 607:8b3210b0b55e 134 * used). Note: bytes 12 and 13 (counting from LSB)
rgrover1 607:8b3210b0b55e 135 * are zeroed out to allow comparison with other long
rgrover1 607:8b3210b0b55e 136 * UUIDs which differ only in the 16-bit relative
rgrover1 607:8b3210b0b55e 137 * part.*/
rgrover1 607:8b3210b0b55e 138 ShortUUIDBytes_t shortUUID; // 16 bit uuid (byte 2-3 using with base)
rgrover1 607:8b3210b0b55e 139 };
rgrover1 607:8b3210b0b55e 140
rgrover1 607:8b3210b0b55e 141 #endif // ifndef __UUID_H__