No changes

Fork of nRF51822 by Nordic Semiconductor

Committer:
vcoubard
Date:
Mon Jan 11 10:19:15 2016 +0000
Revision:
561:613dbbdeed27
Parent:
388:db85a09c27ef
Child:
563:9c4b96f7be8d
Synchronized with git rev 7bf81e7e
Author: Andres Amaya Garcia
Improve shutdown to clear BLE API and not just SD

Improve the shutdown functionality, such that a call to ble.shutdown() from
the user application clears the API and nRF5x state and NOT only the
SoftDevice. To achieve this the following changes are introduced:

* Add a protected member cleanup() to nRF5xGap, nRF5xGattClient,
nRF5xGattServer, nRF5xSecurityManager and nRF5xServiceDiscovery.
* Modify the shutdown() implementation in nRF5xn such that it also calls the
static member shutdown() exposed by the BLE API in Gap.h, SecurityManager.h,
GattClient.h and GattServer.h.
* Modify nRF5xGattClient, nRF5xGattServer and nRF5xSecurityManager
classes so that they dynamically create their respective objects only if
needed. Previously the GattClient, GattServer and SecurityManager objects were
declared as static, which means that they were always present even though they
were not always needed. This increases memory consumption unnecessarily.
Furthermore, pointers to the object instances are stored in static members of
the classes as specified by the BLE API base classes. This ensures that
calls to shutdown do not require calls to getInstance() functions that would
otherwise result in undesired memory allocations.
* nRF5xGap object is always needed, so this remains allocated statically. But
the reference in Gap is pointed to this object.

The shutdown procedure is as follows:

1. The user calls ble.shutdown() which executes the code in nRF5xn::shutdown()
1. The SoftDevice is shutdown
1. The static members of Gap.h, SecurityManager.h, GattClient.h and
GattServer.h are called to clean up their own state.

If at any point an error occur during the last step, BLE_ERROR_INVALID_STATE is
returned.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 561:613dbbdeed27 1 /* mbed Microcontroller Library
vcoubard 561:613dbbdeed27 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 561:613dbbdeed27 3 *
vcoubard 561:613dbbdeed27 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 561:613dbbdeed27 5 * you may not use this file except in compliance with the License.
vcoubard 561:613dbbdeed27 6 * You may obtain a copy of the License at
vcoubard 561:613dbbdeed27 7 *
vcoubard 561:613dbbdeed27 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 561:613dbbdeed27 9 *
vcoubard 561:613dbbdeed27 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 561:613dbbdeed27 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 561:613dbbdeed27 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 561:613dbbdeed27 13 * See the License for the specific language governing permissions and
vcoubard 561:613dbbdeed27 14 * limitations under the License.
vcoubard 561:613dbbdeed27 15 */
vcoubard 561:613dbbdeed27 16
vcoubard 561:613dbbdeed27 17 #ifndef __NRF51822_GATT_SERVER_H__
vcoubard 561:613dbbdeed27 18 #define __NRF51822_GATT_SERVER_H__
vcoubard 561:613dbbdeed27 19
vcoubard 561:613dbbdeed27 20 #include <stddef.h>
vcoubard 561:613dbbdeed27 21
vcoubard 561:613dbbdeed27 22 #include "ble/blecommon.h"
vcoubard 561:613dbbdeed27 23 #include "ble.h" /* nordic ble */
vcoubard 561:613dbbdeed27 24 #include "ble/Gap.h"
vcoubard 561:613dbbdeed27 25 #include "ble/GattServer.h"
vcoubard 561:613dbbdeed27 26
vcoubard 561:613dbbdeed27 27 class nRF5xGattServer : public GattServer
vcoubard 561:613dbbdeed27 28 {
vcoubard 561:613dbbdeed27 29 public:
vcoubard 561:613dbbdeed27 30 static nRF5xGattServer &getInstance();
vcoubard 561:613dbbdeed27 31
vcoubard 561:613dbbdeed27 32 /* Functions that must be implemented from GattServer */
vcoubard 561:613dbbdeed27 33 virtual ble_error_t addService(GattService &);
vcoubard 561:613dbbdeed27 34 virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP);
vcoubard 561:613dbbdeed27 35 virtual ble_error_t read(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP);
vcoubard 561:613dbbdeed27 36 virtual ble_error_t write(GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false);
vcoubard 561:613dbbdeed27 37 virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false);
vcoubard 561:613dbbdeed27 38 virtual ble_error_t areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP);
vcoubard 561:613dbbdeed27 39 virtual ble_error_t areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP);
vcoubard 561:613dbbdeed27 40
vcoubard 561:613dbbdeed27 41 /* nRF51 Functions */
vcoubard 561:613dbbdeed27 42 void eventCallback(void);
vcoubard 561:613dbbdeed27 43 void hwCallback(ble_evt_t *p_ble_evt);
vcoubard 561:613dbbdeed27 44
vcoubard 561:613dbbdeed27 45 protected:
vcoubard 561:613dbbdeed27 46 virtual ble_error_t cleanup(void);
vcoubard 561:613dbbdeed27 47
vcoubard 561:613dbbdeed27 48 private:
vcoubard 561:613dbbdeed27 49 const static unsigned BLE_TOTAL_CHARACTERISTICS = 20;
vcoubard 561:613dbbdeed27 50 const static unsigned BLE_TOTAL_DESCRIPTORS = 8;
vcoubard 561:613dbbdeed27 51
vcoubard 561:613dbbdeed27 52 private:
vcoubard 561:613dbbdeed27 53 /**
vcoubard 561:613dbbdeed27 54 * resolve a value attribute to its owning characteristic.
vcoubard 561:613dbbdeed27 55 * @param valueHandle the value handle to be resolved.
vcoubard 561:613dbbdeed27 56 * @return characteristic index if a resolution is found, else -1.
vcoubard 561:613dbbdeed27 57 */
vcoubard 561:613dbbdeed27 58 int resolveValueHandleToCharIndex(GattAttribute::Handle_t valueHandle) const {
vcoubard 561:613dbbdeed27 59 unsigned charIndex;
vcoubard 561:613dbbdeed27 60 for (charIndex = 0; charIndex < characteristicCount; charIndex++) {
vcoubard 561:613dbbdeed27 61 if (nrfCharacteristicHandles[charIndex].value_handle == valueHandle) {
vcoubard 561:613dbbdeed27 62 return charIndex;
vcoubard 561:613dbbdeed27 63 }
vcoubard 561:613dbbdeed27 64 }
vcoubard 561:613dbbdeed27 65
vcoubard 561:613dbbdeed27 66 return -1;
vcoubard 561:613dbbdeed27 67 }
vcoubard 561:613dbbdeed27 68
vcoubard 561:613dbbdeed27 69 /**
vcoubard 561:613dbbdeed27 70 * resolve a CCCD attribute handle to its owning characteristic.
vcoubard 561:613dbbdeed27 71 * @param cccdHandle the CCCD handle to be resolved.
vcoubard 561:613dbbdeed27 72 * @return characteristic index if a resolution is found, else -1.
vcoubard 561:613dbbdeed27 73 */
vcoubard 561:613dbbdeed27 74 int resolveCCCDHandleToCharIndex(GattAttribute::Handle_t cccdHandle) const {
vcoubard 561:613dbbdeed27 75 unsigned charIndex;
vcoubard 561:613dbbdeed27 76 for (charIndex = 0; charIndex < characteristicCount; charIndex++) {
vcoubard 561:613dbbdeed27 77 if (nrfCharacteristicHandles[charIndex].cccd_handle == cccdHandle) {
vcoubard 561:613dbbdeed27 78 return charIndex;
vcoubard 561:613dbbdeed27 79 }
vcoubard 561:613dbbdeed27 80 }
vcoubard 561:613dbbdeed27 81
vcoubard 561:613dbbdeed27 82 return -1;
vcoubard 561:613dbbdeed27 83 }
vcoubard 561:613dbbdeed27 84
vcoubard 561:613dbbdeed27 85 private:
vcoubard 561:613dbbdeed27 86 GattCharacteristic *p_characteristics[BLE_TOTAL_CHARACTERISTICS];
vcoubard 561:613dbbdeed27 87 ble_gatts_char_handles_t nrfCharacteristicHandles[BLE_TOTAL_CHARACTERISTICS];
vcoubard 561:613dbbdeed27 88 GattAttribute *p_descriptors[BLE_TOTAL_DESCRIPTORS];
vcoubard 561:613dbbdeed27 89 uint8_t descriptorCount;
vcoubard 561:613dbbdeed27 90 uint16_t nrfDescriptorHandles[BLE_TOTAL_DESCRIPTORS];
vcoubard 561:613dbbdeed27 91
vcoubard 561:613dbbdeed27 92 nRF5xGattServer() : GattServer(), p_characteristics(), nrfCharacteristicHandles(), p_descriptors(), descriptorCount(0), nrfDescriptorHandles() {
vcoubard 561:613dbbdeed27 93 /* empty */
vcoubard 561:613dbbdeed27 94 }
vcoubard 561:613dbbdeed27 95
vcoubard 561:613dbbdeed27 96 private:
vcoubard 561:613dbbdeed27 97 nRF5xGattServer(const nRF5xGattServer &);
vcoubard 561:613dbbdeed27 98 const nRF5xGattServer& operator=(const nRF5xGattServer &);
vcoubard 561:613dbbdeed27 99 };
vcoubard 561:613dbbdeed27 100
rgrover1 388:db85a09c27ef 101 #endif // ifndef __NRF51822_GATT_SERVER_H__