High level Bluetooth Low Energy API and radio abstraction layer

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Wed Dec 02 10:29:44 2015 +0000
Revision:
993:4d62b7967c11
Parent:
992:ca834f7ae8ed
Child:
994:1f46234b1237
Synchronized with git rev 12e27cd4
Author: Rohit Grover
Release 2.1.3
=============

* Improvements to CallChainOfFunctionPointerswithContext:
- add a `detach` function to be able to remove callbacks.
- detach function now return true if a function has been detached and
false otherwise.
- add a function call operator.
- use safe-bool idiom. see : http://www.artima.com/cppsource/safebool.html

* Add SafeBool class which allow to easily declare a safe bool operator in
c++03.

* Improvements to FunctionPointerWithContext:
- fix call propagation
- use safe bool idiom

* Add config file for generating Doxygen.

* Setup for onRadioNotification callback does not call initRadioNotification
anymore.

* GapAdvertisementData now handles replacement and appending of data fields
based on type. Some fields can be replaced with new values, and others
require the payload to be appended.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 712:b04b5db36865 1 /* mbed Microcontroller Library
rgrover1 712:b04b5db36865 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 712:b04b5db36865 3 *
rgrover1 712:b04b5db36865 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 712:b04b5db36865 5 * you may not use this file except in compliance with the License.
rgrover1 712:b04b5db36865 6 * You may obtain a copy of the License at
rgrover1 712:b04b5db36865 7 *
rgrover1 712:b04b5db36865 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 712:b04b5db36865 9 *
rgrover1 712:b04b5db36865 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 712:b04b5db36865 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 712:b04b5db36865 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 712:b04b5db36865 13 * See the License for the specific language governing permissions and
rgrover1 712:b04b5db36865 14 * limitations under the License.
rgrover1 712:b04b5db36865 15 */
rgrover1 712:b04b5db36865 16
rgrover1 712:b04b5db36865 17 #ifndef __BLE_DFU_SERVICE_H__
rgrover1 712:b04b5db36865 18 #define __BLE_DFU_SERVICE_H__
rgrover1 712:b04b5db36865 19
rgrover1 712:b04b5db36865 20 #include "ble/BLE.h"
rgrover1 712:b04b5db36865 21 #include "ble/UUID.h"
rgrover1 712:b04b5db36865 22
rgrover1 993:4d62b7967c11 23 extern "C" {
rgrover1 993:4d62b7967c11 24 #include "dfu_app_handler.h"
rgrover1 993:4d62b7967c11 25 }
rgrover1 712:b04b5db36865 26
rgrover1 712:b04b5db36865 27 extern const uint8_t DFUServiceBaseUUID[];
rgrover1 712:b04b5db36865 28 extern const uint16_t DFUServiceShortUUID;
rgrover1 712:b04b5db36865 29 extern const uint16_t DFUServiceControlCharacteristicShortUUID;
rgrover1 712:b04b5db36865 30
rgrover1 712:b04b5db36865 31 extern const uint8_t DFUServiceUUID[];
rgrover1 712:b04b5db36865 32 extern const uint8_t DFUServiceControlCharacteristicUUID[];
rgrover1 712:b04b5db36865 33 extern const uint8_t DFUServicePacketCharacteristicUUID[];
rgrover1 712:b04b5db36865 34
rgrover1 712:b04b5db36865 35 /**
rgrover1 712:b04b5db36865 36 * @class DFUService
rgrover1 712:b04b5db36865 37 * @brief Device Firmware Update Service.
rgrover1 712:b04b5db36865 38 */
rgrover1 712:b04b5db36865 39 class DFUService {
rgrover1 712:b04b5db36865 40 public:
rgrover1 712:b04b5db36865 41 /**
rgrover1 993:4d62b7967c11 42 * @brief Signature for the handover callback. The application may provide this
rgrover1 993:4d62b7967c11 43 * callback when setting up the DFU service. The callback is then
rgrover1 712:b04b5db36865 44 * invoked before handing control over to the bootloader.
rgrover1 712:b04b5db36865 45 */
rgrover1 712:b04b5db36865 46 typedef void (*ResetPrepare_t)(void);
rgrover1 712:b04b5db36865 47
rgrover1 712:b04b5db36865 48 public:
rgrover1 712:b04b5db36865 49 /**
rgrover1 993:4d62b7967c11 50 * @brief Adds Device Firmware Update Service to an existing BLE object.
rgrover1 712:b04b5db36865 51 *
rgrover1 712:b04b5db36865 52 * @param[ref] _ble
rgrover1 712:b04b5db36865 53 * BLE object for the underlying controller.
rgrover1 712:b04b5db36865 54 * @param[in] _handoverCallback
rgrover1 993:4d62b7967c11 55 * Application-specific handover callback.
rgrover1 712:b04b5db36865 56 */
rgrover1 712:b04b5db36865 57 DFUService(BLE &_ble, ResetPrepare_t _handoverCallback = NULL) :
rgrover1 712:b04b5db36865 58 ble(_ble),
rgrover1 712:b04b5db36865 59 controlPoint(DFUServiceControlCharacteristicUUID, controlBytes, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
rgrover1 712:b04b5db36865 60 packet(DFUServicePacketCharacteristicUUID, packetBytes, SIZEOF_PACKET_BYTES, SIZEOF_PACKET_BYTES,
rgrover1 712:b04b5db36865 61 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE),
rgrover1 712:b04b5db36865 62 controlBytes(),
rgrover1 712:b04b5db36865 63 packetBytes() {
rgrover1 993:4d62b7967c11 64 static bool serviceAdded = false; /* We only add the DFU service once. */
rgrover1 712:b04b5db36865 65 if (serviceAdded) {
rgrover1 712:b04b5db36865 66 return;
rgrover1 712:b04b5db36865 67 }
rgrover1 712:b04b5db36865 68
rgrover1 993:4d62b7967c11 69 /* Set an initial value for control bytes, so that the application's DFU service can
rgrover1 712:b04b5db36865 70 * be distinguished from the real DFU service provided by the bootloader. */
rgrover1 712:b04b5db36865 71 controlBytes[0] = 0xFF;
rgrover1 712:b04b5db36865 72 controlBytes[1] = 0xFF;
rgrover1 712:b04b5db36865 73
rgrover1 712:b04b5db36865 74 GattCharacteristic *dfuChars[] = {&controlPoint, &packet};
rgrover1 712:b04b5db36865 75 GattService dfuService(DFUServiceUUID, dfuChars, sizeof(dfuChars) / sizeof(GattCharacteristic *));
rgrover1 712:b04b5db36865 76
rgrover1 712:b04b5db36865 77 ble.addService(dfuService);
rgrover1 712:b04b5db36865 78 handoverCallback = _handoverCallback;
rgrover1 712:b04b5db36865 79 serviceAdded = true;
rgrover1 712:b04b5db36865 80
rgrover1 712:b04b5db36865 81 ble.onDataWritten(this, &DFUService::onDataWritten);
rgrover1 712:b04b5db36865 82 }
rgrover1 712:b04b5db36865 83
rgrover1 712:b04b5db36865 84 /**
rgrover1 993:4d62b7967c11 85 * @brief Get the handle for the value attribute of the control characteristic.
rgrover1 712:b04b5db36865 86 */
rgrover1 712:b04b5db36865 87 uint16_t getControlHandle(void) const {
rgrover1 712:b04b5db36865 88 return controlPoint.getValueHandle();
rgrover1 712:b04b5db36865 89 }
rgrover1 712:b04b5db36865 90
rgrover1 712:b04b5db36865 91 /**
rgrover1 712:b04b5db36865 92 * @brief This callback allows the DFU service to receive the initial trigger to
rgrover1 993:4d62b7967c11 93 * hand control over to the bootloader. First, the application is given a
rgrover1 712:b04b5db36865 94 * chance to clean up.
rgrover1 712:b04b5db36865 95 *
rgrover1 712:b04b5db36865 96 * @param[in] params
rgrover1 712:b04b5db36865 97 * Information about the characterisitc being updated.
rgrover1 712:b04b5db36865 98 */
rgrover1 712:b04b5db36865 99 virtual void onDataWritten(const GattWriteCallbackParams *params) {
rgrover1 712:b04b5db36865 100 if (params->handle == controlPoint.getValueHandle()) {
rgrover1 993:4d62b7967c11 101 /* At present, writing anything will do the trick - this needs to be improved. */
rgrover1 712:b04b5db36865 102 if (handoverCallback) {
rgrover1 712:b04b5db36865 103 handoverCallback();
rgrover1 712:b04b5db36865 104 }
rgrover1 712:b04b5db36865 105
rgrover1 993:4d62b7967c11 106 // Call bootloader_start implicitly trough a event handler call
rgrover1 993:4d62b7967c11 107 // it is a work around for bootloader_start not being public in sdk 8.1
rgrover1 993:4d62b7967c11 108 ble_dfu_t p_dfu;
rgrover1 993:4d62b7967c11 109 ble_dfu_evt_t p_evt;
rgrover1 993:4d62b7967c11 110
rgrover1 993:4d62b7967c11 111 p_dfu.conn_handle = params->connHandle;
rgrover1 993:4d62b7967c11 112 p_evt.ble_dfu_evt_type = BLE_DFU_START;
rgrover1 993:4d62b7967c11 113
rgrover1 993:4d62b7967c11 114 dfu_app_on_dfu_evt(&p_dfu, &p_evt);
rgrover1 712:b04b5db36865 115 }
rgrover1 712:b04b5db36865 116 }
rgrover1 712:b04b5db36865 117
rgrover1 712:b04b5db36865 118 protected:
rgrover1 712:b04b5db36865 119 static const unsigned SIZEOF_CONTROL_BYTES = 2;
rgrover1 712:b04b5db36865 120 static const unsigned SIZEOF_PACKET_BYTES = 20;
rgrover1 712:b04b5db36865 121
rgrover1 712:b04b5db36865 122 protected:
rgrover1 712:b04b5db36865 123 BLE &ble;
rgrover1 712:b04b5db36865 124
rgrover1 993:4d62b7967c11 125 /**< Writing to the control characteristic triggers the handover to DFU
rgrover1 993:4d62b7967c11 126 * bootloader. At present, writing anything will do the trick - this needs
rgrover1 712:b04b5db36865 127 * to be improved. */
rgrover1 712:b04b5db36865 128 WriteOnlyArrayGattCharacteristic<uint8_t, SIZEOF_CONTROL_BYTES> controlPoint;
rgrover1 712:b04b5db36865 129
rgrover1 993:4d62b7967c11 130 /**< The packet characteristic in this service doesn't do anything meaningful;
rgrover1 993:4d62b7967c11 131 * it is only a placeholder to mimic the corresponding characteristic in the
rgrover1 712:b04b5db36865 132 * actual DFU service implemented by the bootloader. Without this, some
rgrover1 993:4d62b7967c11 133 * FOTA clients might get confused, because service definitions change after
rgrover1 712:b04b5db36865 134 * handing control over to the bootloader. */
rgrover1 712:b04b5db36865 135 GattCharacteristic packet;
rgrover1 712:b04b5db36865 136
rgrover1 712:b04b5db36865 137 uint8_t controlBytes[SIZEOF_CONTROL_BYTES];
rgrover1 712:b04b5db36865 138 uint8_t packetBytes[SIZEOF_PACKET_BYTES];
rgrover1 712:b04b5db36865 139
rgrover1 993:4d62b7967c11 140 static ResetPrepare_t handoverCallback; /**< Application-specific handover callback. */
rgrover1 712:b04b5db36865 141 };
rgrover1 712:b04b5db36865 142
rgrover1 992:ca834f7ae8ed 143 #endif /* #ifndef __BLE_DFU_SERVICE_H__*/