Joshua Slater / BLE_API_Changed

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:53:28 2015 +0100
Revision:
711:ea0c4bf9ec99
Parent:
710:b2e1a2660ec2
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

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 710:b2e1a2660ec2 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 710:b2e1a2660ec2 37 onDataSent(),
rgrover1 710:b2e1a2660ec2 38 onDataWritten(),
rgrover1 710:b2e1a2660ec2 39 onDataRead(),
rgrover1 710:b2e1a2660ec2 40 onUpdatesEnabled(NULL),
rgrover1 710:b2e1a2660ec2 41 onUpdatesDisabled(NULL),
rgrover1 710:b2e1a2660ec2 42 onConfirmationReceived(NULL) {
rgrover1 258:85de85adfac7 43 /* empty */
rgrover1 258:85de85adfac7 44 }
rgrover1 258:85de85adfac7 45
rgrover1 710:b2e1a2660ec2 46 friend class BLEDevice;
rgrover1 710:b2e1a2660ec2 47 private:
rgrover1 710:b2e1a2660ec2 48 /* These functions must be defined in the sub-class */
rgrover1 710:b2e1a2660ec2 49 virtual ble_error_t addService(GattService &) = 0;
rgrover1 710:b2e1a2660ec2 50 virtual ble_error_t readValue(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) = 0;
rgrover1 710:b2e1a2660ec2 51 virtual ble_error_t readValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) = 0;
rgrover1 710:b2e1a2660ec2 52 virtual ble_error_t updateValue(GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false) = 0;
rgrover1 710:b2e1a2660ec2 53 virtual ble_error_t updateValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false) = 0;
rgrover1 710:b2e1a2660ec2 54 virtual ble_error_t initializeGATTDatabase(void) = 0;
rgrover1 682:c36be4ee7c01 55
rgrover1 710:b2e1a2660ec2 56 // ToDo: For updateValue, check the CCCD to see if the value we are
rgrover1 710:b2e1a2660ec2 57 // updating has the notify or indicate bits sent, and if BOTH are set
rgrover1 710:b2e1a2660ec2 58 // be sure to call sd_ble_gatts_hvx() twice with notify then indicate!
rgrover1 710:b2e1a2660ec2 59 // Strange use case, but valid and must be covered!
rgrover1 682:c36be4ee7c01 60
rgrover1 710:b2e1a2660ec2 61 void setOnDataSent(void (*callback)(unsigned count)) {onDataSent.add(callback);}
rgrover1 710:b2e1a2660ec2 62 template <typename T>
rgrover1 710:b2e1a2660ec2 63 void setOnDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
rgrover1 710:b2e1a2660ec2 64 onDataSent.add(objPtr, memberPtr);
rgrover1 701:19873f48d07b 65 }
rgrover1 710:b2e1a2660ec2 66 void setOnDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP)) {onDataWritten.add(callback);}
rgrover1 710:b2e1a2660ec2 67 template <typename T>
rgrover1 710:b2e1a2660ec2 68 void setOnDataWritten(T *objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context)) {
rgrover1 710:b2e1a2660ec2 69 onDataWritten.add(objPtr, memberPtr);
rgrover1 701:19873f48d07b 70 }
rgrover1 682:c36be4ee7c01 71
rgrover1 690:4d850ccf9f96 72 /**
rgrover1 701:19873f48d07b 73 * A virtual function to allow underlying stacks to indicate if they support
rgrover1 701:19873f48d07b 74 * onDataRead(). It should be overridden to return true as applicable.
rgrover1 701:19873f48d07b 75 */
rgrover1 701:19873f48d07b 76 virtual bool isOnDataReadAvailable() const {
rgrover1 710:b2e1a2660ec2 77 return false;
rgrover1 701:19873f48d07b 78 }
rgrover1 710:b2e1a2660ec2 79 ble_error_t setOnDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP)) {
rgrover1 710:b2e1a2660ec2 80 if (!isOnDataReadAvailable()) {
rgrover1 710:b2e1a2660ec2 81 return BLE_ERROR_NOT_IMPLEMENTED;
rgrover1 710:b2e1a2660ec2 82 }
rgrover1 690:4d850ccf9f96 83
rgrover1 710:b2e1a2660ec2 84 onDataRead.add(callback);
rgrover1 710:b2e1a2660ec2 85 return BLE_ERROR_NONE;
rgrover1 558:f5d517505e85 86 }
rgrover1 710:b2e1a2660ec2 87 template <typename T>
rgrover1 710:b2e1a2660ec2 88 ble_error_t setOnDataRead(T *objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context)) {
rgrover1 567:e4b38e43de7c 89 if (!isOnDataReadAvailable()) {
rgrover1 567:e4b38e43de7c 90 return BLE_ERROR_NOT_IMPLEMENTED;
rgrover1 567:e4b38e43de7c 91 }
rgrover1 547:f84c514eee35 92
rgrover1 710:b2e1a2660ec2 93 onDataRead.add(objPtr, memberPtr);
rgrover1 300:d9a39f759a6a 94 return BLE_ERROR_NONE;
rgrover1 300:d9a39f759a6a 95 }
rgrover1 710:b2e1a2660ec2 96 void setOnUpdatesEnabled(EventCallback_t callback) {onUpdatesEnabled = callback;}
rgrover1 710:b2e1a2660ec2 97 void setOnUpdatesDisabled(EventCallback_t callback) {onUpdatesDisabled = callback;}
rgrover1 710:b2e1a2660ec2 98 void setOnConfirmationReceived(EventCallback_t callback) {onConfirmationReceived = callback;}
rgrover1 693:2f28bf2dd443 99
rgrover1 258:85de85adfac7 100 protected:
rgrover1 710:b2e1a2660ec2 101 void handleDataWrittenEvent(const GattCharacteristicWriteCBParams *params) {
rgrover1 710:b2e1a2660ec2 102 if (onDataWritten.hasCallbacksAttached()) {
rgrover1 710:b2e1a2660ec2 103 onDataWritten.call(params);
rgrover1 258:85de85adfac7 104 }
rgrover1 258:85de85adfac7 105 }
rgrover1 258:85de85adfac7 106
rgrover1 710:b2e1a2660ec2 107 void handleDataReadEvent(const GattCharacteristicReadCBParams *params) {
rgrover1 710:b2e1a2660ec2 108 if (onDataRead.hasCallbacksAttached()) {
rgrover1 710:b2e1a2660ec2 109 onDataRead.call(params);
rgrover1 300:d9a39f759a6a 110 }
rgrover1 300:d9a39f759a6a 111 }
rgrover1 300:d9a39f759a6a 112
rgrover1 376:47ff130c1d74 113 void handleEvent(GattServerEvents::gattEvent_e type, GattAttribute::Handle_t charHandle) {
rgrover1 258:85de85adfac7 114 switch (type) {
rgrover1 258:85de85adfac7 115 case GattServerEvents::GATT_EVENT_UPDATES_ENABLED:
rgrover1 710:b2e1a2660ec2 116 if (onUpdatesEnabled) {
rgrover1 710:b2e1a2660ec2 117 onUpdatesEnabled(charHandle);
rgrover1 258:85de85adfac7 118 }
rgrover1 258:85de85adfac7 119 break;
rgrover1 258:85de85adfac7 120 case GattServerEvents::GATT_EVENT_UPDATES_DISABLED:
rgrover1 710:b2e1a2660ec2 121 if (onUpdatesDisabled) {
rgrover1 710:b2e1a2660ec2 122 onUpdatesDisabled(charHandle);
rgrover1 258:85de85adfac7 123 }
rgrover1 258:85de85adfac7 124 break;
rgrover1 258:85de85adfac7 125 case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED:
rgrover1 710:b2e1a2660ec2 126 if (onConfirmationReceived) {
rgrover1 710:b2e1a2660ec2 127 onConfirmationReceived(charHandle);
rgrover1 258:85de85adfac7 128 }
rgrover1 258:85de85adfac7 129 break;
rgrover1 267:ad6f6f40eb24 130 default:
rgrover1 267:ad6f6f40eb24 131 break;
rgrover1 258:85de85adfac7 132 }
rgrover1 258:85de85adfac7 133 }
rgrover1 258:85de85adfac7 134
rgrover1 258:85de85adfac7 135 void handleDataSentEvent(unsigned count) {
rgrover1 710:b2e1a2660ec2 136 if (onDataSent.hasCallbacksAttached()) {
rgrover1 710:b2e1a2660ec2 137 onDataSent.call(count);
rgrover1 258:85de85adfac7 138 }
rgrover1 258:85de85adfac7 139 }
rgrover1 258:85de85adfac7 140
rgrover1 258:85de85adfac7 141 protected:
rgrover1 258:85de85adfac7 142 uint8_t serviceCount;
rgrover1 258:85de85adfac7 143 uint8_t characteristicCount;
rgrover1 258:85de85adfac7 144
rgrover1 258:85de85adfac7 145 private:
rgrover1 710:b2e1a2660ec2 146 CallChainOfFunctionPointersWithContext<unsigned> onDataSent;
rgrover1 710:b2e1a2660ec2 147 CallChainOfFunctionPointersWithContext<const GattCharacteristicWriteCBParams *> onDataWritten;
rgrover1 710:b2e1a2660ec2 148 CallChainOfFunctionPointersWithContext<const GattCharacteristicReadCBParams *> onDataRead;
rgrover1 710:b2e1a2660ec2 149 EventCallback_t onUpdatesEnabled;
rgrover1 710:b2e1a2660ec2 150 EventCallback_t onUpdatesDisabled;
rgrover1 710:b2e1a2660ec2 151 EventCallback_t onConfirmationReceived;
rgrover1 258:85de85adfac7 152
rgrover1 258:85de85adfac7 153 private:
rgrover1 258:85de85adfac7 154 /* disallow copy and assignment */
rgrover1 258:85de85adfac7 155 GattServer(const GattServer &);
rgrover1 258:85de85adfac7 156 GattServer& operator=(const GattServer &);
rgrover1 258:85de85adfac7 157 };
rgrover1 258:85de85adfac7 158
rgrover1 258:85de85adfac7 159 #endif // ifndef __GATT_SERVER_H__