Skip to content

Commit 6f4f579

Browse files
sgbihuSidLeung
authored andcommitted
Fix Jira876 BLE scanForName() device from previous scan is picked up
Root cause: 1. The buffer doesn't cleared. The scanned data is not the latest. Changed files: BLEDeviceManager.cpp a. Clear the buffered data when start scan. b. Invalid scan response when buffer timeout or disconnected.
1 parent 6b33e73 commit 6f4f579

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

Diff for: libraries/CurieBLE/src/internal/BLEDeviceManager.cpp

+34-7
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ BLEDeviceManager::BLEDeviceManager():
101101

102102
memset(&_available_for_connect_peripheral_adv_data, 0, sizeof(_available_for_connect_peripheral_adv_data));
103103
memset(&_available_for_connect_peripheral_scan_rsp_data, 0, sizeof(_available_for_connect_peripheral_scan_rsp_data));
104-
105-
memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral));
106104

107105
memset(&_service_uuid, 0, sizeof(_service_uuid));
108106
memset(&_service_solicit_uuid, 0, sizeof(_service_solicit_uuid));
@@ -576,10 +574,32 @@ BLEDevice BLEDeviceManager::peripheral()
576574
return temp;
577575
}
578576

577+
void BLEDeviceManager::_clearAdvertiseBuffer()
578+
{
579+
580+
// Clear the previous found ADV
581+
memset(_peer_temp_adv_buffer, 0, sizeof(_peer_temp_adv_buffer));
582+
memset(_peer_temp_adv_data, 0, sizeof(_peer_temp_adv_data));
583+
memset(_peer_temp_adv_data_len, 0, sizeof(_peer_temp_adv_data_len));
584+
memset(_peer_temp_adv_connectable, 0, sizeof(_peer_adv_connectable));
585+
586+
memset(_peer_adv_buffer, 0, sizeof(_peer_adv_buffer));
587+
memset(_peer_adv_mill, 0, sizeof(_peer_adv_mill));
588+
memset(_peer_adv_data, 0, sizeof(_peer_adv_data));
589+
memset(_peer_adv_data_len, 0, sizeof(_peer_adv_data_len));
590+
memset(_peer_scan_rsp_data, 0, sizeof(_peer_scan_rsp_data));
591+
memset(_peer_scan_rsp_data_len, 0, sizeof(_peer_scan_rsp_data_len));
592+
memset(_peer_adv_rssi, 0, sizeof(_peer_adv_rssi));
593+
594+
}
595+
579596
bool BLEDeviceManager::startScanning()
580597
{
581598
_adv_duplicate_filter_enabled = false;
582599
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
600+
601+
_clearAdvertiseBuffer();
602+
583603
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
584604
if (err)
585605
{
@@ -594,6 +614,8 @@ bool BLEDeviceManager::startScanningWithDuplicates()
594614
_adv_duplicate_filter_enabled = true;
595615
memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer));
596616
_duplicate_filter_header = _duplicate_filter_tail = 0;
617+
618+
_clearAdvertiseBuffer();
597619

598620
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
599621
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
@@ -896,11 +918,6 @@ int BLEDeviceManager::advertisedServiceUuidCount(const BLEDevice* device) const
896918
return service_cnt;
897919
}
898920

899-
if ((len + 1) > adv_data_len) { // Sid. KW, can't be (adv_data_len < 2)
900-
pr_info(LOG_MODULE_BLE, "AD malformed\n");
901-
return service_cnt;
902-
}
903-
904921
/* Sid, 2/15/2017. Sandeep reported that Apple devices may use
905922
BT_DATA_UUID16_SOME and BT_DATA_UUID128_SOME in addition to ALL.
906923
Practically, these types are same as ALL. */
@@ -1067,6 +1084,11 @@ bool BLEDeviceManager::connect(BLEDevice &device)
10671084
uint64_t timestamp = millis();
10681085
uint64_t timestampcur = timestamp;
10691086
bool ret = true;
1087+
if (_available_for_connect_peripheral_connectable == false)
1088+
{
1089+
return false;
1090+
}
1091+
10701092
bt_addr_le_copy(&_wait_for_connect_peripheral, device.bt_le_address());
10711093
// Buffer the ADV data
10721094
memcpy(_wait_for_connect_peripheral_adv_data, _available_for_connect_peripheral_adv_data, BLE_MAX_ADV_SIZE);
@@ -1247,6 +1269,8 @@ void BLEDeviceManager::handleDisconnectEvent(bt_conn_t *conn, uint8_t reason)
12471269
memset(_peer_peripheral_adv_data[i], 0, BLE_MAX_ADV_SIZE);
12481270
_peer_peripheral_adv_data_len[i] = 0;
12491271
_peer_peripheral_adv_rssi[i] = 0;
1272+
memset(_peer_peripheral_scan_rsp_data[i], 0, BLE_MAX_ADV_SIZE);
1273+
_peer_peripheral_scan_rsp_data_len[i] = 0;
12501274
break;
12511275
}
12521276
}
@@ -1406,7 +1430,10 @@ bool BLEDeviceManager::setAdvertiseBuffer(const bt_addr_le_t* bt_addr,
14061430
{
14071431
max_delta = timestamp_delta;
14081432
if (max_delta > 2000) // expired
1433+
{
14091434
index = i;
1435+
_peer_scan_rsp_data_len[index] = 0; // Invalid the scan response
1436+
}
14101437
}
14111438

14121439
if (bt_addr_le_cmp(temp, bt_addr) == 0)

Diff for: libraries/CurieBLE/src/internal/BLEDeviceManager.h

+1
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ class BLEDeviceManager
358358
const uint8_t* data,
359359
uint8_t length);
360360
BLE_STATUS_T _advDataInit(void);
361+
void _clearAdvertiseBuffer();
361362
bool advertiseDataProc(uint8_t type,
362363
const uint8_t *dataPtr,
363364
uint8_t data_len);

0 commit comments

Comments
 (0)