Skip to content

Jira 802, BLE Central scan() to filter Peripheral adv, git #369 #457

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libraries/CurieBLE/src/BLECommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ typedef ble_status_t BleStatus;

#define BLE_MAX_CONN_CFG 2
#define BLE_MAX_ADV_BUFFER_CFG 3
#define BLE_MAX_ADV_FILTER_SIZE_CFG 20

typedef bool (*ble_advertise_handle_cb_t)(uint8_t type, const uint8_t *dataPtr,
uint8_t data_len, const bt_addr_le_t *addrPtr);
Expand Down
57 changes: 54 additions & 3 deletions libraries/CurieBLE/src/internal/BLEDeviceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ BLEDeviceManager::BLEDeviceManager():
_local_name(""),
_state(BLE_PERIPH_STATE_NOT_READY),
_local_ble(NULL),
_peer_peripheral_index(0)
_peer_peripheral_index(0),
_duplicate_filter_header(0),
_duplicate_filter_tail(0),
_adv_duplicate_filter_enabled(false)
{
memset(&_local_bda, 0, sizeof(_local_bda));
memset(&_wait_for_connect_peripheral, 0, sizeof(_wait_for_connect_peripheral));
Expand Down Expand Up @@ -530,7 +533,8 @@ BLEDevice BLEDeviceManager::peripheral()

bool BLEDeviceManager::startScanning()
{
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;//BT_HCI_LE_SCAN_FILTER_DUP_DISABLE;
_adv_duplicate_filter_enabled = false;
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
if (err)
{
Expand All @@ -542,14 +546,18 @@ bool BLEDeviceManager::startScanning()

bool BLEDeviceManager::startScanningWithDuplicates()
{
_adv_duplicate_filter_enabled = true;
memset(_peer_duplicate_address_buffer, 0, sizeof(_peer_duplicate_address_buffer));
_duplicate_filter_header = _duplicate_filter_tail = 0;

_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
int err = bt_le_scan_start(&_scan_param, ble_central_device_found);
if (err)
{
pr_info(LOG_MODULE_BLE, "Scanning failed to start (err %d)\n", err);
return false;
}
return false;
return true;
}

bool BLEDeviceManager::stopScanning()
Expand Down Expand Up @@ -1164,6 +1172,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type,
return false;
}

bool BLEDeviceManager::deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr)
{
bool retVal = false;
for (uint8_t i = 0;
i < (sizeof(_peer_duplicate_address_buffer) / sizeof(bt_addr_le_t));
i++)
{
if (0 == bt_addr_le_cmp(addr, &_peer_duplicate_address_buffer[i]))
{
retVal = true;
break;
}
}
return retVal;
}

void BLEDeviceManager::updateDuplicateFilter(const bt_addr_le_t* addr)
{
uint8_t i = (_duplicate_filter_header + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
if (deviceInDuplicateFilterBuffer(addr))
{
return;
}
bt_addr_le_copy(&_peer_duplicate_address_buffer[_duplicate_filter_header],
addr);
if (i == _duplicate_filter_tail)
{
_duplicate_filter_tail = (_duplicate_filter_tail + 1) % (ARRAY_SIZE(_peer_duplicate_address_buffer));
}
_duplicate_filter_header = i;
}

BLEDevice BLEDeviceManager::available()
{
BLEDevice tempdevice;
Expand All @@ -1179,6 +1219,13 @@ BLEDevice BLEDeviceManager::available()
temp = &_peer_adv_buffer[i];
if ((timestamp_delta <= 2000) && (max_delta < timestamp_delta))
{
// Eable the duplicate filter
if (_adv_duplicate_filter_enabled &&
true == deviceInDuplicateFilterBuffer(temp))
{
_peer_adv_mill[i] -= 2000; // Invalid the item
continue;
}
max_delta = timestamp_delta;
index = i;
}
Expand All @@ -1198,6 +1245,10 @@ BLEDevice BLEDeviceManager::available()

pr_debug(LOG_MODULE_BLE, "%s-%d:Con addr-%s", __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String(*temp).c_str());
_peer_adv_mill[index] -= 2000; // Set it as expired
if (_adv_duplicate_filter_enabled)
{
updateDuplicateFilter(temp);
}
}
}
return tempdevice;
Expand Down
6 changes: 6 additions & 0 deletions libraries/CurieBLE/src/internal/BLEDeviceManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,8 @@ class BLEDeviceManager
const uint8_t* &adv_data,
uint8_t &adv_len) const;
bool disconnectSingle(const bt_addr_le_t *peer);
void updateDuplicateFilter(const bt_addr_le_t* addr);
bool deviceInDuplicateFilterBuffer(const bt_addr_le_t* addr);

private:
uint16_t _min_conn_interval;
Expand Down Expand Up @@ -432,6 +434,10 @@ class BLEDeviceManager
uint8_t _peer_peripheral_adv_data[BLE_MAX_CONN_CFG][BLE_MAX_ADV_SIZE];
uint8_t _peer_peripheral_adv_data_len[BLE_MAX_CONN_CFG];
uint8_t _peer_peripheral_adv_rssi[BLE_MAX_CONN_CFG];
bt_addr_le_t _peer_duplicate_address_buffer[BLE_MAX_ADV_FILTER_SIZE_CFG];
uint8_t _duplicate_filter_header;
uint8_t _duplicate_filter_tail;
bool _adv_duplicate_filter_enabled;

BLEDeviceEventHandler _device_events[BLEDeviceLastEvent];
};
Expand Down