Oscar Ariza / BLE_API

Fork of BLE_API by Bluetooth Low Energy

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