mirror of
https://github.com/0xFEEDC0DE64/arduino-esp32.git
synced 2025-07-05 14:56:32 +02:00
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.
This commit is contained in:
@ -3,6 +3,9 @@
|
||||
*
|
||||
* Created on: Jul 1, 2017
|
||||
* Author: kolban
|
||||
*
|
||||
* Update: April, 2021
|
||||
* add BLE5 support
|
||||
*/
|
||||
#include "sdkconfig.h"
|
||||
#if defined(CONFIG_BLUEDROID_ENABLED)
|
||||
@ -142,6 +145,98 @@ void BLEScan::handleGAPEvent(
|
||||
|
||||
break;
|
||||
} // ESP_GAP_BLE_SCAN_RESULT_EVT
|
||||
#ifdef CONFIG_BT_BLE_50_FEATURES_SUPPORTED
|
||||
case ESP_GAP_BLE_EXT_ADV_REPORT_EVT: {
|
||||
if (param->ext_adv_report.params.event_type & ESP_BLE_GAP_SET_EXT_ADV_PROP_LEGACY) {
|
||||
log_v("legacy adv, adv type 0x%x data len %d", param->ext_adv_report.params.event_type, param->ext_adv_report.params.adv_data_len);
|
||||
}
|
||||
else {
|
||||
log_v("extend adv, adv type 0x%x data len %d, data status: %d", param->ext_adv_report.params.event_type, param->ext_adv_report.params.adv_data_len, param->ext_adv_report.params.data_status);
|
||||
}
|
||||
|
||||
if (m_pExtendedScanCb != nullptr)
|
||||
{
|
||||
m_pExtendedScanCb->onResult(param->ext_adv_report.params);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_GAP_BLE_SET_EXT_SCAN_PARAMS_COMPLETE_EVT: {
|
||||
if (param->set_ext_scan_params.status != ESP_BT_STATUS_SUCCESS) {
|
||||
log_e("extend scan parameters set failed, error status = %x", param->set_ext_scan_params.status);
|
||||
break;
|
||||
}
|
||||
log_v("extend scan params set successfully");
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_GAP_BLE_EXT_SCAN_START_COMPLETE_EVT:
|
||||
if (param->ext_scan_start.status != ESP_BT_STATUS_SUCCESS) {
|
||||
log_e("scan start failed, error status = %x", param->scan_start_cmpl.status);
|
||||
break;
|
||||
}
|
||||
log_v("Scan start success");
|
||||
break;
|
||||
|
||||
case ESP_GAP_BLE_EXT_SCAN_STOP_COMPLETE_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onStop(param->ext_scan_stop.status);
|
||||
}
|
||||
|
||||
if (param->ext_scan_stop.status != ESP_BT_STATUS_SUCCESS){
|
||||
log_e("extend Scan stop failed, error status = %x", param->ext_scan_stop.status);
|
||||
break;
|
||||
}
|
||||
log_v("Stop extend scan successfully");
|
||||
break;
|
||||
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onCreateSync(param->period_adv_create_sync.status);
|
||||
}
|
||||
|
||||
log_v("ESP_GAP_BLE_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT, status %d", param->period_adv_create_sync.status);
|
||||
break;
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_SYNC_CANCEL_COMPLETE_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onCancelSync(param->period_adv_sync_cancel.status);
|
||||
}
|
||||
log_v("ESP_GAP_BLE_PERIODIC_ADV_SYNC_CANCEL_COMPLETE_EVT, status %d", param->period_adv_sync_cancel.status);
|
||||
break;
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_SYNC_TERMINATE_COMPLETE_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onTerminateSync(param->period_adv_sync_term.status);
|
||||
}
|
||||
log_v("ESP_GAP_BLE_PERIODIC_ADV_SYNC_TERMINATE_COMPLETE_EVT, status %d", param->period_adv_sync_term.status);
|
||||
break;
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_SYNC_LOST_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onLostSync(param->periodic_adv_sync_lost.sync_handle);
|
||||
}
|
||||
log_v("ESP_GAP_BLE_PERIODIC_ADV_SYNC_LOST_EVT, sync handle %d", param->periodic_adv_sync_lost.sync_handle);
|
||||
break;
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_SYNC_ESTAB_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onSync(*(esp_ble_periodic_adv_sync_estab_param_t*)¶m->periodic_adv_sync_estab);
|
||||
}
|
||||
log_v("ESP_GAP_BLE_PERIODIC_ADV_SYNC_ESTAB_EVT, status %d", param->periodic_adv_sync_estab.status);
|
||||
break;
|
||||
|
||||
case ESP_GAP_BLE_PERIODIC_ADV_REPORT_EVT:
|
||||
if (m_pPeriodicScanCb != nullptr)
|
||||
{
|
||||
m_pPeriodicScanCb->onReport(param->period_adv_report.params);
|
||||
}
|
||||
break;
|
||||
|
||||
#endif // CONFIG_BT_BLE_50_FEATURES_SUPPORTED
|
||||
|
||||
default: {
|
||||
break;
|
||||
@ -177,6 +272,89 @@ void BLEScan::setAdvertisedDeviceCallbacks(BLEAdvertisedDeviceCallbacks* pAdvert
|
||||
m_shouldParse = shouldParse;
|
||||
} // setAdvertisedDeviceCallbacks
|
||||
|
||||
#ifdef CONFIG_BT_BLE_50_FEATURES_SUPPORTED
|
||||
|
||||
void BLEScan::setExtendedScanCallback(BLEExtAdvertisingCallbacks* cb)
|
||||
{
|
||||
m_pExtendedScanCb = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is used to set the extended scan parameters to be used on the advertising channels.
|
||||
*
|
||||
*
|
||||
* @return - ESP_OK : success
|
||||
* - other : failed
|
||||
*
|
||||
*/
|
||||
esp_err_t BLEScan::setExtScanParams()
|
||||
{
|
||||
esp_ble_ext_scan_params_t ext_scan_params = {
|
||||
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
|
||||
.filter_policy = BLE_SCAN_FILTER_ALLOW_ALL,
|
||||
.scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE,
|
||||
.cfg_mask = ESP_BLE_GAP_EXT_SCAN_CFG_UNCODE_MASK | ESP_BLE_GAP_EXT_SCAN_CFG_CODE_MASK,
|
||||
.uncoded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40},
|
||||
.coded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40},
|
||||
};
|
||||
|
||||
esp_err_t rc = esp_ble_gap_set_ext_scan_params(&ext_scan_params);
|
||||
if (rc) {
|
||||
log_e("set extend scan params error, error code = %x", rc);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is used to set the extended scan parameters to be used on the advertising channels.
|
||||
*
|
||||
* @param[in] params : scan parameters
|
||||
*
|
||||
* @return - ESP_OK : success
|
||||
* - other : failed
|
||||
*
|
||||
*/
|
||||
esp_err_t BLEScan::setExtScanParams(esp_ble_ext_scan_params_t* ext_scan_params)
|
||||
{
|
||||
esp_err_t rc = esp_ble_gap_set_ext_scan_params(ext_scan_params);
|
||||
if (rc) {
|
||||
log_e("set extend scan params error, error code = %x", rc);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is used to enable scanning.
|
||||
*
|
||||
* @param[in] duration : Scan duration
|
||||
* @param[in] period : Time interval from when the Controller started its last Scan Duration until it begins the subsequent Scan Duration.
|
||||
*
|
||||
* @return - ESP_OK : success
|
||||
* - other : failed
|
||||
*
|
||||
*/
|
||||
esp_err_t BLEScan::startExtScan(uint32_t duration, uint16_t period)
|
||||
{
|
||||
esp_err_t rc = esp_ble_gap_start_ext_scan(duration, period);
|
||||
if(rc) log_e("extended scan start failed: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
esp_err_t BLEScan::stopExtScan()
|
||||
{
|
||||
esp_err_t rc;
|
||||
rc = esp_ble_gap_stop_ext_scan();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void BLEScan::setPeriodicScanCallback(BLEPeriodicScanCallbacks* cb)
|
||||
{
|
||||
m_pPeriodicScanCb = cb;
|
||||
}
|
||||
|
||||
#endif // CONFIG_BT_BLE_50_FEATURES_SUPPORTED
|
||||
/**
|
||||
* @brief Set the interval to scan.
|
||||
* @param [in] The interval in msecs.
|
||||
|
Reference in New Issue
Block a user