smart ball test board code

Dependencies:   nrf51-sdk

Fork of nRF51822 by Nordic Semiconductor

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