BLE Temperature Service Mobile and Ubiquitous Computing Module Birkbeck College

Dependencies:   DS1820

Committer:
gkroussos
Date:
Sun Mar 08 19:42:20 2015 +0000
Revision:
0:dd0fea342ad2
BLE Temperature Service ; Mobile and Ubiquitous Computing Module; Birkbeck College

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gkroussos 0:dd0fea342ad2 1 /* mbed Microcontroller Library
gkroussos 0:dd0fea342ad2 2 * Copyright (c) 2006-2013 ARM Limited
gkroussos 0:dd0fea342ad2 3 *
gkroussos 0:dd0fea342ad2 4 * Licensed under the Apache License, Version 2.0 (the "License");
gkroussos 0:dd0fea342ad2 5 * you may not use this file except in compliance with the License.
gkroussos 0:dd0fea342ad2 6 * You may obtain a copy of the License at
gkroussos 0:dd0fea342ad2 7 *
gkroussos 0:dd0fea342ad2 8 * http://www.apache.org/licenses/LICENSE-2.0
gkroussos 0:dd0fea342ad2 9 *
gkroussos 0:dd0fea342ad2 10 * Unless required by applicable law or agreed to in writing, software
gkroussos 0:dd0fea342ad2 11 * distributed under the License is distributed on an "AS IS" BASIS,
gkroussos 0:dd0fea342ad2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
gkroussos 0:dd0fea342ad2 13 * See the License for the specific language governing permissions and
gkroussos 0:dd0fea342ad2 14 * limitations under the License.
gkroussos 0:dd0fea342ad2 15 */
gkroussos 0:dd0fea342ad2 16
gkroussos 0:dd0fea342ad2 17 #include <stdio.h>
gkroussos 0:dd0fea342ad2 18 #include <string.h>
gkroussos 0:dd0fea342ad2 19
gkroussos 0:dd0fea342ad2 20 #include "GapAdvertisingData.h"
gkroussos 0:dd0fea342ad2 21
gkroussos 0:dd0fea342ad2 22 /**************************************************************************/
gkroussos 0:dd0fea342ad2 23 /*!
gkroussos 0:dd0fea342ad2 24 \brief Creates a new GapAdvertisingData instance
gkroussos 0:dd0fea342ad2 25
gkroussos 0:dd0fea342ad2 26 \par EXAMPLE
gkroussos 0:dd0fea342ad2 27
gkroussos 0:dd0fea342ad2 28 \code
gkroussos 0:dd0fea342ad2 29
gkroussos 0:dd0fea342ad2 30 \endcode
gkroussos 0:dd0fea342ad2 31 */
gkroussos 0:dd0fea342ad2 32 /**************************************************************************/
gkroussos 0:dd0fea342ad2 33 GapAdvertisingData::GapAdvertisingData(void)
gkroussos 0:dd0fea342ad2 34 {
gkroussos 0:dd0fea342ad2 35 memset(_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
gkroussos 0:dd0fea342ad2 36 _payloadLen = 0;
gkroussos 0:dd0fea342ad2 37 _appearance = GENERIC_TAG;
gkroussos 0:dd0fea342ad2 38 }
gkroussos 0:dd0fea342ad2 39
gkroussos 0:dd0fea342ad2 40 /**************************************************************************/
gkroussos 0:dd0fea342ad2 41 /*!
gkroussos 0:dd0fea342ad2 42 Destructor
gkroussos 0:dd0fea342ad2 43 */
gkroussos 0:dd0fea342ad2 44 /**************************************************************************/
gkroussos 0:dd0fea342ad2 45 GapAdvertisingData::~GapAdvertisingData(void)
gkroussos 0:dd0fea342ad2 46 {
gkroussos 0:dd0fea342ad2 47 }
gkroussos 0:dd0fea342ad2 48
gkroussos 0:dd0fea342ad2 49 /**************************************************************************/
gkroussos 0:dd0fea342ad2 50 /*!
gkroussos 0:dd0fea342ad2 51 \brief Adds advertising data based on the specified AD type (see
gkroussos 0:dd0fea342ad2 52 DataType)
gkroussos 0:dd0fea342ad2 53
gkroussos 0:dd0fea342ad2 54 \args[in] advDataType The Advertising 'DataType' to add
gkroussos 0:dd0fea342ad2 55 \args[in] payload Pointer to the payload contents
gkroussos 0:dd0fea342ad2 56 \args[in] len Size of the payload in bytes
gkroussos 0:dd0fea342ad2 57
gkroussos 0:dd0fea342ad2 58 \returns ble_error_t
gkroussos 0:dd0fea342ad2 59
gkroussos 0:dd0fea342ad2 60 \retval BLE_ERROR_NONE
gkroussos 0:dd0fea342ad2 61 Everything executed properly
gkroussos 0:dd0fea342ad2 62
gkroussos 0:dd0fea342ad2 63 \retval BLE_ERROR_BUFFER_OVERFLOW
gkroussos 0:dd0fea342ad2 64 The specified data would cause the advertising buffer
gkroussos 0:dd0fea342ad2 65 to overflow
gkroussos 0:dd0fea342ad2 66
gkroussos 0:dd0fea342ad2 67 \par EXAMPLE
gkroussos 0:dd0fea342ad2 68
gkroussos 0:dd0fea342ad2 69 \code
gkroussos 0:dd0fea342ad2 70
gkroussos 0:dd0fea342ad2 71 \endcode
gkroussos 0:dd0fea342ad2 72 */
gkroussos 0:dd0fea342ad2 73 /**************************************************************************/
gkroussos 0:dd0fea342ad2 74 ble_error_t GapAdvertisingData::addData(DataType advDataType, uint8_t * payload, uint8_t len)
gkroussos 0:dd0fea342ad2 75 {
gkroussos 0:dd0fea342ad2 76 /* ToDo: Check if an AD type already exists and if the existing */
gkroussos 0:dd0fea342ad2 77 /* value is exclusive or not (flags, etc.) */
gkroussos 0:dd0fea342ad2 78
gkroussos 0:dd0fea342ad2 79 /* Make sure we don't exceed the 31 byte payload limit */
gkroussos 0:dd0fea342ad2 80 if (_payloadLen + len + 2 >= GAP_ADVERTISING_DATA_MAX_PAYLOAD)
gkroussos 0:dd0fea342ad2 81 return BLE_ERROR_BUFFER_OVERFLOW;
gkroussos 0:dd0fea342ad2 82
gkroussos 0:dd0fea342ad2 83 /* Field length */
gkroussos 0:dd0fea342ad2 84 memset(&_payload[_payloadLen], len+1, 1);
gkroussos 0:dd0fea342ad2 85 _payloadLen++;
gkroussos 0:dd0fea342ad2 86
gkroussos 0:dd0fea342ad2 87 /* Field ID */
gkroussos 0:dd0fea342ad2 88 memset(&_payload[_payloadLen], (uint8_t)advDataType, 1);
gkroussos 0:dd0fea342ad2 89 _payloadLen++;
gkroussos 0:dd0fea342ad2 90
gkroussos 0:dd0fea342ad2 91 /* Payload */
gkroussos 0:dd0fea342ad2 92 memcpy(&_payload[_payloadLen], payload, len);
gkroussos 0:dd0fea342ad2 93 _payloadLen += len;
gkroussos 0:dd0fea342ad2 94
gkroussos 0:dd0fea342ad2 95 return BLE_ERROR_NONE;
gkroussos 0:dd0fea342ad2 96 }
gkroussos 0:dd0fea342ad2 97
gkroussos 0:dd0fea342ad2 98 /**************************************************************************/
gkroussos 0:dd0fea342ad2 99 /*!
gkroussos 0:dd0fea342ad2 100 \brief Helper function to add APPEARANCE data to the advertising
gkroussos 0:dd0fea342ad2 101 payload
gkroussos 0:dd0fea342ad2 102
gkroussos 0:dd0fea342ad2 103 \args[in] appearance The APPEARANCE value to add
gkroussos 0:dd0fea342ad2 104
gkroussos 0:dd0fea342ad2 105 \returns ble_error_t
gkroussos 0:dd0fea342ad2 106
gkroussos 0:dd0fea342ad2 107 \retval BLE_ERROR_NONE
gkroussos 0:dd0fea342ad2 108 Everything executed properly
gkroussos 0:dd0fea342ad2 109
gkroussos 0:dd0fea342ad2 110 \retval BLE_ERROR_BUFFER_OVERFLOW
gkroussos 0:dd0fea342ad2 111 The specified data would cause the advertising buffer
gkroussos 0:dd0fea342ad2 112 to overflow
gkroussos 0:dd0fea342ad2 113
gkroussos 0:dd0fea342ad2 114 \par EXAMPLE
gkroussos 0:dd0fea342ad2 115
gkroussos 0:dd0fea342ad2 116 \code
gkroussos 0:dd0fea342ad2 117
gkroussos 0:dd0fea342ad2 118 \endcode
gkroussos 0:dd0fea342ad2 119 */
gkroussos 0:dd0fea342ad2 120 /**************************************************************************/
gkroussos 0:dd0fea342ad2 121 ble_error_t GapAdvertisingData::addAppearance(Appearance appearance)
gkroussos 0:dd0fea342ad2 122 {
gkroussos 0:dd0fea342ad2 123 _appearance = appearance;
gkroussos 0:dd0fea342ad2 124 return addData(GapAdvertisingData::APPEARANCE, (uint8_t*)&appearance, 2);
gkroussos 0:dd0fea342ad2 125 }
gkroussos 0:dd0fea342ad2 126
gkroussos 0:dd0fea342ad2 127 /**************************************************************************/
gkroussos 0:dd0fea342ad2 128 /*!
gkroussos 0:dd0fea342ad2 129 \brief Helper function to add FLAGS data to the advertising
gkroussos 0:dd0fea342ad2 130 payload
gkroussos 0:dd0fea342ad2 131
gkroussos 0:dd0fea342ad2 132 \args[in] flag The FLAGS value to add
gkroussos 0:dd0fea342ad2 133
gkroussos 0:dd0fea342ad2 134 \par LE_LIMITED_DISCOVERABLE
gkroussos 0:dd0fea342ad2 135 The peripheral is discoverable for a limited period of
gkroussos 0:dd0fea342ad2 136 time
gkroussos 0:dd0fea342ad2 137
gkroussos 0:dd0fea342ad2 138 \par LE_GENERAL_DISCOVERABLE
gkroussos 0:dd0fea342ad2 139 The peripheral is permanently discoverable
gkroussos 0:dd0fea342ad2 140
gkroussos 0:dd0fea342ad2 141 \par BREDR_NOT_SUPPORTED
gkroussos 0:dd0fea342ad2 142 This peripheral is a Bluetooth Low Energy only device
gkroussos 0:dd0fea342ad2 143 (no EDR support)
gkroussos 0:dd0fea342ad2 144
gkroussos 0:dd0fea342ad2 145 \returns ble_error_t
gkroussos 0:dd0fea342ad2 146
gkroussos 0:dd0fea342ad2 147 \retval BLE_ERROR_NONE
gkroussos 0:dd0fea342ad2 148 Everything executed properly
gkroussos 0:dd0fea342ad2 149
gkroussos 0:dd0fea342ad2 150 \retval BLE_ERROR_BUFFER_OVERFLOW
gkroussos 0:dd0fea342ad2 151 The specified data would cause the advertising buffer
gkroussos 0:dd0fea342ad2 152 to overflow
gkroussos 0:dd0fea342ad2 153
gkroussos 0:dd0fea342ad2 154 \par EXAMPLE
gkroussos 0:dd0fea342ad2 155
gkroussos 0:dd0fea342ad2 156 \code
gkroussos 0:dd0fea342ad2 157
gkroussos 0:dd0fea342ad2 158 \endcode
gkroussos 0:dd0fea342ad2 159 */
gkroussos 0:dd0fea342ad2 160 /**************************************************************************/
gkroussos 0:dd0fea342ad2 161 ble_error_t GapAdvertisingData::addFlags(Flags flag)
gkroussos 0:dd0fea342ad2 162 {
gkroussos 0:dd0fea342ad2 163 return addData(GapAdvertisingData::FLAGS, (uint8_t*)&flag, 1);
gkroussos 0:dd0fea342ad2 164 }
gkroussos 0:dd0fea342ad2 165
gkroussos 0:dd0fea342ad2 166 /**************************************************************************/
gkroussos 0:dd0fea342ad2 167 /*!
gkroussos 0:dd0fea342ad2 168 \brief Helper function to add TX_POWER_LEVEL data to the
gkroussos 0:dd0fea342ad2 169 advertising payload
gkroussos 0:dd0fea342ad2 170
gkroussos 0:dd0fea342ad2 171 \args[in] flag The TX_POWER_LEVEL value to add
gkroussos 0:dd0fea342ad2 172
gkroussos 0:dd0fea342ad2 173 \returns ble_error_t
gkroussos 0:dd0fea342ad2 174
gkroussos 0:dd0fea342ad2 175 \retval BLE_ERROR_NONE
gkroussos 0:dd0fea342ad2 176 Everything executed properly
gkroussos 0:dd0fea342ad2 177
gkroussos 0:dd0fea342ad2 178 \retval BLE_ERROR_BUFFER_OVERFLOW
gkroussos 0:dd0fea342ad2 179 The specified data would cause the advertising buffer
gkroussos 0:dd0fea342ad2 180 to overflow
gkroussos 0:dd0fea342ad2 181
gkroussos 0:dd0fea342ad2 182 \par EXAMPLE
gkroussos 0:dd0fea342ad2 183
gkroussos 0:dd0fea342ad2 184 \code
gkroussos 0:dd0fea342ad2 185
gkroussos 0:dd0fea342ad2 186 \endcode
gkroussos 0:dd0fea342ad2 187 */
gkroussos 0:dd0fea342ad2 188 /**************************************************************************/
gkroussos 0:dd0fea342ad2 189 ble_error_t GapAdvertisingData::addTxPower(int8_t txPower)
gkroussos 0:dd0fea342ad2 190 {
gkroussos 0:dd0fea342ad2 191 /* ToDo: Basic error checking to make sure txPower is in range */
gkroussos 0:dd0fea342ad2 192 return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t*)&txPower, 1);
gkroussos 0:dd0fea342ad2 193 }
gkroussos 0:dd0fea342ad2 194
gkroussos 0:dd0fea342ad2 195 /**************************************************************************/
gkroussos 0:dd0fea342ad2 196 /*!
gkroussos 0:dd0fea342ad2 197 \brief Clears the payload and resets the payload length counter
gkroussos 0:dd0fea342ad2 198 */
gkroussos 0:dd0fea342ad2 199 /**************************************************************************/
gkroussos 0:dd0fea342ad2 200 void GapAdvertisingData::clear(void)
gkroussos 0:dd0fea342ad2 201 {
gkroussos 0:dd0fea342ad2 202 memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD);
gkroussos 0:dd0fea342ad2 203 _payloadLen = 0;
gkroussos 0:dd0fea342ad2 204 }
gkroussos 0:dd0fea342ad2 205
gkroussos 0:dd0fea342ad2 206 /**************************************************************************/
gkroussos 0:dd0fea342ad2 207 /*!
gkroussos 0:dd0fea342ad2 208 \brief Returns a pointer to the the current payload
gkroussos 0:dd0fea342ad2 209
gkroussos 0:dd0fea342ad2 210 \returns A pointer to the payload
gkroussos 0:dd0fea342ad2 211 */
gkroussos 0:dd0fea342ad2 212 /**************************************************************************/
gkroussos 0:dd0fea342ad2 213 uint8_t * GapAdvertisingData::getPayload(void)
gkroussos 0:dd0fea342ad2 214 {
gkroussos 0:dd0fea342ad2 215 return (_payloadLen > 0) ? _payload : NULL;
gkroussos 0:dd0fea342ad2 216 }
gkroussos 0:dd0fea342ad2 217
gkroussos 0:dd0fea342ad2 218 /**************************************************************************/
gkroussos 0:dd0fea342ad2 219 /*!
gkroussos 0:dd0fea342ad2 220 \brief Returns the current payload length (0..31 bytes)
gkroussos 0:dd0fea342ad2 221
gkroussos 0:dd0fea342ad2 222 \returns The payload length in bytes
gkroussos 0:dd0fea342ad2 223 */
gkroussos 0:dd0fea342ad2 224 /**************************************************************************/
gkroussos 0:dd0fea342ad2 225 uint8_t GapAdvertisingData::getPayloadLen(void)
gkroussos 0:dd0fea342ad2 226 {
gkroussos 0:dd0fea342ad2 227 return _payloadLen;
gkroussos 0:dd0fea342ad2 228 }
gkroussos 0:dd0fea342ad2 229
gkroussos 0:dd0fea342ad2 230 /**************************************************************************/
gkroussos 0:dd0fea342ad2 231 /*!
gkroussos 0:dd0fea342ad2 232 \brief Returns the 16-bit appearance value for this device
gkroussos 0:dd0fea342ad2 233
gkroussos 0:dd0fea342ad2 234 \returns The 16-bit appearance value
gkroussos 0:dd0fea342ad2 235 */
gkroussos 0:dd0fea342ad2 236 /**************************************************************************/
gkroussos 0:dd0fea342ad2 237 uint16_t GapAdvertisingData::getAppearance(void)
gkroussos 0:dd0fea342ad2 238 {
gkroussos 0:dd0fea342ad2 239 return (uint16_t)_appearance;
gkroussos 0:dd0fea342ad2 240 }