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:
rgrover1
Date:
Mon Nov 02 17:34:04 2015 +0000
Revision:
461:1f352d938a33
Parent:
459:98c44deafc70
Child:
463:b869f947a37a
Synchronized with git rev f0d521f0
Author: Vincent Coubard
Ensure that the initialization flags is set to false if the BLE stack is
shutdown properly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 388:db85a09c27ef 1 /* mbed Microcontroller Library
rgrover1 388:db85a09c27ef 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 388:db85a09c27ef 3 *
rgrover1 388:db85a09c27ef 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 388:db85a09c27ef 5 * you may not use this file except in compliance with the License.
rgrover1 388:db85a09c27ef 6 * You may obtain a copy of the License at
rgrover1 388:db85a09c27ef 7 *
rgrover1 388:db85a09c27ef 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 388:db85a09c27ef 9 *
rgrover1 388:db85a09c27ef 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 388:db85a09c27ef 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 388:db85a09c27ef 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 388:db85a09c27ef 13 * See the License for the specific language governing permissions and
rgrover1 388:db85a09c27ef 14 * limitations under the License.
rgrover1 388:db85a09c27ef 15 */
rgrover1 388:db85a09c27ef 16
rgrover1 388:db85a09c27ef 17 #include "mbed.h"
rgrover1 388:db85a09c27ef 18 #include "nRF5xn.h"
rgrover1 459:98c44deafc70 19 #include "ble/blecommon.h"
rgrover1 388:db85a09c27ef 20 #include "nrf_soc.h"
rgrover1 388:db85a09c27ef 21
rgrover1 388:db85a09c27ef 22 #include "btle/btle.h"
rgrover1 388:db85a09c27ef 23 #include "nrf_delay.h"
rgrover1 388:db85a09c27ef 24
rgrover1 388:db85a09c27ef 25 #include "softdevice_handler.h"
rgrover1 388:db85a09c27ef 26
rgrover1 388:db85a09c27ef 27 /**
rgrover1 388:db85a09c27ef 28 * The singleton which represents the nRF51822 transport for the BLE.
rgrover1 388:db85a09c27ef 29 */
rgrover1 388:db85a09c27ef 30 static nRF5xn deviceInstance;
rgrover1 388:db85a09c27ef 31
rgrover1 388:db85a09c27ef 32 /**
rgrover1 388:db85a09c27ef 33 * BLE-API requires an implementation of the following function in order to
rgrover1 388:db85a09c27ef 34 * obtain its transport handle.
rgrover1 388:db85a09c27ef 35 */
rgrover1 388:db85a09c27ef 36 BLEInstanceBase *
rgrover1 388:db85a09c27ef 37 createBLEInstance(void)
rgrover1 388:db85a09c27ef 38 {
rgrover1 388:db85a09c27ef 39 return (&deviceInstance);
rgrover1 388:db85a09c27ef 40 }
rgrover1 388:db85a09c27ef 41
rgrover1 458:b42881afcc6e 42 nRF5xn::nRF5xn(void) : initialized(false), instanceID(BLE::DEFAULT_INSTANCE)
rgrover1 388:db85a09c27ef 43 {
rgrover1 388:db85a09c27ef 44 }
rgrover1 388:db85a09c27ef 45
rgrover1 388:db85a09c27ef 46 nRF5xn::~nRF5xn(void)
rgrover1 388:db85a09c27ef 47 {
rgrover1 388:db85a09c27ef 48 }
rgrover1 388:db85a09c27ef 49
rgrover1 388:db85a09c27ef 50 const char *nRF5xn::getVersion(void)
rgrover1 388:db85a09c27ef 51 {
rgrover1 459:98c44deafc70 52 if (!initialized) {
rgrover1 459:98c44deafc70 53 return "INITIALIZATION_INCOMPLETE";
rgrover1 459:98c44deafc70 54 }
rgrover1 459:98c44deafc70 55
rgrover1 388:db85a09c27ef 56 static char versionString[32];
rgrover1 388:db85a09c27ef 57 static bool versionFetched = false;
rgrover1 388:db85a09c27ef 58
rgrover1 388:db85a09c27ef 59 if (!versionFetched) {
rgrover1 388:db85a09c27ef 60 ble_version_t version;
rgrover1 388:db85a09c27ef 61 if ((sd_ble_version_get(&version) == NRF_SUCCESS) && (version.company_id == 0x0059)) {
rgrover1 388:db85a09c27ef 62 switch (version.version_number) {
rgrover1 388:db85a09c27ef 63 case 0x07:
rgrover1 403:92d6b4c7bf14 64 case 0x08:
rgrover1 403:92d6b4c7bf14 65 snprintf(versionString, sizeof(versionString), "Nordic BLE4.1 ver:%u fw:%04x", version.version_number, version.subversion_number);
rgrover1 388:db85a09c27ef 66 break;
rgrover1 388:db85a09c27ef 67 default:
rgrover1 403:92d6b4c7bf14 68 snprintf(versionString, sizeof(versionString), "Nordic (spec unknown) ver:%u fw:%04x", version.version_number, version.subversion_number);
rgrover1 388:db85a09c27ef 69 break;
rgrover1 388:db85a09c27ef 70 }
rgrover1 388:db85a09c27ef 71 versionFetched = true;
rgrover1 388:db85a09c27ef 72 } else {
rgrover1 388:db85a09c27ef 73 strncpy(versionString, "unknown", sizeof(versionString));
rgrover1 388:db85a09c27ef 74 }
rgrover1 388:db85a09c27ef 75 }
rgrover1 388:db85a09c27ef 76
rgrover1 388:db85a09c27ef 77 return versionString;
rgrover1 388:db85a09c27ef 78 }
rgrover1 388:db85a09c27ef 79
rgrover1 458:b42881afcc6e 80 ble_error_t nRF5xn::init(BLE::InstanceID_t instanceID, BLE::InitializationCompleteCallback_t callback)
rgrover1 388:db85a09c27ef 81 {
rgrover1 458:b42881afcc6e 82 if (initialized) {
rgrover1 458:b42881afcc6e 83 if (callback) {
rgrover1 458:b42881afcc6e 84 callback(BLE::Instance(instanceID), BLE_ERROR_ALREADY_INITIALIZED);
rgrover1 458:b42881afcc6e 85 }
rgrover1 458:b42881afcc6e 86 return BLE_ERROR_ALREADY_INITIALIZED;
rgrover1 458:b42881afcc6e 87 }
rgrover1 458:b42881afcc6e 88
rgrover1 458:b42881afcc6e 89 instanceID = instanceID;
rgrover1 458:b42881afcc6e 90
rgrover1 388:db85a09c27ef 91 /* ToDo: Clear memory contents, reset the SD, etc. */
rgrover1 388:db85a09c27ef 92 btle_init();
rgrover1 388:db85a09c27ef 93
rgrover1 458:b42881afcc6e 94 initialized = true;
rgrover1 458:b42881afcc6e 95 if (callback) {
rgrover1 458:b42881afcc6e 96 callback(BLE::Instance(instanceID), BLE_ERROR_NONE);
rgrover1 458:b42881afcc6e 97 }
rgrover1 388:db85a09c27ef 98 return BLE_ERROR_NONE;
rgrover1 388:db85a09c27ef 99 }
rgrover1 388:db85a09c27ef 100
rgrover1 388:db85a09c27ef 101 ble_error_t nRF5xn::shutdown(void)
rgrover1 388:db85a09c27ef 102 {
rgrover1 459:98c44deafc70 103 if (!initialized) {
rgrover1 459:98c44deafc70 104 return BLE_ERROR_INITIALIZATION_INCOMPLETE;
rgrover1 459:98c44deafc70 105 }
rgrover1 459:98c44deafc70 106
rgrover1 461:1f352d938a33 107 if(softdevice_handler_sd_disable() != NRF_SUCCESS) {
rgrover1 461:1f352d938a33 108 return BLE_STACK_BUSY;
rgrover1 461:1f352d938a33 109 }
rgrover1 461:1f352d938a33 110
rgrover1 461:1f352d938a33 111 initialized = false;
rgrover1 461:1f352d938a33 112 return BLE_ERROR_NONE;
rgrover1 388:db85a09c27ef 113 }
rgrover1 388:db85a09c27ef 114
rgrover1 388:db85a09c27ef 115 void
rgrover1 388:db85a09c27ef 116 nRF5xn::waitForEvent(void)
rgrover1 388:db85a09c27ef 117 {
rgrover1 388:db85a09c27ef 118 sd_app_evt_wait();
rgrover1 388:db85a09c27ef 119 }