mirror of https://github.com/ARMmbed/mbed-os.git
use enum for state
parent
b0086919ed
commit
f0bbc4c7ae
|
@ -470,7 +470,7 @@ ble_error_t Gap::stopScan()
|
||||||
|
|
||||||
if ((!_scan_enabled && !_scan_pending) || _scan_pending
|
if ((!_scan_enabled && !_scan_pending) || _scan_pending
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|| _ready_to_connect_to_host_resolved_address
|
|| (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle)
|
||||||
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
) {
|
) {
|
||||||
return BLE_STACK_BUSY;
|
return BLE_STACK_BUSY;
|
||||||
|
@ -501,6 +501,12 @@ ble_error_t Gap::connect(
|
||||||
const ConnectionParameters &connectionParams
|
const ConnectionParameters &connectionParams
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
|
||||||
|
return BLE_ERROR_OPERATION_NOT_PERMITTED;
|
||||||
|
}
|
||||||
|
#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
|
||||||
if (!connectionParams.getNumberOfEnabledPhys()) {
|
if (!connectionParams.getNumberOfEnabledPhys()) {
|
||||||
return BLE_ERROR_INVALID_PARAM;
|
return BLE_ERROR_INVALID_PARAM;
|
||||||
}
|
}
|
||||||
|
@ -529,15 +535,18 @@ ble_error_t Gap::connect(
|
||||||
ble_error_t ret = BLE_ERROR_INTERNAL_STACK_FAILURE;
|
ble_error_t ret = BLE_ERROR_INTERNAL_STACK_FAILURE;
|
||||||
|
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
if (_ready_to_connect_to_host_resolved_address) {
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::idle) {
|
||||||
_ready_to_connect_to_host_resolved_address = false;
|
if (peerAddressType == peer_address_type_t::RANDOM_STATIC_IDENTITY ||
|
||||||
_connect_to_address_type = peer_address_type_t::ANONYMOUS;
|
peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) {
|
||||||
} else if (peerAddressType == peer_address_type_t::RANDOM_STATIC_IDENTITY ||
|
_connect_to_host_resolved_address_type = peerAddressType;
|
||||||
peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) {
|
_connect_to_host_resolved_address = peerAddress;
|
||||||
_connect_to_address_type = peerAddressType;
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::scan;
|
||||||
_connect_to_address = peerAddress;
|
}
|
||||||
|
} else if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::connect) {
|
||||||
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
}
|
}
|
||||||
#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
|
||||||
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
|
||||||
if (is_extended_advertising_available() == false) {
|
if (is_extended_advertising_available() == false) {
|
||||||
phy_set_t set(connectionParams.getPhySet());
|
phy_set_t set(connectionParams.getPhySet());
|
||||||
|
@ -555,19 +564,20 @@ ble_error_t Gap::connect(
|
||||||
stopScan();
|
stopScan();
|
||||||
}
|
}
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
if (_connect_to_address_type != peer_address_type_t::ANONYMOUS) {
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
|
||||||
ret = startScan(
|
ret = startScan(
|
||||||
scan_duration_t::forever(),
|
scan_duration_t::forever(),
|
||||||
duplicates_filter_t::ENABLE,
|
duplicates_filter_t::ENABLE,
|
||||||
(scan_period_t)0
|
(scan_period_t)0
|
||||||
);
|
);
|
||||||
if (ret == BLE_ERROR_NONE) {
|
if (ret == BLE_ERROR_NONE) {
|
||||||
_connection_parameters = new ConnectionParameters(connectionParams);
|
_connect_to_host_resolved_address_parameters = new ConnectionParameters(connectionParams);
|
||||||
if (_connection_parameters) {
|
if (!_connect_to_host_resolved_address_parameters) {
|
||||||
_ready_to_connect_to_host_resolved_address = true;
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
} else {
|
|
||||||
ret = BLE_ERROR_NO_MEM;
|
ret = BLE_ERROR_NO_MEM;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
@ -711,7 +721,7 @@ ble_error_t Gap::rejectConnectionParametersUpdate(
|
||||||
ble_error_t Gap::cancelConnect()
|
ble_error_t Gap::cancelConnect()
|
||||||
{
|
{
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
if (_ready_to_connect_to_host_resolved_address) {
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
|
||||||
connecting_to_host_resolved_address_failed(false);
|
connecting_to_host_resolved_address_failed(false);
|
||||||
stopScan();
|
stopScan();
|
||||||
return BLE_ERROR_NONE;
|
return BLE_ERROR_NONE;
|
||||||
|
@ -1070,7 +1080,12 @@ ble_error_t Gap::reset()
|
||||||
|
|
||||||
#if BLE_FEATURE_PRIVACY
|
#if BLE_FEATURE_PRIVACY
|
||||||
_privacy_initialization_pending = false;
|
_privacy_initialization_pending = false;
|
||||||
#endif
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
|
delete _connect_to_host_resolved_address_parameters;
|
||||||
|
_connect_to_host_resolved_address_parameters = nullptr;
|
||||||
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
#endif // BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
#if BLE_ROLE_BROADCASTER
|
#if BLE_ROLE_BROADCASTER
|
||||||
_advertising_timeout.detach();
|
_advertising_timeout.detach();
|
||||||
|
@ -1210,10 +1225,9 @@ void Gap::connecting_to_host_resolved_address_failed(bool inform_user)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
_ready_to_connect_to_host_resolved_address = false;
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
_connect_to_address_type = peer_address_type_t::ANONYMOUS;
|
delete _connect_to_host_resolved_address_parameters;
|
||||||
delete _connection_parameters;
|
_connect_to_host_resolved_address_parameters = nullptr;
|
||||||
_connection_parameters = nullptr;
|
|
||||||
}
|
}
|
||||||
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
|
||||||
|
@ -2617,12 +2631,17 @@ void Gap::signal_advertising_report(
|
||||||
|
|
||||||
/* if successful then proceed to call the handler immediately same as for when privacy is disabled */
|
/* if successful then proceed to call the handler immediately same as for when privacy is disabled */
|
||||||
if (address_resolved) {
|
if (address_resolved) {
|
||||||
if (_ready_to_connect_to_host_resolved_address) {
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
|
||||||
if (_connect_to_address_type == event.getDirectAddressType() &&
|
if (_connect_to_host_resolved_address_type == event.getDirectAddressType() &&
|
||||||
_connect_to_address == event.getDirectAddress()) {
|
_connect_to_host_resolved_address == event.getDirectAddress()) {
|
||||||
connect(_connect_to_address_type, _connect_to_address, *_connection_parameters);
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect;
|
||||||
delete _connection_parameters;
|
connect(
|
||||||
_connection_parameters = nullptr;
|
_connect_to_host_resolved_address_type,
|
||||||
|
_connect_to_host_resolved_address,
|
||||||
|
*_connect_to_host_resolved_address_parameters
|
||||||
|
);
|
||||||
|
delete _connect_to_host_resolved_address_parameters;
|
||||||
|
_connect_to_host_resolved_address_parameters = nullptr;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_event_handler->onAdvertisingReport(
|
_event_handler->onAdvertisingReport(
|
||||||
|
@ -2685,11 +2704,16 @@ void Gap::conclude_signal_advertising_report_after_address_resolution(
|
||||||
peer_address_type_t::RANDOM_STATIC_IDENTITY
|
peer_address_type_t::RANDOM_STATIC_IDENTITY
|
||||||
: peer_address_type_t::PUBLIC_IDENTITY;
|
: peer_address_type_t::PUBLIC_IDENTITY;
|
||||||
|
|
||||||
if (_ready_to_connect_to_host_resolved_address) {
|
if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
|
||||||
if (_connect_to_address_type == peer_address_type && _connect_to_address == *identity_address) {
|
if (_connect_to_host_resolved_address_type == peer_address_type && _connect_to_host_resolved_address == *identity_address) {
|
||||||
connect(event.getPeerAddressType(), event.getPeerAddress(), *_connection_parameters);
|
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect;
|
||||||
delete _connection_parameters;
|
connect(
|
||||||
_connection_parameters = nullptr;
|
event.getPeerAddressType(),
|
||||||
|
event.getPeerAddress(),
|
||||||
|
*_connect_to_host_resolved_address_parameters
|
||||||
|
);
|
||||||
|
delete _connect_to_host_resolved_address_parameters;
|
||||||
|
_connect_to_host_resolved_address_parameters = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2977,7 +3001,7 @@ ble_error_t Gap::startScan(
|
||||||
{
|
{
|
||||||
if (_scan_pending || _scan_address_refresh
|
if (_scan_pending || _scan_address_refresh
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|| _ready_to_connect_to_host_resolved_address
|
|| (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle)
|
||||||
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
) {
|
) {
|
||||||
return BLE_STACK_BUSY;
|
return BLE_STACK_BUSY;
|
||||||
|
|
|
@ -852,10 +852,15 @@ private:
|
||||||
bool _scan_interruptible = false;
|
bool _scan_interruptible = false;
|
||||||
bool _scan_address_refresh = false;
|
bool _scan_address_refresh = false;
|
||||||
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
bool _ready_to_connect_to_host_resolved_address = false;
|
enum class ConnectionToHostResolvedAddressState : uint8_t {
|
||||||
peer_address_type_t _connect_to_address_type = peer_address_type_t::ANONYMOUS;
|
idle,
|
||||||
ble::address_t _connect_to_address;
|
scan,
|
||||||
ConnectionParameters *_connection_parameters = nullptr;
|
connect
|
||||||
|
};
|
||||||
|
ble::address_t _connect_to_host_resolved_address;
|
||||||
|
peer_address_type_t _connect_to_host_resolved_address_type = peer_address_type_t::ANONYMOUS;
|
||||||
|
ConnectionToHostResolvedAddressState _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
|
||||||
|
ConnectionParameters *_connect_to_host_resolved_address_parameters = nullptr;
|
||||||
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
|
||||||
|
|
||||||
mbed::LowPowerTimeout _advertising_timeout;
|
mbed::LowPowerTimeout _advertising_timeout;
|
||||||
|
|
Loading…
Reference in New Issue