Skip to content

Commit 972c943

Browse files
committed
Jira 802 BLE scan() does not work correctly with duplicate filter, git issue arduino#369
1. Add the soft duplicate filter feature.
1 parent 5ce0576 commit 972c943

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

libraries/CurieBLE/src/BLECommon.h

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ typedef ble_status_t BleStatus;
103103

104104
#define BLE_MAX_CONN_CFG 2
105105
#define BLE_MAX_ADV_BUFFER_CFG 3
106+
#define BLE_MAX_ADV_FILTER_SIZE_CFG 20
106107

107108
typedef bool (*ble_advertise_handle_cb_t)(uint8_t type, const uint8_t *dataPtr,
108109
uint8_t data_len, const bt_addr_le_t *addrPtr);

libraries/CurieBLE/src/internal/BLEDeviceManager.cpp

+53-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ BLEDeviceManager::BLEDeviceManager():
4747
_local_name(""),
4848
_state(BLE_PERIPH_STATE_NOT_READY),
4949
_local_ble(NULL),
50-
_peer_peripheral_index(0)
50+
_peer_peripheral_index(0),
51+
_duplicate_filter_header(0),
52+
_duplicate_filter_tail(0),
53+
_adv_duplicate_filter_enabled(false)
5154
{
5255
memset(&_local_bda, 0, sizeof(_local_bda));
5356
memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral));
@@ -530,7 +533,8 @@ BLEDevice BLEDeviceManager::peripheral()
530533

531534
bool BLEDeviceManager::startScanning()
532535
{
533-
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;//BT_HCI_LE_SCAN_FILTER_DUP_DISABLE;
536+
_adv_duplicate_filter_enabled = false;
537+
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
534538
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
535539
if (err)
536540
{
@@ -542,14 +546,17 @@ bool BLEDeviceManager::startScanning()
542546

543547
bool BLEDeviceManager::startScanningWithDuplicates()
544548
{
549+
_adv_duplicate_filter_enabled = true;
550+
memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer));
551+
545552
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
546553
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
547554
if (err)
548555
{
549556
pr_info(LOG_MODULE_BLE, "Scanning failed to start (err %d)\n", err);
550557
return false;
551558
}
552-
return false;
559+
return true;
553560
}
554561

555562
bool BLEDeviceManager::stopScanning()
@@ -1164,6 +1171,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type,
11641171
return false;
11651172
}
11661173

1174+
bool BLEDeviceManager::deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr)
1175+
{
1176+
bool retVal = false;
1177+
for (uint8_t i = 0;
1178+
i < (sizeof(_peer_duplicate_address_buffer) / sizeof(bt_addr_le_t));
1179+
i++)
1180+
{
1181+
if (0 == bt_addr_le_cmp(addr, &_peer_duplicate_address_buffer[i]))
1182+
{
1183+
retVal = true;
1184+
break;
1185+
}
1186+
}
1187+
return retVal;
1188+
}
1189+
1190+
void BLEDeviceManager::updateDuplicateFilter(const bt_addr_le_t* addr)
1191+
{
1192+
uint8_t i = (_duplicate_filter_header + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
1193+
if (deviceInDuplicateFilterBuffer(addr))
1194+
{
1195+
return;
1196+
}
1197+
bt_addr_le_copy(&_peer_duplicate_address_buffer[_duplicate_filter_header],
1198+
addr);
1199+
if (i == _duplicate_filter_tail)
1200+
{
1201+
_duplicate_filter_tail = (_duplicate_filter_tail + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
1202+
}
1203+
_duplicate_filter_header = i;
1204+
}
1205+
11671206
BLEDevice BLEDeviceManager::available()
11681207
{
11691208
BLEDevice tempdevice;
@@ -1179,6 +1218,13 @@ BLEDevice BLEDeviceManager::available()
11791218
temp = &_peer_adv_buffer[i];
11801219
if ((timestamp_delta <= 2000) && (max_delta < timestamp_delta))
11811220
{
1221+
// Eable the duplicate filter
1222+
if (_adv_duplicate_filter_enabled &&
1223+
true == deviceInDuplicateFilterBuffer(temp))
1224+
{
1225+
_peer_adv_mill[i] -= 2000; // Invalid the item
1226+
continue;
1227+
}
11821228
max_delta = timestamp_delta;
11831229
index = i;
11841230
}
@@ -1198,6 +1244,10 @@ BLEDevice BLEDeviceManager::available()
11981244

11991245
pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
12001246
_peer_adv_mill[index] -= 2000; // Set it as expired
1247+
if (_adv_duplicate_filter_enabled)
1248+
{
1249+
updateDuplicateFilter(temp);
1250+
}
12011251
}
12021252
}
12031253
return tempdevice;

libraries/CurieBLE/src/internal/BLEDeviceManager.h

+6
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,8 @@ class BLEDeviceManager
362362
const uint8_t* &adv_data,
363363
uint8_t &adv_len) const;
364364
bool disconnectSingle(const bt_addr_le_t *peer);
365+
void updateDuplicateFilter(const bt_addr_le_t* addr);
366+
bool deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr);
365367

366368
private:
367369
uint16_t _min_conn_interval;
@@ -432,6 +434,10 @@ class BLEDeviceManager
432434
uint8_t _peer_peripheral_adv_data[BLE_MAX_CONN_CFG][BLE_MAX_ADV_SIZE];
433435
uint8_t _peer_peripheral_adv_data_len[BLE_MAX_CONN_CFG];
434436
uint8_t _peer_peripheral_adv_rssi[BLE_MAX_CONN_CFG];
437+
bt_addr_le_t _peer_duplicate_address_buffer[BLE_MAX_ADV_FILTER_SIZE_CFG];
438+
uint8_t _duplicate_filter_header;
439+
uint8_t _duplicate_filter_tail;
440+
bool _adv_duplicate_filter_enabled;
435441

436442
BLEDeviceEventHandler _device_events[BLEDeviceLastEvent];
437443
};

0 commit comments

Comments
 (0)