move BleScanner to seperate lib

This commit is contained in:
technyon
2022-04-30 21:01:41 +02:00
parent 3a671b6704
commit 25544e8ad0
12 changed files with 237 additions and 1 deletions

View File

@@ -0,0 +1,13 @@
#pragma once
#include <NimBLEDevice.h>
class BLEScannerSubscriber {
public:
virtual void onResult(NimBLEAdvertisedDevice* advertisedDevice) = 0;
};
class BLEScannerPublisher {
public:
virtual void subscribe(BLEScannerSubscriber* subscriber) = 0;
virtual void unsubscribe(BLEScannerSubscriber* subscriber) = 0;
};

View File

@@ -0,0 +1,54 @@
#include "BleScanner.h"
#include <NimBLEUtils.h>
#include <NimBLEScan.h>
#include <NimBLEAdvertisedDevice.h>
BleScanner::BleScanner(int reservedSubscribers) {
subscribers.reserve(reservedSubscribers);
}
void BleScanner::initialize(const std::string& deviceName, const bool wantDuplicates, const uint16_t interval, const uint16_t window) {
if (!BLEDevice::getInitialized()) {
BLEDevice::init(deviceName);
}
bleScan = BLEDevice::getScan();
bleScan->setAdvertisedDeviceCallbacks(this, wantDuplicates);
bleScan->setActiveScan(true);
bleScan->setInterval(interval);
bleScan->setWindow(window);
}
void BleScanner::update() {
if (bleScan->isScanning()) {
return;
}
bool result = bleScan->start(scanDuration, nullptr, false);
if (!result) {
log_w("BLE Scan error");
}
}
void BleScanner::setScanDuration(const uint32_t value) {
scanDuration = value;
}
void BleScanner::subscribe(BLEScannerSubscriber* subscriber) {
if (std::find(subscribers.begin(), subscribers.end(), subscriber) != subscribers.end()) {
return;
}
subscribers.push_back(subscriber);
}
void BleScanner::unsubscribe(BLEScannerSubscriber* subscriber) {
auto it = std::find(subscribers.begin(), subscribers.end(), subscriber);
if (it != subscribers.end()) {
subscribers.erase(it);
}
}
void BleScanner::onResult(NimBLEAdvertisedDevice* advertisedDevice) {
for (const auto& subscriber : subscribers) {
subscriber->onResult(advertisedDevice);
}
}

View File

@@ -0,0 +1,25 @@
#pragma once
#include <string>
#include <NimBLEDevice.h>
#include "BleInterfaces.h"
class BleScanner : public BLEScannerPublisher, BLEAdvertisedDeviceCallbacks {
public:
BleScanner(int reservedSubscribers = 10);
~BleScanner() = default;
void initialize(const std::string& deviceName = "blescanner", const bool wantDuplicates = false, const uint16_t interval = 40, const uint16_t window = 40);
void update();
void setScanDuration(const uint32_t value);
void subscribe(BLEScannerSubscriber* subscriber) override;
void unsubscribe(BLEScannerSubscriber* subscriber) override;
void onResult(NimBLEAdvertisedDevice* advertisedDevice) override;
private:
uint32_t scanDuration = 3;
BLEScan* bleScan = nullptr;
std::vector<BLEScannerSubscriber*> subscribers;
};

View File

@@ -0,0 +1,9 @@
#include <Arduino.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}