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.
Fork of X_NUCLEO_IDB0XA1 by
x-nucleo-idb0xa1/BlueNRGGap.h@276:a20f4cad1d61, 2016-09-15 (annotated)
- Committer:
- Vincent Coubard
- Date:
- Thu Sep 15 10:51:40 2016 +0100
- Branch:
- sync_with_github
- Revision:
- 276:a20f4cad1d61
- Parent:
- 275:cb9a052c769b
- Parent:
- 272:4639da7705e1
- Child:
- 278:a5209d8cfd61
Sync with e6d00ca1d1860d23ec86287a3d7ff17abad1cb06
Merge 83c30f290087a6f5a503812f507492e725a3b717 into 4f8db2b28527e45a5d1505c0ca5711af74175909
2016-07-20 10:24:40+02:00: Andrea Palmieri
Merge branch 'workshop-july'
Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>
Who changed what in which revision?
User | Revision | Line number | New 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 | ****************************************************************************** |
Vincent Coubard |
255:97adb68decd4 | 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>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
Vincent Coubard |
255:97adb68decd4 | 33 | */ |
Vincent Coubard |
255:97adb68decd4 | 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 | |
Wolfgang Betz |
130:770ce14d3d15 | 69 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 70 | /*! |
Wolfgang Betz |
130:770ce14d3d15 | 71 | \brief |
Wolfgang Betz |
130:770ce14d3d15 | 72 | |
Wolfgang Betz |
130:770ce14d3d15 | 73 | */ |
Wolfgang Betz |
130:770ce14d3d15 | 74 | /**************************************************************************/ |
Wolfgang Betz |
130:770ce14d3d15 | 75 | class BlueNRGGap : public Gap |
Wolfgang Betz |
130:770ce14d3d15 | 76 | { |
Wolfgang Betz |
130:770ce14d3d15 | 77 | public: |
Wolfgang Betz |
130:770ce14d3d15 | 78 | static BlueNRGGap &getInstance() { |
Wolfgang Betz |
130:770ce14d3d15 | 79 | static BlueNRGGap m_instance; |
Wolfgang Betz |
130:770ce14d3d15 | 80 | return m_instance; |
Wolfgang Betz |
130:770ce14d3d15 | 81 | } |
Wolfgang Betz |
130:770ce14d3d15 | 82 | |
Wolfgang Betz |
132:51056160fa4a | 83 | enum Reason_t { |
Wolfgang Betz |
132:51056160fa4a | 84 | DEVICE_FOUND, |
Wolfgang Betz |
132:51056160fa4a | 85 | DISCOVERY_COMPLETE |
Wolfgang Betz |
132:51056160fa4a | 86 | }; |
Vincent Coubard |
255:97adb68decd4 | 87 | |
Wolfgang Betz |
130:770ce14d3d15 | 88 | /* Functions that must be implemented from Gap */ |
Vincent Coubard |
275:cb9a052c769b | 89 | virtual ble_error_t setAddress(addr_type_t type, const BLEProtocol::AddressBytes_t address); |
Vincent Coubard |
265:46333d70cf81 | 90 | virtual ble_error_t getAddress(BLEProtocol::AddressType_t *typeP, BLEProtocol::AddressBytes_t address); |
Wolfgang Betz |
130:770ce14d3d15 | 91 | virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &); |
Wolfgang Betz |
130:770ce14d3d15 | 92 | virtual ble_error_t startAdvertising(const GapAdvertisingParams &); |
Wolfgang Betz |
130:770ce14d3d15 | 93 | virtual ble_error_t stopAdvertising(void); |
Wolfgang Betz |
130:770ce14d3d15 | 94 | virtual ble_error_t stopScan(); |
Andrea Palmieri |
224:d8669b6b3175 | 95 | virtual uint16_t getMinAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_INTERVAL_MIN);} |
Andrea Palmieri |
224:d8669b6b3175 | 96 | virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_NONCON_INTERVAL_MIN);} |
Andrea Palmieri |
224:d8669b6b3175 | 97 | virtual uint16_t getMaxAdvertisingInterval(void) const {return GapAdvertisingParams::ADVERTISEMENT_DURATION_UNITS_TO_MS(BLUENRG_GAP_ADV_INTERVAL_MAX);} |
Wolfgang Betz |
130:770ce14d3d15 | 98 | virtual ble_error_t disconnect(DisconnectionReason_t reason); |
Wolfgang Betz |
130:770ce14d3d15 | 99 | virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason); |
Wolfgang Betz |
130:770ce14d3d15 | 100 | virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params); |
Wolfgang Betz |
130:770ce14d3d15 | 101 | virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params); |
Wolfgang Betz |
130:770ce14d3d15 | 102 | virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params); |
Wolfgang Betz |
130:770ce14d3d15 | 103 | |
Wolfgang Betz |
130:770ce14d3d15 | 104 | virtual ble_error_t setDeviceName(const uint8_t *deviceName); |
Wolfgang Betz |
130:770ce14d3d15 | 105 | virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP); |
Wolfgang Betz |
130:770ce14d3d15 | 106 | virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance); |
Wolfgang Betz |
130:770ce14d3d15 | 107 | virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP); |
Andrea Palmieri |
229:9981f62cdb1a | 108 | |
Andrea Palmieri |
229:9981f62cdb1a | 109 | virtual ble_error_t setScanningPolicyMode(ScanningPolicyMode_t mode); |
Andrea Palmieri |
229:9981f62cdb1a | 110 | virtual ble_error_t setAdvertisingPolicyMode(AdvertisingPolicyMode_t mode); |
Andrea Palmieri |
229:9981f62cdb1a | 111 | virtual AdvertisingPolicyMode_t getAdvertisingPolicyMode(void) const; |
Andrea Palmieri |
229:9981f62cdb1a | 112 | virtual ScanningPolicyMode_t getScanningPolicyMode(void) const; |
Andrea Palmieri |
229:9981f62cdb1a | 113 | |
Wolfgang Betz |
130:770ce14d3d15 | 114 | virtual ble_error_t setTxPower(int8_t txPower); |
Wolfgang Betz |
130:770ce14d3d15 | 115 | virtual void getPermittedTxPowerValues(const int8_t **, size_t *); |
Andrea Palmieri |
229:9981f62cdb1a | 116 | |
Wolfgang Betz |
132:51056160fa4a | 117 | virtual ble_error_t connect(const Address_t peerAddr, |
Wolfgang Betz |
132:51056160fa4a | 118 | Gap::AddressType_t peerAddrType, |
Wolfgang Betz |
132:51056160fa4a | 119 | const ConnectionParams_t *connectionParams, |
Wolfgang Betz |
132:51056160fa4a | 120 | const GapScanningParams *scanParams); |
Andrea Palmieri |
229:9981f62cdb1a | 121 | |
Andrea Palmieri |
229:9981f62cdb1a | 122 | virtual ble_error_t reset(void); |
Wolfgang Betz |
130:770ce14d3d15 | 123 | |
Wolfgang Betz |
132:51056160fa4a | 124 | void Discovery_CB(Reason_t reason, |
Wolfgang Betz |
132:51056160fa4a | 125 | uint8_t adv_type, |
Andrea Palmieri |
229:9981f62cdb1a | 126 | uint8_t addr_type, |
Wolfgang Betz |
132:51056160fa4a | 127 | uint8_t *addr, |
Wolfgang Betz |
132:51056160fa4a | 128 | uint8_t *data_length, |
Wolfgang Betz |
132:51056160fa4a | 129 | uint8_t *data, |
Wolfgang Betz |
132:51056160fa4a | 130 | uint8_t *RSSI); |
Wolfgang Betz |
165:3576598c0889 | 131 | ble_error_t createConnection(void); |
Wolfgang Betz |
165:3576598c0889 | 132 | |
Wolfgang Betz |
130:770ce14d3d15 | 133 | void setConnectionHandle(uint16_t con_handle); |
Wolfgang Betz |
130:770ce14d3d15 | 134 | uint16_t getConnectionHandle(void); |
Vincent Coubard |
255:97adb68decd4 | 135 | |
Wolfgang Betz |
130:770ce14d3d15 | 136 | bool getIsSetAddress(); |
Vincent Coubard |
255:97adb68decd4 | 137 | |
Wolfgang Betz |
130:770ce14d3d15 | 138 | Timeout getAdvTimeout(void) const { |
Wolfgang Betz |
130:770ce14d3d15 | 139 | return advTimeout; |
Wolfgang Betz |
130:770ce14d3d15 | 140 | } |
Wolfgang Betz |
130:770ce14d3d15 | 141 | uint8_t getAdvToFlag(void) { |
Wolfgang Betz |
130:770ce14d3d15 | 142 | return AdvToFlag; |
Wolfgang Betz |
130:770ce14d3d15 | 143 | } |
Wolfgang Betz |
130:770ce14d3d15 | 144 | void setAdvToFlag(void); |
Vincent Coubard |
255:97adb68decd4 | 145 | |
Wolfgang Betz |
130:770ce14d3d15 | 146 | void Process(void); |
Wolfgang Betz |
130:770ce14d3d15 | 147 | |
Andrea Palmieri |
160:174387d53809 | 148 | GapScanningParams* getScanningParams(void); |
Andrea Palmieri |
160:174387d53809 | 149 | |
Wolfgang Betz |
130:770ce14d3d15 | 150 | virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams); |
Wolfgang Betz |
130:770ce14d3d15 | 151 | |
Vincent Coubard |
256:146bb175ce80 | 152 | void setConnectionInterval(uint16_t interval); |
Vincent Coubard |
272:4639da7705e1 | 153 | void setGapRole(Role_t role); |
Vincent Coubard |
256:146bb175ce80 | 154 | |
Wolfgang Betz |
130:770ce14d3d15 | 155 | private: |
Wolfgang Betz |
130:770ce14d3d15 | 156 | uint16_t m_connectionHandle; |
Vincent Coubard |
272:4639da7705e1 | 157 | Role_t gapRole; |
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 | Timeout advTimeout; |
Wolfgang Betz |
130:770ce14d3d15 | 168 | bool AdvToFlag; |
Wolfgang Betz |
130:770ce14d3d15 | 169 | |
Andrea Palmieri |
229:9981f62cdb1a | 170 | static uint16_t SCAN_DURATION_UNITS_TO_MSEC(uint16_t duration) { |
Andrea Palmieri |
229:9981f62cdb1a | 171 | return (duration * 625) / 1000; |
Andrea Palmieri |
229:9981f62cdb1a | 172 | } |
Andrea Palmieri |
229:9981f62cdb1a | 173 | |
Andrea Palmieri |
229:9981f62cdb1a | 174 | uint16_t scanInterval; |
Andrea Palmieri |
229:9981f62cdb1a | 175 | uint16_t scanWindow; |
Andrea Palmieri |
232:aead10288880 | 176 | uint16_t advInterval; |
Andrea Palmieri |
251:86df2c289e7c | 177 | uint16_t slaveConnIntervMin; |
Andrea Palmieri |
251:86df2c289e7c | 178 | uint16_t slaveConnIntervMax; |
Andrea Palmieri |
229:9981f62cdb1a | 179 | uint16_t conn_min_interval; |
Andrea Palmieri |
229:9981f62cdb1a | 180 | uint16_t conn_max_interval; |
Andrea Palmieri |
232:aead10288880 | 181 | void setAdvParameters(void); |
Andrea Palmieri |
229:9981f62cdb1a | 182 | void setConnectionParameters(void); |
Andrea Palmieri |
229:9981f62cdb1a | 183 | |
Andrea Palmieri |
229:9981f62cdb1a | 184 | Gap::AdvertisingPolicyMode_t advertisingPolicyMode; |
Andrea Palmieri |
229:9981f62cdb1a | 185 | Gap::ScanningPolicyMode_t scanningPolicyMode; |
Andrea Palmieri |
229:9981f62cdb1a | 186 | |
Andrea Palmieri |
229:9981f62cdb1a | 187 | Whitelist_t whitelistAddresses; |
Andrea Palmieri |
229:9981f62cdb1a | 188 | |
Andrea Palmieri |
238:b6454c839f42 | 189 | ble_error_t updateAdvertisingData(void); |
Andrea Palmieri |
238:b6454c839f42 | 190 | |
Vincent Coubard |
270:ca649990a830 | 191 | BlueNRGGap() { |
Wolfgang Betz |
130:770ce14d3d15 | 192 | m_connectionHandle = BLE_CONN_HANDLE_INVALID; |
Andrea Palmieri |
228:25368f053411 | 193 | addr_type = BLEProtocol::AddressType::RANDOM_STATIC; |
Andrea Palmieri |
229:9981f62cdb1a | 194 | |
Andrea Palmieri |
229:9981f62cdb1a | 195 | /* Set the whitelist policy filter modes to IGNORE_WHITELIST */ |
Andrea Palmieri |
229:9981f62cdb1a | 196 | advertisingPolicyMode = Gap::ADV_POLICY_IGNORE_WHITELIST; |
Andrea Palmieri |
230:6eb53072d82b | 197 | scanningPolicyMode = Gap::SCAN_POLICY_IGNORE_WHITELIST; |
Andrea Palmieri |
229:9981f62cdb1a | 198 | |
Wolfgang Betz |
130:770ce14d3d15 | 199 | isSetAddress = false; |
Andrea Palmieri |
228:25368f053411 | 200 | memset(deviceAppearance, 0, sizeof(deviceAppearance)); |
Wolfgang Betz |
130:770ce14d3d15 | 201 | } |
Wolfgang Betz |
130:770ce14d3d15 | 202 | |
Wolfgang Betz |
130:770ce14d3d15 | 203 | BlueNRGGap(BlueNRGGap const &); |
Wolfgang Betz |
130:770ce14d3d15 | 204 | void operator=(BlueNRGGap const &); |
Vincent Coubard |
255:97adb68decd4 | 205 | |
Vincent Coubard |
255:97adb68decd4 | 206 | GapAdvertisingData _advData; |
Vincent Coubard |
270:ca649990a830 | 207 | GapAdvertisingData _scanResponse; |
Wolfgang Betz |
130:770ce14d3d15 | 208 | }; |
Wolfgang Betz |
130:770ce14d3d15 | 209 | |
Vincent Coubard |
255:97adb68decd4 | 210 | #endif // ifndef __BLUENRG_GAP_H__ |