Skip to content

Commit c43a162

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 303e5b4 commit c43a162

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()
@@ -1153,6 +1160,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type,
11531160
return false;
11541161
}
11551162

1163+
bool BLEDeviceManager::deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr)
1164+
{
1165+
bool retVal = false;
1166+
for (uint8_t i = 0;
1167+
i < (sizeof(_peer_duplicate_address_buffer) / sizeof(bt_addr_le_t));
1168+
i++)
1169+
{
1170+
if (0 == bt_addr_le_cmp(addr, &_peer_duplicate_address_buffer[i]))
1171+
{
1172+
retVal = true;
1173+
break;
1174+
}
1175+
}
1176+
return retVal;
1177+
}
1178+
1179+
void BLEDeviceManager::updateDuplicateFilter(const bt_addr_le_t* addr)
1180+
{
1181+
uint8_t i = (_duplicate_filter_header + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
1182+
if (deviceInDuplicateFilterBuffer(addr))
1183+
{
1184+
return;
1185+
}
1186+
bt_addr_le_copy(&_peer_duplicate_address_buffer[_duplicate_filter_header],
1187+
addr);
1188+
if (i == _duplicate_filter_tail)
1189+
{
1190+
_duplicate_filter_tail = (_duplicate_filter_tail + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
1191+
}
1192+
_duplicate_filter_header = i;
1193+
}
1194+
11561195
BLEDevice BLEDeviceManager::available()
11571196
{
11581197
BLEDevice tempdevice;
@@ -1168,6 +1207,13 @@ BLEDevice BLEDeviceManager::available()
11681207
temp = &_peer_adv_buffer[i];
11691208
if ((timestamp_delta <= 2000) && (max_delta < timestamp_delta))
11701209
{
1210+
// Eable the duplicate filter
1211+
if (_adv_duplicate_filter_enabled &&
1212+
true == deviceInDuplicateFilterBuffer(temp))
1213+
{
1214+
_peer_adv_mill[i] -= 2000; // Invalid the item
1215+
continue;
1216+
}
11711217
max_delta = timestamp_delta;
11721218
index = i;
11731219
}
@@ -1187,6 +1233,10 @@ BLEDevice BLEDeviceManager::available()
11871233

11881234
pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
11891235
_peer_adv_mill[index] -= 2000; // Set it as expired
1236+
if (_adv_duplicate_filter_enabled)
1237+
{
1238+
updateDuplicateFilter(temp);
1239+
}
11901240
}
11911241
}
11921242
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)