@@ -47,7 +47,10 @@ BLEDeviceManager::BLEDeviceManager():
47
47
_local_name(" " ),
48
48
_state(BLE_PERIPH_STATE_NOT_READY),
49
49
_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 )
51
54
{
52
55
memset (&_local_bda, 0 , sizeof (_local_bda));
53
56
memset (&_wait_for_connect_peripheral, 0 , sizeof (_wait_for_connect_peripheral));
@@ -530,7 +533,8 @@ BLEDevice BLEDeviceManager::peripheral()
530
533
531
534
bool BLEDeviceManager::startScanning ()
532
535
{
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;
534
538
int err = bt_le_scan_start (&_scan_param, ble_central_device_found);
535
539
if (err)
536
540
{
@@ -542,14 +546,17 @@ bool BLEDeviceManager::startScanning()
542
546
543
547
bool BLEDeviceManager::startScanningWithDuplicates ()
544
548
{
549
+ _adv_duplicate_filter_enabled = true ;
550
+ memset (_peer_duplicate_address_buffer, 0 , sizeof (_peer_duplicate_address_buffer));
551
+
545
552
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
546
553
int err = bt_le_scan_start (&_scan_param, ble_central_device_found);
547
554
if (err)
548
555
{
549
556
pr_info (LOG_MODULE_BLE, " Scanning failed to start (err %d)\n " , err);
550
557
return false ;
551
558
}
552
- return false ;
559
+ return true ;
553
560
}
554
561
555
562
bool BLEDeviceManager::stopScanning ()
@@ -1153,6 +1160,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type,
1153
1160
return false ;
1154
1161
}
1155
1162
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
+
1156
1195
BLEDevice BLEDeviceManager::available ()
1157
1196
{
1158
1197
BLEDevice tempdevice;
@@ -1168,6 +1207,13 @@ BLEDevice BLEDeviceManager::available()
1168
1207
temp = &_peer_adv_buffer[i];
1169
1208
if ((timestamp_delta <= 2000 ) && (max_delta < timestamp_delta))
1170
1209
{
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
+ }
1171
1217
max_delta = timestamp_delta;
1172
1218
index = i;
1173
1219
}
@@ -1187,6 +1233,10 @@ BLEDevice BLEDeviceManager::available()
1187
1233
1188
1234
pr_debug (LOG_MODULE_BLE, " %s-%d:Con addr-%s" , __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String (*temp).c_str ());
1189
1235
_peer_adv_mill[index ] -= 2000 ; // Set it as expired
1236
+ if (_adv_duplicate_filter_enabled)
1237
+ {
1238
+ updateDuplicateFilter (temp);
1239
+ }
1190
1240
}
1191
1241
}
1192
1242
return tempdevice;
0 commit comments