Nordic stack and drivers for the mbed BLE API. Version to work around build bug.

Dependents:   microbit_rubber_ducky microbit_mouse_BLE microbit_mouse_BLE_daybreak_version microbit_presenter

Fork of nRF51822 by Nordic Semiconductor

Committer:
vcoubard
Date:
Mon Jan 11 10:19:18 2016 +0000
Revision:
565:cf03471a4ec4
Parent:
563:9c4b96f7be8d
Child:
566:e425ad9e5d6e
Synchronized with git rev 0bcc2e96
Author: Andres Amaya Garcia
Modify shutdown due to BLE API change

The module is updated to comply with the changes to BLE API regarding correct
shutdown functionality. The following changes are introduced to ble-nrf51822:

* Calls to the old static function shutdown in Gap, GattClient, GattServer and
SecurityManager are removed.
* The cleanup function in Gap, GattClient, GattServer and SecurityManager is
renamed to `reset()` and made public.
* The static references inside nRF5xGap, nRF5xGattClient, nRF5xGattServer and
nRF5xSecurityManager to objects of their own class are moved to nRF5xn.
* The static getInstance accessors in nRF5xGap, nRF5xGattClient,
nRF5xGattServer and nRF5xSecurityManager are removed and their functionality is
moved to the implemented virtual accessors in nRF5xn i.e. getGap(),
getGattClient, etc.
* A static function Instance is added to nRF5xn class to make the transport
object accessible across the module.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 542:1bf9c597f44f 1 /* mbed Microcontroller Library
vcoubard 542:1bf9c597f44f 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 542:1bf9c597f44f 3 *
vcoubard 542:1bf9c597f44f 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 542:1bf9c597f44f 5 * you may not use this file except in compliance with the License.
vcoubard 542:1bf9c597f44f 6 * You may obtain a copy of the License at
vcoubard 542:1bf9c597f44f 7 *
vcoubard 542:1bf9c597f44f 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 542:1bf9c597f44f 9 *
vcoubard 542:1bf9c597f44f 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 542:1bf9c597f44f 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 542:1bf9c597f44f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 542:1bf9c597f44f 13 * See the License for the specific language governing permissions and
vcoubard 542:1bf9c597f44f 14 * limitations under the License.
vcoubard 542:1bf9c597f44f 15 */
vcoubard 542:1bf9c597f44f 16
vcoubard 542:1bf9c597f44f 17 #ifndef __NRF51822_GATT_CLIENT_H__
vcoubard 542:1bf9c597f44f 18 #define __NRF51822_GATT_CLIENT_H__
vcoubard 542:1bf9c597f44f 19
vcoubard 542:1bf9c597f44f 20 #include "ble/GattClient.h"
vcoubard 542:1bf9c597f44f 21 #include "nRF5xServiceDiscovery.h"
vcoubard 542:1bf9c597f44f 22
vcoubard 542:1bf9c597f44f 23 class nRF5xGattClient : public GattClient
vcoubard 542:1bf9c597f44f 24 {
vcoubard 542:1bf9c597f44f 25 public:
vcoubard 542:1bf9c597f44f 26 /**
vcoubard 542:1bf9c597f44f 27 * When using S110, all Gatt client features will return
vcoubard 542:1bf9c597f44f 28 * BLE_ERROR_NOT_IMPLEMENTED
vcoubard 542:1bf9c597f44f 29 */
vcoubard 542:1bf9c597f44f 30 #if !defined(TARGET_MCU_NRF51_16K_S110) && !defined(TARGET_MCU_NRF51_32K_S110)
vcoubard 542:1bf9c597f44f 31
vcoubard 542:1bf9c597f44f 32 /**
vcoubard 542:1bf9c597f44f 33 * Launch service discovery. Once launched, service discovery will remain
vcoubard 542:1bf9c597f44f 34 * active with callbacks being issued back into the application for matching
vcoubard 542:1bf9c597f44f 35 * services/characteristics. isActive() can be used to determine status; and
vcoubard 542:1bf9c597f44f 36 * a termination callback (if setup) will be invoked at the end. Service
vcoubard 542:1bf9c597f44f 37 * discovery can be terminated prematurely if needed using terminate().
vcoubard 542:1bf9c597f44f 38 *
vcoubard 542:1bf9c597f44f 39 * @param connectionHandle
vcoubard 542:1bf9c597f44f 40 * Handle for the connection with the peer.
vcoubard 542:1bf9c597f44f 41 * @param sc
vcoubard 542:1bf9c597f44f 42 * This is the application callback for matching service. Taken as
vcoubard 542:1bf9c597f44f 43 * NULL by default. Note: service discovery may still be active
vcoubard 542:1bf9c597f44f 44 * when this callback is issued; calling asynchronous BLE-stack
vcoubard 542:1bf9c597f44f 45 * APIs from within this application callback might cause the
vcoubard 542:1bf9c597f44f 46 * stack to abort service discovery. If this becomes an issue, it
vcoubard 542:1bf9c597f44f 47 * may be better to make local copy of the discoveredService and
vcoubard 542:1bf9c597f44f 48 * wait for service discovery to terminate before operating on the
vcoubard 542:1bf9c597f44f 49 * service.
vcoubard 542:1bf9c597f44f 50 * @param cc
vcoubard 542:1bf9c597f44f 51 * This is the application callback for matching characteristic.
vcoubard 542:1bf9c597f44f 52 * Taken as NULL by default. Note: service discovery may still be
vcoubard 542:1bf9c597f44f 53 * active when this callback is issued; calling asynchronous
vcoubard 542:1bf9c597f44f 54 * BLE-stack APIs from within this application callback might cause
vcoubard 542:1bf9c597f44f 55 * the stack to abort service discovery. If this becomes an issue,
vcoubard 542:1bf9c597f44f 56 * it may be better to make local copy of the discoveredCharacteristic
vcoubard 542:1bf9c597f44f 57 * and wait for service discovery to terminate before operating on the
vcoubard 542:1bf9c597f44f 58 * characteristic.
vcoubard 542:1bf9c597f44f 59 * @param matchingServiceUUID
vcoubard 542:1bf9c597f44f 60 * UUID based filter for specifying a service in which the application is
vcoubard 542:1bf9c597f44f 61 * interested. By default it is set as the wildcard UUID_UNKNOWN,
vcoubard 542:1bf9c597f44f 62 * in which case it matches all services. If characteristic-UUID
vcoubard 542:1bf9c597f44f 63 * filter (below) is set to the wildcard value, then a service
vcoubard 542:1bf9c597f44f 64 * callback will be invoked for the matching service (or for every
vcoubard 542:1bf9c597f44f 65 * service if the service filter is a wildcard).
vcoubard 542:1bf9c597f44f 66 * @param matchingCharacteristicUUIDIn
vcoubard 542:1bf9c597f44f 67 * UUID based filter for specifying characteristic in which the application
vcoubard 542:1bf9c597f44f 68 * is interested. By default it is set as the wildcard UUID_UKNOWN
vcoubard 542:1bf9c597f44f 69 * to match against any characteristic. If both service-UUID
vcoubard 542:1bf9c597f44f 70 * filter and characteristic-UUID filter are used with non- wildcard
vcoubard 542:1bf9c597f44f 71 * values, then only a single characteristic callback is
vcoubard 542:1bf9c597f44f 72 * invoked for the matching characteristic.
vcoubard 542:1bf9c597f44f 73 *
vcoubard 542:1bf9c597f44f 74 * @Note Using wildcard values for both service-UUID and characteristic-
vcoubard 542:1bf9c597f44f 75 * UUID will result in complete service discovery--callbacks being
vcoubard 542:1bf9c597f44f 76 * called for every service and characteristic.
vcoubard 542:1bf9c597f44f 77 *
vcoubard 542:1bf9c597f44f 78 * @return
vcoubard 542:1bf9c597f44f 79 * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error.
vcoubard 542:1bf9c597f44f 80 */
vcoubard 542:1bf9c597f44f 81 virtual ble_error_t launchServiceDiscovery(Gap::Handle_t connectionHandle,
vcoubard 542:1bf9c597f44f 82 ServiceDiscovery::ServiceCallback_t sc = NULL,
vcoubard 542:1bf9c597f44f 83 ServiceDiscovery::CharacteristicCallback_t cc = NULL,
vcoubard 542:1bf9c597f44f 84 const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
vcoubard 542:1bf9c597f44f 85 const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN));
vcoubard 542:1bf9c597f44f 86
vcoubard 542:1bf9c597f44f 87 virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
vcoubard 565:cf03471a4ec4 88 discovery.onTermination(callback);
vcoubard 542:1bf9c597f44f 89 }
vcoubard 542:1bf9c597f44f 90
vcoubard 542:1bf9c597f44f 91 /**
vcoubard 542:1bf9c597f44f 92 * Is service-discovery currently active?
vcoubard 542:1bf9c597f44f 93 */
vcoubard 542:1bf9c597f44f 94 virtual bool isServiceDiscoveryActive(void) const {
vcoubard 565:cf03471a4ec4 95 return discovery.isActive();
vcoubard 542:1bf9c597f44f 96 }
vcoubard 542:1bf9c597f44f 97
vcoubard 542:1bf9c597f44f 98 /**
vcoubard 542:1bf9c597f44f 99 * Terminate an ongoing service-discovery. This should result in an
vcoubard 542:1bf9c597f44f 100 * invocation of the TerminationCallback if service-discovery is active.
vcoubard 542:1bf9c597f44f 101 */
vcoubard 542:1bf9c597f44f 102 virtual void terminateServiceDiscovery(void) {
vcoubard 565:cf03471a4ec4 103 discovery.terminate();
vcoubard 542:1bf9c597f44f 104 }
vcoubard 542:1bf9c597f44f 105
vcoubard 542:1bf9c597f44f 106 virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const {
vcoubard 542:1bf9c597f44f 107 uint32_t rc = sd_ble_gattc_read(connHandle, attributeHandle, offset);
vcoubard 542:1bf9c597f44f 108 if (rc == NRF_SUCCESS) {
vcoubard 542:1bf9c597f44f 109 return BLE_ERROR_NONE;
vcoubard 542:1bf9c597f44f 110 }
vcoubard 542:1bf9c597f44f 111 switch (rc) {
vcoubard 542:1bf9c597f44f 112 case NRF_ERROR_BUSY:
vcoubard 542:1bf9c597f44f 113 return BLE_STACK_BUSY;
vcoubard 542:1bf9c597f44f 114 case BLE_ERROR_INVALID_CONN_HANDLE:
vcoubard 542:1bf9c597f44f 115 case NRF_ERROR_INVALID_STATE:
vcoubard 542:1bf9c597f44f 116 case NRF_ERROR_INVALID_ADDR:
vcoubard 542:1bf9c597f44f 117 default:
vcoubard 542:1bf9c597f44f 118 return BLE_ERROR_INVALID_STATE;
vcoubard 542:1bf9c597f44f 119 }
vcoubard 542:1bf9c597f44f 120 }
vcoubard 542:1bf9c597f44f 121
vcoubard 542:1bf9c597f44f 122 virtual ble_error_t write(GattClient::WriteOp_t cmd, Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, size_t length, const uint8_t *value) const {
vcoubard 542:1bf9c597f44f 123 ble_gattc_write_params_t writeParams;
vcoubard 542:1bf9c597f44f 124 writeParams.write_op = cmd;
vcoubard 542:1bf9c597f44f 125 writeParams.flags = 0; /* this is inconsequential */
vcoubard 542:1bf9c597f44f 126 writeParams.handle = attributeHandle;
vcoubard 542:1bf9c597f44f 127 writeParams.offset = 0;
vcoubard 542:1bf9c597f44f 128 writeParams.len = length;
vcoubard 542:1bf9c597f44f 129 writeParams.p_value = const_cast<uint8_t *>(value);
vcoubard 542:1bf9c597f44f 130
vcoubard 542:1bf9c597f44f 131 uint32_t rc = sd_ble_gattc_write(connHandle, &writeParams);
vcoubard 542:1bf9c597f44f 132 if (rc == NRF_SUCCESS) {
vcoubard 542:1bf9c597f44f 133 return BLE_ERROR_NONE;
vcoubard 542:1bf9c597f44f 134 }
vcoubard 542:1bf9c597f44f 135 switch (rc) {
vcoubard 542:1bf9c597f44f 136 case NRF_ERROR_BUSY:
vcoubard 542:1bf9c597f44f 137 return BLE_STACK_BUSY;
vcoubard 542:1bf9c597f44f 138 case BLE_ERROR_NO_TX_BUFFERS:
vcoubard 542:1bf9c597f44f 139 return BLE_ERROR_NO_MEM;
vcoubard 542:1bf9c597f44f 140 case BLE_ERROR_INVALID_CONN_HANDLE:
vcoubard 542:1bf9c597f44f 141 case NRF_ERROR_INVALID_STATE:
vcoubard 542:1bf9c597f44f 142 case NRF_ERROR_INVALID_ADDR:
vcoubard 542:1bf9c597f44f 143 default:
vcoubard 542:1bf9c597f44f 144 return BLE_ERROR_INVALID_STATE;
vcoubard 542:1bf9c597f44f 145 }
vcoubard 542:1bf9c597f44f 146 }
vcoubard 542:1bf9c597f44f 147
vcoubard 565:cf03471a4ec4 148 /**
vcoubard 565:cf03471a4ec4 149 * @brief Clear nRF5xGattClient's state.
vcoubard 565:cf03471a4ec4 150 *
vcoubard 565:cf03471a4ec4 151 * @return
vcoubard 565:cf03471a4ec4 152 * BLE_ERROR_NONE if successful.
vcoubard 565:cf03471a4ec4 153 */
vcoubard 565:cf03471a4ec4 154 virtual ble_error_t reset(void) {
vcoubard 565:cf03471a4ec4 155 /* Clear all state that is from the parent, including private members */
vcoubard 565:cf03471a4ec4 156 if (GattClient::reset() != BLE_ERROR_NONE) {
vcoubard 565:cf03471a4ec4 157 return BLE_ERROR_INVALID_STATE;
vcoubard 565:cf03471a4ec4 158 }
vcoubard 565:cf03471a4ec4 159
vcoubard 565:cf03471a4ec4 160 /* Clear derived class members */
vcoubard 565:cf03471a4ec4 161 discovery.reset();
vcoubard 565:cf03471a4ec4 162
vcoubard 565:cf03471a4ec4 163 return BLE_ERROR_NONE;
vcoubard 565:cf03471a4ec4 164 }
vcoubard 565:cf03471a4ec4 165
vcoubard 542:1bf9c597f44f 166 public:
vcoubard 565:cf03471a4ec4 167 /*
vcoubard 565:cf03471a4ec4 168 * Allow instantiation from nRF5xn when required.
vcoubard 565:cf03471a4ec4 169 */
vcoubard 565:cf03471a4ec4 170 friend class nRF5xn;
vcoubard 565:cf03471a4ec4 171
vcoubard 565:cf03471a4ec4 172 nRF5xGattClient() : discovery(this) {
vcoubard 542:1bf9c597f44f 173 /* empty */
vcoubard 542:1bf9c597f44f 174 }
vcoubard 542:1bf9c597f44f 175
vcoubard 565:cf03471a4ec4 176 friend void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
vcoubard 542:1bf9c597f44f 177
vcoubard 542:1bf9c597f44f 178 private:
vcoubard 542:1bf9c597f44f 179 nRF5xGattClient(const nRF5xGattClient &);
vcoubard 542:1bf9c597f44f 180 const nRF5xGattClient& operator=(const nRF5xGattClient &);
vcoubard 542:1bf9c597f44f 181
vcoubard 542:1bf9c597f44f 182 private:
vcoubard 565:cf03471a4ec4 183 nRF5xServiceDiscovery discovery;
vcoubard 542:1bf9c597f44f 184
vcoubard 542:1bf9c597f44f 185 #endif // if !S110
vcoubard 542:1bf9c597f44f 186 };
vcoubard 542:1bf9c597f44f 187
rgrover1 388:db85a09c27ef 188 #endif // ifndef __NRF51822_GATT_CLIENT_H__