BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield (Component)

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 are Arduino compatible with an exception: instead of using pin D13 for the SPI clock, they use pin D3. The default configuration for this library is having the SPI clock on pin D3.

To be fully Arduino compatible, X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 need a small HW patch.

For X-NUCLEO-IDB04A1 this patch consists in removing zero resistor R10 and instead soldering zero resistor R11. For X-NUCLEO-IDB05A1 this patch consists in removing zero resistor R4 and instead soldering zero resistor R6.

In case you patch your board, then you also have to configure this library to use pin D13 to drive the SPI clock (see macro IDB0XA1_D13_PATCH in file x_nucleo_idb0xa1_targets.h).

If you use pin D13 for the SPI clock, please be aware that on STM32 Nucleo boards you may not drive the LED, otherwise you will get a conflict: the LED on STM32 Nucleo boards is connected to pin D13.

Referring to the current list of tested platforms (see X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 pages), the patch is required by ST-Nucleo-F103RB; ST-Nucleo-F302R8; ST-Nucleo-F411RE; and ST-Nucleo-F446RE.

Committer:
Vincent Coubard
Date:
Thu Sep 15 10:51:38 2016 +0100
Branch:
sync_with_github
Revision:
275:cb9a052c769b
Parent:
265:46333d70cf81
Child:
276:a20f4cad1d61
Sync with 4f8db2b28527e45a5d1505c0ca5711af74175909

2016-07-20 10:19:58+02:00: Andrea Palmieri
Update Address type

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 130:770ce14d3d15 1 /* mbed Microcontroller Library
Wolfgang Betz 130:770ce14d3d15 2 * Copyright (c) 2006-2013 ARM Limited
Wolfgang Betz 130:770ce14d3d15 3 *
Wolfgang Betz 130:770ce14d3d15 4 * Licensed under the Apache License, Version 2.0 (the "License");
Wolfgang Betz 130:770ce14d3d15 5 * you may not use this file except in compliance with the License.
Wolfgang Betz 130:770ce14d3d15 6 * You may obtain a copy of the License at
Wolfgang Betz 130:770ce14d3d15 7 *
Wolfgang Betz 130:770ce14d3d15 8 * http://www.apache.org/licenses/LICENSE-2.0
Wolfgang Betz 130:770ce14d3d15 9 *
Wolfgang Betz 130:770ce14d3d15 10 * Unless required by applicable law or agreed to in writing, software
Wolfgang Betz 130:770ce14d3d15 11 * distributed under the License is distributed on an "AS IS" BASIS,
Wolfgang Betz 130:770ce14d3d15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Wolfgang Betz 130:770ce14d3d15 13 * See the License for the specific language governing permissions and
Wolfgang Betz 130:770ce14d3d15 14 * limitations under the License.
Wolfgang Betz 130:770ce14d3d15 15 */
Wolfgang Betz 130:770ce14d3d15 16
Wolfgang Betz 130:770ce14d3d15 17 /**
Wolfgang Betz 130:770ce14d3d15 18 ******************************************************************************
Wolfgang Betz 130:770ce14d3d15 19 * @file BlueNRGGap.h
Wolfgang Betz 130:770ce14d3d15 20 * @author STMicroelectronics
Wolfgang Betz 130:770ce14d3d15 21 * @brief Header file for BlueNRG BLE_API Gap Class
Wolfgang Betz 130:770ce14d3d15 22 ******************************************************************************
Wolfgang Betz 130:770ce14d3d15 23 * @copy
Wolfgang Betz 130:770ce14d3d15 24 *
Wolfgang Betz 130:770ce14d3d15 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 130:770ce14d3d15 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Wolfgang Betz 130:770ce14d3d15 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Wolfgang Betz 130:770ce14d3d15 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Wolfgang Betz 130:770ce14d3d15 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Wolfgang Betz 130:770ce14d3d15 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 130:770ce14d3d15 31 *
Wolfgang Betz 130:770ce14d3d15 32 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
Wolfgang Betz 130:770ce14d3d15 33 */
Wolfgang Betz 130:770ce14d3d15 34
Wolfgang Betz 130:770ce14d3d15 35 #ifndef __BLUENRG_GAP_H__
Wolfgang Betz 130:770ce14d3d15 36 #define __BLUENRG_GAP_H__
Wolfgang Betz 130:770ce14d3d15 37
Vincent Coubard 253:9665a6f8bbdb 38 #include "mbed-drivers/mbed.h"
Wolfgang Betz 131:e09947216ccb 39 #include "ble/blecommon.h"
Wolfgang Betz 130:770ce14d3d15 40 #include "btle.h"
Wolfgang Betz 131:e09947216ccb 41 #include "ble/GapAdvertisingParams.h"
Wolfgang Betz 131:e09947216ccb 42 #include "ble/GapAdvertisingData.h"
Wolfgang Betz 132:51056160fa4a 43 #include "ble/Gap.h"
Wolfgang Betz 130:770ce14d3d15 44
Wolfgang Betz 130:770ce14d3d15 45 #define BLE_CONN_HANDLE_INVALID 0x0
Wolfgang Betz 130:770ce14d3d15 46 #define BDADDR_SIZE 6
Wolfgang Betz 130:770ce14d3d15 47
Andrea Palmieri 224:d8669b6b3175 48 #define BLUENRG_GAP_ADV_INTERVAL_MIN (0x0020)
Andrea Palmieri 229:9981f62cdb1a 49 #define BLUENRG_GAP_ADV_INTERVAL_MAX (0x4000)
Andrea Palmieri 229:9981f62cdb1a 50 #define BLUENRG_GAP_ADV_NONCON_INTERVAL_MIN (0x00A0)
Wolfgang Betz 130:770ce14d3d15 51
Wolfgang Betz 132:51056160fa4a 52 // Scanning and Connection Params used by Central for creating connection
Andrea Palmieri 217:23870c55b07e 53 #define GAP_OBSERVATION_PROC (0x80)
Wolfgang Betz 132:51056160fa4a 54
Andrea Palmieri 220:e02936f0d4c7 55 #define SCAN_P (0x0010)
Andrea Palmieri 220:e02936f0d4c7 56 #define SCAN_L (0x0010)
Andrea Palmieri 220:e02936f0d4c7 57 #define SUPERV_TIMEOUT (0xC80)
Wolfgang Betz 132:51056160fa4a 58 #define CONN_P(x) ((int)((x)/1.25f))
Wolfgang Betz 132:51056160fa4a 59 #define CONN_L(x) ((int)((x)/0.625f))
Andrea Palmieri 220:e02936f0d4c7 60 #define CONN_P1 ((int)(_advParams.getInterval()+5)/1.25f)//(0x4C)//(0x6C)
Andrea Palmieri 220:e02936f0d4c7 61 #define CONN_P2 ((int)(_advParams.getInterval()+5)/1.25f)//(0x4C)//(0x6C)
Andrea Palmieri 229:9981f62cdb1a 62 #define CONN_L1 (0x0008)
Andrea Palmieri 229:9981f62cdb1a 63 #define CONN_L2 (0x0008)
Andrea Palmieri 229:9981f62cdb1a 64 #define GUARD_INT 5 //msec
Andrea Palmieri 234:3f6bba52b307 65 #define MIN_INT_CONN 0x0006 //=>7.5msec
Andrea Palmieri 234:3f6bba52b307 66 #define MAX_INT_CONN 0x0C80 //=>4000msec
Andrea Palmieri 234:3f6bba52b307 67 #define DEF_INT_CONN 0x0140 //=>400msec (default value for connection interval)
Andrea Palmieri 189:30fa96fa8ec4 68
Andrea Palmieri 222:37a7e289ee3d 69 #define LOCAL_NAME_MAX_SIZE 9 //8 + 1(AD_DATA_TYPE)
Andrea Palmieri 222:37a7e289ee3d 70 #define UUID_BUFFER_SIZE 17 //Either 8*2(16-bit UUIDs) or 4*4(32-bit UUIDs) or 1*16(128-bit UUIDs) +1(AD_DATA_TYPE)
Wolfgang Betz 130:770ce14d3d15 71 #define ADV_DATA_MAX_SIZE 31
Wolfgang Betz 130:770ce14d3d15 72
Wolfgang Betz 130:770ce14d3d15 73 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 74 /*!
Wolfgang Betz 130:770ce14d3d15 75 \brief
Wolfgang Betz 130:770ce14d3d15 76
Wolfgang Betz 130:770ce14d3d15 77 */
Wolfgang Betz 130:770ce14d3d15 78 /**************************************************************************/
Wolfgang Betz 130:770ce14d3d15 79 class BlueNRGGap : public Gap
Wolfgang Betz 130:770ce14d3d15 80 {
Wolfgang Betz 130:770ce14d3d15 81 public:
Wolfgang Betz 130:770ce14d3d15 82 static BlueNRGGap &getInstance() {
Wolfgang Betz 130:770ce14d3d15 83 static BlueNRGGap m_instance;
Wolfgang Betz 130:770ce14d3d15 84 return m_instance;
Wolfgang Betz 130:770ce14d3d15 85 }
Wolfgang Betz 130:770ce14d3d15 86
Wolfgang Betz 132:51056160fa4a 87 enum Reason_t {
Wolfgang Betz 132:51056160fa4a 88 DEVICE_FOUND,
Wolfgang Betz 132:51056160fa4a 89 DISCOVERY_COMPLETE
Wolfgang Betz 132:51056160fa4a 90 };
Wolfgang Betz 130:770ce14d3d15 91
Wolfgang Betz 130:770ce14d3d15 92 /* Functions that must be implemented from Gap */
Vincent Coubard 275:cb9a052c769b 93 virtual ble_error_t setAddress(addr_type_t type, const BLEProtocol::AddressBytes_t address);
Vincent Coubard 265:46333d70cf81 94 virtual ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address);
Wolfgang Betz 130:770ce14d3d15 95 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &);
Wolfgang Betz 130:770ce14d3d15 96 virtual ble_error_t startAdvertising(const GapAdvertisingParams &);
Wolfgang Betz 130:770ce14d3d15 97 virtual ble_error_t stopAdvertising(void);
Wolfgang Betz 130:770ce14d3d15 98 virtual ble_error_t stopScan();
Andrea Palmieri 224:d8669b6b3175 99 virtual uint16_t getMinAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_INTERVAL_MIN);}
Andrea Palmieri 224:d8669b6b3175 100 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_NONCON_INTERVAL_MIN);}
Andrea Palmieri 224:d8669b6b3175 101 virtual uint16_t getMaxAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_INTERVAL_MAX);}
Wolfgang Betz 130:770ce14d3d15 102 virtual ble_error_t disconnect(DisconnectionReason_t reason);
Wolfgang Betz 130:770ce14d3d15 103 virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason);
Wolfgang Betz 130:770ce14d3d15 104 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params);
Wolfgang Betz 130:770ce14d3d15 105 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params);
Wolfgang Betz 130:770ce14d3d15 106 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params);
Wolfgang Betz 130:770ce14d3d15 107
Wolfgang Betz 130:770ce14d3d15 108 virtual ble_error_t setDeviceName(const uint8_t *deviceName);
Wolfgang Betz 130:770ce14d3d15 109 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP);
Wolfgang Betz 130:770ce14d3d15 110 virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance);
Wolfgang Betz 130:770ce14d3d15 111 virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP);
Andrea Palmieri 229:9981f62cdb1a 112
Andrea Palmieri 229:9981f62cdb1a 113 virtual ble_error_t setScanningPolicyMode(ScanningPolicyMode_t mode);
Andrea Palmieri 229:9981f62cdb1a 114 virtual ble_error_t setAdvertisingPolicyMode(AdvertisingPolicyMode_t mode);
Andrea Palmieri 229:9981f62cdb1a 115 virtual AdvertisingPolicyMode_t getAdvertisingPolicyMode(void) const;
Andrea Palmieri 229:9981f62cdb1a 116 virtual ScanningPolicyMode_t getScanningPolicyMode(void) const;
Andrea Palmieri 229:9981f62cdb1a 117
Wolfgang Betz 130:770ce14d3d15 118 virtual ble_error_t setTxPower(int8_t txPower);
Wolfgang Betz 130:770ce14d3d15 119 virtual void getPermittedTxPowerValues(const int8_t **, size_t *);
Andrea Palmieri 229:9981f62cdb1a 120
Wolfgang Betz 132:51056160fa4a 121 virtual ble_error_t connect(const Address_t peerAddr,
Wolfgang Betz 132:51056160fa4a 122 Gap::AddressType_t peerAddrType,
Wolfgang Betz 132:51056160fa4a 123 const ConnectionParams_t *connectionParams,
Wolfgang Betz 132:51056160fa4a 124 const GapScanningParams *scanParams);
Andrea Palmieri 229:9981f62cdb1a 125
Andrea Palmieri 229:9981f62cdb1a 126 virtual ble_error_t reset(void);
Wolfgang Betz 130:770ce14d3d15 127
Wolfgang Betz 132:51056160fa4a 128 void Discovery_CB(Reason_t reason,
Wolfgang Betz 132:51056160fa4a 129 uint8_t adv_type,
Andrea Palmieri 229:9981f62cdb1a 130 uint8_t addr_type,
Wolfgang Betz 132:51056160fa4a 131 uint8_t *addr,
Wolfgang Betz 132:51056160fa4a 132 uint8_t *data_length,
Wolfgang Betz 132:51056160fa4a 133 uint8_t *data,
Wolfgang Betz 132:51056160fa4a 134 uint8_t *RSSI);
Wolfgang Betz 165:3576598c0889 135 ble_error_t createConnection(void);
Wolfgang Betz 165:3576598c0889 136
Wolfgang Betz 130:770ce14d3d15 137 void setConnectionHandle(uint16_t con_handle);
Wolfgang Betz 130:770ce14d3d15 138 uint16_t getConnectionHandle(void);
Wolfgang Betz 130:770ce14d3d15 139
Wolfgang Betz 130:770ce14d3d15 140 bool getIsSetAddress();
Wolfgang Betz 130:770ce14d3d15 141
Wolfgang Betz 130:770ce14d3d15 142 Timeout getAdvTimeout(void) const {
Wolfgang Betz 130:770ce14d3d15 143 return advTimeout;
Wolfgang Betz 130:770ce14d3d15 144 }
Wolfgang Betz 130:770ce14d3d15 145 uint8_t getAdvToFlag(void) {
Wolfgang Betz 130:770ce14d3d15 146 return AdvToFlag;
Wolfgang Betz 130:770ce14d3d15 147 }
Wolfgang Betz 130:770ce14d3d15 148 void setAdvToFlag(void);
Wolfgang Betz 130:770ce14d3d15 149
Wolfgang Betz 130:770ce14d3d15 150 void Process(void);
Wolfgang Betz 130:770ce14d3d15 151
Andrea Palmieri 160:174387d53809 152 GapScanningParams* getScanningParams(void);
Andrea Palmieri 160:174387d53809 153
Wolfgang Betz 130:770ce14d3d15 154 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams);
Wolfgang Betz 130:770ce14d3d15 155
Wolfgang Betz 130:770ce14d3d15 156 private:
Wolfgang Betz 130:770ce14d3d15 157 uint16_t m_connectionHandle;
Wolfgang Betz 132:51056160fa4a 158 AddressType_t addr_type;
Wolfgang Betz 132:51056160fa4a 159 Address_t _peerAddr;
Andrea Palmieri 229:9981f62cdb1a 160 AddressType_t _peerAddrType;
Wolfgang Betz 130:770ce14d3d15 161 uint8_t bdaddr[BDADDR_SIZE];
Wolfgang Betz 132:51056160fa4a 162 bool _scanning;
Wolfgang Betz 132:51056160fa4a 163 bool _connecting;
Wolfgang Betz 130:770ce14d3d15 164 bool isSetAddress;
Wolfgang Betz 130:770ce14d3d15 165 uint8_t deviceAppearance[2];
Wolfgang Betz 130:770ce14d3d15 166
Wolfgang Betz 130:770ce14d3d15 167 uint8_t local_name_length;
Andrea Palmieri 251:86df2c289e7c 168 uint8_t local_name[ADV_DATA_MAX_SIZE];//LOCAL_NAME_MAX_SIZE];
Wolfgang Betz 130:770ce14d3d15 169
Wolfgang Betz 130:770ce14d3d15 170 uint8_t servUuidlength;
Wolfgang Betz 130:770ce14d3d15 171 uint8_t servUuidData[UUID_BUFFER_SIZE];
Wolfgang Betz 130:770ce14d3d15 172
Wolfgang Betz 130:770ce14d3d15 173 uint8_t AdvLen;
Wolfgang Betz 130:770ce14d3d15 174 uint8_t AdvData[ADV_DATA_MAX_SIZE];
Andrea Palmieri 251:86df2c289e7c 175
Andrea Palmieri 251:86df2c289e7c 176 uint8_t txPowLevSet;
Wolfgang Betz 130:770ce14d3d15 177
Wolfgang Betz 130:770ce14d3d15 178 Timeout advTimeout;
Wolfgang Betz 130:770ce14d3d15 179 bool AdvToFlag;
Wolfgang Betz 130:770ce14d3d15 180
Andrea Palmieri 236:2a73f3a97452 181 const uint8_t *scan_response_payload;
Andrea Palmieri 236:2a73f3a97452 182 uint8_t scan_rsp_length;
Andrea Palmieri 236:2a73f3a97452 183
Andrea Palmieri 229:9981f62cdb1a 184 static uint16_t SCAN_DURATION_UNITS_TO_MSEC(uint16_t duration) {
Andrea Palmieri 229:9981f62cdb1a 185 return (duration * 625) / 1000;
Andrea Palmieri 229:9981f62cdb1a 186 }
Andrea Palmieri 229:9981f62cdb1a 187
Andrea Palmieri 229:9981f62cdb1a 188 uint16_t scanInterval;
Andrea Palmieri 229:9981f62cdb1a 189 uint16_t scanWindow;
Andrea Palmieri 232:aead10288880 190 uint16_t advInterval;
Andrea Palmieri 251:86df2c289e7c 191 uint16_t slaveConnIntervMin;
Andrea Palmieri 251:86df2c289e7c 192 uint16_t slaveConnIntervMax;
Andrea Palmieri 229:9981f62cdb1a 193 uint16_t conn_min_interval;
Andrea Palmieri 229:9981f62cdb1a 194 uint16_t conn_max_interval;
Andrea Palmieri 232:aead10288880 195 void setAdvParameters(void);
Andrea Palmieri 229:9981f62cdb1a 196 void setConnectionParameters(void);
Andrea Palmieri 229:9981f62cdb1a 197
Andrea Palmieri 229:9981f62cdb1a 198 Gap::AdvertisingPolicyMode_t advertisingPolicyMode;
Andrea Palmieri 229:9981f62cdb1a 199 Gap::ScanningPolicyMode_t scanningPolicyMode;
Andrea Palmieri 229:9981f62cdb1a 200
Andrea Palmieri 229:9981f62cdb1a 201 Whitelist_t whitelistAddresses;
Andrea Palmieri 229:9981f62cdb1a 202
Andrea Palmieri 238:b6454c839f42 203 ble_error_t updateAdvertisingData(void);
Andrea Palmieri 238:b6454c839f42 204
Andrea Palmieri 251:86df2c289e7c 205 BlueNRGGap(): txPowLevSet(0) {
Wolfgang Betz 130:770ce14d3d15 206 m_connectionHandle = BLE_CONN_HANDLE_INVALID;
Andrea Palmieri 228:25368f053411 207 addr_type = BLEProtocol::AddressType::RANDOM_STATIC;
Andrea Palmieri 229:9981f62cdb1a 208
Andrea Palmieri 229:9981f62cdb1a 209 /* Set the whitelist policy filter modes to IGNORE_WHITELIST */
Andrea Palmieri 229:9981f62cdb1a 210 advertisingPolicyMode = Gap::ADV_POLICY_IGNORE_WHITELIST;
Andrea Palmieri 230:6eb53072d82b 211 scanningPolicyMode = Gap::SCAN_POLICY_IGNORE_WHITELIST;
Andrea Palmieri 229:9981f62cdb1a 212
Wolfgang Betz 130:770ce14d3d15 213 isSetAddress = false;
Andrea Palmieri 228:25368f053411 214 memset(deviceAppearance, 0, sizeof(deviceAppearance));
Wolfgang Betz 130:770ce14d3d15 215 }
Wolfgang Betz 130:770ce14d3d15 216
Wolfgang Betz 130:770ce14d3d15 217 BlueNRGGap(BlueNRGGap const &);
Wolfgang Betz 130:770ce14d3d15 218 void operator=(BlueNRGGap const &);
Wolfgang Betz 130:770ce14d3d15 219 };
Wolfgang Betz 130:770ce14d3d15 220
Vincent Coubard 265:46333d70cf81 221 #endif // ifndef __BLUENRG_GAP_H__