arduino-libraries / ArduinoBLE

ArduinoBLE library for Arduino
GNU Lesser General Public License v2.1
291 stars 198 forks source link

Reset scan filters when stopScan is called [Fixes #350] #351

Open andrewchilds opened 5 months ago

andrewchilds commented 5 months ago

This PR addresses a bug outlined in #350, where calling stopScan does not reset the filters set by scanByName etc, so a call to scan after will not work as expected.

Here's a barebones sketch that demonstrates the bug:

#include <ArduinoBLE.h>

#define SERVICE_UUID "MY-SERVICE-UUID"

unsigned long scanStart;
bool fallbackToFullScan = false;

void setup() {
  Serial.begin(9600);
  delay(1000); // Wait for serial

  if (!BLE.begin()) {
    Serial.println("Starting BLE failed!");
    while (1);
  }

  Serial.println("Scanning by Service UUID...");
  BLE.scanForUuid(SERVICE_UUID);
  scanStart = millis();
}

void notWorkingScan() {
  BLE.stopScan();
  delay(1000);
  // This scan will not work - it will continue to behave like BLE.scanForUuid(SERVICE_UUID)
  BLE.scan();
}

void workingScan() {
  // This will reset _scanNameFilter, _scanUuidFilter, and _scanAddressFilter to ""
  BLE.scanForUuid("");
  BLE.stopScan();
  delay(1000);
  // This scan will now work
  BLE.scan();
}

void loop() {
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    Serial.println("Peripheral found!");
    BLE.stopScan();
  }

  // Wait 5 seconds to connect, then fall back to a regular scan.
  if (!fallbackToFullScan && millis() - scanStart > 5000) {
    scanStart = millis();
    Serial.println("Falling back to full scan...");
    fallbackToFullScan = true;
    // notWorkingScan();
    workingScan();
  }
}
CLAassistant commented 5 months ago

CLA assistant check
All committers have signed the CLA.