Add clear scan duplicate filter cache method + clear on start.

This allows for clearing the duplicate filter cache when required and will also clear it
automatically when starting a scan.

This is useful when unexpectedly disconnected from a device and attempting to reconnect.
Previously the scan filter would not report advertisements from a device if it was multi-connectable
and advertising while connected. The result was long delays until the device would be scanned again.
This resolves it by clearing the filter cache on each scan start/clearResults call
and adding a method to NimBLEScan for manually clearing the cache on demand.
This commit is contained in:
h2zero 2021-03-31 20:24:57 -06:00
parent f5eab87a87
commit 05080abad4
2 changed files with 12 additions and 0 deletions

View file

@ -316,6 +316,8 @@ bool NimBLEScan::start(uint32_t duration, void (*scanCompleteCB)(NimBLEScanResul
break; break;
case BLE_HS_EALREADY: case BLE_HS_EALREADY:
// Clear the cache if already scanning in case an advertiser was missed.
clearDuplicateCache();
break; break;
case BLE_HS_EBUSY: case BLE_HS_EBUSY:
@ -398,6 +400,14 @@ bool NimBLEScan::stop() {
} // stop } // stop
/**
* @brief Clears the duplicate scan filter cache.
*/
void NimBLEScan::clearDuplicateCache() {
esp_ble_scan_dupilcate_list_flush();
}
/** /**
* @brief Delete peer device from the scan results vector. * @brief Delete peer device from the scan results vector.
* @param [in] address The address of the device to delete from the results. * @param [in] address The address of the device to delete from the results.
@ -453,6 +463,7 @@ void NimBLEScan::clearResults() {
delete it; delete it;
} }
m_scanResults.m_advertisedDevicesVector.clear(); m_scanResults.m_advertisedDevicesVector.clear();
clearDuplicateCache();
} }

View file

@ -70,6 +70,7 @@ public:
void setDuplicateFilter(bool enabled); void setDuplicateFilter(bool enabled);
void setLimitedOnly(bool enabled); void setLimitedOnly(bool enabled);
void setFilterPolicy(uint8_t filter); void setFilterPolicy(uint8_t filter);
void clearDuplicateCache();
bool stop(); bool stop();
void clearResults(); void clearResults();
NimBLEScanResults getResults(); NimBLEScanResults getResults();