High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:52:06 2015 +0100
Revision:
526:caa67c3187a0
Parent:
524:6e97ab392e2a
Child:
527:493185cebc03
Synchronized with git rev 9bcd7433
Author: Rohit Grover
Rename BLEDevice as BLE. Retain an alias to BLEDevice for the sake of compatibility with old code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 258:85de85adfac7 1 /* mbed Microcontroller Library
rgrover1 258:85de85adfac7 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 258:85de85adfac7 3 *
rgrover1 258:85de85adfac7 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 258:85de85adfac7 5 * you may not use this file except in compliance with the License.
rgrover1 258:85de85adfac7 6 * You may obtain a copy of the License at
rgrover1 258:85de85adfac7 7 *
rgrover1 258:85de85adfac7 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 258:85de85adfac7 9 *
rgrover1 258:85de85adfac7 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 258:85de85adfac7 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 258:85de85adfac7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 258:85de85adfac7 13 * See the License for the specific language governing permissions and
rgrover1 258:85de85adfac7 14 * limitations under the License.
rgrover1 258:85de85adfac7 15 */
rgrover1 258:85de85adfac7 16
rgrover1 258:85de85adfac7 17 #ifndef __GATT_SERVER_H__
rgrover1 258:85de85adfac7 18 #define __GATT_SERVER_H__
rgrover1 258:85de85adfac7 19
rgrover1 340:c7684a5bc2e1 20 #include "Gap.h"
rgrover1 258:85de85adfac7 21 #include "GattService.h"
rgrover1 340:c7684a5bc2e1 22 #include "GattAttribute.h"
rgrover1 258:85de85adfac7 23 #include "GattServerEvents.h"
rgrover1 526:caa67c3187a0 24 #include "GattCharacteristicCallbackParams.h"
rgrover1 258:85de85adfac7 25 #include "CallChainOfFunctionPointersWithContext.h"
rgrover1 258:85de85adfac7 26
rgrover1 258:85de85adfac7 27 class GattServer {
rgrover1 258:85de85adfac7 28 public:
rgrover1 258:85de85adfac7 29 /* Event callback handlers. */
rgrover1 376:47ff130c1d74 30 typedef void (*EventCallback_t)(GattAttribute::Handle_t attributeHandle);
rgrover1 258:85de85adfac7 31 typedef void (*ServerEventCallback_t)(void); /**< independent of any particular attribute */
rgrover1 258:85de85adfac7 32
rgrover1 258:85de85adfac7 33 protected:
rgrover1 263:73847e8b6025 34 GattServer() :
rgrover1 263:73847e8b6025 35 serviceCount(0),
rgrover1 263:73847e8b6025 36 characteristicCount(0),
rgrover1 263:73847e8b6025 37 onDataSent(),
rgrover1 263:73847e8b6025 38 onDataWritten(),
rgrover1 300:d9a39f759a6a 39 onDataRead(),
rgrover1 263:73847e8b6025 40 onUpdatesEnabled(NULL),
rgrover1 263:73847e8b6025 41 onUpdatesDisabled(NULL),
rgrover1 263:73847e8b6025 42 onConfirmationReceived(NULL) {
rgrover1 258:85de85adfac7 43 /* empty */
rgrover1 258:85de85adfac7 44 }
rgrover1 258:85de85adfac7 45
rgrover1 526:caa67c3187a0 46 public:
rgrover1 258:85de85adfac7 47 /* These functions must be defined in the sub-class */
rgrover1 328:1fd12f67ed7a 48 virtual ble_error_t addService(GattService &) = 0;
rgrover1 328:1fd12f67ed7a 49 virtual ble_error_t readValue(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) = 0;
rgrover1 342:152bd9c825d6 50 virtual ble_error_t readValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) = 0;
rgrover1 328:1fd12f67ed7a 51 virtual ble_error_t updateValue(GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false) = 0;
rgrover1 342:152bd9c825d6 52 virtual ble_error_t updateValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false) = 0;
rgrover1 328:1fd12f67ed7a 53 virtual ble_error_t initializeGATTDatabase(void) = 0;
rgrover1 258:85de85adfac7 54
rgrover1 258:85de85adfac7 55 // ToDo: For updateValue, check the CCCD to see if the value we are
rgrover1 258:85de85adfac7 56 // updating has the notify or indicate bits sent, and if BOTH are set
rgrover1 258:85de85adfac7 57 // be sure to call sd_ble_gatts_hvx() twice with notify then indicate!
rgrover1 258:85de85adfac7 58 // Strange use case, but valid and must be covered!
rgrover1 258:85de85adfac7 59
rgrover1 259:a95264ad705c 60 void setOnDataSent(void (*callback)(unsigned count)) {onDataSent.add(callback);}
rgrover1 259:a95264ad705c 61 template <typename T>
rgrover1 259:a95264ad705c 62 void setOnDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
rgrover1 259:a95264ad705c 63 onDataSent.add(objPtr, memberPtr);
rgrover1 259:a95264ad705c 64 }
rgrover1 526:caa67c3187a0 65 void setOnDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP)) {onDataWritten.add(callback);}
rgrover1 258:85de85adfac7 66 template <typename T>
rgrover1 526:caa67c3187a0 67 void setOnDataWritten(T *objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context)) {
rgrover1 258:85de85adfac7 68 onDataWritten.add(objPtr, memberPtr);
rgrover1 258:85de85adfac7 69 }
rgrover1 300:d9a39f759a6a 70
rgrover1 300:d9a39f759a6a 71 /**
rgrover1 300:d9a39f759a6a 72 * A virtual function to allow underlying stacks to indicate if they support
rgrover1 300:d9a39f759a6a 73 * onDataRead(). It should be overridden to return true as applicable.
rgrover1 300:d9a39f759a6a 74 */
rgrover1 301:54c87189e423 75 virtual bool isOnDataReadAvailable() const {
rgrover1 300:d9a39f759a6a 76 return false;
rgrover1 300:d9a39f759a6a 77 }
rgrover1 526:caa67c3187a0 78 ble_error_t setOnDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP)) {
rgrover1 301:54c87189e423 79 if (!isOnDataReadAvailable()) {
rgrover1 300:d9a39f759a6a 80 return BLE_ERROR_NOT_IMPLEMENTED;
rgrover1 300:d9a39f759a6a 81 }
rgrover1 300:d9a39f759a6a 82
rgrover1 300:d9a39f759a6a 83 onDataRead.add(callback);
rgrover1 300:d9a39f759a6a 84 return BLE_ERROR_NONE;
rgrover1 300:d9a39f759a6a 85 }
rgrover1 300:d9a39f759a6a 86 template <typename T>
rgrover1 526:caa67c3187a0 87 ble_error_t setOnDataRead(T *objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context)) {
rgrover1 301:54c87189e423 88 if (!isOnDataReadAvailable()) {
rgrover1 300:d9a39f759a6a 89 return BLE_ERROR_NOT_IMPLEMENTED;
rgrover1 300:d9a39f759a6a 90 }
rgrover1 300:d9a39f759a6a 91
rgrover1 300:d9a39f759a6a 92 onDataRead.add(objPtr, memberPtr);
rgrover1 300:d9a39f759a6a 93 return BLE_ERROR_NONE;
rgrover1 300:d9a39f759a6a 94 }
rgrover1 377:5044c245e996 95 void setOnUpdatesEnabled(EventCallback_t callback) {onUpdatesEnabled = callback;}
rgrover1 377:5044c245e996 96 void setOnUpdatesDisabled(EventCallback_t callback) {onUpdatesDisabled = callback;}
rgrover1 258:85de85adfac7 97 void setOnConfirmationReceived(EventCallback_t callback) {onConfirmationReceived = callback;}
rgrover1 258:85de85adfac7 98
rgrover1 258:85de85adfac7 99 protected:
rgrover1 526:caa67c3187a0 100 void handleDataWrittenEvent(const GattCharacteristicWriteCBParams *params) {
rgrover1 258:85de85adfac7 101 if (onDataWritten.hasCallbacksAttached()) {
rgrover1 258:85de85adfac7 102 onDataWritten.call(params);
rgrover1 258:85de85adfac7 103 }
rgrover1 258:85de85adfac7 104 }
rgrover1 258:85de85adfac7 105
rgrover1 526:caa67c3187a0 106 void handleDataReadEvent(const GattCharacteristicReadCBParams *params) {
rgrover1 300:d9a39f759a6a 107 if (onDataRead.hasCallbacksAttached()) {
rgrover1 300:d9a39f759a6a 108 onDataRead.call(params);
rgrover1 300:d9a39f759a6a 109 }
rgrover1 300:d9a39f759a6a 110 }
rgrover1 300:d9a39f759a6a 111
rgrover1 376:47ff130c1d74 112 void handleEvent(GattServerEvents::gattEvent_e type, GattAttribute::Handle_t charHandle) {
rgrover1 258:85de85adfac7 113 switch (type) {
rgrover1 258:85de85adfac7 114 case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
rgrover1 258:85de85adfac7 115 if (onUpdatesEnabled) {
rgrover1 258:85de85adfac7 116 onUpdatesEnabled(charHandle);
rgrover1 258:85de85adfac7 117 }
rgrover1 258:85de85adfac7 118 break;
rgrover1 258:85de85adfac7 119 case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
rgrover1 258:85de85adfac7 120 if (onUpdatesDisabled) {
rgrover1 258:85de85adfac7 121 onUpdatesDisabled(charHandle);
rgrover1 258:85de85adfac7 122 }
rgrover1 258:85de85adfac7 123 break;
rgrover1 258:85de85adfac7 124 case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
rgrover1 258:85de85adfac7 125 if (onConfirmationReceived) {
rgrover1 258:85de85adfac7 126 onConfirmationReceived(charHandle);
rgrover1 258:85de85adfac7 127 }
rgrover1 258:85de85adfac7 128 break;
rgrover1 267:ad6f6f40eb24 129 default:
rgrover1 267:ad6f6f40eb24 130 break;
rgrover1 258:85de85adfac7 131 }
rgrover1 258:85de85adfac7 132 }
rgrover1 258:85de85adfac7 133
rgrover1 258:85de85adfac7 134 void handleDataSentEvent(unsigned count) {
rgrover1 259:a95264ad705c 135 if (onDataSent.hasCallbacksAttached()) {
rgrover1 259:a95264ad705c 136 onDataSent.call(count);
rgrover1 258:85de85adfac7 137 }
rgrover1 258:85de85adfac7 138 }
rgrover1 258:85de85adfac7 139
rgrover1 258:85de85adfac7 140 protected:
rgrover1 258:85de85adfac7 141 uint8_t serviceCount;
rgrover1 258:85de85adfac7 142 uint8_t characteristicCount;
rgrover1 258:85de85adfac7 143
rgrover1 258:85de85adfac7 144 private:
rgrover1 377:5044c245e996 145 CallChainOfFunctionPointersWithContext<unsigned> onDataSent;
rgrover1 526:caa67c3187a0 146 CallChainOfFunctionPointersWithContext<const GattCharacteristicWriteCBParams *> onDataWritten;
rgrover1 526:caa67c3187a0 147 CallChainOfFunctionPointersWithContext<const GattCharacteristicReadCBParams *> onDataRead;
rgrover1 377:5044c245e996 148 EventCallback_t onUpdatesEnabled;
rgrover1 377:5044c245e996 149 EventCallback_t onUpdatesDisabled;
rgrover1 377:5044c245e996 150 EventCallback_t onConfirmationReceived;
rgrover1 258:85de85adfac7 151
rgrover1 258:85de85adfac7 152 private:
rgrover1 258:85de85adfac7 153 /* disallow copy and assignment */
rgrover1 258:85de85adfac7 154 GattServer(const GattServer &);
rgrover1 258:85de85adfac7 155 GattServer& operator=(const GattServer &);
rgrover1 258:85de85adfac7 156 };
rgrover1 258:85de85adfac7 157
rgrover1 258:85de85adfac7 158 #endif // ifndef __GATT_SERVER_H__