use enum for state

pull/13759/head
Paul Szczeanek 2020-10-01 10:45:43 +01:00 committed by Vincent Coubard
parent b0086919ed
commit f0bbc4c7ae
2 changed files with 65 additions and 36 deletions

View File

@ -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;
} else if (peerAddressType == peer_address_type_t::RANDOM_STATIC_IDENTITY ||
peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) { peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) {
_connect_to_address_type = peerAddressType; _connect_to_host_resolved_address_type = peerAddressType;
_connect_to_address = peerAddress; _connect_to_host_resolved_address = peerAddress;
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::scan;
} }
#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION } 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
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;

View File

@ -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;