fix all line endings to be Unix style
This commit is contained in:
parent
270ac8d7c5
commit
bec9560c70
|
@ -1,38 +1,38 @@
|
|||
/* 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 "BLEDevice.h"
|
||||
|
||||
#if defined(TARGET_OTA_ENABLED)
|
||||
#include "DFUService.h"
|
||||
#endif
|
||||
|
||||
ble_error_t
|
||||
BLEDevice::init()
|
||||
{
|
||||
ble_error_t err = transport->init();
|
||||
if (err != BLE_ERROR_NONE) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Platforms enabled for DFU should introduce the DFU Service into
|
||||
* applications automatically. */
|
||||
#if defined(TARGET_OTA_ENABLED)
|
||||
static DFUService dfu(*this); // defined static so that the object remains alive
|
||||
#endif // TARGET_OTA_ENABLED
|
||||
|
||||
return BLE_ERROR_NONE;
|
||||
}
|
||||
/* 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 "BLEDevice.h"
|
||||
|
||||
#if defined(TARGET_OTA_ENABLED)
|
||||
#include "DFUService.h"
|
||||
#endif
|
||||
|
||||
ble_error_t
|
||||
BLEDevice::init()
|
||||
{
|
||||
ble_error_t err = transport->init();
|
||||
if (err != BLE_ERROR_NONE) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Platforms enabled for DFU should introduce the DFU Service into
|
||||
* applications automatically. */
|
||||
#if defined(TARGET_OTA_ENABLED)
|
||||
static DFUService dfu(*this); // defined static so that the object remains alive
|
||||
#endif // TARGET_OTA_ENABLED
|
||||
|
||||
return BLE_ERROR_NONE;
|
||||
}
|
||||
|
|
|
@ -1,238 +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;
|
||||
}
|
||||
/* 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;
|
||||
}
|
||||
|
|
|
@ -1,129 +1,129 @@
|
|||
/* 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 "blecommon.h"
|
||||
#include "GapAdvertisingParams.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Instantiates a new GapAdvertisingParams instance
|
||||
|
||||
\param[in] advType
|
||||
The GAP advertising mode to use for this device. Valid
|
||||
values are defined in AdvertisingType:
|
||||
|
||||
\par ADV_NON_CONNECTABLE_UNDIRECTED
|
||||
All connections to the peripheral device will be refused.
|
||||
|
||||
\par ADV_CONNECTABLE_DIRECTED
|
||||
Only connections from a pre-defined central device will be
|
||||
accepted.
|
||||
|
||||
\par ADV_CONNECTABLE_UNDIRECTED
|
||||
Any central device can connect to this peripheral.
|
||||
|
||||
\par ADV_SCANNABLE_UNDIRECTED
|
||||
Any central device can connect to this peripheral, and
|
||||
the secondary Scan Response payload will be included or
|
||||
available to central devices.
|
||||
|
||||
\par
|
||||
See Bluetooth Core Specification 4.0 (Vol. 3), Part C,
|
||||
Section 9.3 and Core Specification 4.0 (Vol. 6), Part B,
|
||||
Section 2.3.1 for further information on GAP connection
|
||||
modes
|
||||
|
||||
\param[in] interval
|
||||
Advertising interval between 0x0020 and 0x4000 in 0.625ms units
|
||||
(20ms to 10.24s). If using non-connectable mode
|
||||
(ADV_NON_CONNECTABLE_UNDIRECTED) this min value is 0x00A0
|
||||
(100ms). To reduce the likelihood of collisions, the link layer
|
||||
perturbs this interval by a pseudo-random delay with a range of
|
||||
0 ms to 10 ms for each advertising event.
|
||||
|
||||
\par
|
||||
Decreasing this value will allow central devices to detect
|
||||
your peripheral faster at the expense of more power being
|
||||
used by the radio due to the higher data transmit rate.
|
||||
|
||||
\par
|
||||
This field must be set to 0 if connectionMode is equal
|
||||
to ADV_CONNECTABLE_DIRECTED
|
||||
|
||||
\par
|
||||
See Bluetooth Core Specification, Vol 3., Part C,
|
||||
Appendix A for suggested advertising intervals.
|
||||
|
||||
\param[in] timeout
|
||||
Advertising timeout between 0x1 and 0x3FFF (1 and 16383)
|
||||
in seconds. Enter 0 to disable the advertising timeout.
|
||||
|
||||
\par EXAMPLE
|
||||
|
||||
\code
|
||||
|
||||
\endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GapAdvertisingParams::GapAdvertisingParams(AdvertisingType advType, uint16_t interval, uint16_t timeout)
|
||||
{
|
||||
_advType = advType;
|
||||
_interval = interval;
|
||||
_timeout = timeout;
|
||||
|
||||
/* Interval checks */
|
||||
if (_advType == ADV_CONNECTABLE_DIRECTED) {
|
||||
/* Interval must be 0 in directed connectable mode */
|
||||
_interval = 0;
|
||||
} else if (_advType == ADV_NON_CONNECTABLE_UNDIRECTED) {
|
||||
/* Min interval is slightly larger than in other modes */
|
||||
if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON;
|
||||
}
|
||||
if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MAX;
|
||||
}
|
||||
} else {
|
||||
/* Stay within interval limits */
|
||||
if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MIN;
|
||||
}
|
||||
if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
/* Timeout checks */
|
||||
if (timeout) {
|
||||
/* Stay within timeout limits */
|
||||
if (_timeout > GAP_ADV_PARAMS_TIMEOUT_MAX) {
|
||||
_timeout = GAP_ADV_PARAMS_TIMEOUT_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Destructor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GapAdvertisingParams::~GapAdvertisingParams(void)
|
||||
{
|
||||
}
|
||||
/* 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 "blecommon.h"
|
||||
#include "GapAdvertisingParams.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Instantiates a new GapAdvertisingParams instance
|
||||
|
||||
\param[in] advType
|
||||
The GAP advertising mode to use for this device. Valid
|
||||
values are defined in AdvertisingType:
|
||||
|
||||
\par ADV_NON_CONNECTABLE_UNDIRECTED
|
||||
All connections to the peripheral device will be refused.
|
||||
|
||||
\par ADV_CONNECTABLE_DIRECTED
|
||||
Only connections from a pre-defined central device will be
|
||||
accepted.
|
||||
|
||||
\par ADV_CONNECTABLE_UNDIRECTED
|
||||
Any central device can connect to this peripheral.
|
||||
|
||||
\par ADV_SCANNABLE_UNDIRECTED
|
||||
Any central device can connect to this peripheral, and
|
||||
the secondary Scan Response payload will be included or
|
||||
available to central devices.
|
||||
|
||||
\par
|
||||
See Bluetooth Core Specification 4.0 (Vol. 3), Part C,
|
||||
Section 9.3 and Core Specification 4.0 (Vol. 6), Part B,
|
||||
Section 2.3.1 for further information on GAP connection
|
||||
modes
|
||||
|
||||
\param[in] interval
|
||||
Advertising interval between 0x0020 and 0x4000 in 0.625ms units
|
||||
(20ms to 10.24s). If using non-connectable mode
|
||||
(ADV_NON_CONNECTABLE_UNDIRECTED) this min value is 0x00A0
|
||||
(100ms). To reduce the likelihood of collisions, the link layer
|
||||
perturbs this interval by a pseudo-random delay with a range of
|
||||
0 ms to 10 ms for each advertising event.
|
||||
|
||||
\par
|
||||
Decreasing this value will allow central devices to detect
|
||||
your peripheral faster at the expense of more power being
|
||||
used by the radio due to the higher data transmit rate.
|
||||
|
||||
\par
|
||||
This field must be set to 0 if connectionMode is equal
|
||||
to ADV_CONNECTABLE_DIRECTED
|
||||
|
||||
\par
|
||||
See Bluetooth Core Specification, Vol 3., Part C,
|
||||
Appendix A for suggested advertising intervals.
|
||||
|
||||
\param[in] timeout
|
||||
Advertising timeout between 0x1 and 0x3FFF (1 and 16383)
|
||||
in seconds. Enter 0 to disable the advertising timeout.
|
||||
|
||||
\par EXAMPLE
|
||||
|
||||
\code
|
||||
|
||||
\endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GapAdvertisingParams::GapAdvertisingParams(AdvertisingType advType, uint16_t interval, uint16_t timeout)
|
||||
{
|
||||
_advType = advType;
|
||||
_interval = interval;
|
||||
_timeout = timeout;
|
||||
|
||||
/* Interval checks */
|
||||
if (_advType == ADV_CONNECTABLE_DIRECTED) {
|
||||
/* Interval must be 0 in directed connectable mode */
|
||||
_interval = 0;
|
||||
} else if (_advType == ADV_NON_CONNECTABLE_UNDIRECTED) {
|
||||
/* Min interval is slightly larger than in other modes */
|
||||
if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON;
|
||||
}
|
||||
if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MAX;
|
||||
}
|
||||
} else {
|
||||
/* Stay within interval limits */
|
||||
if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MIN;
|
||||
}
|
||||
if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
|
||||
_interval = GAP_ADV_PARAMS_INTERVAL_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
/* Timeout checks */
|
||||
if (timeout) {
|
||||
/* Stay within timeout limits */
|
||||
if (_timeout > GAP_ADV_PARAMS_TIMEOUT_MAX) {
|
||||
_timeout = GAP_ADV_PARAMS_TIMEOUT_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Destructor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GapAdvertisingParams::~GapAdvertisingParams(void)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
/* 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 "GattService.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Creates a new GattService using the specified 128-bit UUID
|
||||
|
||||
@note The UUID value must be unique on the device
|
||||
|
||||
@param[in] uuid
|
||||
The 16 byte (128-bit) UUID to use for this characteristic
|
||||
|
||||
@section EXAMPLE
|
||||
|
||||
@code
|
||||
|
||||
@endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GattService::GattService(const UUID &uuid, GattCharacteristic *characteristics[], unsigned numCharacteristics) :
|
||||
_primaryServiceID(uuid), _characteristicCount(numCharacteristics), _characteristics(characteristics), _handle(0)
|
||||
{
|
||||
/* empty */
|
||||
}
|
||||
/* 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 "GattService.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Creates a new GattService using the specified 128-bit UUID
|
||||
|
||||
@note The UUID value must be unique on the device
|
||||
|
||||
@param[in] uuid
|
||||
The 16 byte (128-bit) UUID to use for this characteristic
|
||||
|
||||
@section EXAMPLE
|
||||
|
||||
@code
|
||||
|
||||
@endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GattService::GattService(const UUID &uuid, GattCharacteristic *characteristics[], unsigned numCharacteristics) :
|
||||
_primaryServiceID(uuid), _characteristicCount(numCharacteristics), _characteristics(characteristics), _handle(0)
|
||||
{
|
||||
/* empty */
|
||||
}
|
||||
|
|
188
common/UUID.cpp
188
common/UUID.cpp
|
@ -1,94 +1,94 @@
|
|||
/* 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 <string.h>
|
||||
|
||||
#include "UUID.h"
|
||||
|
||||
UUID::UUID(ShortUUIDBytes_t shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(shortUUID) {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief 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.
|
||||
|
||||
@note When creating a UUID, the constructor will check if all bytes
|
||||
except bytes 2/3 are equal to 0. If only bytes 2/3 have a
|
||||
value, the UUID will be treated as a short/BLE UUID, and the
|
||||
.type field will be set to UUID::UUID_TYPE_SHORT. If any
|
||||
of the bytes outside byte 2/3 have a non-zero value, the UUID
|
||||
will be considered a 128-bit ID, and .type will be assigned
|
||||
as UUID::UUID_TYPE_LONG.
|
||||
|
||||
@param[in] uuid_base
|
||||
The 128-bit (16-byte) UUID value. For 128-bit values,
|
||||
assign all 16 bytes. For 16-bit values, assign the
|
||||
16-bits to byte 2 and 3, and leave the rest of the bytes
|
||||
as 0.
|
||||
|
||||
@section EXAMPLE
|
||||
|
||||
@code
|
||||
|
||||
// Create a short UUID (0x180F)
|
||||
uint8_t shortID[16] = { 0, 0, 0x0F, 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
UUID ble_uuid = UUID(shortID);
|
||||
// ble_uuid.type = UUID_TYPE_SHORT
|
||||
// ble_uuid.value = 0x180F
|
||||
|
||||
// Creeate a long UUID
|
||||
uint8_t longID[16] = { 0x00, 0x11, 0x22, 0x33,
|
||||
0x44, 0x55, 0x66, 0x77,
|
||||
0x88, 0x99, 0xAA, 0xBB,
|
||||
0xCC, 0xDD, 0xEE, 0xFF };
|
||||
UUID custom_uuid = UUID(longID);
|
||||
// custom_uuid.type = UUID_TYPE_LONG
|
||||
// custom_uuid.value = 0x3322
|
||||
// custom_uuid.base = 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
|
||||
|
||||
@endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
UUID::UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(0)
|
||||
{
|
||||
memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
|
||||
shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3]));
|
||||
|
||||
/* Check if this is a short of a long UUID */
|
||||
unsigned index;
|
||||
for (index = 0; index < LENGTH_OF_LONG_UUID; index++) {
|
||||
if ((index == 2) || (index == 3)) {
|
||||
continue; /* we should not consider bytes 2 and 3 because that's
|
||||
* where the 16-bit relative UUID is placed. */
|
||||
}
|
||||
|
||||
if (baseUUID[index] != 0) {
|
||||
type = UUID_TYPE_LONG;
|
||||
|
||||
/* zero out the 16-bit part in the base; this will help equate long
|
||||
* UUIDs when they differ only in this 16-bit relative part.*/
|
||||
baseUUID[2] = 0;
|
||||
baseUUID[3] = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 <string.h>
|
||||
|
||||
#include "UUID.h"
|
||||
|
||||
UUID::UUID(ShortUUIDBytes_t shortUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(shortUUID) {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief 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.
|
||||
|
||||
@note When creating a UUID, the constructor will check if all bytes
|
||||
except bytes 2/3 are equal to 0. If only bytes 2/3 have a
|
||||
value, the UUID will be treated as a short/BLE UUID, and the
|
||||
.type field will be set to UUID::UUID_TYPE_SHORT. If any
|
||||
of the bytes outside byte 2/3 have a non-zero value, the UUID
|
||||
will be considered a 128-bit ID, and .type will be assigned
|
||||
as UUID::UUID_TYPE_LONG.
|
||||
|
||||
@param[in] uuid_base
|
||||
The 128-bit (16-byte) UUID value. For 128-bit values,
|
||||
assign all 16 bytes. For 16-bit values, assign the
|
||||
16-bits to byte 2 and 3, and leave the rest of the bytes
|
||||
as 0.
|
||||
|
||||
@section EXAMPLE
|
||||
|
||||
@code
|
||||
|
||||
// Create a short UUID (0x180F)
|
||||
uint8_t shortID[16] = { 0, 0, 0x0F, 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
UUID ble_uuid = UUID(shortID);
|
||||
// ble_uuid.type = UUID_TYPE_SHORT
|
||||
// ble_uuid.value = 0x180F
|
||||
|
||||
// Creeate a long UUID
|
||||
uint8_t longID[16] = { 0x00, 0x11, 0x22, 0x33,
|
||||
0x44, 0x55, 0x66, 0x77,
|
||||
0x88, 0x99, 0xAA, 0xBB,
|
||||
0xCC, 0xDD, 0xEE, 0xFF };
|
||||
UUID custom_uuid = UUID(longID);
|
||||
// custom_uuid.type = UUID_TYPE_LONG
|
||||
// custom_uuid.value = 0x3322
|
||||
// custom_uuid.base = 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
|
||||
|
||||
@endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
UUID::UUID(const LongUUIDBytes_t longUUID) : type(UUID_TYPE_SHORT), baseUUID(), shortUUID(0)
|
||||
{
|
||||
memcpy(baseUUID, longUUID, LENGTH_OF_LONG_UUID);
|
||||
shortUUID = (uint16_t)((longUUID[2] << 8) | (longUUID[3]));
|
||||
|
||||
/* Check if this is a short of a long UUID */
|
||||
unsigned index;
|
||||
for (index = 0; index < LENGTH_OF_LONG_UUID; index++) {
|
||||
if ((index == 2) || (index == 3)) {
|
||||
continue; /* we should not consider bytes 2 and 3 because that's
|
||||
* where the 16-bit relative UUID is placed. */
|
||||
}
|
||||
|
||||
if (baseUUID[index] != 0) {
|
||||
type = UUID_TYPE_LONG;
|
||||
|
||||
/* zero out the 16-bit part in the base; this will help equate long
|
||||
* UUIDs when they differ only in this 16-bit relative part.*/
|
||||
baseUUID[2] = 0;
|
||||
baseUUID[3] = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,136 +1,136 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __BLE_COMMON_H__
|
||||
#define __BLE_COMMON_H__
|
||||
|
||||
#define NRF51
|
||||
#define DEBUG_NRF_USER
|
||||
#define BLE_STACK_SUPPORT_REQD
|
||||
#define BOARD_PCA10001
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs
|
||||
* @{ */
|
||||
/* Generic UUIDs, applicable to all services */
|
||||
enum {
|
||||
BLE_UUID_UNKNOWN = 0x0000, /**< Reserved UUID. */
|
||||
BLE_UUID_SERVICE_PRIMARY = 0x2800, /**< Primary Service. */
|
||||
BLE_UUID_SERVICE_SECONDARY = 0x2801, /**< Secondary Service. */
|
||||
BLE_UUID_SERVICE_INCLUDE = 0x2802, /**< Include. */
|
||||
BLE_UUID_CHARACTERISTIC = 0x2803, /**< Characteristic. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP = 0x2900, /**< Characteristic Extended Properties Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_USER_DESC = 0x2901, /**< Characteristic User Description Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG = 0x2902, /**< Client Characteristic Configuration Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG = 0x2903, /**< Server Characteristic Configuration Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT = 0x2904, /**< Characteristic Presentation Format Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT = 0x2905, /**< Characteristic Aggregate Format Descriptor. */
|
||||
|
||||
/* GATT specific UUIDs */
|
||||
BLE_UUID_GATT = 0x1801, /**< Generic Attribute Profile. */
|
||||
BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED = 0x2A05, /**< Service Changed Characteristic. */
|
||||
|
||||
/* GAP specific UUIDs */
|
||||
BLE_UUID_GAP = 0x1800, /**< Generic Access Profile. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME = 0x2A00, /**< Device Name Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE = 0x2A01, /**< Appearance Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_PPF = 0x2A02, /**< Peripheral Privacy Flag Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR = 0x2A03, /**< Reconnection Address Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_PPCP = 0x2A04, /**< Peripheral Preferred Connection Parameters Characteristic. */
|
||||
};
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_APPEARANCES Bluetooth Appearance values
|
||||
* @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
|
||||
* @{ */
|
||||
enum {
|
||||
BLE_APPEARANCE_UNKNOWN = 0, /**< Unknown. */
|
||||
BLE_APPEARANCE_GENERIC_PHONE = 64, /**< Generic Phone. */
|
||||
BLE_APPEARANCE_GENERIC_COMPUTER = 128, /**< Generic Computer. */
|
||||
BLE_APPEARANCE_GENERIC_WATCH = 192, /**< Generic Watch. */
|
||||
BLE_APPEARANCE_WATCH_SPORTS_WATCH = 193, /**< Watch: Sports Watch. */
|
||||
BLE_APPEARANCE_GENERIC_CLOCK = 256, /**< Generic Clock. */
|
||||
BLE_APPEARANCE_GENERIC_DISPLAY = 320, /**< Generic Display. */
|
||||
BLE_APPEARANCE_GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control. */
|
||||
BLE_APPEARANCE_GENERIC_EYE_GLASSES = 448, /**< Generic Eye-glasses. */
|
||||
BLE_APPEARANCE_GENERIC_TAG = 512, /**< Generic Tag. */
|
||||
BLE_APPEARANCE_GENERIC_KEYRING = 576, /**< Generic Keyring. */
|
||||
BLE_APPEARANCE_GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player. */
|
||||
BLE_APPEARANCE_GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner. */
|
||||
BLE_APPEARANCE_GENERIC_THERMOMETER = 768, /**< Generic Thermometer. */
|
||||
BLE_APPEARANCE_THERMOMETER_EAR = 769, /**< Thermometer: Ear. */
|
||||
BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart rate Sensor. */
|
||||
BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Heart Rate Sensor: Heart Rate Belt. */
|
||||
BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure. */
|
||||
BLE_APPEARANCE_BLOOD_PRESSURE_ARM = 897, /**< Blood Pressure: Arm. */
|
||||
BLE_APPEARANCE_BLOOD_PRESSURE_WRIST = 898, /**< Blood Pressure: Wrist. */
|
||||
BLE_APPEARANCE_GENERIC_HID = 960, /**< Human Interface Device (HID). */
|
||||
BLE_APPEARANCE_HID_KEYBOARD = 961, /**< Keyboard (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_MOUSE = 962, /**< Mouse (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_JOYSTICK = 963, /**< Joystiq (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_GAMEPAD = 964, /**< Gamepad (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_DIGITIZERSUBTYPE = 965, /**< Digitizer Tablet (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_CARD_READER = 966, /**< Card Reader (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_DIGITAL_PEN = 967, /**< Digital Pen (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_BARCODE = 968, /**< Barcode Scanner (HID Subtype). */
|
||||
BLE_APPEARANCE_GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter. */
|
||||
BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running Walking Sensor. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< Running Walking Sensor: In-Shoe. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< Running Walking Sensor: On-Shoe. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< Running Walking Sensor: On-Hip. */
|
||||
BLE_APPEARANCE_GENERIC_CYCLING = 1152, /**< Generic Cycling. */
|
||||
BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling: Cycling Computer. */
|
||||
BLE_APPEARANCE_CYCLING_SPEED_SENSOR = 1154, /**< Cycling: Speed Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_CADENCE_SENSOR = 1155, /**< Cycling: Cadence Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_POWER_SENSOR = 1156, /**< Cycling: Power Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR = 1157, /**< Cycling: Speed and Cadence Sensor. */
|
||||
BLE_APPEARANCE_GENERIC_PULSE_OXIMETER = 3136, /**< Generic Pulse Oximeter. */
|
||||
BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip (Pulse Oximeter subtype). */
|
||||
BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn(Pulse Oximeter subtype). */
|
||||
BLE_APPEARANCE_GENERIC_WEIGHT_SCALE = 3200, /**< Generic Weight Scale. */
|
||||
BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT = 5184, /**< Generic Outdoor Sports Activity. */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP = 5185, /**< Location Display Device (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP = 5186, /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD = 5187, /**< Location Pod (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD = 5188, /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */
|
||||
};
|
||||
/** @} */
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Error codes for the BLE API
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_error_e
|
||||
{
|
||||
BLE_ERROR_NONE = 0, /**< No error */
|
||||
BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted */
|
||||
BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implement or isn't supported by the target HW */
|
||||
BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range */
|
||||
BLE_STACK_BUSY = 4, /**< The stack is busy */
|
||||
} ble_error_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ifndef __BLE_COMMON_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __BLE_COMMON_H__
|
||||
#define __BLE_COMMON_H__
|
||||
|
||||
#define NRF51
|
||||
#define DEBUG_NRF_USER
|
||||
#define BLE_STACK_SUPPORT_REQD
|
||||
#define BOARD_PCA10001
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs
|
||||
* @{ */
|
||||
/* Generic UUIDs, applicable to all services */
|
||||
enum {
|
||||
BLE_UUID_UNKNOWN = 0x0000, /**< Reserved UUID. */
|
||||
BLE_UUID_SERVICE_PRIMARY = 0x2800, /**< Primary Service. */
|
||||
BLE_UUID_SERVICE_SECONDARY = 0x2801, /**< Secondary Service. */
|
||||
BLE_UUID_SERVICE_INCLUDE = 0x2802, /**< Include. */
|
||||
BLE_UUID_CHARACTERISTIC = 0x2803, /**< Characteristic. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP = 0x2900, /**< Characteristic Extended Properties Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_USER_DESC = 0x2901, /**< Characteristic User Description Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG = 0x2902, /**< Client Characteristic Configuration Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG = 0x2903, /**< Server Characteristic Configuration Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT = 0x2904, /**< Characteristic Presentation Format Descriptor. */
|
||||
BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT = 0x2905, /**< Characteristic Aggregate Format Descriptor. */
|
||||
|
||||
/* GATT specific UUIDs */
|
||||
BLE_UUID_GATT = 0x1801, /**< Generic Attribute Profile. */
|
||||
BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED = 0x2A05, /**< Service Changed Characteristic. */
|
||||
|
||||
/* GAP specific UUIDs */
|
||||
BLE_UUID_GAP = 0x1800, /**< Generic Access Profile. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME = 0x2A00, /**< Device Name Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE = 0x2A01, /**< Appearance Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_PPF = 0x2A02, /**< Peripheral Privacy Flag Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR = 0x2A03, /**< Reconnection Address Characteristic. */
|
||||
BLE_UUID_GAP_CHARACTERISTIC_PPCP = 0x2A04, /**< Peripheral Preferred Connection Parameters Characteristic. */
|
||||
};
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_APPEARANCES Bluetooth Appearance values
|
||||
* @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
|
||||
* @{ */
|
||||
enum {
|
||||
BLE_APPEARANCE_UNKNOWN = 0, /**< Unknown. */
|
||||
BLE_APPEARANCE_GENERIC_PHONE = 64, /**< Generic Phone. */
|
||||
BLE_APPEARANCE_GENERIC_COMPUTER = 128, /**< Generic Computer. */
|
||||
BLE_APPEARANCE_GENERIC_WATCH = 192, /**< Generic Watch. */
|
||||
BLE_APPEARANCE_WATCH_SPORTS_WATCH = 193, /**< Watch: Sports Watch. */
|
||||
BLE_APPEARANCE_GENERIC_CLOCK = 256, /**< Generic Clock. */
|
||||
BLE_APPEARANCE_GENERIC_DISPLAY = 320, /**< Generic Display. */
|
||||
BLE_APPEARANCE_GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control. */
|
||||
BLE_APPEARANCE_GENERIC_EYE_GLASSES = 448, /**< Generic Eye-glasses. */
|
||||
BLE_APPEARANCE_GENERIC_TAG = 512, /**< Generic Tag. */
|
||||
BLE_APPEARANCE_GENERIC_KEYRING = 576, /**< Generic Keyring. */
|
||||
BLE_APPEARANCE_GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player. */
|
||||
BLE_APPEARANCE_GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner. */
|
||||
BLE_APPEARANCE_GENERIC_THERMOMETER = 768, /**< Generic Thermometer. */
|
||||
BLE_APPEARANCE_THERMOMETER_EAR = 769, /**< Thermometer: Ear. */
|
||||
BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart rate Sensor. */
|
||||
BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Heart Rate Sensor: Heart Rate Belt. */
|
||||
BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure. */
|
||||
BLE_APPEARANCE_BLOOD_PRESSURE_ARM = 897, /**< Blood Pressure: Arm. */
|
||||
BLE_APPEARANCE_BLOOD_PRESSURE_WRIST = 898, /**< Blood Pressure: Wrist. */
|
||||
BLE_APPEARANCE_GENERIC_HID = 960, /**< Human Interface Device (HID). */
|
||||
BLE_APPEARANCE_HID_KEYBOARD = 961, /**< Keyboard (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_MOUSE = 962, /**< Mouse (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_JOYSTICK = 963, /**< Joystiq (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_GAMEPAD = 964, /**< Gamepad (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_DIGITIZERSUBTYPE = 965, /**< Digitizer Tablet (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_CARD_READER = 966, /**< Card Reader (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_DIGITAL_PEN = 967, /**< Digital Pen (HID Subtype). */
|
||||
BLE_APPEARANCE_HID_BARCODE = 968, /**< Barcode Scanner (HID Subtype). */
|
||||
BLE_APPEARANCE_GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter. */
|
||||
BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running Walking Sensor. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< Running Walking Sensor: In-Shoe. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< Running Walking Sensor: On-Shoe. */
|
||||
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< Running Walking Sensor: On-Hip. */
|
||||
BLE_APPEARANCE_GENERIC_CYCLING = 1152, /**< Generic Cycling. */
|
||||
BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling: Cycling Computer. */
|
||||
BLE_APPEARANCE_CYCLING_SPEED_SENSOR = 1154, /**< Cycling: Speed Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_CADENCE_SENSOR = 1155, /**< Cycling: Cadence Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_POWER_SENSOR = 1156, /**< Cycling: Power Sensor. */
|
||||
BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR = 1157, /**< Cycling: Speed and Cadence Sensor. */
|
||||
BLE_APPEARANCE_GENERIC_PULSE_OXIMETER = 3136, /**< Generic Pulse Oximeter. */
|
||||
BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip (Pulse Oximeter subtype). */
|
||||
BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn(Pulse Oximeter subtype). */
|
||||
BLE_APPEARANCE_GENERIC_WEIGHT_SCALE = 3200, /**< Generic Weight Scale. */
|
||||
BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT = 5184, /**< Generic Outdoor Sports Activity. */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP = 5185, /**< Location Display Device (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP = 5186, /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD = 5187, /**< Location Pod (Outdoor Sports Activity subtype). */
|
||||
BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD = 5188, /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */
|
||||
};
|
||||
/** @} */
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Error codes for the BLE API
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_error_e
|
||||
{
|
||||
BLE_ERROR_NONE = 0, /**< No error */
|
||||
BLE_ERROR_BUFFER_OVERFLOW = 1, /**< The requested action would cause a buffer overflow and has been aborted */
|
||||
BLE_ERROR_NOT_IMPLEMENTED = 2, /**< Requested a feature that isn't yet implement or isn't supported by the target HW */
|
||||
BLE_ERROR_PARAM_OUT_OF_RANGE = 3, /**< One of the supplied parameters is outside the valid range */
|
||||
BLE_STACK_BUSY = 4, /**< The stack is busy */
|
||||
} ble_error_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ifndef __BLE_COMMON_H__
|
||||
|
|
|
@ -228,7 +228,7 @@ public:
|
|||
*
|
||||
* @Note: it is possible to chain together multiple onDataSent callbacks
|
||||
* (potentially from different modules of an application) to receive updates
|
||||
* to characteristics.
|
||||
* to characteristics.
|
||||
*
|
||||
* @Note: it is also possible to setup a callback into a member function of
|
||||
* some object.
|
||||
|
|
354
public/Gap.h
354
public/Gap.h
|
@ -1,177 +1,177 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_H__
|
||||
#define __GAP_H__
|
||||
|
||||
#include "GapAdvertisingData.h"
|
||||
#include "GapAdvertisingParams.h"
|
||||
#include "GapEvents.h"
|
||||
#include "CallChain.h"
|
||||
|
||||
using namespace mbed;
|
||||
|
||||
class Gap {
|
||||
public:
|
||||
typedef enum addr_type_e {
|
||||
ADDR_TYPE_PUBLIC = 0,
|
||||
ADDR_TYPE_RANDOM_STATIC,
|
||||
ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
|
||||
ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
|
||||
} addr_type_t;
|
||||
|
||||
static const unsigned ADDR_LEN = 6;
|
||||
typedef uint8_t address_t[ADDR_LEN];
|
||||
|
||||
/**
|
||||
* Enumeration for disconnection reasons. The values for these reasons are
|
||||
* derived from Nordic's implementation; but the reasons are meant to be
|
||||
* independent of the transport. If you are returned a reason which is not
|
||||
* covered by this enumeration, then please refer to the underlying
|
||||
* transport library.
|
||||
*/
|
||||
enum DisconnectionReason_t {
|
||||
REMOTE_USER_TERMINATED_CONNECTION = 0x13,
|
||||
LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
|
||||
CONN_INTERVAL_UNACCEPTABLE = 0x3B,
|
||||
};
|
||||
|
||||
/* Describes the current state of the device (more than one bit can be set) */
|
||||
typedef struct GapState_s {
|
||||
unsigned advertising : 1; /**< peripheral is currently advertising */
|
||||
unsigned connected : 1; /**< peripheral is connected to a central */
|
||||
} GapState_t;
|
||||
|
||||
typedef uint16_t Handle_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
} ConnectionParams_t;
|
||||
|
||||
static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
|
||||
static const uint16_t UNIT_0_625_MS = 650; /**< Number of microseconds in 0.625 milliseconds. */
|
||||
static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
|
||||
return (durationInMillis * 1000) / UNIT_1_25_MS;
|
||||
}
|
||||
static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
|
||||
return (durationInMillis * 1000) / UNIT_0_625_MS;
|
||||
}
|
||||
|
||||
typedef void (*EventCallback_t)(void);
|
||||
typedef void (*ConnectionEventCallback_t)(Handle_t, addr_type_t peerAddrType, const address_t peerAddr, const ConnectionParams_t *);
|
||||
typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
|
||||
|
||||
friend class BLEDevice;
|
||||
private:
|
||||
/* These functions must be defined in the sub-class */
|
||||
virtual ble_error_t setAddress(addr_type_t type, const address_t address) = 0;
|
||||
virtual ble_error_t getAddress(addr_type_t *typeP, address_t address) = 0;
|
||||
virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
|
||||
virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
|
||||
virtual ble_error_t stopAdvertising(void) = 0;
|
||||
virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
|
||||
virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
|
||||
virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
|
||||
virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
|
||||
|
||||
virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
|
||||
virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
|
||||
virtual ble_error_t setAppearance(uint16_t appearance) = 0;
|
||||
virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
|
||||
|
||||
private:
|
||||
/* Event callback handlers */
|
||||
void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
|
||||
void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
|
||||
|
||||
/**
|
||||
* Set the application callback for disconnection events.
|
||||
* @param callback
|
||||
* Pointer to the unique callback.
|
||||
*/
|
||||
void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
|
||||
|
||||
/**
|
||||
* Append to a chain of callbacks to be invoked upon disconnection; these
|
||||
* callbacks receive no context and are therefore different from the
|
||||
* onDisconnection callback.
|
||||
* @param callback
|
||||
* function pointer to be invoked upon disconnection; receives no context.
|
||||
*
|
||||
* @note the disconnection CallChain should have been merged with
|
||||
* onDisconnctionCallback; but this was not possible because
|
||||
* FunctionPointer (which is a building block for CallChain) doesn't
|
||||
* accept variadic templates.
|
||||
*/
|
||||
template<typename T>
|
||||
void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
|
||||
|
||||
GapState_t getState(void) const {
|
||||
return state;
|
||||
}
|
||||
|
||||
protected:
|
||||
/* Default constructor. */
|
||||
Gap() : state(), onTimeout(NULL), onConnection(NULL), onDisconnection(NULL), disconnectionCallChain() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
public:
|
||||
void processConnectionEvent(Handle_t handle, addr_type_t type, const address_t addr, const ConnectionParams_t *params) {
|
||||
state.connected = 1;
|
||||
if (onConnection) {
|
||||
onConnection(handle, type, addr, params);
|
||||
}
|
||||
}
|
||||
|
||||
void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
|
||||
state.connected = 0;
|
||||
if (onDisconnection) {
|
||||
onDisconnection(handle, reason);
|
||||
}
|
||||
disconnectionCallChain.call();
|
||||
}
|
||||
|
||||
void processEvent(GapEvents::gapEvent_e type) {
|
||||
switch (type) {
|
||||
case GapEvents::GAP_EVENT_TIMEOUT:
|
||||
state.advertising = 0;
|
||||
if (onTimeout) {
|
||||
onTimeout();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
GapState_t state;
|
||||
|
||||
private:
|
||||
EventCallback_t onTimeout;
|
||||
ConnectionEventCallback_t onConnection;
|
||||
DisconnectionEventCallback_t onDisconnection;
|
||||
CallChain disconnectionCallChain;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
Gap(const Gap &);
|
||||
Gap& operator=(const Gap &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_H__
|
||||
#define __GAP_H__
|
||||
|
||||
#include "GapAdvertisingData.h"
|
||||
#include "GapAdvertisingParams.h"
|
||||
#include "GapEvents.h"
|
||||
#include "CallChain.h"
|
||||
|
||||
using namespace mbed;
|
||||
|
||||
class Gap {
|
||||
public:
|
||||
typedef enum addr_type_e {
|
||||
ADDR_TYPE_PUBLIC = 0,
|
||||
ADDR_TYPE_RANDOM_STATIC,
|
||||
ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
|
||||
ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
|
||||
} addr_type_t;
|
||||
|
||||
static const unsigned ADDR_LEN = 6;
|
||||
typedef uint8_t address_t[ADDR_LEN];
|
||||
|
||||
/**
|
||||
* Enumeration for disconnection reasons. The values for these reasons are
|
||||
* derived from Nordic's implementation; but the reasons are meant to be
|
||||
* independent of the transport. If you are returned a reason which is not
|
||||
* covered by this enumeration, then please refer to the underlying
|
||||
* transport library.
|
||||
*/
|
||||
enum DisconnectionReason_t {
|
||||
REMOTE_USER_TERMINATED_CONNECTION = 0x13,
|
||||
LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
|
||||
CONN_INTERVAL_UNACCEPTABLE = 0x3B,
|
||||
};
|
||||
|
||||
/* Describes the current state of the device (more than one bit can be set) */
|
||||
typedef struct GapState_s {
|
||||
unsigned advertising : 1; /**< peripheral is currently advertising */
|
||||
unsigned connected : 1; /**< peripheral is connected to a central */
|
||||
} GapState_t;
|
||||
|
||||
typedef uint16_t Handle_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
|
||||
} ConnectionParams_t;
|
||||
|
||||
static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
|
||||
static const uint16_t UNIT_0_625_MS = 650; /**< Number of microseconds in 0.625 milliseconds. */
|
||||
static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
|
||||
return (durationInMillis * 1000) / UNIT_1_25_MS;
|
||||
}
|
||||
static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
|
||||
return (durationInMillis * 1000) / UNIT_0_625_MS;
|
||||
}
|
||||
|
||||
typedef void (*EventCallback_t)(void);
|
||||
typedef void (*ConnectionEventCallback_t)(Handle_t, addr_type_t peerAddrType, const address_t peerAddr, const ConnectionParams_t *);
|
||||
typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
|
||||
|
||||
friend class BLEDevice;
|
||||
private:
|
||||
/* These functions must be defined in the sub-class */
|
||||
virtual ble_error_t setAddress(addr_type_t type, const address_t address) = 0;
|
||||
virtual ble_error_t getAddress(addr_type_t *typeP, address_t address) = 0;
|
||||
virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
|
||||
virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
|
||||
virtual ble_error_t stopAdvertising(void) = 0;
|
||||
virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
|
||||
virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
|
||||
virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
|
||||
virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
|
||||
|
||||
virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
|
||||
virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
|
||||
virtual ble_error_t setAppearance(uint16_t appearance) = 0;
|
||||
virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
|
||||
|
||||
private:
|
||||
/* Event callback handlers */
|
||||
void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
|
||||
void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
|
||||
|
||||
/**
|
||||
* Set the application callback for disconnection events.
|
||||
* @param callback
|
||||
* Pointer to the unique callback.
|
||||
*/
|
||||
void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
|
||||
|
||||
/**
|
||||
* Append to a chain of callbacks to be invoked upon disconnection; these
|
||||
* callbacks receive no context and are therefore different from the
|
||||
* onDisconnection callback.
|
||||
* @param callback
|
||||
* function pointer to be invoked upon disconnection; receives no context.
|
||||
*
|
||||
* @note the disconnection CallChain should have been merged with
|
||||
* onDisconnctionCallback; but this was not possible because
|
||||
* FunctionPointer (which is a building block for CallChain) doesn't
|
||||
* accept variadic templates.
|
||||
*/
|
||||
template<typename T>
|
||||
void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
|
||||
|
||||
GapState_t getState(void) const {
|
||||
return state;
|
||||
}
|
||||
|
||||
protected:
|
||||
/* Default constructor. */
|
||||
Gap() : state(), onTimeout(NULL), onConnection(NULL), onDisconnection(NULL), disconnectionCallChain() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
public:
|
||||
void processConnectionEvent(Handle_t handle, addr_type_t type, const address_t addr, const ConnectionParams_t *params) {
|
||||
state.connected = 1;
|
||||
if (onConnection) {
|
||||
onConnection(handle, type, addr, params);
|
||||
}
|
||||
}
|
||||
|
||||
void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
|
||||
state.connected = 0;
|
||||
if (onDisconnection) {
|
||||
onDisconnection(handle, reason);
|
||||
}
|
||||
disconnectionCallChain.call();
|
||||
}
|
||||
|
||||
void processEvent(GapEvents::gapEvent_e type) {
|
||||
switch (type) {
|
||||
case GapEvents::GAP_EVENT_TIMEOUT:
|
||||
state.advertising = 0;
|
||||
if (onTimeout) {
|
||||
onTimeout();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
GapState_t state;
|
||||
|
||||
private:
|
||||
EventCallback_t onTimeout;
|
||||
ConnectionEventCallback_t onConnection;
|
||||
DisconnectionEventCallback_t onDisconnection;
|
||||
CallChain disconnectionCallChain;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
Gap(const Gap &);
|
||||
Gap& operator=(const Gap &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_H__
|
||||
|
|
|
@ -1,209 +1,209 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_ADVERTISING_DATA_H__
|
||||
#define __GAP_ADVERTISING_DATA_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
#define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
This class provides several helper functions to generate properly
|
||||
formatted GAP Advertising and Scan Response data payloads
|
||||
|
||||
\note
|
||||
See Bluetooth Specification 4.0 (Vol. 3), Part C, Section 11 and 18
|
||||
for further information on Advertising and Scan Response data.
|
||||
|
||||
\par Advertising and Scan Response Payloads
|
||||
Advertising data and Scan Response data are organized around a set of
|
||||
data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
|
||||
Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
|
||||
|
||||
\par
|
||||
Each AD type has it's own standardized 'assigned number', as defined
|
||||
by the Bluetooth SIG:
|
||||
https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
|
||||
|
||||
\par
|
||||
For convenience sake, all appropriate AD types have been encapsulated
|
||||
into GapAdvertisingData::DataType.
|
||||
|
||||
\par
|
||||
Before the AD Types and their payload (if any) can be inserted into
|
||||
the Advertising or Scan Response frames, they need to be formatted as
|
||||
follows:
|
||||
|
||||
\li \c Record length (1 byte)
|
||||
\li \c AD Type (1 byte)
|
||||
\li \c AD payload (optional, only present if record length > 1)
|
||||
|
||||
\par
|
||||
This class takes care of properly formatting the payload, performs
|
||||
some basic checks on the payload length, and tries to avoid common
|
||||
errors like adding an exclusive AD field twice in the Advertising
|
||||
or Scan Response payload.
|
||||
|
||||
\par EXAMPLE
|
||||
|
||||
\code
|
||||
|
||||
// ToDo
|
||||
|
||||
\endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapAdvertisingData
|
||||
{
|
||||
public:
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of Advertising Data types commonly used by peripherals.
|
||||
These AD types are used to describe the capabilities of the
|
||||
peripheral, and get inserted inside the advertising or scan
|
||||
response payloads.
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
|
||||
\li \c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum DataType {
|
||||
FLAGS = 0x01, /**< \ref *Flags */
|
||||
INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02, /**< Incomplete list of 16-bit Service IDs */
|
||||
COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03, /**< Complete list of 16-bit Service IDs */
|
||||
INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04, /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
|
||||
COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05, /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
|
||||
INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06, /**< Incomplete list of 128-bit Service IDs */
|
||||
COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07, /**< Complete list of 128-bit Service IDs */
|
||||
SHORTENED_LOCAL_NAME = 0x08, /**< Shortened Local Name */
|
||||
COMPLETE_LOCAL_NAME = 0x09, /**< Complete Local Name */
|
||||
TX_POWER_LEVEL = 0x0A, /**< TX Power Level (in dBm) */
|
||||
DEVICE_ID = 0x10, /**< Device ID */
|
||||
SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range */
|
||||
SERVICE_DATA = 0x16, /**< Service Data */
|
||||
APPEARANCE = 0x19, /**< \ref Appearance */
|
||||
ADVERTISING_INTERVAL = 0x1A, /**< Advertising Interval */
|
||||
MANUFACTURER_SPECIFIC_DATA = 0xFF /**< Manufacturer Specific Data */
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of values for the FLAGS AD Type
|
||||
|
||||
\note
|
||||
You can use more than one value in the FLAGS AD Type (ex.
|
||||
LE_GENERAL_DISCOVERABLE and BREDR_NOT_SUPPORTED).
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum Flags {
|
||||
LE_LIMITED_DISCOVERABLE = 0x01, /**< *Peripheral device is discoverable for a limited period of time */
|
||||
LE_GENERAL_DISCOVERABLE = 0x02, /**< Peripheral device is discoverable at any moment */
|
||||
BREDR_NOT_SUPPORTED = 0x04, /**< Peripheral device is LE only */
|
||||
SIMULTANEOUS_LE_BREDR_C = 0x08, /**< Not relevant - central mode only */
|
||||
SIMULTANEOUS_LE_BREDR_H = 0x10 /**< Not relevant - central mode only */
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of values for the APPEARANCE AD Type, which describes the
|
||||
physical shape or appearance of the device
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification Supplement, Part A, Section 1.12
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2
|
||||
\li \c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum Appearance {
|
||||
UNKNOWN = 0, /**< Unknown of unspecified appearance type */
|
||||
GENERIC_PHONE = 64, /**< Generic Phone */
|
||||
GENERIC_COMPUTER = 128, /**< Generic Computer */
|
||||
GENERIC_WATCH = 192, /**< Generic Watch */
|
||||
WATCH_SPORTS_WATCH = 193, /**< Sports Watch */
|
||||
GENERIC_CLOCK = 256, /**< Generic Clock */
|
||||
GENERIC_DISPLAY = 320, /**< Generic Display */
|
||||
GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control */
|
||||
GENERIC_EYE_GLASSES = 448, /**< Generic Eye Glasses */
|
||||
GENERIC_TAG = 512, /**< Generic Tag */
|
||||
GENERIC_KEYRING = 576, /**< Generic Keyring */
|
||||
GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player */
|
||||
GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner */
|
||||
GENERIC_THERMOMETER = 768, /**< Generic Thermometer */
|
||||
THERMOMETER_EAR = 769, /**< Ear Thermometer */
|
||||
GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor */
|
||||
HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Belt Heart Rate Sensor */
|
||||
GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure */
|
||||
BLOOD_PRESSURE_ARM = 897, /**< Arm Blood Pressure */
|
||||
BLOOD_PRESSURE_WRIST = 898, /**< Wrist Blood Pressure */
|
||||
HUMAN_INTERFACE_DEVICE_HID = 960, /**< Human Interface Device (HID) */
|
||||
KEYBOARD = 961, /**< Keyboard */
|
||||
MOUSE = 962, /**< Mouse */
|
||||
JOYSTICK = 963, /**< Joystick */
|
||||
GAMEPAD = 964, /**< Gamepad */
|
||||
DIGITIZER_TABLET = 965, /**< Digitizer Tablet */
|
||||
CARD_READER = 966, /**< Card Read */
|
||||
DIGITAL_PEN = 967, /**< Digital Pen */
|
||||
BARCODE_SCANNER = 968, /**< Barcode Scanner */
|
||||
GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter */
|
||||
GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< In Shoe Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< On Shoe Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< On Hip Running/Walking Sensor */
|
||||
GENERIC_CYCLING = 1152, /**< Generic Cycling */
|
||||
CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling Computer */
|
||||
CYCLING_SPEED_SENSOR = 1154, /**< Cycling Speed Senspr */
|
||||
CYCLING_CADENCE_SENSOR = 1155, /**< Cycling Cadence Sensor */
|
||||
CYCLING_POWER_SENSOR = 1156, /**< Cycling Power Sensor */
|
||||
CYCLING_SPEED_AND_CADENCE_SENSOR = 1157, /**< Cycling Speed and Cadence Sensor */
|
||||
PULSE_OXIMETER_GENERIC = 3136, /**< Generic Pulse Oximeter */
|
||||
PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip Pulse Oximeter */
|
||||
PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn Pulse Oximeter */
|
||||
OUTDOOR_GENERIC = 5184, /**< Generic Outdoor */
|
||||
OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185, /**< Outdoor Location Display Device */
|
||||
OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186, /**< Outdoor Location and Navigation Display Device */
|
||||
OUTDOOR_LOCATION_POD = 5187, /**< Outdoor Location Pod */
|
||||
OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188 /**< Outdoor Location and Navigation Pod */
|
||||
};
|
||||
|
||||
GapAdvertisingData(void);
|
||||
virtual ~GapAdvertisingData(void);
|
||||
|
||||
ble_error_t addData(DataType, const uint8_t *, uint8_t);
|
||||
ble_error_t addAppearance(Appearance appearance = GENERIC_TAG);
|
||||
ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE);
|
||||
ble_error_t addTxPower(int8_t txPower);
|
||||
void clear(void);
|
||||
const uint8_t *getPayload(void) const;
|
||||
uint8_t getPayloadLen(void) const;
|
||||
uint16_t getAppearance(void) const;
|
||||
|
||||
private:
|
||||
uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
|
||||
uint8_t _payloadLen;
|
||||
uint16_t _appearance;
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_ADVERTISING_DATA_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_ADVERTISING_DATA_H__
|
||||
#define __GAP_ADVERTISING_DATA_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
#define GAP_ADVERTISING_DATA_MAX_PAYLOAD (31)
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
This class provides several helper functions to generate properly
|
||||
formatted GAP Advertising and Scan Response data payloads
|
||||
|
||||
\note
|
||||
See Bluetooth Specification 4.0 (Vol. 3), Part C, Section 11 and 18
|
||||
for further information on Advertising and Scan Response data.
|
||||
|
||||
\par Advertising and Scan Response Payloads
|
||||
Advertising data and Scan Response data are organized around a set of
|
||||
data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
|
||||
Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
|
||||
|
||||
\par
|
||||
Each AD type has it's own standardized 'assigned number', as defined
|
||||
by the Bluetooth SIG:
|
||||
https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
|
||||
|
||||
\par
|
||||
For convenience sake, all appropriate AD types have been encapsulated
|
||||
into GapAdvertisingData::DataType.
|
||||
|
||||
\par
|
||||
Before the AD Types and their payload (if any) can be inserted into
|
||||
the Advertising or Scan Response frames, they need to be formatted as
|
||||
follows:
|
||||
|
||||
\li \c Record length (1 byte)
|
||||
\li \c AD Type (1 byte)
|
||||
\li \c AD payload (optional, only present if record length > 1)
|
||||
|
||||
\par
|
||||
This class takes care of properly formatting the payload, performs
|
||||
some basic checks on the payload length, and tries to avoid common
|
||||
errors like adding an exclusive AD field twice in the Advertising
|
||||
or Scan Response payload.
|
||||
|
||||
\par EXAMPLE
|
||||
|
||||
\code
|
||||
|
||||
// ToDo
|
||||
|
||||
\endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapAdvertisingData
|
||||
{
|
||||
public:
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of Advertising Data types commonly used by peripherals.
|
||||
These AD types are used to describe the capabilities of the
|
||||
peripheral, and get inserted inside the advertising or scan
|
||||
response payloads.
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
|
||||
\li \c https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum DataType {
|
||||
FLAGS = 0x01, /**< \ref *Flags */
|
||||
INCOMPLETE_LIST_16BIT_SERVICE_IDS = 0x02, /**< Incomplete list of 16-bit Service IDs */
|
||||
COMPLETE_LIST_16BIT_SERVICE_IDS = 0x03, /**< Complete list of 16-bit Service IDs */
|
||||
INCOMPLETE_LIST_32BIT_SERVICE_IDS = 0x04, /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
|
||||
COMPLETE_LIST_32BIT_SERVICE_IDS = 0x05, /**< Complete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
|
||||
INCOMPLETE_LIST_128BIT_SERVICE_IDS = 0x06, /**< Incomplete list of 128-bit Service IDs */
|
||||
COMPLETE_LIST_128BIT_SERVICE_IDS = 0x07, /**< Complete list of 128-bit Service IDs */
|
||||
SHORTENED_LOCAL_NAME = 0x08, /**< Shortened Local Name */
|
||||
COMPLETE_LOCAL_NAME = 0x09, /**< Complete Local Name */
|
||||
TX_POWER_LEVEL = 0x0A, /**< TX Power Level (in dBm) */
|
||||
DEVICE_ID = 0x10, /**< Device ID */
|
||||
SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range */
|
||||
SERVICE_DATA = 0x16, /**< Service Data */
|
||||
APPEARANCE = 0x19, /**< \ref Appearance */
|
||||
ADVERTISING_INTERVAL = 0x1A, /**< Advertising Interval */
|
||||
MANUFACTURER_SPECIFIC_DATA = 0xFF /**< Manufacturer Specific Data */
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of values for the FLAGS AD Type
|
||||
|
||||
\note
|
||||
You can use more than one value in the FLAGS AD Type (ex.
|
||||
LE_GENERAL_DISCOVERABLE and BREDR_NOT_SUPPORTED).
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum Flags {
|
||||
LE_LIMITED_DISCOVERABLE = 0x01, /**< *Peripheral device is discoverable for a limited period of time */
|
||||
LE_GENERAL_DISCOVERABLE = 0x02, /**< Peripheral device is discoverable at any moment */
|
||||
BREDR_NOT_SUPPORTED = 0x04, /**< Peripheral device is LE only */
|
||||
SIMULTANEOUS_LE_BREDR_C = 0x08, /**< Not relevant - central mode only */
|
||||
SIMULTANEOUS_LE_BREDR_H = 0x10 /**< Not relevant - central mode only */
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
A list of values for the APPEARANCE AD Type, which describes the
|
||||
physical shape or appearance of the device
|
||||
|
||||
\par Source
|
||||
\li \c Bluetooth Core Specification Supplement, Part A, Section 1.12
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2
|
||||
\li \c https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
|
||||
*/
|
||||
/**********************************************************************/
|
||||
enum Appearance {
|
||||
UNKNOWN = 0, /**< Unknown of unspecified appearance type */
|
||||
GENERIC_PHONE = 64, /**< Generic Phone */
|
||||
GENERIC_COMPUTER = 128, /**< Generic Computer */
|
||||
GENERIC_WATCH = 192, /**< Generic Watch */
|
||||
WATCH_SPORTS_WATCH = 193, /**< Sports Watch */
|
||||
GENERIC_CLOCK = 256, /**< Generic Clock */
|
||||
GENERIC_DISPLAY = 320, /**< Generic Display */
|
||||
GENERIC_REMOTE_CONTROL = 384, /**< Generic Remote Control */
|
||||
GENERIC_EYE_GLASSES = 448, /**< Generic Eye Glasses */
|
||||
GENERIC_TAG = 512, /**< Generic Tag */
|
||||
GENERIC_KEYRING = 576, /**< Generic Keyring */
|
||||
GENERIC_MEDIA_PLAYER = 640, /**< Generic Media Player */
|
||||
GENERIC_BARCODE_SCANNER = 704, /**< Generic Barcode Scanner */
|
||||
GENERIC_THERMOMETER = 768, /**< Generic Thermometer */
|
||||
THERMOMETER_EAR = 769, /**< Ear Thermometer */
|
||||
GENERIC_HEART_RATE_SENSOR = 832, /**< Generic Heart Rate Sensor */
|
||||
HEART_RATE_SENSOR_HEART_RATE_BELT = 833, /**< Belt Heart Rate Sensor */
|
||||
GENERIC_BLOOD_PRESSURE = 896, /**< Generic Blood Pressure */
|
||||
BLOOD_PRESSURE_ARM = 897, /**< Arm Blood Pressure */
|
||||
BLOOD_PRESSURE_WRIST = 898, /**< Wrist Blood Pressure */
|
||||
HUMAN_INTERFACE_DEVICE_HID = 960, /**< Human Interface Device (HID) */
|
||||
KEYBOARD = 961, /**< Keyboard */
|
||||
MOUSE = 962, /**< Mouse */
|
||||
JOYSTICK = 963, /**< Joystick */
|
||||
GAMEPAD = 964, /**< Gamepad */
|
||||
DIGITIZER_TABLET = 965, /**< Digitizer Tablet */
|
||||
CARD_READER = 966, /**< Card Read */
|
||||
DIGITAL_PEN = 967, /**< Digital Pen */
|
||||
BARCODE_SCANNER = 968, /**< Barcode Scanner */
|
||||
GENERIC_GLUCOSE_METER = 1024, /**< Generic Glucose Meter */
|
||||
GENERIC_RUNNING_WALKING_SENSOR = 1088, /**< Generic Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_IN_SHOE = 1089, /**< In Shoe Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_ON_SHOE = 1090, /**< On Shoe Running/Walking Sensor */
|
||||
RUNNING_WALKING_SENSOR_ON_HIP = 1091, /**< On Hip Running/Walking Sensor */
|
||||
GENERIC_CYCLING = 1152, /**< Generic Cycling */
|
||||
CYCLING_CYCLING_COMPUTER = 1153, /**< Cycling Computer */
|
||||
CYCLING_SPEED_SENSOR = 1154, /**< Cycling Speed Senspr */
|
||||
CYCLING_CADENCE_SENSOR = 1155, /**< Cycling Cadence Sensor */
|
||||
CYCLING_POWER_SENSOR = 1156, /**< Cycling Power Sensor */
|
||||
CYCLING_SPEED_AND_CADENCE_SENSOR = 1157, /**< Cycling Speed and Cadence Sensor */
|
||||
PULSE_OXIMETER_GENERIC = 3136, /**< Generic Pulse Oximeter */
|
||||
PULSE_OXIMETER_FINGERTIP = 3137, /**< Fingertip Pulse Oximeter */
|
||||
PULSE_OXIMETER_WRIST_WORN = 3138, /**< Wrist Worn Pulse Oximeter */
|
||||
OUTDOOR_GENERIC = 5184, /**< Generic Outdoor */
|
||||
OUTDOOR_LOCATION_DISPLAY_DEVICE = 5185, /**< Outdoor Location Display Device */
|
||||
OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE = 5186, /**< Outdoor Location and Navigation Display Device */
|
||||
OUTDOOR_LOCATION_POD = 5187, /**< Outdoor Location Pod */
|
||||
OUTDOOR_LOCATION_AND_NAVIGATION_POD = 5188 /**< Outdoor Location and Navigation Pod */
|
||||
};
|
||||
|
||||
GapAdvertisingData(void);
|
||||
virtual ~GapAdvertisingData(void);
|
||||
|
||||
ble_error_t addData(DataType, const uint8_t *, uint8_t);
|
||||
ble_error_t addAppearance(Appearance appearance = GENERIC_TAG);
|
||||
ble_error_t addFlags(uint8_t flags = LE_GENERAL_DISCOVERABLE);
|
||||
ble_error_t addTxPower(int8_t txPower);
|
||||
void clear(void);
|
||||
const uint8_t *getPayload(void) const;
|
||||
uint8_t getPayloadLen(void) const;
|
||||
uint16_t getAppearance(void) const;
|
||||
|
||||
private:
|
||||
uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
|
||||
uint8_t _payloadLen;
|
||||
uint16_t _appearance;
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_ADVERTISING_DATA_H__
|
||||
|
|
|
@ -1,86 +1,86 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_ADVERTISING_PARAMS_H__
|
||||
#define __GAP_ADVERTISING_PARAMS_H__
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
This class provides a wrapper for the core advertising parameters,
|
||||
including the advertising type (Connectable Undirected,
|
||||
Non Connectable Undirected, etc.), as well as the advertising and
|
||||
timeout intervals.
|
||||
|
||||
\par
|
||||
See the following for more information on advertising types:
|
||||
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 6), Part B, Section 2.3.1
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 9.3
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapAdvertisingParams {
|
||||
public:
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN = 0x0020;
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN_NONCON = 0x00A0;
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MAX = 0x4000;
|
||||
static const unsigned GAP_ADV_PARAMS_TIMEOUT_MAX = 0x3FFF;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Encapsulates the peripheral advertising modes, which determine how
|
||||
the device appears to other central devices in hearing range
|
||||
|
||||
\par
|
||||
See the following for more information on advertising types:
|
||||
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 6), Part B, Section 2.3.1
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 9.3
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum AdvertisingType {
|
||||
ADV_CONNECTABLE_UNDIRECTED, /**< Vol 3, Part C, Section 9.3.4 and Vol 6, Part B, Section 2.3.1.1 */
|
||||
ADV_CONNECTABLE_DIRECTED, /**< Vol 3, Part C, Section 9.3.3 and Vol 6, Part B, Section 2.3.1.2 */
|
||||
ADV_SCANNABLE_UNDIRECTED, /**< Include support for Scan Response payloads, see Vol 6, Part B, Section 2.3.1.4 */
|
||||
ADV_NON_CONNECTABLE_UNDIRECTED /**< Vol 3, Part C, Section 9.3.2 and Vol 6, Part B, Section 2.3.1.3 */
|
||||
};
|
||||
|
||||
public:
|
||||
GapAdvertisingParams(AdvertisingType advType = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED,
|
||||
uint16_t interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON,
|
||||
uint16_t timeout = 0);
|
||||
virtual ~GapAdvertisingParams(void);
|
||||
|
||||
AdvertisingType getAdvertisingType(void) const {return _advType; }
|
||||
uint16_t getInterval(void) const {return _interval;}
|
||||
uint16_t getTimeout(void) const {return _timeout; }
|
||||
|
||||
void setAdvertisingType(AdvertisingType newAdvType) {_advType = newAdvType; }
|
||||
void setInterval(uint16_t newInterval) {_interval = newInterval;}
|
||||
void setTimeout(uint16_t newTimeout) {_timeout = newTimeout; }
|
||||
|
||||
private:
|
||||
AdvertisingType _advType;
|
||||
uint16_t _interval;
|
||||
uint16_t _timeout;
|
||||
|
||||
private:
|
||||
/* disallow copy constructor */
|
||||
GapAdvertisingParams(const GapAdvertisingParams &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_ADVERTISING_PARAMS_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_ADVERTISING_PARAMS_H__
|
||||
#define __GAP_ADVERTISING_PARAMS_H__
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
This class provides a wrapper for the core advertising parameters,
|
||||
including the advertising type (Connectable Undirected,
|
||||
Non Connectable Undirected, etc.), as well as the advertising and
|
||||
timeout intervals.
|
||||
|
||||
\par
|
||||
See the following for more information on advertising types:
|
||||
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 6), Part B, Section 2.3.1
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 9.3
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapAdvertisingParams {
|
||||
public:
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN = 0x0020;
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN_NONCON = 0x00A0;
|
||||
static const unsigned GAP_ADV_PARAMS_INTERVAL_MAX = 0x4000;
|
||||
static const unsigned GAP_ADV_PARAMS_TIMEOUT_MAX = 0x3FFF;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Encapsulates the peripheral advertising modes, which determine how
|
||||
the device appears to other central devices in hearing range
|
||||
|
||||
\par
|
||||
See the following for more information on advertising types:
|
||||
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 6), Part B, Section 2.3.1
|
||||
\li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 9.3
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum AdvertisingType {
|
||||
ADV_CONNECTABLE_UNDIRECTED, /**< Vol 3, Part C, Section 9.3.4 and Vol 6, Part B, Section 2.3.1.1 */
|
||||
ADV_CONNECTABLE_DIRECTED, /**< Vol 3, Part C, Section 9.3.3 and Vol 6, Part B, Section 2.3.1.2 */
|
||||
ADV_SCANNABLE_UNDIRECTED, /**< Include support for Scan Response payloads, see Vol 6, Part B, Section 2.3.1.4 */
|
||||
ADV_NON_CONNECTABLE_UNDIRECTED /**< Vol 3, Part C, Section 9.3.2 and Vol 6, Part B, Section 2.3.1.3 */
|
||||
};
|
||||
|
||||
public:
|
||||
GapAdvertisingParams(AdvertisingType advType = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED,
|
||||
uint16_t interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON,
|
||||
uint16_t timeout = 0);
|
||||
virtual ~GapAdvertisingParams(void);
|
||||
|
||||
AdvertisingType getAdvertisingType(void) const {return _advType; }
|
||||
uint16_t getInterval(void) const {return _interval;}
|
||||
uint16_t getTimeout(void) const {return _timeout; }
|
||||
|
||||
void setAdvertisingType(AdvertisingType newAdvType) {_advType = newAdvType; }
|
||||
void setInterval(uint16_t newInterval) {_interval = newInterval;}
|
||||
void setTimeout(uint16_t newTimeout) {_timeout = newTimeout; }
|
||||
|
||||
private:
|
||||
AdvertisingType _advType;
|
||||
uint16_t _interval;
|
||||
uint16_t _timeout;
|
||||
|
||||
private:
|
||||
/* disallow copy constructor */
|
||||
GapAdvertisingParams(const GapAdvertisingParams &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_ADVERTISING_PARAMS_H__
|
||||
|
|
|
@ -1,46 +1,46 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_EVENTS_H__
|
||||
#define __GAP_EVENTS_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
The base class used to abstract away the callback events that can be
|
||||
triggered with the GAP.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapEvents
|
||||
{
|
||||
public:
|
||||
/******************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Identifies GAP events generated by the radio HW when an event
|
||||
callback occurs
|
||||
*/
|
||||
/******************************************************************/
|
||||
typedef enum gapEvent_e {
|
||||
GAP_EVENT_TIMEOUT = 1, /**< Advertising timed out before a connection was established */
|
||||
GAP_EVENT_CONNECTED = 2, /**< A connection was established with a central device */
|
||||
GAP_EVENT_DISCONNECTED = 3 /**< A connection was closed or lost with a central device */
|
||||
} gapEvent_t;
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_EVENTS_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GAP_EVENTS_H__
|
||||
#define __GAP_EVENTS_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
The base class used to abstract away the callback events that can be
|
||||
triggered with the GAP.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class GapEvents
|
||||
{
|
||||
public:
|
||||
/******************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Identifies GAP events generated by the radio HW when an event
|
||||
callback occurs
|
||||
*/
|
||||
/******************************************************************/
|
||||
typedef enum gapEvent_e {
|
||||
GAP_EVENT_TIMEOUT = 1, /**< Advertising timed out before a connection was established */
|
||||
GAP_EVENT_CONNECTED = 2, /**< A connection was established with a central device */
|
||||
GAP_EVENT_DISCONNECTED = 3 /**< A connection was closed or lost with a central device */
|
||||
} gapEvent_t;
|
||||
};
|
||||
|
||||
#endif // ifndef __GAP_EVENTS_H__
|
||||
|
|
|
@ -1,74 +1,74 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_ATTRIBUTE_H__
|
||||
#define __GATT_ATTRIBUTE_H__
|
||||
|
||||
class GattAttribute {
|
||||
public:
|
||||
typedef uint16_t Handle_t;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new GattAttribute using the specified
|
||||
* UUID, value length, and inital value
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this attribute
|
||||
* @param[in] valuePtr
|
||||
* The memory holding the initial value.
|
||||
* @param[in] initialLen
|
||||
* The min length in bytes of this characteristic's value
|
||||
* @param[in] maxLen
|
||||
* The max length in bytes of this characteristic's value
|
||||
*
|
||||
* @section EXAMPLE
|
||||
*
|
||||
* @code
|
||||
*
|
||||
* // UUID = 0x2A19, Min length 2, Max len = 2, Properties = write
|
||||
* GattCharacteristic c = GattCharacteristic( 0x2A19, 2, 2, BLE_GATT_CHAR_PROPERTIES_WRITE );
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GattAttribute(const UUID &uuid, uint8_t *valuePtr = NULL, uint16_t initialLen = 0, uint16_t maxLen = 0) :
|
||||
_uuid(uuid), _valuePtr(valuePtr), _initialLen(initialLen), _lenMax(maxLen), _handle() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
public:
|
||||
Handle_t getHandle(void) const {return _handle; }
|
||||
const UUID &getUUID(void) const {return _uuid; }
|
||||
uint16_t getInitialLength(void) const {return _initialLen;}
|
||||
uint16_t getMaxLength(void) const {return _lenMax; }
|
||||
void setHandle(Handle_t id) {_handle = id; }
|
||||
uint8_t *getValuePtr(void) {return _valuePtr; }
|
||||
|
||||
private:
|
||||
UUID _uuid; /* Characteristic UUID */
|
||||
uint8_t *_valuePtr;
|
||||
uint16_t _initialLen; /* Initial length of the value */
|
||||
uint16_t _lenMax; /* Maximum length of the value */
|
||||
Handle_t _handle;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
GattAttribute(const GattAttribute &);
|
||||
GattAttribute& operator=(const GattAttribute &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_ATTRIBUTE_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_ATTRIBUTE_H__
|
||||
#define __GATT_ATTRIBUTE_H__
|
||||
|
||||
class GattAttribute {
|
||||
public:
|
||||
typedef uint16_t Handle_t;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new GattAttribute using the specified
|
||||
* UUID, value length, and inital value
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this attribute
|
||||
* @param[in] valuePtr
|
||||
* The memory holding the initial value.
|
||||
* @param[in] initialLen
|
||||
* The min length in bytes of this characteristic's value
|
||||
* @param[in] maxLen
|
||||
* The max length in bytes of this characteristic's value
|
||||
*
|
||||
* @section EXAMPLE
|
||||
*
|
||||
* @code
|
||||
*
|
||||
* // UUID = 0x2A19, Min length 2, Max len = 2, Properties = write
|
||||
* GattCharacteristic c = GattCharacteristic( 0x2A19, 2, 2, BLE_GATT_CHAR_PROPERTIES_WRITE );
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
/**************************************************************************/
|
||||
GattAttribute(const UUID &uuid, uint8_t *valuePtr = NULL, uint16_t initialLen = 0, uint16_t maxLen = 0) :
|
||||
_uuid(uuid), _valuePtr(valuePtr), _initialLen(initialLen), _lenMax(maxLen), _handle() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
public:
|
||||
Handle_t getHandle(void) const {return _handle; }
|
||||
const UUID &getUUID(void) const {return _uuid; }
|
||||
uint16_t getInitialLength(void) const {return _initialLen;}
|
||||
uint16_t getMaxLength(void) const {return _lenMax; }
|
||||
void setHandle(Handle_t id) {_handle = id; }
|
||||
uint8_t *getValuePtr(void) {return _valuePtr; }
|
||||
|
||||
private:
|
||||
UUID _uuid; /* Characteristic UUID */
|
||||
uint8_t *_valuePtr;
|
||||
uint16_t _initialLen; /* Initial length of the value */
|
||||
uint16_t _lenMax; /* Maximum length of the value */
|
||||
Handle_t _handle;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
GattAttribute(const GattAttribute &);
|
||||
GattAttribute& operator=(const GattAttribute &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_ATTRIBUTE_H__
|
||||
|
|
|
@ -1,434 +1,434 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_CHARACTERISTIC_H__
|
||||
#define __GATT_CHARACTERISTIC_H__
|
||||
|
||||
#include "GattAttribute.h"
|
||||
#include "GattCharacteristicWriteCBParams.h"
|
||||
#include "FunctionPointerWithContext.h"
|
||||
|
||||
class GattCharacteristic {
|
||||
public:
|
||||
enum {
|
||||
UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
|
||||
UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
|
||||
UUID_REMOVABLE_CHAR = 0x2A3A,
|
||||
UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
|
||||
UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
|
||||
UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
|
||||
UUID_ALERT_LEVEL_CHAR = 0x2A06,
|
||||
UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
|
||||
UUID_ALERT_STATUS_CHAR = 0x2A3F,
|
||||
UUID_BATTERY_LEVEL_CHAR = 0x2A19,
|
||||
UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
|
||||
UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
|
||||
UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
|
||||
UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
|
||||
UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
|
||||
UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
|
||||
UUID_CURRENT_TIME_CHAR = 0x2A2B,
|
||||
UUID_DATE_TIME_CHAR = 0x2A08,
|
||||
UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
|
||||
UUID_DAY_OF_WEEK_CHAR = 0x2A09,
|
||||
UUID_DST_OFFSET_CHAR = 0x2A0D,
|
||||
UUID_EXACT_TIME_256_CHAR = 0x2A0C,
|
||||
UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
|
||||
UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
|
||||
UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
|
||||
UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
|
||||
UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
|
||||
UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
|
||||
UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
|
||||
UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
|
||||
UUID_HID_INFORMATION_CHAR = 0x2A4A,
|
||||
UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
|
||||
UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
|
||||
UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
|
||||
UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
|
||||
UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
|
||||
UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
|
||||
UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
|
||||
UUID_UNREAD_ALERT_CHAR = 0x2A45,
|
||||
UUID_NEW_ALERT_CHAR = 0x2A46,
|
||||
UUID_PNP_ID_CHAR = 0x2A50,
|
||||
UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
|
||||
UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
|
||||
UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
|
||||
UUID_REPORT_CHAR = 0x2A4D,
|
||||
UUID_REPORT_MAP_CHAR = 0x2A4B,
|
||||
UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
|
||||
UUID_RINGER_SETTING_CHAR = 0x2A41,
|
||||
UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
|
||||
UUID_SCAN_REFRESH_CHAR = 0x2A31,
|
||||
UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
|
||||
UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
|
||||
UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
|
||||
UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
|
||||
UUID_SYSTEM_ID_CHAR = 0x2A23,
|
||||
UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
|
||||
UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
|
||||
UUID_TIME_ACCURACY_CHAR = 0x2A12,
|
||||
UUID_TIME_SOURCE_CHAR = 0x2A13,
|
||||
UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
|
||||
UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
|
||||
UUID_TIME_WITH_DST_CHAR = 0x2A11,
|
||||
UUID_TIME_ZONE_CHAR = 0x2A0E,
|
||||
UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
|
||||
UUID_CSC_FEATURE_CHAR = 0x2A5C,
|
||||
UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
|
||||
UUID_RSC_FEATURE_CHAR = 0x2A54,
|
||||
UUID_RSC_MEASUREMENT_CHAR = 0x2A53,
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT characteristic presentation format unit types.
|
||||
These unit types are used to describe what the raw numeric
|
||||
data in a characteristic actually represents.
|
||||
|
||||
\note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_unit_e {
|
||||
BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type */
|
||||
BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, Metre */
|
||||
BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, Kilogram */
|
||||
BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, Second */
|
||||
BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric Current, Ampere */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic Temperature, Kelvin */
|
||||
BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of Substance, Mole */
|
||||
BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous Intensity, Candela */
|
||||
BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, Square Metres */
|
||||
BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, Cubic Metres*/
|
||||
BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, Metres per Second*/
|
||||
BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, Metres per Second Squared */
|
||||
BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave Number Reciprocal, Metre */
|
||||
BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, Kilogram per Cubic Metre */
|
||||
BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
|
||||
BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic Field Strength, Ampere per Metre */
|
||||
BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
|
||||
BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
|
||||
BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
|
||||
BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
|
||||
BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
|
||||
BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
|
||||
BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, Hertz */
|
||||
BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, Newton */
|
||||
BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, Pascal */
|
||||
BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, Joule */
|
||||
BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, Watt */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical Charge, Coulomb */
|
||||
BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical Potential Difference, Voltage */
|
||||
BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
|
||||
BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
|
||||
BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
|
||||
BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
|
||||
BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
|
||||
BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
|
||||
BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
|
||||
BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
|
||||
BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
|
||||
BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
|
||||
BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
|
||||
BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
|
||||
BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
|
||||
BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
|
||||
BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
|
||||
BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
|
||||
BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
|
||||
BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
|
||||
BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
|
||||
BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
|
||||
BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
|
||||
BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
|
||||
BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
|
||||
BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
|
||||
BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
|
||||
BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
|
||||
BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
|
||||
BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, Minute */
|
||||
BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, Hour */
|
||||
BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, Day */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
|
||||
BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
|
||||
BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
|
||||
BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
|
||||
BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, Bar */
|
||||
BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, Millimetre of Mercury */
|
||||
BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
|
||||
BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
|
||||
BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
|
||||
BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
|
||||
BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
|
||||
BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
|
||||
BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, Yard */
|
||||
BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, Parsec */
|
||||
BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, Inch */
|
||||
BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, Foot */
|
||||
BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, Mile */
|
||||
BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
|
||||
BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, Kilometre per Hour */
|
||||
BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, Mile per Hour */
|
||||
BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, Revolution per Minute */
|
||||
BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, Gram Calorie */
|
||||
BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, Kilogram Calorie */
|
||||
BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, Killowatt Hour */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
|
||||
BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage */
|
||||
BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
|
||||
BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
|
||||
BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
|
||||
BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
|
||||
BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, Year */
|
||||
BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, Month */
|
||||
BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
|
||||
BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
|
||||
} ble_gatt_unit_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT number types
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
|
||||
\note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_format_e {
|
||||
BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved For Future Use. */
|
||||
BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
|
||||
BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
|
||||
BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
|
||||
BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
|
||||
BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
|
||||
BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
|
||||
BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
|
||||
BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
|
||||
BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
|
||||
BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
|
||||
BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
|
||||
} ble_gatt_format_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT characteristic properties
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
|
||||
and Section 3.3.3.1 for Extended Properties
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_char_properties_e {
|
||||
BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
|
||||
BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the Characteristic Value using Server Characteristic Configuration Descriptor. */
|
||||
BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the Characteristic Value. */
|
||||
BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the Characteristic Value without response. */
|
||||
BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the Characteristic Value with response. */
|
||||
BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a Characteristic Value without acknowledgment. */
|
||||
BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a Characteristic Value with acknowledgment. */
|
||||
BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the Characteristic Value. */
|
||||
BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor */
|
||||
} ble_gatt_char_properties_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief GATT presentation format wrapper
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
|
||||
\note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef struct PresentationFormat {
|
||||
uint8_t gatt_format; /**< Format of the value, see @ref ble_gatt_format_t. */
|
||||
int8_t exponent; /**< Exponent for integer data types. Ex. if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
|
||||
uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers, see @ref ble_gatt_unit_t. */
|
||||
uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1', see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0', see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
} presentation_format_t;
|
||||
|
||||
/**
|
||||
* @brief Creates a new GattCharacteristic using the specified 16-bit
|
||||
* UUID, value length, and properties
|
||||
*
|
||||
* @note The UUID value must be unique in the service and is normally >1
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this characteristic
|
||||
* @param[in] valuePtr
|
||||
* The memory holding the initial value. The value is copied
|
||||
* into the stack when the enclosing service is added; and
|
||||
* thereafter maintained internally by the stack.
|
||||
* @param[in] initialLen
|
||||
* The min length in bytes of this characteristic's value
|
||||
* @param[in] maxLen
|
||||
* The max length in bytes of this characteristic's value
|
||||
* @param[in] props
|
||||
* The 8-bit bit field containing the characteristic's properties
|
||||
* @param[in] descriptors
|
||||
* A pointer to an array of descriptors to be included within this characteristic
|
||||
* @param[in] numDescriptors
|
||||
* The number of descriptors
|
||||
* @param[in] writeAuthorizationIn
|
||||
* Do the attribute(s) of this characteristic have write
|
||||
* authorization enabled? if so, Write Authorization will be
|
||||
* requested from the application on every write request
|
||||
* operation (but not write command).
|
||||
*
|
||||
* @NOTE: If valuePtr == NULL, initialLength == 0, and properties == READ
|
||||
* for the value attribute of a characteristic, then that particular
|
||||
* characteristic may be considered optional and dropped while
|
||||
* instantiating the service with the underlying BLE stack.
|
||||
*/
|
||||
GattCharacteristic(const UUID &uuid,
|
||||
uint8_t *valuePtr = NULL,
|
||||
uint16_t initialLen = 0,
|
||||
uint16_t maxLen = 0,
|
||||
uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
|
||||
GattAttribute *descriptors[] = NULL,
|
||||
unsigned numDescriptors = 0) :
|
||||
_valueAttribute(uuid, valuePtr, initialLen, maxLen),
|
||||
_properties(props),
|
||||
_descriptors(descriptors),
|
||||
_descriptorCount(numDescriptors),
|
||||
enabledReadAuthorization(false),
|
||||
enabledWriteAuthorization(false),
|
||||
readAuthorizationCallback(),
|
||||
writeAuthorizationCallback() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
/**
|
||||
* Authorization.
|
||||
*/
|
||||
public:
|
||||
void setWriteAuthorizationCallback(void (*callback)(GattCharacteristicWriteAuthCBParams *)) {
|
||||
writeAuthorizationCallback.attach(callback);
|
||||
enabledWriteAuthorization = true;
|
||||
}
|
||||
template <typename T>
|
||||
void setWriteAuthorizationCallback(T *object, void (T::*member)(GattCharacteristicWriteAuthCBParams *)) {
|
||||
writeAuthorizationCallback.attach(object, member);
|
||||
enabledWriteAuthorization = true;
|
||||
}
|
||||
void setReadAuthorizationCallback(void (*callback)(GattCharacteristicReadAuthCBParams *)) {
|
||||
readAuthorizationCallback.attach(callback);
|
||||
enabledReadAuthorization = true;
|
||||
}
|
||||
template <typename T>
|
||||
void setReadAuthorizationCallback(T *object, void (T::*member)(GattCharacteristicReadAuthCBParams *)) {
|
||||
readAuthorizationCallback.attach(object, member);
|
||||
enabledReadAuthorization = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function meant to be called from the guts of the BLE stack to
|
||||
* determine the authorization reply for a write request.
|
||||
* @param params to capture the context of the write-auth request; and also contains an out-parameter for reply.
|
||||
* @return true if the write is authorized to proceed.
|
||||
*/
|
||||
bool authorizeWrite(GattCharacteristicWriteAuthCBParams *params) {
|
||||
if (!isWriteAuthorizationEnabled()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
params->authorizationReply = true; /* initialized to true by default */
|
||||
writeAuthorizationCallback.call(params);
|
||||
return params->authorizationReply;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function meant to be called from the guts of the BLE stack to
|
||||
* determine the authorization reply for a read request.
|
||||
* @param params to capture the context of the read-auth request; and also contains an out-parameter for reply.
|
||||
* @return true if the read is authorized to proceed.
|
||||
*/
|
||||
bool authorizeRead(GattCharacteristicReadAuthCBParams *params) {
|
||||
if (!isReadAuthorizationEnabled()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
params->authorizationReply = true; /* initialized to true by default */
|
||||
readAuthorizationCallback.call(params);
|
||||
return params->authorizationReply;
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
public:
|
||||
GattAttribute& getValueAttribute() {return _valueAttribute; }
|
||||
const GattAttribute& getValueAttribute() const {return _valueAttribute; }
|
||||
GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
|
||||
uint8_t getProperties(void) const {return _properties; }
|
||||
uint8_t getDescriptorCount(void) const {return _descriptorCount; }
|
||||
bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
|
||||
bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
|
||||
|
||||
GattAttribute *getDescriptor(uint8_t index) {
|
||||
if (index >= _descriptorCount) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _descriptors[index];
|
||||
}
|
||||
|
||||
private:
|
||||
GattAttribute _valueAttribute;
|
||||
uint8_t _properties;
|
||||
GattAttribute **_descriptors;
|
||||
uint8_t _descriptorCount;
|
||||
|
||||
bool enabledReadAuthorization;
|
||||
bool enabledWriteAuthorization;
|
||||
FunctionPointerWithContext<GattCharacteristicReadAuthCBParams *> readAuthorizationCallback;
|
||||
FunctionPointerWithContext<GattCharacteristicWriteAuthCBParams *> writeAuthorizationCallback;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
GattCharacteristic(const GattCharacteristic &);
|
||||
GattCharacteristic& operator=(const GattCharacteristic &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_CHARACTERISTIC_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_CHARACTERISTIC_H__
|
||||
#define __GATT_CHARACTERISTIC_H__
|
||||
|
||||
#include "GattAttribute.h"
|
||||
#include "GattCharacteristicWriteCBParams.h"
|
||||
#include "FunctionPointerWithContext.h"
|
||||
|
||||
class GattCharacteristic {
|
||||
public:
|
||||
enum {
|
||||
UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B,
|
||||
UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A,
|
||||
UUID_REMOVABLE_CHAR = 0x2A3A,
|
||||
UUID_SERVICE_REQUIRED_CHAR = 0x2A3B,
|
||||
UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43,
|
||||
UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42,
|
||||
UUID_ALERT_LEVEL_CHAR = 0x2A06,
|
||||
UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44,
|
||||
UUID_ALERT_STATUS_CHAR = 0x2A3F,
|
||||
UUID_BATTERY_LEVEL_CHAR = 0x2A19,
|
||||
UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49,
|
||||
UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35,
|
||||
UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38,
|
||||
UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22,
|
||||
UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32,
|
||||
UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33,
|
||||
UUID_CURRENT_TIME_CHAR = 0x2A2B,
|
||||
UUID_DATE_TIME_CHAR = 0x2A08,
|
||||
UUID_DAY_DATE_TIME_CHAR = 0x2A0A,
|
||||
UUID_DAY_OF_WEEK_CHAR = 0x2A09,
|
||||
UUID_DST_OFFSET_CHAR = 0x2A0D,
|
||||
UUID_EXACT_TIME_256_CHAR = 0x2A0C,
|
||||
UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26,
|
||||
UUID_GLUCOSE_FEATURE_CHAR = 0x2A51,
|
||||
UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18,
|
||||
UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34,
|
||||
UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27,
|
||||
UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39,
|
||||
UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37,
|
||||
UUID_HID_CONTROL_POINT_CHAR = 0x2A4C,
|
||||
UUID_HID_INFORMATION_CHAR = 0x2A4A,
|
||||
UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A,
|
||||
UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36,
|
||||
UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E,
|
||||
UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F,
|
||||
UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29,
|
||||
UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21,
|
||||
UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24,
|
||||
UUID_UNREAD_ALERT_CHAR = 0x2A45,
|
||||
UUID_NEW_ALERT_CHAR = 0x2A46,
|
||||
UUID_PNP_ID_CHAR = 0x2A50,
|
||||
UUID_PROTOCOL_MODE_CHAR = 0x2A4E,
|
||||
UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52,
|
||||
UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14,
|
||||
UUID_REPORT_CHAR = 0x2A4D,
|
||||
UUID_REPORT_MAP_CHAR = 0x2A4B,
|
||||
UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40,
|
||||
UUID_RINGER_SETTING_CHAR = 0x2A41,
|
||||
UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F,
|
||||
UUID_SCAN_REFRESH_CHAR = 0x2A31,
|
||||
UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25,
|
||||
UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28,
|
||||
UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47,
|
||||
UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48,
|
||||
UUID_SYSTEM_ID_CHAR = 0x2A23,
|
||||
UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C,
|
||||
UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D,
|
||||
UUID_TIME_ACCURACY_CHAR = 0x2A12,
|
||||
UUID_TIME_SOURCE_CHAR = 0x2A13,
|
||||
UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16,
|
||||
UUID_TIME_UPDATE_STATE_CHAR = 0x2A17,
|
||||
UUID_TIME_WITH_DST_CHAR = 0x2A11,
|
||||
UUID_TIME_ZONE_CHAR = 0x2A0E,
|
||||
UUID_TX_POWER_LEVEL_CHAR = 0x2A07,
|
||||
UUID_CSC_FEATURE_CHAR = 0x2A5C,
|
||||
UUID_CSC_MEASUREMENT_CHAR = 0x2A5B,
|
||||
UUID_RSC_FEATURE_CHAR = 0x2A54,
|
||||
UUID_RSC_MEASUREMENT_CHAR = 0x2A53,
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT characteristic presentation format unit types.
|
||||
These unit types are used to describe what the raw numeric
|
||||
data in a characteristic actually represents.
|
||||
|
||||
\note See https://developer.bluetooth.org/gatt/units/Pages/default.aspx
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_unit_e {
|
||||
BLE_GATT_UNIT_NONE = 0x2700, /**< No specified unit type */
|
||||
BLE_GATT_UNIT_LENGTH_METRE = 0x2701, /**< Length, Metre */
|
||||
BLE_GATT_UNIT_MASS_KILOGRAM = 0x2702, /**< Mass, Kilogram */
|
||||
BLE_GATT_UNIT_TIME_SECOND = 0x2703, /**< Time, Second */
|
||||
BLE_GATT_UNIT_ELECTRIC_CURRENT_AMPERE = 0x2704, /**< Electric Current, Ampere */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_KELVIN = 0x2705, /**< Thermodynamic Temperature, Kelvin */
|
||||
BLE_GATT_UNIT_AMOUNT_OF_SUBSTANCE_MOLE = 0x2706, /**< Amount of Substance, Mole */
|
||||
BLE_GATT_UNIT_LUMINOUS_INTENSITY_CANDELA = 0x2707, /**< Luminous Intensity, Candela */
|
||||
BLE_GATT_UNIT_AREA_SQUARE_METRES = 0x2710, /**< Area, Square Metres */
|
||||
BLE_GATT_UNIT_VOLUME_CUBIC_METRES = 0x2711, /**< Volume, Cubic Metres*/
|
||||
BLE_GATT_UNIT_VELOCITY_METRES_PER_SECOND = 0x2712, /**< Velocity, Metres per Second*/
|
||||
BLE_GATT_UNIT_ACCELERATION_METRES_PER_SECOND_SQUARED = 0x2713, /**< Acceleration, Metres per Second Squared */
|
||||
BLE_GATT_UNIT_WAVENUMBER_RECIPROCAL_METRE = 0x2714, /**< Wave Number Reciprocal, Metre */
|
||||
BLE_GATT_UNIT_DENSITY_KILOGRAM_PER_CUBIC_METRE = 0x2715, /**< Density, Kilogram per Cubic Metre */
|
||||
BLE_GATT_UNIT_SURFACE_DENSITY_KILOGRAM_PER_SQUARE_METRE = 0x2716, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_VOLUME_CUBIC_METRE_PER_KILOGRAM = 0x2717, /**< */
|
||||
BLE_GATT_UNIT_CURRENT_DENSITY_AMPERE_PER_SQUARE_METRE = 0x2718, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FIELD_STRENGTH_AMPERE_PER_METRE = 0x2719, /**< Magnetic Field Strength, Ampere per Metre */
|
||||
BLE_GATT_UNIT_AMOUNT_CONCENTRATION_MOLE_PER_CUBIC_METRE = 0x271A, /**< */
|
||||
BLE_GATT_UNIT_MASS_CONCENTRATION_KILOGRAM_PER_CUBIC_METRE = 0x271B, /**< */
|
||||
BLE_GATT_UNIT_LUMINANCE_CANDELA_PER_SQUARE_METRE = 0x271C, /**< */
|
||||
BLE_GATT_UNIT_REFRACTIVE_INDEX = 0x271D, /**< */
|
||||
BLE_GATT_UNIT_RELATIVE_PERMEABILITY = 0x271E, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_RADIAN = 0x2720, /**< */
|
||||
BLE_GATT_UNIT_SOLID_ANGLE_STERADIAN = 0x2721, /**< */
|
||||
BLE_GATT_UNIT_FREQUENCY_HERTZ = 0x2722, /**< Frequency, Hertz */
|
||||
BLE_GATT_UNIT_FORCE_NEWTON = 0x2723, /**< Force, Newton */
|
||||
BLE_GATT_UNIT_PRESSURE_PASCAL = 0x2724, /**< Pressure, Pascal */
|
||||
BLE_GATT_UNIT_ENERGY_JOULE = 0x2725, /**< Energy, Joule */
|
||||
BLE_GATT_UNIT_POWER_WATT = 0x2726, /**< Power, Watt */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_COULOMB = 0x2727, /**< Electrical Charge, Coulomb */
|
||||
BLE_GATT_UNIT_ELECTRIC_POTENTIAL_DIFFERENCE_VOLT = 0x2728, /**< Electrical Potential Difference, Voltage */
|
||||
BLE_GATT_UNIT_CAPACITANCE_FARAD = 0x2729, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_RESISTANCE_OHM = 0x272A, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CONDUCTANCE_SIEMENS = 0x272B, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FLEX_WEBER = 0x272C, /**< */
|
||||
BLE_GATT_UNIT_MAGNETIC_FLEX_DENSITY_TESLA = 0x272D, /**< */
|
||||
BLE_GATT_UNIT_INDUCTANCE_HENRY = 0x272E, /**< */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_CELSIUS = 0x272F, /**< */
|
||||
BLE_GATT_UNIT_LUMINOUS_FLUX_LUMEN = 0x2730, /**< */
|
||||
BLE_GATT_UNIT_ILLUMINANCE_LUX = 0x2731, /**< */
|
||||
BLE_GATT_UNIT_ACTIVITY_REFERRED_TO_A_RADIONUCLIDE_BECQUEREL = 0x2732, /**< */
|
||||
BLE_GATT_UNIT_ABSORBED_DOSE_GRAY = 0x2733, /**< */
|
||||
BLE_GATT_UNIT_DOSE_EQUIVALENT_SIEVERT = 0x2734, /**< */
|
||||
BLE_GATT_UNIT_CATALYTIC_ACTIVITY_KATAL = 0x2735, /**< */
|
||||
BLE_GATT_UNIT_DYNAMIC_VISCOSITY_PASCAL_SECOND = 0x2740, /**< */
|
||||
BLE_GATT_UNIT_MOMENT_OF_FORCE_NEWTON_METRE = 0x2741, /**< */
|
||||
BLE_GATT_UNIT_SURFACE_TENSION_NEWTON_PER_METRE = 0x2742, /**< */
|
||||
BLE_GATT_UNIT_ANGULAR_VELOCITY_RADIAN_PER_SECOND = 0x2743, /**< */
|
||||
BLE_GATT_UNIT_ANGULAR_ACCELERATION_RADIAN_PER_SECOND_SQUARED = 0x2744, /**< */
|
||||
BLE_GATT_UNIT_HEAT_FLUX_DENSITY_WATT_PER_SQUARE_METRE = 0x2745, /**< */
|
||||
BLE_GATT_UNIT_HEAT_CAPACITY_JOULE_PER_KELVIN = 0x2746, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_HEAT_CAPACITY_JOULE_PER_KILOGRAM_KELVIN = 0x2747, /**< */
|
||||
BLE_GATT_UNIT_SPECIFIC_ENERGY_JOULE_PER_KILOGRAM = 0x2748, /**< */
|
||||
BLE_GATT_UNIT_THERMAL_CONDUCTIVITY_WATT_PER_METRE_KELVIN = 0x2749, /**< */
|
||||
BLE_GATT_UNIT_ENERGY_DENSITY_JOULE_PER_CUBIC_METRE = 0x274A, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_FIELD_STRENGTH_VOLT_PER_METRE = 0x274B, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_DENSITY_COULOMB_PER_CUBIC_METRE = 0x274C, /**< */
|
||||
BLE_GATT_UNIT_SURFACE_CHARGE_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274D, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_FLUX_DENSITY_COULOMB_PER_SQUARE_METRE = 0x274E, /**< */
|
||||
BLE_GATT_UNIT_PERMITTIVITY_FARAD_PER_METRE = 0x274F, /**< */
|
||||
BLE_GATT_UNIT_PERMEABILITY_HENRY_PER_METRE = 0x2750, /**< */
|
||||
BLE_GATT_UNIT_MOLAR_ENERGY_JOULE_PER_MOLE = 0x2751, /**< */
|
||||
BLE_GATT_UNIT_MOLAR_ENTROPY_JOULE_PER_MOLE_KELVIN = 0x2752, /**< */
|
||||
BLE_GATT_UNIT_EXPOSURE_COULOMB_PER_KILOGRAM = 0x2753, /**< */
|
||||
BLE_GATT_UNIT_ABSORBED_DOSE_RATE_GRAY_PER_SECOND = 0x2754, /**< */
|
||||
BLE_GATT_UNIT_RADIANT_INTENSITY_WATT_PER_STERADIAN = 0x2755, /**< */
|
||||
BLE_GATT_UNIT_RADIANCE_WATT_PER_SQUARE_METRE_STERADIAN = 0x2756, /**< */
|
||||
BLE_GATT_UNIT_CATALYTIC_ACTIVITY_CONCENTRATION_KATAL_PER_CUBIC_METRE = 0x2757, /**< */
|
||||
BLE_GATT_UNIT_TIME_MINUTE = 0x2760, /**< Time, Minute */
|
||||
BLE_GATT_UNIT_TIME_HOUR = 0x2761, /**< Time, Hour */
|
||||
BLE_GATT_UNIT_TIME_DAY = 0x2762, /**< Time, Day */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_DEGREE = 0x2763, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_MINUTE = 0x2764, /**< */
|
||||
BLE_GATT_UNIT_PLANE_ANGLE_SECOND = 0x2765, /**< */
|
||||
BLE_GATT_UNIT_AREA_HECTARE = 0x2766, /**< */
|
||||
BLE_GATT_UNIT_VOLUME_LITRE = 0x2767, /**< */
|
||||
BLE_GATT_UNIT_MASS_TONNE = 0x2768, /**< */
|
||||
BLE_GATT_UNIT_PRESSURE_BAR = 0x2780, /**< Pressure, Bar */
|
||||
BLE_GATT_UNIT_PRESSURE_MILLIMETRE_OF_MERCURY = 0x2781, /**< Pressure, Millimetre of Mercury */
|
||||
BLE_GATT_UNIT_LENGTH_ANGSTROM = 0x2782, /**< */
|
||||
BLE_GATT_UNIT_LENGTH_NAUTICAL_MILE = 0x2783, /**< */
|
||||
BLE_GATT_UNIT_AREA_BARN = 0x2784, /**< */
|
||||
BLE_GATT_UNIT_VELOCITY_KNOT = 0x2785, /**< */
|
||||
BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_NEPER = 0x2786, /**< */
|
||||
BLE_GATT_UNIT_LOGARITHMIC_RADIO_QUANTITY_BEL = 0x2787, /**< */
|
||||
BLE_GATT_UNIT_LENGTH_YARD = 0x27A0, /**< Length, Yard */
|
||||
BLE_GATT_UNIT_LENGTH_PARSEC = 0x27A1, /**< Length, Parsec */
|
||||
BLE_GATT_UNIT_LENGTH_INCH = 0x27A2, /**< Length, Inch */
|
||||
BLE_GATT_UNIT_LENGTH_FOOT = 0x27A3, /**< Length, Foot */
|
||||
BLE_GATT_UNIT_LENGTH_MILE = 0x27A4, /**< Length, Mile */
|
||||
BLE_GATT_UNIT_PRESSURE_POUND_FORCE_PER_SQUARE_INCH = 0x27A5, /**< */
|
||||
BLE_GATT_UNIT_VELOCITY_KILOMETRE_PER_HOUR = 0x27A6, /**< Velocity, Kilometre per Hour */
|
||||
BLE_GATT_UNIT_VELOCITY_MILE_PER_HOUR = 0x27A7, /**< Velocity, Mile per Hour */
|
||||
BLE_GATT_UNIT_ANGULAR_VELOCITY_REVOLUTION_PER_MINUTE = 0x27A8, /**< Angular Velocity, Revolution per Minute */
|
||||
BLE_GATT_UNIT_ENERGY_GRAM_CALORIE = 0x27A9, /**< Energy, Gram Calorie */
|
||||
BLE_GATT_UNIT_ENERGY_KILOGRAM_CALORIE = 0x27AA, /**< Energy, Kilogram Calorie */
|
||||
BLE_GATT_UNIT_ENERGY_KILOWATT_HOUR = 0x27AB, /**< Energy, Killowatt Hour */
|
||||
BLE_GATT_UNIT_THERMODYNAMIC_TEMPERATURE_DEGREE_FAHRENHEIT = 0x27AC, /**< */
|
||||
BLE_GATT_UNIT_PERCENTAGE = 0x27AD, /**< Percentage */
|
||||
BLE_GATT_UNIT_PER_MILLE = 0x27AE, /**< */
|
||||
BLE_GATT_UNIT_PERIOD_BEATS_PER_MINUTE = 0x27AF, /**< */
|
||||
BLE_GATT_UNIT_ELECTRIC_CHARGE_AMPERE_HOURS = 0x27B0, /**< */
|
||||
BLE_GATT_UNIT_MASS_DENSITY_MILLIGRAM_PER_DECILITRE = 0x27B1, /**< */
|
||||
BLE_GATT_UNIT_MASS_DENSITY_MILLIMOLE_PER_LITRE = 0x27B2, /**< */
|
||||
BLE_GATT_UNIT_TIME_YEAR = 0x27B3, /**< Time, Year */
|
||||
BLE_GATT_UNIT_TIME_MONTH = 0x27B4, /**< Time, Month */
|
||||
BLE_GATT_UNIT_CONCENTRATION_COUNT_PER_CUBIC_METRE = 0x27B5, /**< */
|
||||
BLE_GATT_UNIT_IRRADIANCE_WATT_PER_SQUARE_METRE = 0x27B6 /**< */
|
||||
} ble_gatt_unit_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT number types
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5.2
|
||||
\note See http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_format_e {
|
||||
BLE_GATT_FORMAT_RFU = 0x00, /**< Reserved For Future Use. */
|
||||
BLE_GATT_FORMAT_BOOLEAN = 0x01, /**< Boolean. */
|
||||
BLE_GATT_FORMAT_2BIT = 0x02, /**< Unsigned 2-bit integer. */
|
||||
BLE_GATT_FORMAT_NIBBLE = 0x03, /**< Unsigned 4-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT8 = 0x04, /**< Unsigned 8-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT12 = 0x05, /**< Unsigned 12-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT16 = 0x06, /**< Unsigned 16-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT24 = 0x07, /**< Unsigned 24-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT32 = 0x08, /**< Unsigned 32-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT48 = 0x09, /**< Unsigned 48-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT64 = 0x0A, /**< Unsigned 64-bit integer. */
|
||||
BLE_GATT_FORMAT_UINT128 = 0x0B, /**< Unsigned 128-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT8 = 0x0C, /**< Signed 2-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT12 = 0x0D, /**< Signed 12-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT16 = 0x0E, /**< Signed 16-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT24 = 0x0F, /**< Signed 24-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT32 = 0x10, /**< Signed 32-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT48 = 0x11, /**< Signed 48-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT64 = 0x12, /**< Signed 64-bit integer. */
|
||||
BLE_GATT_FORMAT_SINT128 = 0x13, /**< Signed 128-bit integer. */
|
||||
BLE_GATT_FORMAT_FLOAT32 = 0x14, /**< IEEE-754 32-bit floating point. */
|
||||
BLE_GATT_FORMAT_FLOAT64 = 0x15, /**< IEEE-754 64-bit floating point. */
|
||||
BLE_GATT_FORMAT_SFLOAT = 0x16, /**< IEEE-11073 16-bit SFLOAT. */
|
||||
BLE_GATT_FORMAT_FLOAT = 0x17, /**< IEEE-11073 32-bit FLOAT. */
|
||||
BLE_GATT_FORMAT_DUINT16 = 0x18, /**< IEEE-20601 format. */
|
||||
BLE_GATT_FORMAT_UTF8S = 0x19, /**< UTF-8 string. */
|
||||
BLE_GATT_FORMAT_UTF16S = 0x1A, /**< UTF-16 string. */
|
||||
BLE_GATT_FORMAT_STRUCT = 0x1B /**< Opaque Structure. */
|
||||
} ble_gatt_format_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief Standard GATT characteristic properties
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.1.1
|
||||
and Section 3.3.3.1 for Extended Properties
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef enum ble_gatt_char_properties_e {
|
||||
BLE_GATT_CHAR_PROPERTIES_NONE = 0x00,
|
||||
BLE_GATT_CHAR_PROPERTIES_BROADCAST = 0x01, /**< Permits broadcasts of the Characteristic Value using Server Characteristic Configuration Descriptor. */
|
||||
BLE_GATT_CHAR_PROPERTIES_READ = 0x02, /**< Permits reads of the Characteristic Value. */
|
||||
BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE = 0x04, /**< Permits writes of the Characteristic Value without response. */
|
||||
BLE_GATT_CHAR_PROPERTIES_WRITE = 0x08, /**< Permits writes of the Characteristic Value with response. */
|
||||
BLE_GATT_CHAR_PROPERTIES_NOTIFY = 0x10, /**< Permits notifications of a Characteristic Value without acknowledgment. */
|
||||
BLE_GATT_CHAR_PROPERTIES_INDICATE = 0x20, /**< Permits indications of a Characteristic Value with acknowledgment. */
|
||||
BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES = 0x40, /**< Permits signed writes to the Characteristic Value. */
|
||||
BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES = 0x80 /**< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor */
|
||||
} ble_gatt_char_properties_t;
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
\brief GATT presentation format wrapper
|
||||
|
||||
\note See Bluetooth Specification 4.0 (Vol. 3), Part G, Section 3.3.3.5
|
||||
\note See https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef struct PresentationFormat {
|
||||
uint8_t gatt_format; /**< Format of the value, see @ref ble_gatt_format_t. */
|
||||
int8_t exponent; /**< Exponent for integer data types. Ex. if Exponent = -3 and the char value is 3892, the actual value is 3.892 */
|
||||
uint16_t gatt_unit; /**< UUID from Bluetooth Assigned Numbers, see @ref ble_gatt_unit_t. */
|
||||
uint8_t gatt_namespace; /**< Namespace from Bluetooth Assigned Numbers, normally '1', see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
uint16_t gatt_nsdesc; /**< Namespace description from Bluetooth Assigned Numbers, normally '0', see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
} presentation_format_t;
|
||||
|
||||
/**
|
||||
* @brief Creates a new GattCharacteristic using the specified 16-bit
|
||||
* UUID, value length, and properties
|
||||
*
|
||||
* @note The UUID value must be unique in the service and is normally >1
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this characteristic
|
||||
* @param[in] valuePtr
|
||||
* The memory holding the initial value. The value is copied
|
||||
* into the stack when the enclosing service is added; and
|
||||
* thereafter maintained internally by the stack.
|
||||
* @param[in] initialLen
|
||||
* The min length in bytes of this characteristic's value
|
||||
* @param[in] maxLen
|
||||
* The max length in bytes of this characteristic's value
|
||||
* @param[in] props
|
||||
* The 8-bit bit field containing the characteristic's properties
|
||||
* @param[in] descriptors
|
||||
* A pointer to an array of descriptors to be included within this characteristic
|
||||
* @param[in] numDescriptors
|
||||
* The number of descriptors
|
||||
* @param[in] writeAuthorizationIn
|
||||
* Do the attribute(s) of this characteristic have write
|
||||
* authorization enabled? if so, Write Authorization will be
|
||||
* requested from the application on every write request
|
||||
* operation (but not write command).
|
||||
*
|
||||
* @NOTE: If valuePtr == NULL, initialLength == 0, and properties == READ
|
||||
* for the value attribute of a characteristic, then that particular
|
||||
* characteristic may be considered optional and dropped while
|
||||
* instantiating the service with the underlying BLE stack.
|
||||
*/
|
||||
GattCharacteristic(const UUID &uuid,
|
||||
uint8_t *valuePtr = NULL,
|
||||
uint16_t initialLen = 0,
|
||||
uint16_t maxLen = 0,
|
||||
uint8_t props = BLE_GATT_CHAR_PROPERTIES_NONE,
|
||||
GattAttribute *descriptors[] = NULL,
|
||||
unsigned numDescriptors = 0) :
|
||||
_valueAttribute(uuid, valuePtr, initialLen, maxLen),
|
||||
_properties(props),
|
||||
_descriptors(descriptors),
|
||||
_descriptorCount(numDescriptors),
|
||||
enabledReadAuthorization(false),
|
||||
enabledWriteAuthorization(false),
|
||||
readAuthorizationCallback(),
|
||||
writeAuthorizationCallback() {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
/**
|
||||
* Authorization.
|
||||
*/
|
||||
public:
|
||||
void setWriteAuthorizationCallback(void (*callback)(GattCharacteristicWriteAuthCBParams *)) {
|
||||
writeAuthorizationCallback.attach(callback);
|
||||
enabledWriteAuthorization = true;
|
||||
}
|
||||
template <typename T>
|
||||
void setWriteAuthorizationCallback(T *object, void (T::*member)(GattCharacteristicWriteAuthCBParams *)) {
|
||||
writeAuthorizationCallback.attach(object, member);
|
||||
enabledWriteAuthorization = true;
|
||||
}
|
||||
void setReadAuthorizationCallback(void (*callback)(GattCharacteristicReadAuthCBParams *)) {
|
||||
readAuthorizationCallback.attach(callback);
|
||||
enabledReadAuthorization = true;
|
||||
}
|
||||
template <typename T>
|
||||
void setReadAuthorizationCallback(T *object, void (T::*member)(GattCharacteristicReadAuthCBParams *)) {
|
||||
readAuthorizationCallback.attach(object, member);
|
||||
enabledReadAuthorization = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function meant to be called from the guts of the BLE stack to
|
||||
* determine the authorization reply for a write request.
|
||||
* @param params to capture the context of the write-auth request; and also contains an out-parameter for reply.
|
||||
* @return true if the write is authorized to proceed.
|
||||
*/
|
||||
bool authorizeWrite(GattCharacteristicWriteAuthCBParams *params) {
|
||||
if (!isWriteAuthorizationEnabled()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
params->authorizationReply = true; /* initialized to true by default */
|
||||
writeAuthorizationCallback.call(params);
|
||||
return params->authorizationReply;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function meant to be called from the guts of the BLE stack to
|
||||
* determine the authorization reply for a read request.
|
||||
* @param params to capture the context of the read-auth request; and also contains an out-parameter for reply.
|
||||
* @return true if the read is authorized to proceed.
|
||||
*/
|
||||
bool authorizeRead(GattCharacteristicReadAuthCBParams *params) {
|
||||
if (!isReadAuthorizationEnabled()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
params->authorizationReply = true; /* initialized to true by default */
|
||||
readAuthorizationCallback.call(params);
|
||||
return params->authorizationReply;
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
public:
|
||||
GattAttribute& getValueAttribute() {return _valueAttribute; }
|
||||
const GattAttribute& getValueAttribute() const {return _valueAttribute; }
|
||||
GattAttribute::Handle_t getValueHandle(void) const {return getValueAttribute().getHandle();}
|
||||
uint8_t getProperties(void) const {return _properties; }
|
||||
uint8_t getDescriptorCount(void) const {return _descriptorCount; }
|
||||
bool isReadAuthorizationEnabled() const {return enabledReadAuthorization; }
|
||||
bool isWriteAuthorizationEnabled() const {return enabledWriteAuthorization; }
|
||||
|
||||
GattAttribute *getDescriptor(uint8_t index) {
|
||||
if (index >= _descriptorCount) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _descriptors[index];
|
||||
}
|
||||
|
||||
private:
|
||||
GattAttribute _valueAttribute;
|
||||
uint8_t _properties;
|
||||
GattAttribute **_descriptors;
|
||||
uint8_t _descriptorCount;
|
||||
|
||||
bool enabledReadAuthorization;
|
||||
bool enabledWriteAuthorization;
|
||||
FunctionPointerWithContext<GattCharacteristicReadAuthCBParams *> readAuthorizationCallback;
|
||||
FunctionPointerWithContext<GattCharacteristicWriteAuthCBParams *> writeAuthorizationCallback;
|
||||
|
||||
private:
|
||||
/* disallow copy and assignment */
|
||||
GattCharacteristic(const GattCharacteristic &);
|
||||
GattCharacteristic& operator=(const GattCharacteristic &);
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_CHARACTERISTIC_H__
|
||||
|
|
|
@ -1,39 +1,39 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_SERVER_EVENTS_H__
|
||||
#define __GATT_SERVER_EVENTS_H__
|
||||
|
||||
/*!
|
||||
\brief
|
||||
The base class used to abstract away the callback events that can be
|
||||
triggered with the GATT Server.
|
||||
*/
|
||||
class GattServerEvents
|
||||
{
|
||||
public:
|
||||
typedef enum gattEvent_e {
|
||||
GATT_EVENT_DATA_SENT = 1, /**< Fired when a msg was successfully sent out (notify only?) */
|
||||
GATT_EVENT_DATA_WRITTEN = 2, /**< Client wrote data to Server (separate into char and descriptor writes?) */
|
||||
GATT_EVENT_UPDATES_ENABLED = 3, /**< Notify/Indicate Enabled in CCCD */
|
||||
GATT_EVENT_UPDATES_DISABLED = 4, /**< Notify/Indicate Disabled in CCCD */
|
||||
GATT_EVENT_CONFIRMATION_RECEIVED = 5, /**< Response received from Indicate message */
|
||||
GATT_EVENT_READ_AUTHORIZATION_REQ = 6, /**< Request application to authorize read */
|
||||
GATT_EVENT_WRITE_AUTHORIZATION_REQ = 7, /**< Request application to authorize write */
|
||||
} gattEvent_t;
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_SERVER_EVENTS_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_SERVER_EVENTS_H__
|
||||
#define __GATT_SERVER_EVENTS_H__
|
||||
|
||||
/*!
|
||||
\brief
|
||||
The base class used to abstract away the callback events that can be
|
||||
triggered with the GATT Server.
|
||||
*/
|
||||
class GattServerEvents
|
||||
{
|
||||
public:
|
||||
typedef enum gattEvent_e {
|
||||
GATT_EVENT_DATA_SENT = 1, /**< Fired when a msg was successfully sent out (notify only?) */
|
||||
GATT_EVENT_DATA_WRITTEN = 2, /**< Client wrote data to Server (separate into char and descriptor writes?) */
|
||||
GATT_EVENT_UPDATES_ENABLED = 3, /**< Notify/Indicate Enabled in CCCD */
|
||||
GATT_EVENT_UPDATES_DISABLED = 4, /**< Notify/Indicate Disabled in CCCD */
|
||||
GATT_EVENT_CONFIRMATION_RECEIVED = 5, /**< Response received from Indicate message */
|
||||
GATT_EVENT_READ_AUTHORIZATION_REQ = 6, /**< Request application to authorize read */
|
||||
GATT_EVENT_WRITE_AUTHORIZATION_REQ = 7, /**< Request application to authorize write */
|
||||
} gattEvent_t;
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_SERVER_EVENTS_H__
|
||||
|
|
|
@ -1,82 +1,82 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_SERVICE_H__
|
||||
#define __GATT_SERVICE_H__
|
||||
|
||||
#include "UUID.h"
|
||||
#include "GattCharacteristic.h"
|
||||
|
||||
class GattService {
|
||||
public:
|
||||
enum {
|
||||
UUID_ALERT_NOTIFICATION_SERVICE = 0x1811,
|
||||
UUID_BATTERY_SERVICE = 0x180F,
|
||||
UUID_BLOOD_PRESSURE_SERVICE = 0x1810,
|
||||
UUID_CURRENT_TIME_SERVICE = 0x1805,
|
||||
UUID_CYCLING_SPEED_AND_CADENCE = 0x1816,
|
||||
UUID_DEVICE_INFORMATION_SERVICE = 0x180A,
|
||||
UUID_GLUCOSE_SERVICE = 0x1808,
|
||||
UUID_HEALTH_THERMOMETER_SERVICE = 0x1809,
|
||||
UUID_HEART_RATE_SERVICE = 0x180D,
|
||||
UUID_HUMAN_INTERFACE_DEVICE_SERVICE = 0x1812,
|
||||
UUID_IMMEDIATE_ALERT_SERVICE = 0x1802,
|
||||
UUID_LINK_LOSS_SERVICE = 0x1803,
|
||||
UUID_NEXT_DST_CHANGE_SERVICE = 0x1807,
|
||||
UUID_PHONE_ALERT_STATUS_SERVICE = 0x180E,
|
||||
UUID_REFERENCE_TIME_UPDATE_SERVICE = 0x1806,
|
||||
UUID_RUNNING_SPEED_AND_CADENCE = 0x1814,
|
||||
UUID_SCAN_PARAMETERS_SERVICE = 0x1813,
|
||||
UUID_TX_POWER_SERVICE = 0x1804
|
||||
};
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new GattCharacteristic using the specified 16-bit
|
||||
* UUID, value length, and properties
|
||||
*
|
||||
* @note The UUID value must be unique in the service and is normally >1
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this characteristic
|
||||
* @param[in] characteristics
|
||||
* A pointer to an array of characteristics to be included within this service
|
||||
* @param[in] numCharacteristics
|
||||
* The number of characteristics
|
||||
*/
|
||||
GattService(const UUID &uuid, GattCharacteristic *characteristics[], unsigned numCharacteristics);
|
||||
|
||||
const UUID &getUUID(void) const {return _primaryServiceID; }
|
||||
uint16_t getHandle(void) const {return _handle; }
|
||||
uint8_t getCharacteristicCount(void) const {return _characteristicCount;}
|
||||
void setHandle(uint16_t handle) {_handle = handle;}
|
||||
|
||||
GattCharacteristic *getCharacteristic(uint8_t index) {
|
||||
if (index >= _characteristicCount) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _characteristics[index];
|
||||
}
|
||||
|
||||
private:
|
||||
UUID _primaryServiceID;
|
||||
uint8_t _characteristicCount;
|
||||
GattCharacteristic **_characteristics;
|
||||
uint16_t _handle;
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_SERVICE_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __GATT_SERVICE_H__
|
||||
#define __GATT_SERVICE_H__
|
||||
|
||||
#include "UUID.h"
|
||||
#include "GattCharacteristic.h"
|
||||
|
||||
class GattService {
|
||||
public:
|
||||
enum {
|
||||
UUID_ALERT_NOTIFICATION_SERVICE = 0x1811,
|
||||
UUID_BATTERY_SERVICE = 0x180F,
|
||||
UUID_BLOOD_PRESSURE_SERVICE = 0x1810,
|
||||
UUID_CURRENT_TIME_SERVICE = 0x1805,
|
||||
UUID_CYCLING_SPEED_AND_CADENCE = 0x1816,
|
||||
UUID_DEVICE_INFORMATION_SERVICE = 0x180A,
|
||||
UUID_GLUCOSE_SERVICE = 0x1808,
|
||||
UUID_HEALTH_THERMOMETER_SERVICE = 0x1809,
|
||||
UUID_HEART_RATE_SERVICE = 0x180D,
|
||||
UUID_HUMAN_INTERFACE_DEVICE_SERVICE = 0x1812,
|
||||
UUID_IMMEDIATE_ALERT_SERVICE = 0x1802,
|
||||
UUID_LINK_LOSS_SERVICE = 0x1803,
|
||||
UUID_NEXT_DST_CHANGE_SERVICE = 0x1807,
|
||||
UUID_PHONE_ALERT_STATUS_SERVICE = 0x180E,
|
||||
UUID_REFERENCE_TIME_UPDATE_SERVICE = 0x1806,
|
||||
UUID_RUNNING_SPEED_AND_CADENCE = 0x1814,
|
||||
UUID_SCAN_PARAMETERS_SERVICE = 0x1813,
|
||||
UUID_TX_POWER_SERVICE = 0x1804
|
||||
};
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Creates a new GattCharacteristic using the specified 16-bit
|
||||
* UUID, value length, and properties
|
||||
*
|
||||
* @note The UUID value must be unique in the service and is normally >1
|
||||
*
|
||||
* @param[in] uuid
|
||||
* The UUID to use for this characteristic
|
||||
* @param[in] characteristics
|
||||
* A pointer to an array of characteristics to be included within this service
|
||||
* @param[in] numCharacteristics
|
||||
* The number of characteristics
|
||||
*/
|
||||
GattService(const UUID &uuid, GattCharacteristic *characteristics[], unsigned numCharacteristics);
|
||||
|
||||
const UUID &getUUID(void) const {return _primaryServiceID; }
|
||||
uint16_t getHandle(void) const {return _handle; }
|
||||
uint8_t getCharacteristicCount(void) const {return _characteristicCount;}
|
||||
void setHandle(uint16_t handle) {_handle = handle;}
|
||||
|
||||
GattCharacteristic *getCharacteristic(uint8_t index) {
|
||||
if (index >= _characteristicCount) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _characteristics[index];
|
||||
}
|
||||
|
||||
private:
|
||||
UUID _primaryServiceID;
|
||||
uint8_t _characteristicCount;
|
||||
GattCharacteristic **_characteristics;
|
||||
uint16_t _handle;
|
||||
};
|
||||
|
||||
#endif // ifndef __GATT_SERVICE_H__
|
||||
|
|
104
public/UUID.h
104
public/UUID.h
|
@ -1,52 +1,52 @@
|
|||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __UUID_H__
|
||||
#define __UUID_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
const unsigned LENGTH_OF_LONG_UUID = 16;
|
||||
typedef uint16_t ShortUUIDBytes_t;
|
||||
typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID];
|
||||
|
||||
class UUID {
|
||||
public:
|
||||
enum {
|
||||
UUID_TYPE_SHORT = 0, // Short BLE UUID
|
||||
UUID_TYPE_LONG = 1 // Full 128-bit UUID
|
||||
};
|
||||
|
||||
public:
|
||||
UUID(const LongUUIDBytes_t);
|
||||
UUID(ShortUUIDBytes_t);
|
||||
|
||||
public:
|
||||
uint8_t shortOrLong(void) const {return type; }
|
||||
const uint8_t *getBaseUUID(void) const {return baseUUID; }
|
||||
ShortUUIDBytes_t getShortUUID(void) const {return shortUUID;}
|
||||
|
||||
private:
|
||||
uint8_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)
|
||||
};
|
||||
|
||||
#endif // ifndef __UUID_H__
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef __UUID_H__
|
||||
#define __UUID_H__
|
||||
|
||||
#include "blecommon.h"
|
||||
|
||||
const unsigned LENGTH_OF_LONG_UUID = 16;
|
||||
typedef uint16_t ShortUUIDBytes_t;
|
||||
typedef uint8_t LongUUIDBytes_t[LENGTH_OF_LONG_UUID];
|
||||
|
||||
class UUID {
|
||||
public:
|
||||
enum {
|
||||
UUID_TYPE_SHORT = 0, // Short BLE UUID
|
||||
UUID_TYPE_LONG = 1 // Full 128-bit UUID
|
||||
};
|
||||
|
||||
public:
|
||||
UUID(const LongUUIDBytes_t);
|
||||
UUID(ShortUUIDBytes_t);
|
||||
|
||||
public:
|
||||
uint8_t shortOrLong(void) const {return type; }
|
||||
const uint8_t *getBaseUUID(void) const {return baseUUID; }
|
||||
ShortUUIDBytes_t getShortUUID(void) const {return shortUUID;}
|
||||
|
||||
private:
|
||||
uint8_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)
|
||||
};
|
||||
|
||||
#endif // ifndef __UUID_H__
|
||||
|
|
Loading…
Reference in New Issue