IOTIO
Fork of Nucleo_BLE_API by
Diff: common/GapAdvertisingData.cpp
- Revision:
- 0:289fd2dae405
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/GapAdvertisingData.cpp Fri Dec 19 18:54:46 2014 +0000 @@ -0,0 +1,238 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <string.h> + +#include "GapAdvertisingData.h" + +/**************************************************************************/ +/*! + \brief Creates a new GapAdvertisingData instance + + \par EXAMPLE + + \code + + \endcode +*/ +/**************************************************************************/ +GapAdvertisingData::GapAdvertisingData(void) : _payload(), _payloadLen(0), _appearance(GENERIC_TAG) { + /* empty */ +} + +/**************************************************************************/ +/*! + Destructor +*/ +/**************************************************************************/ +GapAdvertisingData::~GapAdvertisingData(void) +{ +} + +/**************************************************************************/ +/*! + \brief Adds advertising data based on the specified AD type (see + DataType) + + \args[in] advDataType The Advertising 'DataType' to add + \args[in] payload Pointer to the payload contents + \args[in] len Size of the payload in bytes + + \returns ble_error_t + + \retval BLE_ERROR_NONE + Everything executed properly + + \retval BLE_ERROR_BUFFER_OVERFLOW + The specified data would cause the advertising buffer + to overflow + + \par EXAMPLE + + \code + + \endcode +*/ +/**************************************************************************/ +ble_error_t GapAdvertisingData::addData(DataType advDataType, const uint8_t *payload, uint8_t len) +{ + /* ToDo: Check if an AD type already exists and if the existing */ + /* value is exclusive or not (flags, etc.) */ + + /* Make sure we don't exceed the 31 byte payload limit */ + if (_payloadLen + len + 2 > GAP_ADVERTISING_DATA_MAX_PAYLOAD) { + return BLE_ERROR_BUFFER_OVERFLOW; + } + + /* Field length */ + memset(&_payload[_payloadLen], len + 1, 1); + _payloadLen++; + + /* Field ID */ + memset(&_payload[_payloadLen], (uint8_t)advDataType, 1); + _payloadLen++; + + /* Payload */ + memcpy(&_payload[_payloadLen], payload, len); + _payloadLen += len; + + return BLE_ERROR_NONE; +} + +/**************************************************************************/ +/*! + \brief Helper function to add APPEARANCE data to the advertising + payload + + \args[in] appearance The APPEARANCE value to add + + \returns ble_error_t + + \retval BLE_ERROR_NONE + Everything executed properly + + \retval BLE_ERROR_BUFFER_OVERFLOW + The specified data would cause the advertising buffer + to overflow + + \par EXAMPLE + + \code + + \endcode +*/ +/**************************************************************************/ +ble_error_t GapAdvertisingData::addAppearance(Appearance appearance) +{ + _appearance = appearance; + return addData(GapAdvertisingData::APPEARANCE, (uint8_t *)&appearance, 2); +} + +/**************************************************************************/ +/*! + \brief Helper function to add FLAGS data to the advertising + payload + + \args[in] flag The FLAGS value to add + + \par LE_LIMITED_DISCOVERABLE + The peripheral is discoverable for a limited period of + time + + \par LE_GENERAL_DISCOVERABLE + The peripheral is permanently discoverable + + \par BREDR_NOT_SUPPORTED + This peripheral is a Bluetooth Low Energy only device + (no EDR support) + + \returns ble_error_t + + \retval BLE_ERROR_NONE + Everything executed properly + + \retval BLE_ERROR_BUFFER_OVERFLOW + The specified data would cause the advertising buffer + to overflow + + \par EXAMPLE + + \code + + \endcode +*/ +/**************************************************************************/ +ble_error_t GapAdvertisingData::addFlags(uint8_t flags) +{ + return addData(GapAdvertisingData::FLAGS, &flags, 1); +} + +/**************************************************************************/ +/*! + \brief Helper function to add TX_POWER_LEVEL data to the + advertising payload + + \args[in] flag The TX_POWER_LEVEL value to add + + \returns ble_error_t + + \retval BLE_ERROR_NONE + Everything executed properly + + \retval BLE_ERROR_BUFFER_OVERFLOW + The specified data would cause the advertising buffer + to overflow + + \par EXAMPLE + + \code + + \endcode +*/ +/**************************************************************************/ +ble_error_t GapAdvertisingData::addTxPower(int8_t txPower) +{ + /* ToDo: Basic error checking to make sure txPower is in range */ + return addData(GapAdvertisingData::TX_POWER_LEVEL, (uint8_t *)&txPower, 1); +} + +/**************************************************************************/ +/*! + \brief Clears the payload and resets the payload length counter +*/ +/**************************************************************************/ +void GapAdvertisingData::clear(void) +{ + memset(&_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD); + _payloadLen = 0; +} + +/**************************************************************************/ +/*! + \brief Returns a pointer to the the current payload + + \returns A pointer to the payload +*/ +/**************************************************************************/ +const uint8_t *GapAdvertisingData::getPayload(void) const +{ + return (_payloadLen > 0) ? _payload : NULL; +} + +/**************************************************************************/ +/*! + \brief Returns the current payload length (0..31 bytes) + + \returns The payload length in bytes +*/ +/**************************************************************************/ +uint8_t GapAdvertisingData::getPayloadLen(void) const +{ + return _payloadLen; +} + +/**************************************************************************/ +/*! + \brief Returns the 16-bit appearance value for this device + + \returns The 16-bit appearance value +*/ +/**************************************************************************/ +uint16_t GapAdvertisingData::getAppearance(void) const +{ + return (uint16_t)_appearance; +}