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.
mbed-os/features/FEATURE_BLE/source/Gap.cpp@0:8fdf9a60065b, 2018-10-10 (annotated)
- Committer:
- kadonotakashi
- Date:
- Wed Oct 10 00:33:53 2018 +0000
- Revision:
- 0:8fdf9a60065b
how to make mbed librry
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kadonotakashi | 0:8fdf9a60065b | 1 | /* mbed Microcontroller Library |
kadonotakashi | 0:8fdf9a60065b | 2 | * Copyright (c) 2018 ARM Limited |
kadonotakashi | 0:8fdf9a60065b | 3 | * |
kadonotakashi | 0:8fdf9a60065b | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
kadonotakashi | 0:8fdf9a60065b | 5 | * you may not use this file except in compliance with the License. |
kadonotakashi | 0:8fdf9a60065b | 6 | * You may obtain a copy of the License at |
kadonotakashi | 0:8fdf9a60065b | 7 | * |
kadonotakashi | 0:8fdf9a60065b | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
kadonotakashi | 0:8fdf9a60065b | 9 | * |
kadonotakashi | 0:8fdf9a60065b | 10 | * Unless required by applicable law or agreed to in writing, software |
kadonotakashi | 0:8fdf9a60065b | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
kadonotakashi | 0:8fdf9a60065b | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
kadonotakashi | 0:8fdf9a60065b | 13 | * See the License for the specific language governing permissions and |
kadonotakashi | 0:8fdf9a60065b | 14 | * limitations under the License. |
kadonotakashi | 0:8fdf9a60065b | 15 | */ |
kadonotakashi | 0:8fdf9a60065b | 16 | |
kadonotakashi | 0:8fdf9a60065b | 17 | #include "ble/Gap.h" |
kadonotakashi | 0:8fdf9a60065b | 18 | |
kadonotakashi | 0:8fdf9a60065b | 19 | namespace { |
kadonotakashi | 0:8fdf9a60065b | 20 | |
kadonotakashi | 0:8fdf9a60065b | 21 | ble_error_t convert_address_type( |
kadonotakashi | 0:8fdf9a60065b | 22 | Gap::PeerAddressType_t input_type, |
kadonotakashi | 0:8fdf9a60065b | 23 | const BLEProtocol::AddressBytes_t address, |
kadonotakashi | 0:8fdf9a60065b | 24 | BLEProtocol::AddressType_t& output_type |
kadonotakashi | 0:8fdf9a60065b | 25 | ) { |
kadonotakashi | 0:8fdf9a60065b | 26 | typedef Gap::RandomAddressType_t RandomAddressType_t; |
kadonotakashi | 0:8fdf9a60065b | 27 | typedef Gap::PeerAddressType_t PeerAddressType_t; |
kadonotakashi | 0:8fdf9a60065b | 28 | typedef BLEProtocol::AddressType LegacyAddressType_t; |
kadonotakashi | 0:8fdf9a60065b | 29 | |
kadonotakashi | 0:8fdf9a60065b | 30 | // best effort; peerAddrTypeIn should not be used when privacy is on. |
kadonotakashi | 0:8fdf9a60065b | 31 | switch(input_type.value()) { |
kadonotakashi | 0:8fdf9a60065b | 32 | case PeerAddressType_t::PUBLIC: |
kadonotakashi | 0:8fdf9a60065b | 33 | case PeerAddressType_t::PUBLIC_IDENTITY: |
kadonotakashi | 0:8fdf9a60065b | 34 | output_type = LegacyAddressType_t::PUBLIC; |
kadonotakashi | 0:8fdf9a60065b | 35 | break; |
kadonotakashi | 0:8fdf9a60065b | 36 | case PeerAddressType_t::RANDOM: { |
kadonotakashi | 0:8fdf9a60065b | 37 | RandomAddressType_t random_address_type(RandomAddressType_t::STATIC); |
kadonotakashi | 0:8fdf9a60065b | 38 | ble_error_t err = Gap::getRandomAddressType(address, &random_address_type); |
kadonotakashi | 0:8fdf9a60065b | 39 | if (err) { |
kadonotakashi | 0:8fdf9a60065b | 40 | return err; |
kadonotakashi | 0:8fdf9a60065b | 41 | } |
kadonotakashi | 0:8fdf9a60065b | 42 | switch (random_address_type.value()) { |
kadonotakashi | 0:8fdf9a60065b | 43 | case RandomAddressType_t::STATIC: |
kadonotakashi | 0:8fdf9a60065b | 44 | output_type = LegacyAddressType_t::RANDOM_STATIC; |
kadonotakashi | 0:8fdf9a60065b | 45 | break; |
kadonotakashi | 0:8fdf9a60065b | 46 | case RandomAddressType_t::NON_RESOLVABLE_PRIVATE: |
kadonotakashi | 0:8fdf9a60065b | 47 | output_type = LegacyAddressType_t::RANDOM_PRIVATE_NON_RESOLVABLE; |
kadonotakashi | 0:8fdf9a60065b | 48 | break; |
kadonotakashi | 0:8fdf9a60065b | 49 | case RandomAddressType_t::RESOLVABLE_PRIVATE: |
kadonotakashi | 0:8fdf9a60065b | 50 | output_type = LegacyAddressType_t::RANDOM_PRIVATE_RESOLVABLE; |
kadonotakashi | 0:8fdf9a60065b | 51 | break; |
kadonotakashi | 0:8fdf9a60065b | 52 | } |
kadonotakashi | 0:8fdf9a60065b | 53 | break; |
kadonotakashi | 0:8fdf9a60065b | 54 | } |
kadonotakashi | 0:8fdf9a60065b | 55 | case PeerAddressType_t::RANDOM_STATIC_IDENTITY: |
kadonotakashi | 0:8fdf9a60065b | 56 | output_type = LegacyAddressType_t::RANDOM_STATIC; |
kadonotakashi | 0:8fdf9a60065b | 57 | break; |
kadonotakashi | 0:8fdf9a60065b | 58 | } |
kadonotakashi | 0:8fdf9a60065b | 59 | |
kadonotakashi | 0:8fdf9a60065b | 60 | return BLE_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 61 | } |
kadonotakashi | 0:8fdf9a60065b | 62 | |
kadonotakashi | 0:8fdf9a60065b | 63 | Gap::PeerAddressType_t convert_legacy_address_type( |
kadonotakashi | 0:8fdf9a60065b | 64 | BLEProtocol::AddressType_t legacy_address |
kadonotakashi | 0:8fdf9a60065b | 65 | ) { |
kadonotakashi | 0:8fdf9a60065b | 66 | if (legacy_address == BLEProtocol::AddressType::PUBLIC) { |
kadonotakashi | 0:8fdf9a60065b | 67 | return Gap::PeerAddressType_t::PUBLIC; |
kadonotakashi | 0:8fdf9a60065b | 68 | } else { |
kadonotakashi | 0:8fdf9a60065b | 69 | return Gap::PeerAddressType_t::RANDOM; |
kadonotakashi | 0:8fdf9a60065b | 70 | } |
kadonotakashi | 0:8fdf9a60065b | 71 | } |
kadonotakashi | 0:8fdf9a60065b | 72 | |
kadonotakashi | 0:8fdf9a60065b | 73 | } |
kadonotakashi | 0:8fdf9a60065b | 74 | |
kadonotakashi | 0:8fdf9a60065b | 75 | const Gap::PeripheralPrivacyConfiguration_t Gap::default_peripheral_privacy_configuration = { |
kadonotakashi | 0:8fdf9a60065b | 76 | /* use_non_resolvable_random_address */ false, |
kadonotakashi | 0:8fdf9a60065b | 77 | /* resolution_strategy */ PeripheralPrivacyConfiguration_t::PERFORM_PAIRING_PROCEDURE |
kadonotakashi | 0:8fdf9a60065b | 78 | }; |
kadonotakashi | 0:8fdf9a60065b | 79 | |
kadonotakashi | 0:8fdf9a60065b | 80 | const Gap::CentralPrivacyConfiguration_t Gap::default_central_privacy_configuration = { |
kadonotakashi | 0:8fdf9a60065b | 81 | /* use_non_resolvable_random_address */ false, |
kadonotakashi | 0:8fdf9a60065b | 82 | /* resolution_strategy */ CentralPrivacyConfiguration_t::RESOLVE_AND_FORWARD |
kadonotakashi | 0:8fdf9a60065b | 83 | }; |
kadonotakashi | 0:8fdf9a60065b | 84 | |
kadonotakashi | 0:8fdf9a60065b | 85 | void Gap::processConnectionEvent( |
kadonotakashi | 0:8fdf9a60065b | 86 | Handle_t handle, |
kadonotakashi | 0:8fdf9a60065b | 87 | Role_t role, |
kadonotakashi | 0:8fdf9a60065b | 88 | PeerAddressType_t peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 89 | const BLEProtocol::AddressBytes_t peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 90 | BLEProtocol::AddressType_t ownAddrType, |
kadonotakashi | 0:8fdf9a60065b | 91 | const BLEProtocol::AddressBytes_t ownAddr, |
kadonotakashi | 0:8fdf9a60065b | 92 | const ConnectionParams_t *connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 93 | const uint8_t *peerResolvableAddr, |
kadonotakashi | 0:8fdf9a60065b | 94 | const uint8_t *localResolvableAddr |
kadonotakashi | 0:8fdf9a60065b | 95 | ) { |
kadonotakashi | 0:8fdf9a60065b | 96 | /* Update Gap state */ |
kadonotakashi | 0:8fdf9a60065b | 97 | state.advertising = 0; |
kadonotakashi | 0:8fdf9a60065b | 98 | state.connected = 1; |
kadonotakashi | 0:8fdf9a60065b | 99 | ++connectionCount; |
kadonotakashi | 0:8fdf9a60065b | 100 | |
kadonotakashi | 0:8fdf9a60065b | 101 | ConnectionCallbackParams_t callbackParams( |
kadonotakashi | 0:8fdf9a60065b | 102 | handle, |
kadonotakashi | 0:8fdf9a60065b | 103 | role, |
kadonotakashi | 0:8fdf9a60065b | 104 | peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 105 | peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 106 | ownAddrType, |
kadonotakashi | 0:8fdf9a60065b | 107 | ownAddr, |
kadonotakashi | 0:8fdf9a60065b | 108 | connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 109 | peerResolvableAddr, |
kadonotakashi | 0:8fdf9a60065b | 110 | localResolvableAddr |
kadonotakashi | 0:8fdf9a60065b | 111 | ); |
kadonotakashi | 0:8fdf9a60065b | 112 | |
kadonotakashi | 0:8fdf9a60065b | 113 | connectionCallChain.call(&callbackParams); |
kadonotakashi | 0:8fdf9a60065b | 114 | } |
kadonotakashi | 0:8fdf9a60065b | 115 | |
kadonotakashi | 0:8fdf9a60065b | 116 | void Gap::processAdvertisementReport( |
kadonotakashi | 0:8fdf9a60065b | 117 | const BLEProtocol::AddressBytes_t peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 118 | int8_t rssi, |
kadonotakashi | 0:8fdf9a60065b | 119 | bool isScanResponse, |
kadonotakashi | 0:8fdf9a60065b | 120 | GapAdvertisingParams::AdvertisingType_t type, |
kadonotakashi | 0:8fdf9a60065b | 121 | uint8_t advertisingDataLen, |
kadonotakashi | 0:8fdf9a60065b | 122 | const uint8_t *advertisingData, |
kadonotakashi | 0:8fdf9a60065b | 123 | PeerAddressType_t addressType |
kadonotakashi | 0:8fdf9a60065b | 124 | ) { |
kadonotakashi | 0:8fdf9a60065b | 125 | AdvertisementCallbackParams_t params; |
kadonotakashi | 0:8fdf9a60065b | 126 | |
kadonotakashi | 0:8fdf9a60065b | 127 | memcpy(params.peerAddr, peerAddr, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 128 | params.rssi = rssi; |
kadonotakashi | 0:8fdf9a60065b | 129 | params.isScanResponse = isScanResponse; |
kadonotakashi | 0:8fdf9a60065b | 130 | params.type = type; |
kadonotakashi | 0:8fdf9a60065b | 131 | params.advertisingDataLen = advertisingDataLen; |
kadonotakashi | 0:8fdf9a60065b | 132 | params.advertisingData = advertisingData; |
kadonotakashi | 0:8fdf9a60065b | 133 | params.peerAddrType = addressType; |
kadonotakashi | 0:8fdf9a60065b | 134 | |
kadonotakashi | 0:8fdf9a60065b | 135 | convert_address_type( |
kadonotakashi | 0:8fdf9a60065b | 136 | addressType, |
kadonotakashi | 0:8fdf9a60065b | 137 | peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 138 | params.addressType |
kadonotakashi | 0:8fdf9a60065b | 139 | ); |
kadonotakashi | 0:8fdf9a60065b | 140 | |
kadonotakashi | 0:8fdf9a60065b | 141 | onAdvertisementReport.call(¶ms); |
kadonotakashi | 0:8fdf9a60065b | 142 | } |
kadonotakashi | 0:8fdf9a60065b | 143 | |
kadonotakashi | 0:8fdf9a60065b | 144 | |
kadonotakashi | 0:8fdf9a60065b | 145 | #if defined(__GNUC__) && !defined(__CC_ARM) |
kadonotakashi | 0:8fdf9a60065b | 146 | #pragma GCC diagnostic push |
kadonotakashi | 0:8fdf9a60065b | 147 | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
kadonotakashi | 0:8fdf9a60065b | 148 | #elif defined(__CC_ARM) |
kadonotakashi | 0:8fdf9a60065b | 149 | #pragma push |
kadonotakashi | 0:8fdf9a60065b | 150 | #pragma diag_suppress 1361 |
kadonotakashi | 0:8fdf9a60065b | 151 | #endif |
kadonotakashi | 0:8fdf9a60065b | 152 | |
kadonotakashi | 0:8fdf9a60065b | 153 | Gap::AdvertisementCallbackParams_t::AdvertisementCallbackParams_t() : |
kadonotakashi | 0:8fdf9a60065b | 154 | peerAddr(), |
kadonotakashi | 0:8fdf9a60065b | 155 | rssi(), |
kadonotakashi | 0:8fdf9a60065b | 156 | isScanResponse(), |
kadonotakashi | 0:8fdf9a60065b | 157 | type(), |
kadonotakashi | 0:8fdf9a60065b | 158 | advertisingDataLen(0), |
kadonotakashi | 0:8fdf9a60065b | 159 | advertisingData(NULL), |
kadonotakashi | 0:8fdf9a60065b | 160 | addressType(), |
kadonotakashi | 0:8fdf9a60065b | 161 | peerAddrType(PeerAddressType_t::PUBLIC) |
kadonotakashi | 0:8fdf9a60065b | 162 | { |
kadonotakashi | 0:8fdf9a60065b | 163 | } |
kadonotakashi | 0:8fdf9a60065b | 164 | |
kadonotakashi | 0:8fdf9a60065b | 165 | ble_error_t Gap::getRandomAddressType( |
kadonotakashi | 0:8fdf9a60065b | 166 | const BLEProtocol::AddressBytes_t address, |
kadonotakashi | 0:8fdf9a60065b | 167 | RandomAddressType_t* type |
kadonotakashi | 0:8fdf9a60065b | 168 | ) { |
kadonotakashi | 0:8fdf9a60065b | 169 | // see section Device address in Bluetooth Link Layer specification |
kadonotakashi | 0:8fdf9a60065b | 170 | // (Vol 6 - Part B) |
kadonotakashi | 0:8fdf9a60065b | 171 | switch (address[5] >> 6) { |
kadonotakashi | 0:8fdf9a60065b | 172 | case 0x03: |
kadonotakashi | 0:8fdf9a60065b | 173 | *type = RandomAddressType_t::STATIC; |
kadonotakashi | 0:8fdf9a60065b | 174 | return BLE_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 175 | case 0x00: |
kadonotakashi | 0:8fdf9a60065b | 176 | *type = RandomAddressType_t::NON_RESOLVABLE_PRIVATE; |
kadonotakashi | 0:8fdf9a60065b | 177 | return BLE_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 178 | case 0x01: |
kadonotakashi | 0:8fdf9a60065b | 179 | *type = RandomAddressType_t::RESOLVABLE_PRIVATE; |
kadonotakashi | 0:8fdf9a60065b | 180 | return BLE_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 181 | default: |
kadonotakashi | 0:8fdf9a60065b | 182 | return BLE_ERROR_INVALID_PARAM; |
kadonotakashi | 0:8fdf9a60065b | 183 | } |
kadonotakashi | 0:8fdf9a60065b | 184 | } |
kadonotakashi | 0:8fdf9a60065b | 185 | |
kadonotakashi | 0:8fdf9a60065b | 186 | Gap::ConnectionCallbackParams_t::ConnectionCallbackParams_t( |
kadonotakashi | 0:8fdf9a60065b | 187 | Handle_t handleIn, |
kadonotakashi | 0:8fdf9a60065b | 188 | Role_t roleIn, |
kadonotakashi | 0:8fdf9a60065b | 189 | BLEProtocol::AddressType_t peerAddrTypeIn, |
kadonotakashi | 0:8fdf9a60065b | 190 | const uint8_t *peerAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 191 | BLEProtocol::AddressType_t ownAddrTypeIn, |
kadonotakashi | 0:8fdf9a60065b | 192 | const uint8_t *ownAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 193 | const ConnectionParams_t *connectionParamsIn, |
kadonotakashi | 0:8fdf9a60065b | 194 | const uint8_t *peerResolvableAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 195 | const uint8_t *localResolvableAddrIn |
kadonotakashi | 0:8fdf9a60065b | 196 | ) : handle(handleIn), |
kadonotakashi | 0:8fdf9a60065b | 197 | role(roleIn), |
kadonotakashi | 0:8fdf9a60065b | 198 | peerAddrType(peerAddrTypeIn), |
kadonotakashi | 0:8fdf9a60065b | 199 | peerAddr(), |
kadonotakashi | 0:8fdf9a60065b | 200 | ownAddrType(ownAddrTypeIn), |
kadonotakashi | 0:8fdf9a60065b | 201 | ownAddr(), |
kadonotakashi | 0:8fdf9a60065b | 202 | connectionParams(connectionParamsIn), |
kadonotakashi | 0:8fdf9a60065b | 203 | peerResolvableAddr(), |
kadonotakashi | 0:8fdf9a60065b | 204 | localResolvableAddr(), |
kadonotakashi | 0:8fdf9a60065b | 205 | peerAddressType(convert_legacy_address_type(peerAddrTypeIn)) |
kadonotakashi | 0:8fdf9a60065b | 206 | { |
kadonotakashi | 0:8fdf9a60065b | 207 | constructor_helper( |
kadonotakashi | 0:8fdf9a60065b | 208 | peerAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 209 | ownAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 210 | peerResolvableAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 211 | localResolvableAddrIn |
kadonotakashi | 0:8fdf9a60065b | 212 | ); |
kadonotakashi | 0:8fdf9a60065b | 213 | } |
kadonotakashi | 0:8fdf9a60065b | 214 | |
kadonotakashi | 0:8fdf9a60065b | 215 | Gap::ConnectionCallbackParams_t::ConnectionCallbackParams_t( |
kadonotakashi | 0:8fdf9a60065b | 216 | Handle_t handleIn, |
kadonotakashi | 0:8fdf9a60065b | 217 | Role_t roleIn, |
kadonotakashi | 0:8fdf9a60065b | 218 | PeerAddressType_t peerAddrTypeIn, |
kadonotakashi | 0:8fdf9a60065b | 219 | const uint8_t *peerAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 220 | BLEProtocol::AddressType_t ownAddrTypeIn, |
kadonotakashi | 0:8fdf9a60065b | 221 | const uint8_t *ownAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 222 | const ConnectionParams_t *connectionParamsIn, |
kadonotakashi | 0:8fdf9a60065b | 223 | const uint8_t *peerResolvableAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 224 | const uint8_t *localResolvableAddrIn |
kadonotakashi | 0:8fdf9a60065b | 225 | ) : handle(handleIn), |
kadonotakashi | 0:8fdf9a60065b | 226 | role(roleIn), |
kadonotakashi | 0:8fdf9a60065b | 227 | peerAddrType(), |
kadonotakashi | 0:8fdf9a60065b | 228 | peerAddr(), |
kadonotakashi | 0:8fdf9a60065b | 229 | ownAddrType(ownAddrTypeIn), |
kadonotakashi | 0:8fdf9a60065b | 230 | ownAddr(), |
kadonotakashi | 0:8fdf9a60065b | 231 | connectionParams(connectionParamsIn), |
kadonotakashi | 0:8fdf9a60065b | 232 | peerResolvableAddr(), |
kadonotakashi | 0:8fdf9a60065b | 233 | localResolvableAddr(), |
kadonotakashi | 0:8fdf9a60065b | 234 | peerAddressType(peerAddrTypeIn) |
kadonotakashi | 0:8fdf9a60065b | 235 | { |
kadonotakashi | 0:8fdf9a60065b | 236 | constructor_helper( |
kadonotakashi | 0:8fdf9a60065b | 237 | peerAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 238 | ownAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 239 | peerResolvableAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 240 | localResolvableAddrIn |
kadonotakashi | 0:8fdf9a60065b | 241 | ); |
kadonotakashi | 0:8fdf9a60065b | 242 | |
kadonotakashi | 0:8fdf9a60065b | 243 | convert_address_type(peerAddrTypeIn, peerAddrIn, peerAddrType); |
kadonotakashi | 0:8fdf9a60065b | 244 | } |
kadonotakashi | 0:8fdf9a60065b | 245 | |
kadonotakashi | 0:8fdf9a60065b | 246 | void Gap::ConnectionCallbackParams_t::constructor_helper( |
kadonotakashi | 0:8fdf9a60065b | 247 | const uint8_t *peerAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 248 | const uint8_t *ownAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 249 | const uint8_t *peerResolvableAddrIn, |
kadonotakashi | 0:8fdf9a60065b | 250 | const uint8_t *localResolvableAddrIn |
kadonotakashi | 0:8fdf9a60065b | 251 | ) { |
kadonotakashi | 0:8fdf9a60065b | 252 | memcpy(peerAddr, peerAddrIn, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 253 | |
kadonotakashi | 0:8fdf9a60065b | 254 | if (ownAddrIn) { |
kadonotakashi | 0:8fdf9a60065b | 255 | memcpy(ownAddr, ownAddrIn, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 256 | } else { |
kadonotakashi | 0:8fdf9a60065b | 257 | memset(ownAddr, 0, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 258 | } |
kadonotakashi | 0:8fdf9a60065b | 259 | |
kadonotakashi | 0:8fdf9a60065b | 260 | if (peerResolvableAddrIn) { |
kadonotakashi | 0:8fdf9a60065b | 261 | memcpy(peerResolvableAddr, peerResolvableAddrIn, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 262 | } else { |
kadonotakashi | 0:8fdf9a60065b | 263 | memset(ownAddr, 0, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 264 | } |
kadonotakashi | 0:8fdf9a60065b | 265 | |
kadonotakashi | 0:8fdf9a60065b | 266 | if (localResolvableAddrIn) { |
kadonotakashi | 0:8fdf9a60065b | 267 | memcpy(localResolvableAddr, localResolvableAddrIn, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 268 | } else { |
kadonotakashi | 0:8fdf9a60065b | 269 | memset(ownAddr, 0, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 270 | } |
kadonotakashi | 0:8fdf9a60065b | 271 | } |
kadonotakashi | 0:8fdf9a60065b | 272 | |
kadonotakashi | 0:8fdf9a60065b | 273 | ble_error_t Gap::connect( |
kadonotakashi | 0:8fdf9a60065b | 274 | const BLEProtocol::AddressBytes_t peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 275 | DeprecatedAddressType_t peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 276 | const ConnectionParams_t *connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 277 | const GapScanningParams *scanParams |
kadonotakashi | 0:8fdf9a60065b | 278 | ) { |
kadonotakashi | 0:8fdf9a60065b | 279 | return connect( |
kadonotakashi | 0:8fdf9a60065b | 280 | peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 281 | (BLEProtocol::AddressType_t) peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 282 | connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 283 | scanParams |
kadonotakashi | 0:8fdf9a60065b | 284 | ); |
kadonotakashi | 0:8fdf9a60065b | 285 | } |
kadonotakashi | 0:8fdf9a60065b | 286 | |
kadonotakashi | 0:8fdf9a60065b | 287 | void Gap::processConnectionEvent( |
kadonotakashi | 0:8fdf9a60065b | 288 | Handle_t handle, |
kadonotakashi | 0:8fdf9a60065b | 289 | Role_t role, |
kadonotakashi | 0:8fdf9a60065b | 290 | BLEProtocol::AddressType_t peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 291 | const BLEProtocol::AddressBytes_t peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 292 | BLEProtocol::AddressType_t ownAddrType, |
kadonotakashi | 0:8fdf9a60065b | 293 | const BLEProtocol::AddressBytes_t ownAddr, |
kadonotakashi | 0:8fdf9a60065b | 294 | const ConnectionParams_t *connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 295 | const uint8_t *peerResolvableAddr, |
kadonotakashi | 0:8fdf9a60065b | 296 | const uint8_t *localResolvableAddr |
kadonotakashi | 0:8fdf9a60065b | 297 | ) { |
kadonotakashi | 0:8fdf9a60065b | 298 | /* Update Gap state */ |
kadonotakashi | 0:8fdf9a60065b | 299 | state.advertising = 0; |
kadonotakashi | 0:8fdf9a60065b | 300 | state.connected = 1; |
kadonotakashi | 0:8fdf9a60065b | 301 | ++connectionCount; |
kadonotakashi | 0:8fdf9a60065b | 302 | |
kadonotakashi | 0:8fdf9a60065b | 303 | ConnectionCallbackParams_t callbackParams( |
kadonotakashi | 0:8fdf9a60065b | 304 | handle, |
kadonotakashi | 0:8fdf9a60065b | 305 | role, |
kadonotakashi | 0:8fdf9a60065b | 306 | peerAddrType, |
kadonotakashi | 0:8fdf9a60065b | 307 | peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 308 | ownAddrType, |
kadonotakashi | 0:8fdf9a60065b | 309 | ownAddr, |
kadonotakashi | 0:8fdf9a60065b | 310 | connectionParams, |
kadonotakashi | 0:8fdf9a60065b | 311 | peerResolvableAddr, |
kadonotakashi | 0:8fdf9a60065b | 312 | localResolvableAddr |
kadonotakashi | 0:8fdf9a60065b | 313 | ); |
kadonotakashi | 0:8fdf9a60065b | 314 | |
kadonotakashi | 0:8fdf9a60065b | 315 | connectionCallChain.call(&callbackParams); |
kadonotakashi | 0:8fdf9a60065b | 316 | } |
kadonotakashi | 0:8fdf9a60065b | 317 | |
kadonotakashi | 0:8fdf9a60065b | 318 | void Gap::processAdvertisementReport( |
kadonotakashi | 0:8fdf9a60065b | 319 | const BLEProtocol::AddressBytes_t peerAddr, |
kadonotakashi | 0:8fdf9a60065b | 320 | int8_t rssi, |
kadonotakashi | 0:8fdf9a60065b | 321 | bool isScanResponse, |
kadonotakashi | 0:8fdf9a60065b | 322 | GapAdvertisingParams::AdvertisingType_t type, |
kadonotakashi | 0:8fdf9a60065b | 323 | uint8_t advertisingDataLen, |
kadonotakashi | 0:8fdf9a60065b | 324 | const uint8_t *advertisingData, |
kadonotakashi | 0:8fdf9a60065b | 325 | BLEProtocol::AddressType_t addressType |
kadonotakashi | 0:8fdf9a60065b | 326 | ) { |
kadonotakashi | 0:8fdf9a60065b | 327 | AdvertisementCallbackParams_t params; |
kadonotakashi | 0:8fdf9a60065b | 328 | memcpy(params.peerAddr, peerAddr, ADDR_LEN); |
kadonotakashi | 0:8fdf9a60065b | 329 | params.rssi = rssi; |
kadonotakashi | 0:8fdf9a60065b | 330 | params.isScanResponse = isScanResponse; |
kadonotakashi | 0:8fdf9a60065b | 331 | params.type = type; |
kadonotakashi | 0:8fdf9a60065b | 332 | params.advertisingDataLen = advertisingDataLen; |
kadonotakashi | 0:8fdf9a60065b | 333 | params.advertisingData = advertisingData; |
kadonotakashi | 0:8fdf9a60065b | 334 | params.addressType = addressType; |
kadonotakashi | 0:8fdf9a60065b | 335 | |
kadonotakashi | 0:8fdf9a60065b | 336 | params.peerAddrType = convert_legacy_address_type(addressType); |
kadonotakashi | 0:8fdf9a60065b | 337 | onAdvertisementReport.call(¶ms); |
kadonotakashi | 0:8fdf9a60065b | 338 | } |
kadonotakashi | 0:8fdf9a60065b | 339 | |
kadonotakashi | 0:8fdf9a60065b | 340 | #if defined(__GNUC__) && !defined(__CC_ARM) |
kadonotakashi | 0:8fdf9a60065b | 341 | #pragma GCC diagnostic pop |
kadonotakashi | 0:8fdf9a60065b | 342 | #elif defined(__CC_ARM) |
kadonotakashi | 0:8fdf9a60065b | 343 | #pragma pop |
kadonotakashi | 0:8fdf9a60065b | 344 | #endif |