Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BlueNRGGattClient.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 /** 00017 ****************************************************************************** 00018 * @file BlueNRGGattServer.cpp 00019 * @author STMicroelectronics 00020 * @brief Implementation of BlueNRG BLE_API GattServer Class 00021 ****************************************************************************** 00022 * @copy 00023 * 00024 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 00025 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 00026 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY 00027 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 00028 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 00029 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 00030 * 00031 * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> 00032 */ 00033 00034 /** @defgroup BlueNRGGATTClient 00035 * @brief BlueNRG BLE_API GattClient Adaptation 00036 * @{ 00037 */ 00038 00039 #include "BlueNRGGattClient.h" 00040 #ifdef YOTTA_CFG_MBED_OS 00041 #include "mbed-drivers/mbed.h" 00042 #else 00043 #include "mbed.h" 00044 #endif 00045 #include "BlueNRGGap.h" 00046 #include "ble_utils.h" 00047 #include "ble_debug.h" 00048 00049 #include <new> 00050 #include <assert.h> 00051 00052 ble_error_t BlueNRGGattClient::createGattConnectionClient(Gap::Handle_t connectionHandle) 00053 { 00054 if(MAX_ACTIVE_CONNECTIONS <= _numConnections) { 00055 return BLE_ERROR_OPERATION_NOT_PERMITTED; 00056 } 00057 00058 for(uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00059 00060 if(_connectionPool[i] == NULL) { 00061 BlueNRGGattConnectionClient *gattConnectionClient = new(std::nothrow) BlueNRGGattConnectionClient(this, connectionHandle); 00062 00063 if (gattConnectionClient == NULL) { 00064 return BLE_ERROR_NO_MEM; 00065 } 00066 00067 _connectionPool[i] = gattConnectionClient; 00068 _connectionPool[i]->onServiceDiscoveryTermination(terminationCallback); 00069 _numConnections++; 00070 00071 PRINTF("createGattConnectionClient: _connectionPool index=%d\r\n", i); 00072 PRINTF("createGattConnectionClient: succesfully added new gattConnectionClient (_numConnections=%d)\r\n", _numConnections); 00073 break; 00074 } 00075 } 00076 00077 return BLE_ERROR_NONE; 00078 } 00079 00080 ble_error_t BlueNRGGattClient::removeGattConnectionClient(Gap::Handle_t connectionHandle, uint8_t reason) 00081 { 00082 00083 PRINTF("removeGattConnectionClient: connectionHandle=%d reason=0x%x\r\n", connectionHandle, reason); 00084 00085 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00086 PRINTF("removeGattConnectionClient: _connectionPool[%d]->_connectionHandle=%d\r\n", i, _connectionPool[i]->_connectionHandle); 00087 00088 if(_connectionPool[i]->_connectionHandle == connectionHandle) { 00089 PRINTF("removeGattConnectionClient: Found gattConnectionClient\r\n"); 00090 delete _connectionPool[i]; 00091 _connectionPool[i] = NULL; 00092 00093 _numConnections--; 00094 PRINTF("removeGattConnectionClient: succesfully removed gattConnectionClient (_numConnections=%d)\r\n", _numConnections); 00095 00096 break; 00097 00098 } else { 00099 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00100 } 00101 } 00102 00103 return BLE_ERROR_NONE; 00104 } 00105 00106 BlueNRGGattConnectionClient * BlueNRGGattClient::getGattConnectionClient(Gap::Handle_t connectionHandle) { 00107 PRINTF("getGattConnectionClient\r\n"); 00108 00109 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00110 PRINTF("getGattConnectionClient: _connectionPool[%d]->_connectionHandle=%d\r\n", i, _connectionPool[i]->_connectionHandle); 00111 00112 if(_connectionPool[i]->_connectionHandle == connectionHandle) { 00113 PRINTF("getGattConnectionClient: Found gattConnectionClient\r\n"); 00114 return _connectionPool[i]; 00115 } 00116 } 00117 00118 return NULL; 00119 } 00120 00121 void BlueNRGGattClient::gattProcedureCompleteCB(Gap::Handle_t connectionHandle, uint8_t error_code) { 00122 00123 if(error_code != BLE_STATUS_SUCCESS) { 00124 return; 00125 } 00126 00127 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00128 00129 assert(gattConnectionClient != NULL); 00130 00131 gattConnectionClient->gattProcedureCompleteCB(error_code); 00132 } 00133 00134 void BlueNRGGattClient::primaryServicesCB(Gap::Handle_t connectionHandle, 00135 uint8_t event_data_length, 00136 uint8_t attribute_data_length, 00137 uint8_t *attribute_data_list) { 00138 00139 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00140 00141 assert(gattConnectionClient != NULL); 00142 00143 gattConnectionClient->primaryServicesCB(event_data_length, 00144 attribute_data_length, 00145 attribute_data_list); 00146 } 00147 00148 void BlueNRGGattClient::primaryServiceCB(Gap::Handle_t connectionHandle, 00149 uint8_t event_data_length, 00150 uint8_t *handles_info_list) { 00151 00152 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00153 00154 assert(gattConnectionClient != NULL); 00155 00156 gattConnectionClient->primaryServiceCB(event_data_length, 00157 handles_info_list); 00158 } 00159 00160 ble_error_t BlueNRGGattClient::findServiceChars(Gap::Handle_t connectionHandle) { 00161 00162 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00163 00164 if(gattConnectionClient != NULL) { 00165 return gattConnectionClient->findServiceChars(); 00166 } else { 00167 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00168 } 00169 } 00170 00171 void BlueNRGGattClient::serviceCharsCB(Gap::Handle_t connectionHandle, 00172 uint8_t event_data_length, 00173 uint8_t handle_value_pair_length, 00174 uint8_t *handle_value_pair) { 00175 00176 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00177 00178 assert(gattConnectionClient != NULL); 00179 00180 gattConnectionClient->serviceCharsCB(event_data_length, 00181 handle_value_pair_length, 00182 handle_value_pair); 00183 } 00184 00185 void BlueNRGGattClient::serviceCharByUUIDCB(Gap::Handle_t connectionHandle, 00186 uint8_t event_data_length, 00187 uint16_t attr_handle, 00188 uint8_t *attr_value) { 00189 00190 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00191 00192 assert(gattConnectionClient != NULL); 00193 00194 gattConnectionClient->serviceCharByUUIDCB(event_data_length, 00195 attr_handle, 00196 attr_value); 00197 } 00198 00199 void BlueNRGGattClient::discAllCharacDescCB(Gap::Handle_t connHandle, 00200 uint8_t event_data_length, 00201 uint8_t format, 00202 uint8_t *handle_uuid_pair) { 00203 00204 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle); 00205 00206 assert(gattConnectionClient != NULL); 00207 00208 gattConnectionClient->discAllCharacDescCB(event_data_length, 00209 format, 00210 handle_uuid_pair); 00211 } 00212 00213 void BlueNRGGattClient::charReadCB(Gap::Handle_t connHandle, 00214 uint8_t event_data_length, 00215 uint8_t* attribute_value) { 00216 00217 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle); 00218 00219 assert(gattConnectionClient != NULL); 00220 00221 gattConnectionClient->charReadCB(event_data_length, 00222 attribute_value); 00223 } 00224 00225 void BlueNRGGattClient::charWritePrepareCB(Gap::Handle_t connHandle, 00226 uint8_t event_data_length, 00227 uint16_t attribute_handle, 00228 uint16_t offset, 00229 uint8_t *part_attr_value) { 00230 00231 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle); 00232 00233 assert(gattConnectionClient != NULL); 00234 00235 gattConnectionClient->charWritePrepareCB(event_data_length, 00236 attribute_handle, 00237 offset, 00238 part_attr_value); 00239 } 00240 00241 void BlueNRGGattClient::charWriteExecCB(Gap::Handle_t connHandle, 00242 uint8_t event_data_length) { 00243 00244 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle); 00245 00246 assert(gattConnectionClient != NULL); 00247 00248 gattConnectionClient->charWriteExecCB(event_data_length); 00249 } 00250 00251 ble_error_t BlueNRGGattClient::launchServiceDiscovery(Gap::Handle_t connectionHandle, 00252 ServiceDiscovery::ServiceCallback_t sc, 00253 ServiceDiscovery::CharacteristicCallback_t cc, 00254 const UUID &matchingServiceUUID, 00255 const UUID &matchingCharacteristicUUIDIn) 00256 { 00257 PRINTF("BlueNRGGattClient launchServiceDiscovery\n\r"); 00258 00259 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00260 00261 if(gattConnectionClient != NULL) { 00262 return gattConnectionClient->launchServiceDiscovery(sc, cc, matchingServiceUUID, matchingCharacteristicUUIDIn); 00263 } else { 00264 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00265 } 00266 } 00267 00268 ble_error_t BlueNRGGattClient::discoverServices(Gap::Handle_t connectionHandle, 00269 ServiceDiscovery::ServiceCallback_t callback, 00270 const UUID &matchingServiceUUID) 00271 { 00272 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00273 00274 if(gattConnectionClient != NULL) { 00275 00276 return gattConnectionClient->discoverServices(callback, matchingServiceUUID); 00277 00278 } else { 00279 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00280 } 00281 } 00282 00283 ble_error_t BlueNRGGattClient::discoverServices(Gap::Handle_t connectionHandle, 00284 ServiceDiscovery::ServiceCallback_t callback, 00285 GattAttribute::Handle_t startHandle, 00286 GattAttribute::Handle_t endHandle) 00287 { 00288 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle); 00289 00290 if(gattConnectionClient != NULL) { 00291 00292 return gattConnectionClient->discoverServices(callback, startHandle, endHandle); 00293 00294 } else { 00295 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00296 } 00297 } 00298 00299 bool BlueNRGGattClient::isServiceDiscoveryActive(void) const 00300 { 00301 bool isSDActive = false; 00302 00303 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00304 if (_connectionPool[i]) { 00305 isSDActive |= _connectionPool[i]->isServiceDiscoveryActive(); 00306 } 00307 } 00308 00309 return isSDActive; 00310 } 00311 00312 void BlueNRGGattClient::terminateServiceDiscovery(void) 00313 { 00314 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00315 if (_connectionPool[i]) { 00316 _connectionPool[i]->terminateServiceDiscovery(); 00317 } 00318 } 00319 } 00320 00321 void BlueNRGGattClient::onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) { 00322 terminationCallback = callback; 00323 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; ++i) { 00324 if (_connectionPool[i]) { 00325 _connectionPool[i]->onServiceDiscoveryTermination(callback); 00326 } 00327 } 00328 } 00329 00330 ble_error_t BlueNRGGattClient::read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const 00331 { 00332 BlueNRGGattConnectionClient *gattConnectionClient = const_cast<BlueNRGGattClient*>(this)->getGattConnectionClient(connHandle); 00333 00334 if(gattConnectionClient != NULL) { 00335 00336 return gattConnectionClient->read(attributeHandle, offset); 00337 00338 } else { 00339 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00340 } 00341 } 00342 00343 ble_error_t BlueNRGGattClient::write(GattClient::WriteOp_t cmd, 00344 Gap::Handle_t connHandle, 00345 GattAttribute::Handle_t attributeHandle, 00346 size_t length, 00347 const uint8_t *value) const 00348 { 00349 BlueNRGGattConnectionClient *gattConnectionClient = const_cast<BlueNRGGattClient*>(this)->getGattConnectionClient(connHandle); 00350 00351 if(gattConnectionClient != NULL) { 00352 00353 return gattConnectionClient->write(cmd, attributeHandle, length, value); 00354 00355 } else { 00356 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00357 } 00358 } 00359 00360 ble_error_t BlueNRGGattClient::discoverCharacteristicDescriptors( 00361 const DiscoveredCharacteristic& characteristic, 00362 const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& discoveryCallback, 00363 const CharacteristicDescriptorDiscovery::TerminationCallback_t& terminationCallback) 00364 { 00365 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(characteristic.getConnectionHandle()); 00366 00367 if(gattConnectionClient != NULL) { 00368 00369 return gattConnectionClient->discoverCharacteristicDescriptors(characteristic, discoveryCallback, terminationCallback); 00370 00371 } else { 00372 return BLE_ERROR_INTERNAL_STACK_FAILURE; 00373 } 00374 } 00375 00376 /**************************************************************************/ 00377 /*! 00378 @brief Clear BlueNRGGattClient's state. 00379 00380 @returns ble_error_t 00381 00382 @retval BLE_ERROR_NONE 00383 Everything executed properly 00384 */ 00385 /**************************************************************************/ 00386 ble_error_t BlueNRGGattClient::reset(void) 00387 { 00388 PRINTF("BlueNRGGattClient::reset\n"); 00389 00390 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) { 00391 if(_connectionPool[i] != NULL) { 00392 _connectionPool[i]->reset(); 00393 00394 delete _connectionPool[i]; 00395 _connectionPool[i] = NULL; 00396 00397 _numConnections--; 00398 } 00399 } 00400 00401 return BLE_ERROR_NONE; 00402 } 00403
Generated on Tue Jul 12 2022 21:44:00 by
1.7.2