for bbc microbit library
Fork of nRF51822 by
Revision 566:e425ad9e5d6e, committed 2016-01-11
- Comitter:
- vcoubard
- Date:
- Mon Jan 11 10:19:18 2016 +0000
- Parent:
- 565:cf03471a4ec4
- Child:
- 567:e1800bd55a9e
- Commit message:
- Synchronized with git rev 52200b37
Author: Rohit Grover
follow the extraction of ddress related types from Gap.h into BLEProtocol.h
Changed in this revision
--- a/source/btle/btle.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/btle/btle.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -27,7 +27,9 @@ #include "custom/custom_helper.h" #include "ble/GapEvents.h" -#include "nRF5xn.h" +#include "nRF5xGap.h" +#include "nRF5xGattServer.h" +#include "nRF5xSecurityManager.h" extern "C" { #include "pstorage.h" @@ -136,11 +138,6 @@ bleGattcEventHandler(p_ble_evt); #endif - nRF5xn &ble = nRF5xn::Instance(BLE::DEFAULT_INSTANCE); - nRF5xGap &gap = (nRF5xGap &) ble.getGap(); - nRF5xGattServer &gattServer = (nRF5xGattServer &) ble.getGattServer(); - nRF5xSecurityManager &securityManager = (nRF5xSecurityManager &) ble.getSecurityManager(); - /* Custom event handler */ switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: { @@ -151,14 +148,14 @@ #else Gap::Role_t role = static_cast<Gap::Role_t>(p_ble_evt->evt.gap_evt.params.connected.role); #endif - gap.setConnectionHandle(handle); + nRF5xGap::getInstance().setConnectionHandle(handle); const Gap::ConnectionParams_t *params = reinterpret_cast<Gap::ConnectionParams_t *>(&(p_ble_evt->evt.gap_evt.params.connected.conn_params)); const ble_gap_addr_t *peer = &p_ble_evt->evt.gap_evt.params.connected.peer_addr; const ble_gap_addr_t *own = &p_ble_evt->evt.gap_evt.params.connected.own_addr; - gap.processConnectionEvent(handle, + nRF5xGap::getInstance().processConnectionEvent(handle, role, - static_cast<Gap::AddressType_t>(peer->addr_type), peer->addr, - static_cast<Gap::AddressType_t>(own->addr_type), own->addr, + static_cast<BLEProtocol::AddressType::Type>(peer->addr_type), peer->addr, + static_cast<BLEProtocol::AddressType::Type>(own->addr_type), own->addr, params); break; } @@ -167,7 +164,7 @@ Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle; // Since we are not in a connection and have not started advertising, // store bonds - gap.setConnectionHandle (BLE_CONN_HANDLE_INVALID); + nRF5xGap::getInstance().setConnectionHandle (BLE_CONN_HANDLE_INVALID); Gap::DisconnectionReason_t reason; switch (p_ble_evt->evt.gap_evt.params.disconnected.reason) { @@ -186,16 +183,16 @@ reason = static_cast<Gap::DisconnectionReason_t>(p_ble_evt->evt.gap_evt.params.disconnected.reason); break; } - gap.processDisconnectionEvent(handle, reason); + nRF5xGap::getInstance().processDisconnectionEvent(handle, reason); break; } case BLE_GAP_EVT_PASSKEY_DISPLAY: - securityManager.processPasskeyDisplayEvent(p_ble_evt->evt.gap_evt.conn_handle, p_ble_evt->evt.gap_evt.params.passkey_display.passkey); + nRF5xSecurityManager::getInstance().processPasskeyDisplayEvent(p_ble_evt->evt.gap_evt.conn_handle, p_ble_evt->evt.gap_evt.params.passkey_display.passkey); break; case BLE_GAP_EVT_TIMEOUT: - gap.processTimeoutEvent(static_cast<Gap::TimeoutSource_t>(p_ble_evt->evt.gap_evt.params.timeout.src)); + nRF5xGap::getInstance().processTimeoutEvent(static_cast<Gap::TimeoutSource_t>(p_ble_evt->evt.gap_evt.params.timeout.src)); break; case BLE_GATTC_EVT_TIMEOUT: @@ -207,12 +204,12 @@ case BLE_GAP_EVT_ADV_REPORT: { const ble_gap_evt_adv_report_t *advReport = &p_ble_evt->evt.gap_evt.params.adv_report; - gap.processAdvertisementReport(advReport->peer_addr.addr, - advReport->rssi, - advReport->scan_rsp, - static_cast<GapAdvertisingParams::AdvertisingType_t>(advReport->type), - advReport->dlen, - advReport->data); + nRF5xGap::getInstance().processAdvertisementReport(advReport->peer_addr.addr, + advReport->rssi, + advReport->scan_rsp, + static_cast<GapAdvertisingParams::AdvertisingType_t>(advReport->type), + advReport->dlen, + advReport->data); break; } @@ -220,7 +217,7 @@ break; } - gattServer.hwCallback(p_ble_evt); + nRF5xGattServer::getInstance().hwCallback(p_ble_evt); } /*! @brief Callback when an error occurs inside the SoftDevice */
--- a/source/btle/btle_discovery.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/btle/btle_discovery.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -14,15 +14,13 @@ * limitations under the License. */ -#include "nRF5xn.h" +#include "nRF5xServiceDiscovery.h" +#include "nRF5xGattClient.h" #if !defined(TARGET_MCU_NRF51_16K_S110) && !defined(TARGET_MCU_NRF51_32K_S110) void bleGattcEventHandler(const ble_evt_t *p_ble_evt) { - nRF5xn &ble = nRF5xn::Instance(BLE::DEFAULT_INSTANCE); - nRF5xGap &gap = (nRF5xGap &) ble.getGap(); - nRF5xGattClient &gattClient = (nRF5xGattClient &) ble.getGattClient(); - nRF5xServiceDiscovery &sdSingleton = gattClient.discovery; + nRF5xServiceDiscovery &sdSingleton = nRF5xGattClient::getInstance().discovery; switch (p_ble_evt->header.evt_id) { case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: @@ -65,7 +63,7 @@ .len = p_ble_evt->evt.gattc_evt.params.read_rsp.len, .data = p_ble_evt->evt.gattc_evt.params.read_rsp.data, }; - gattClient.processReadResponse(&response); + nRF5xGattClient::getInstance().processReadResponse(&response); } break; @@ -78,7 +76,7 @@ .len = p_ble_evt->evt.gattc_evt.params.write_rsp.len, .data = p_ble_evt->evt.gattc_evt.params.write_rsp.data, }; - gattClient.processWriteResponse(&response); + nRF5xGattClient::getInstance().processWriteResponse(&response); } break; @@ -90,7 +88,7 @@ params.len = p_ble_evt->evt.gattc_evt.params.hvx.len; params.data = p_ble_evt->evt.gattc_evt.params.hvx.data; - gattClient.processHVXEvent(¶ms); + nRF5xGattClient::getInstance().processHVXEvent(¶ms); } break; }
--- a/source/btle/btle_security.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/btle/btle_security.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -16,7 +16,8 @@ #include "btle.h" -#include "nRF5xn.h" +#include "nRF5xGap.h" +#include "nRF5xSecurityManager.h" extern "C" { #include "pstorage.h" @@ -203,20 +204,17 @@ ret_code_t dm_handler(dm_handle_t const *p_handle, dm_event_t const *p_event, ret_code_t event_result) { - nRF5xn &ble = nRF5xn::Instance(BLE::DEFAULT_INSTANCE); - nRF5xSecurityManager &securityManager = (nRF5xSecurityManager &) ble.getSecurityManager(); - switch (p_event->event_id) { case DM_EVT_SECURITY_SETUP: /* started */ { const ble_gap_sec_params_t *peerParams = &p_event->event_param.p_gap_param->params.sec_params_request.peer_params; - securityManager.processSecuritySetupInitiatedEvent(p_event->event_param.p_gap_param->conn_handle, + nRF5xSecurityManager::getInstance().processSecuritySetupInitiatedEvent(p_event->event_param.p_gap_param->conn_handle, peerParams->bond, peerParams->mitm, (SecurityManager::SecurityIOCapabilities_t)peerParams->io_caps); break; } case DM_EVT_SECURITY_SETUP_COMPLETE: - securityManager. + nRF5xSecurityManager::getInstance(). processSecuritySetupCompletedEvent(p_event->event_param.p_gap_param->conn_handle, (SecurityManager::SecurityCompletionStatus_t)(p_event->event_param.p_gap_param->params.auth_status.auth_status)); break; @@ -250,11 +248,11 @@ break; } - securityManager.processLinkSecuredEvent(p_event->event_param.p_gap_param->conn_handle, resolvedSecurityMode); + nRF5xSecurityManager::getInstance().processLinkSecuredEvent(p_event->event_param.p_gap_param->conn_handle, resolvedSecurityMode); break; } case DM_EVT_DEVICE_CONTEXT_STORED: - securityManager.processSecurityContextStoredEvent(p_event->event_param.p_gap_param->conn_handle); + nRF5xSecurityManager::getInstance().processSecurityContextStoredEvent(p_event->event_param.p_gap_param->conn_handle); break; default: break;
--- a/source/nRF5xGap.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGap.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -14,17 +14,20 @@ * limitations under the License. */ -#include "nRF5xn.h" +#include "nRF5xGap.h" #include "mbed.h" -#include "ble/BLE.h" #include "common/common.h" #include "ble_advdata.h" #include "ble_hci.h" +nRF5xGap &nRF5xGap::getInstance() { + static nRF5xGap m_instance; + return m_instance; +} + void radioNotificationStaticCallback(bool param) { - nRF5xGap &gap = (nRF5xGap &) nRF5xn::Instance(BLE::DEFAULT_INSTANCE).getGap(); - gap.processRadioNotificationEvent(param); + nRF5xGap::getInstance().processRadioNotificationEvent(param); } /**************************************************************************/ @@ -335,29 +338,6 @@ /**************************************************************************/ /*! - @brief Clear nRF5xGap's state. - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly -*/ -/**************************************************************************/ -ble_error_t nRF5xGap::reset(void) -{ - /* Clear all state that is from the parent, including private members */ - if (Gap::reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - /* Clear derived class members */ - m_connectionHandle = BLE_CONN_HANDLE_INVALID; - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! @brief Sets the 16-bit connection handle */ /**************************************************************************/ @@ -387,7 +367,7 @@ @code uint8_t device_address[6] = { 0xca, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0 }; - nrf.getGap().setAddress(Gap::ADDR_TYPE_RANDOM_STATIC, device_address); + nrf.getGap().setAddress(Gap::BLEProtocol::AddressType::RANDOM_STATIC, device_address); @endcode */ @@ -401,12 +381,12 @@ When using Random Private addresses, the cycle mode must be Auto. In auto mode, the given address is ignored. */ - if ((type == ADDR_TYPE_PUBLIC) || (type == ADDR_TYPE_RANDOM_STATIC)) + if ((type == BLEProtocol::AddressType::PUBLIC) || (type == BLEProtocol::AddressType::RANDOM_STATIC)) { cycle_mode = BLE_GAP_ADDR_CYCLE_MODE_NONE; memcpy(dev_addr.addr, address, ADDR_LEN); } - else if ((type == ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE) || (type == ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE)) + else if ((type == BLEProtocol::AddressType::RANDOM_PRIVATE_RESOLVABLE) || (type == BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE)) { cycle_mode = BLE_GAP_ADDR_CYCLE_MODE_AUTO; // address is ignored when in auto mode
--- a/source/nRF5xGap.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGap.h Mon Jan 11 10:19:18 2016 +0000 @@ -44,6 +44,8 @@ class nRF5xGap : public Gap { public: + static nRF5xGap &getInstance(); + /* Functions that must be implemented from Gap */ virtual ble_error_t setAddress(AddressType_t type, const Address_t address); virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address); @@ -74,8 +76,6 @@ virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params); virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params); - virtual ble_error_t reset(void); - virtual ble_error_t initRadioNotification(void) { if (ble_radio_notification_init(NRF_APP_PRIORITY_HIGH, NRF_RADIO_NOTIFICATION_DISTANCE_800US, radioNotificationStaticCallback) == NRF_SUCCESS) { return BLE_ERROR_NONE; @@ -196,12 +196,6 @@ private: uint16_t m_connectionHandle; - - /* - * Allow instantiation from nRF5xn when required. - */ - friend class nRF5xn; - nRF5xGap() { m_connectionHandle = BLE_CONN_HANDLE_INVALID; }
--- a/source/nRF5xGattClient.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGattClient.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -16,6 +16,15 @@ #include "nRF5xGattClient.h" +nRF5xGattClient & +nRF5xGattClient::getInstance(void) { + static nRF5xGattClient* nRFGattClientSingleton = NULL; + if (nRFGattClientSingleton == NULL) { + nRFGattClientSingleton = new nRF5xGattClient(); + } + return *nRFGattClientSingleton; +} + #if !defined(TARGET_MCU_NRF51_16K_S110) && !defined(TARGET_MCU_NRF51_32K_S110) ble_error_t nRF5xGattClient::launchServiceDiscovery(Gap::Handle_t connectionHandle,
--- a/source/nRF5xGattClient.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGattClient.h Mon Jan 11 10:19:18 2016 +0000 @@ -23,6 +23,8 @@ class nRF5xGattClient : public GattClient { public: + static nRF5xGattClient &getInstance(); + /** * When using S110, all Gatt client features will return * BLE_ERROR_NOT_IMPLEMENTED @@ -145,30 +147,7 @@ } } - /** - * @brief Clear nRF5xGattClient's state. - * - * @return - * BLE_ERROR_NONE if successful. - */ - virtual ble_error_t reset(void) { - /* Clear all state that is from the parent, including private members */ - if (GattClient::reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - /* Clear derived class members */ - discovery.reset(); - - return BLE_ERROR_NONE; - } - public: - /* - * Allow instantiation from nRF5xn when required. - */ - friend class nRF5xn; - nRF5xGattClient() : discovery(this) { /* empty */ }
--- a/source/nRF5xGattServer.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGattServer.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -20,7 +20,12 @@ #include "common/common.h" #include "btle/custom/custom_helper.h" -#include "nRF5xn.h" +#include "nRF5xGap.h" + +nRF5xGattServer &nRF5xGattServer::getInstance(void) { + static nRF5xGattServer m_instance; + return m_instance; +} /**************************************************************************/ /*! @@ -236,8 +241,7 @@ hvx_params.p_len = &len; if (connectionHandle == BLE_CONN_HANDLE_INVALID) { /* use the default connection handle if the caller hasn't specified a valid connectionHandle. */ - nRF5xGap &gap = (nRF5xGap &) nRF5xn::Instance(BLE::DEFAULT_INSTANCE).getGap(); - connectionHandle = gap.getConnectionHandle(); + connectionHandle = nRF5xGap::getInstance().getConnectionHandle(); } error_t error = (error_t) sd_ble_gatts_hvx(connectionHandle, &hvx_params); if (error != ERROR_NONE) { @@ -276,8 +280,7 @@ ble_error_t nRF5xGattServer::areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP) { /* Forward the call with the default connection handle. */ - nRF5xGap &gap = (nRF5xGap &) nRF5xn::Instance(BLE::DEFAULT_INSTANCE).getGap(); - return areUpdatesEnabled(gap.getConnectionHandle(), characteristic, enabledP); + return areUpdatesEnabled(nRF5xGap::getInstance().getConnectionHandle(), characteristic, enabledP); } ble_error_t nRF5xGattServer::areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP) @@ -309,33 +312,6 @@ /**************************************************************************/ /*! - @brief Clear nRF5xGattServer's state. - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly -*/ -/**************************************************************************/ -ble_error_t nRF5xGattServer::reset(void) -{ - /* Clear all state that is from the parent, including private members */ - if (GattServer::reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - /* Clear derived class members */ - memset(p_characteristics, 0, sizeof(p_characteristics)); - memset(p_descriptors, 0, sizeof(p_descriptors)); - memset(nrfCharacteristicHandles, 0, sizeof(ble_gatts_char_handles_t)); - memset(nrfDescriptorHandles, 0, sizeof(nrfDescriptorHandles)); - descriptorCount = 0; - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! @brief Callback handler for events getting pushed up from the SD */ /**************************************************************************/
--- a/source/nRF5xGattServer.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xGattServer.h Mon Jan 11 10:19:18 2016 +0000 @@ -27,6 +27,8 @@ class nRF5xGattServer : public GattServer { public: + static nRF5xGattServer &getInstance(); + /* Functions that must be implemented from GattServer */ virtual ble_error_t addService(GattService &); virtual ble_error_t read(GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP); @@ -35,13 +37,11 @@ virtual ble_error_t write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly = false); virtual ble_error_t areUpdatesEnabled(const GattCharacteristic &characteristic, bool *enabledP); virtual ble_error_t areUpdatesEnabled(Gap::Handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP); - virtual ble_error_t reset(void); /* nRF51 Functions */ void eventCallback(void); void hwCallback(ble_evt_t *p_ble_evt); - private: const static unsigned BLE_TOTAL_CHARACTERISTICS = 20; const static unsigned BLE_TOTAL_DESCRIPTORS = 8; @@ -86,11 +86,6 @@ uint8_t descriptorCount; uint16_t nrfDescriptorHandles[BLE_TOTAL_DESCRIPTORS]; - /* - * Allow instantiation from nRF5xn when required. - */ - friend class nRF5xn; - nRF5xGattServer() : GattServer(), p_characteristics(), nrfCharacteristicHandles(), p_descriptors(), descriptorCount(0), nrfDescriptorHandles() { /* empty */ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/nRF5xSecurityManager.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -0,0 +1,25 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "nRF5xSecurityManager.h" + +nRF5xSecurityManager &nRF5xSecurityManager::getInstance(void) { + static nRF5xSecurityManager* m_instance = NULL; + if (m_instance == NULL) { + m_instance = new nRF5xSecurityManager(); + } + return *m_instance; +} \ No newline at end of file
--- a/source/nRF5xSecurityManager.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xSecurityManager.h Mon Jan 11 10:19:18 2016 +0000 @@ -25,6 +25,8 @@ class nRF5xSecurityManager : public SecurityManager { public: + static nRF5xSecurityManager &getInstance(); + /* Functions that must be implemented from SecurityManager */ virtual ble_error_t init(bool enableBonding, bool requireMITM, @@ -45,27 +47,7 @@ return btle_purgeAllBondingState(); } - /** - * @brief Clear nRF5xSecurityManager's state. - * - * @return - * BLE_ERROR_NONE if successful. - */ - virtual ble_error_t reset(void) - { - if (SecurityManager::reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - return BLE_ERROR_NONE; - } - public: - /* - * Allow instantiation from nRF5xn when required. - */ - friend class nRF5xn; - nRF5xSecurityManager() { /* empty */ }
--- a/source/nRF5xServiceDiscovery.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xServiceDiscovery.h Mon Jan 11 10:19:18 2016 +0000 @@ -99,34 +99,6 @@ onTerminationCallback = callback; } - /** - * @brief Clear nRF5xServiceDiscovery's state. - * - * @return - * BLE_ERROR_NONE if successful. - */ - virtual ble_error_t reset(void) { - /* Clear all state that is from the parent, including private members */ - if (ServiceDiscovery::reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - /* Clear derived class members */ - serviceIndex = 0; - numServices = 0; - characteristicIndex = 0; - numCharacteristics = 0; - - state = INACTIVE; - - serviceUUIDDiscoveryQueue.reset(); - charUUIDDiscoveryQueue.reset(); - - onTerminationCallback = NULL; - - return BLE_ERROR_NONE; - } - private: ble_error_t launchCharacteristicDiscovery(Gap::Handle_t connectionHandle, Gap::Handle_t startHandle, Gap::Handle_t endHandle);
--- a/source/nRF5xn.cpp Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xn.cpp Mon Jan 11 10:19:18 2016 +0000 @@ -32,33 +32,16 @@ static nRF5xn deviceInstance; /** - * The singleton for nRF5xGap. This has been kept static because it is - * always needed for any application that uses BLE. - */ -nRF5xGap nRF5xn::_gapInstance; - -/** * BLE-API requires an implementation of the following function in order to * obtain its transport handle. */ BLEInstanceBase * createBLEInstance(void) { - return &nRF5xn::Instance(BLE::DEFAULT_INSTANCE); -} - -nRF5xn& nRF5xn::Instance(BLE::InstanceID_t instanceId) -{ - return deviceInstance; + return (&deviceInstance); } -nRF5xn::nRF5xn(void) : - initialized(false), - instanceID(BLE::DEFAULT_INSTANCE), - gapInstance(NULL), - gattServerInstance(NULL), - gattClientInstance(NULL), - securityManagerInstance(NULL) +nRF5xn::nRF5xn(void) : initialized(false), instanceID(BLE::DEFAULT_INSTANCE) { } @@ -121,60 +104,16 @@ return BLE_ERROR_NONE; } -/**************************************************************************/ -/*! - @brief Purge the BLE stack of GATT and GAP state. - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @note When using S110, GattClient::shutdown() will not be called - since Gatt client features are not supported. -*/ -/**************************************************************************/ ble_error_t nRF5xn::shutdown(void) { if (!initialized) { return BLE_ERROR_INITIALIZATION_INCOMPLETE; } - /* - * Shutdown the SoftDevice first. This is because we need to disable all - * interrupts. Otherwise if we clear the BLE API and glue code first there - * will be many NULL references and no config information which could lead - * to errors if the shutdown process is interrupted. - */ if(softdevice_handler_sd_disable() != NRF_SUCCESS) { return BLE_STACK_BUSY; } - - /* Shutdown the BLE API and nRF51 glue code */ - if (gattServerInstance != NULL && - gattServerInstance->reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - if (securityManagerInstance != NULL && - securityManagerInstance->reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - - /* S110 does not support BLE client features, nothing to reset. */ -#if !defined(TARGET_MCU_NRF51_16K_S110) && !defined(TARGET_MCU_NRF51_32K_S110) - if (gattClientInstance != NULL && - gattClientInstance->reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } -#endif - - if (gapInstance != NULL && - gapInstance->reset() != BLE_ERROR_NONE) { - return BLE_ERROR_INVALID_STATE; - } - initialized = false; return BLE_ERROR_NONE; }
--- a/source/nRF5xn.h Mon Jan 11 10:19:18 2016 +0000 +++ b/source/nRF5xn.h Mon Jan 11 10:19:18 2016 +0000 @@ -41,153 +41,32 @@ virtual ble_error_t shutdown(void); virtual const char *getVersion(void); - /** - * Accessors to GAP. This function checks whether gapInstance points to an - * object. If if does not, then the gapInstance is updated to - * &_getInstance before returning. - * - * @return A reference to GattServer. - * - * @note Unlike the GattClient, GattServer and SecurityManager, Gap is - * always needed in a BLE application. Therefore it is allocated - * statically. - */ virtual Gap &getGap() { - if (gapInstance == NULL) { - gapInstance = &_gapInstance; - } - return *gapInstance; + return nRF5xGap::getInstance(); }; - - /** - * Accessors to GATT Server. This function checks whether a GattServer - * object was previously instantiated. If such object does not exist, then - * it is created before returning. - * - * @return A reference to GattServer. - */ + virtual const Gap &getGap() const { + return nRF5xGap::getInstance(); + }; virtual GattServer &getGattServer() { - if (gattServerInstance == NULL) { - gattServerInstance = new nRF5xGattServer(); - } - return *gattServerInstance; + return nRF5xGattServer::getInstance(); }; - - /** - * Accessors to GATT Client. This function checks whether a GattClient - * object was previously instantiated. If such object does not exist, then - * it is created before returning. - * - * @return A reference to GattClient. - */ + virtual const GattServer &getGattServer() const { + return nRF5xGattServer::getInstance(); + }; virtual GattClient &getGattClient() { - if (gattClientInstance == NULL) { - gattClientInstance = new nRF5xGattClient(); - } - return *gattClientInstance; - } - - /** - * Accessors to Security Manager. This function checks whether a SecurityManager - * object was previously instantiated. If such object does not exist, then - * it is created before returning. - * - * @return A reference to GattServer. - */ - virtual SecurityManager &getSecurityManager() { - if (securityManagerInstance == NULL) { - securityManagerInstance = new nRF5xSecurityManager(); - } - return *securityManagerInstance; + return nRF5xGattClient::getInstance(); } - - /** - * Accessors to GAP. This function checks whether gapInstance points to an - * object. If if does not, then the gapInstance is updated to - * &_getInstance before returning. - * - * @return A const reference to GattServer. - * - * @note Unlike the GattClient, GattServer and SecurityManager, Gap is - * always needed in a BLE application. Therefore it is allocated - * statically. - * - * @note The accessor is able to modify the object's state because the - * internal pointer has been declared mutable. - */ - virtual const Gap &getGap() const { - if (gapInstance == NULL) { - gapInstance = &_gapInstance; - } - return *gapInstance; - }; - - /** - * Accessors to GATT Server. This function checks whether a GattServer - * object was previously instantiated. If such object does not exist, then - * it is created before returning. - * - * @return A const reference to GattServer. - * - * @note The accessor is able to modify the object's state because the - * internal pointer has been declared mutable. - */ - virtual const GattServer &getGattServer() const { - if (gattServerInstance == NULL) { - gattServerInstance = new nRF5xGattServer(); - } - return *gattServerInstance; - }; - - /** - * Accessors to Security Manager. This function checks whether a SecurityManager - * object was previously instantiated. If such object does not exist, then - * it is created before returning. - * - * @return A const reference to GattServer. - * - * @note The accessor is able to modify the object's state because the - * internal pointer has been declared mutable. - */ virtual const SecurityManager &getSecurityManager() const { - if (securityManagerInstance == NULL) { - securityManagerInstance = new nRF5xSecurityManager(); - } - return *securityManagerInstance; + return nRF5xSecurityManager::getInstance(); } - + virtual SecurityManager &getSecurityManager() { + return nRF5xSecurityManager::getInstance(); + } virtual void waitForEvent(void); -public: - static nRF5xn& Instance(BLE::InstanceID_t instanceId); - private: bool initialized; BLE::InstanceID_t instanceID; - -private: - static nRF5xGap _gapInstance; /**< Gap instance whose reference is returned from a call to - * getGap(). Unlike the GattClient, GattServer and - * SecurityManager, Gap is always needed in a BLE application. - * Therefore it is allocated statically. */ - -private: - mutable nRF5xGap *gapInstance; /**< Pointer to the Gap object instance. - * If NULL, then Gap has not been initialized. - * The pointer has been declared as 'mutable' so that - * it can be assigned inside a 'const' function. */ - mutable nRF5xGattServer *gattServerInstance; /**< Pointer to the GattServer object instance. - * If NULL, then GattServer has not been initialized. - * The pointer has been declared as 'mutable' so that - * it can be assigned inside a 'const' function. */ - mutable nRF5xGattClient *gattClientInstance; /**< Pointer to the GattClient object instance. - * If NULL, then GattClient has not been initialized. - * The pointer has been declared as 'mutable' so that - * it can be assigned inside a 'const' function. */ - mutable nRF5xSecurityManager *securityManagerInstance; /**< Pointer to the SecurityManager object instance. - * If NULL, then SecurityManager has not been initialized. - * The pointer has been declared as 'mutable' so that - * it can be assigned inside a 'const' function. */ }; #endif \ No newline at end of file