chegewara 7856de7a57
BLE5 features to use with C3/S3 (#5085)
Added new BLE5 features to use on C3/S3 family:

extended scan,
extended/multi advertising
New code is not fancy (no feedback from events), but i think it is functional. To get feedback from events i am suggesting to use custom GAP callback, which is already implemented in BLEDevice.
2021-04-22 13:01:20 +03:00

123 lines
4.3 KiB
C++

/*
* BLEScan.h
*
* Created on: Jul 1, 2017
* Author: kolban
*/
#ifndef COMPONENTS_CPP_UTILS_BLESCAN_H_
#define COMPONENTS_CPP_UTILS_BLESCAN_H_
#include "sdkconfig.h"
#if defined(CONFIG_BLUEDROID_ENABLED)
#include <esp_gap_ble_api.h>
// #include <vector>
#include <string>
#include "BLEAdvertisedDevice.h"
#include "BLEClient.h"
#include "RTOS.h"
class BLEAdvertisedDevice;
class BLEAdvertisedDeviceCallbacks;
class BLEExtAdvertisingCallbacks;
class BLEClient;
class BLEScan;
class BLEPeriodicScanCallbacks;
struct esp_ble_periodic_adv_sync_estab_param_t {
uint8_t status; /*!< periodic advertising sync status */
uint16_t sync_handle; /*!< periodic advertising sync handle */
uint8_t sid; /*!< periodic advertising sid */
esp_ble_addr_type_t adv_addr_type; /*!< periodic advertising address type */
esp_bd_addr_t adv_addr; /*!< periodic advertising address */
esp_ble_gap_phy_t adv_phy; /*!< periodic advertising phy type */
uint16_t period_adv_interval; /*!< periodic advertising interval */
uint8_t adv_clk_accuracy; /*!< periodic advertising clock accuracy */
};
/**
* @brief The result of having performed a scan.
* When a scan completes, we have a set of found devices. Each device is described
* by a BLEAdvertisedDevice object. The number of items in the set is given by
* getCount(). We can retrieve a device by calling getDevice() passing in the
* index (starting at 0) of the desired device.
*/
class BLEScanResults {
public:
void dump();
int getCount();
BLEAdvertisedDevice getDevice(uint32_t i);
private:
friend BLEScan;
std::map<std::string, BLEAdvertisedDevice*> m_vectorAdvertisedDevices;
};
/**
* @brief Perform and manage %BLE scans.
*
* Scanning is associated with a %BLE client that is attempting to locate BLE servers.
*/
class BLEScan {
public:
void setActiveScan(bool active);
void setAdvertisedDeviceCallbacks(
BLEAdvertisedDeviceCallbacks* pAdvertisedDeviceCallbacks,
bool wantDuplicates = false,
bool shouldParse = true);
void setInterval(uint16_t intervalMSecs);
void setWindow(uint16_t windowMSecs);
bool start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults), bool is_continue = false);
BLEScanResults start(uint32_t duration, bool is_continue = false);
void stop();
void erase(BLEAddress address);
BLEScanResults getResults();
void clearResults();
#ifdef CONFIG_BT_BLE_50_FEATURES_SUPPORTED
void setExtendedScanCallback(BLEExtAdvertisingCallbacks* cb);
void setPeriodicScanCallback(BLEPeriodicScanCallbacks* cb);
esp_err_t stopExtScan();
esp_err_t setExtScanParams();
esp_err_t setExtScanParams(esp_ble_ext_scan_params_t* ext_scan_params);
esp_err_t startExtScan(uint32_t duration, uint16_t period);
private:
BLEExtAdvertisingCallbacks* m_pExtendedScanCb = nullptr;
BLEPeriodicScanCallbacks* m_pPeriodicScanCb = nullptr;
#endif // CONFIG_BT_BLE_50_FEATURES_SUPPORTED
private:
BLEScan(); // One doesn't create a new instance instead one asks the BLEDevice for the singleton.
friend class BLEDevice;
void handleGAPEvent(
esp_gap_ble_cb_event_t event,
esp_ble_gap_cb_param_t* param);
esp_ble_scan_params_t m_scan_params;
BLEAdvertisedDeviceCallbacks* m_pAdvertisedDeviceCallbacks = nullptr;
bool m_stopped = true;
bool m_shouldParse = true;
FreeRTOS::Semaphore m_semaphoreScanEnd = FreeRTOS::Semaphore("ScanEnd");
BLEScanResults m_scanResults;
bool m_wantDuplicates;
void (*m_scanCompleteCB)(BLEScanResults scanResults);
}; // BLEScan
class BLEPeriodicScanCallbacks {
public:
virtual ~BLEPeriodicScanCallbacks() {}
virtual void onCreateSync(esp_bt_status_t status) {}
virtual void onCancelSync(esp_bt_status_t status) {}
virtual void onTerminateSync(esp_bt_status_t status) {}
virtual void onLostSync(uint16_t sync_handle) {}
virtual void onSync(esp_ble_periodic_adv_sync_estab_param_t) {}
virtual void onReport(esp_ble_gap_periodic_adv_report_t params) {}
virtual void onStop(esp_bt_status_t status) {}
};
#endif /* CONFIG_BLUEDROID_ENABLED */
#endif /* COMPONENTS_CPP_UTILS_BLESCAN_H_ */