mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
Use PSRam for BLE scan results. (#4486)
* Use PSRam for BLE scan results. * Format Document * Use generic define `CONFIG_SPIRAM`. * Formatting changes. * Memory allocation is allowed to fail. * Use mark_failed instead of abort. --------- Co-authored-by: Your Name <you@example.com> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
2ef25f3153
commit
5e6665494d
2 changed files with 17 additions and 4 deletions
|
@ -53,6 +53,14 @@ void ESP32BLETracker::setup() {
|
||||||
ESP_LOGE(TAG, "BLE Tracker was marked failed by ESP32BLE");
|
ESP_LOGE(TAG, "BLE Tracker was marked failed by ESP32BLE");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ExternalRAMAllocator<esp_ble_gap_cb_param_t::ble_scan_result_evt_param> allocator(
|
||||||
|
ExternalRAMAllocator<esp_ble_gap_cb_param_t::ble_scan_result_evt_param>::ALLOW_FAILURE);
|
||||||
|
this->scan_result_buffer_ = allocator.allocate(ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE);
|
||||||
|
|
||||||
|
if (this->scan_result_buffer_ == nullptr) {
|
||||||
|
ESP_LOGE(TAG, "Could not allocate buffer for BLE Tracker!");
|
||||||
|
this->mark_failed();
|
||||||
|
}
|
||||||
|
|
||||||
global_esp32_ble_tracker = this;
|
global_esp32_ble_tracker = this;
|
||||||
this->scan_result_lock_ = xSemaphoreCreateMutex();
|
this->scan_result_lock_ = xSemaphoreCreateMutex();
|
||||||
|
@ -107,7 +115,7 @@ void ESP32BLETracker::loop() {
|
||||||
xSemaphoreTake(this->scan_result_lock_, 5L / portTICK_PERIOD_MS)) {
|
xSemaphoreTake(this->scan_result_lock_, 5L / portTICK_PERIOD_MS)) {
|
||||||
uint32_t index = this->scan_result_index_;
|
uint32_t index = this->scan_result_index_;
|
||||||
if (index) {
|
if (index) {
|
||||||
if (index >= 16) {
|
if (index >= ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE) {
|
||||||
ESP_LOGW(TAG, "Too many BLE events to process. Some devices may not show up.");
|
ESP_LOGW(TAG, "Too many BLE events to process. Some devices may not show up.");
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < index; i++) {
|
for (size_t i = 0; i < index; i++) {
|
||||||
|
@ -322,7 +330,7 @@ void ESP32BLETracker::gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_
|
||||||
void ESP32BLETracker::gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param ¶m) {
|
void ESP32BLETracker::gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param ¶m) {
|
||||||
if (param.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT) {
|
if (param.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT) {
|
||||||
if (xSemaphoreTake(this->scan_result_lock_, 0L)) {
|
if (xSemaphoreTake(this->scan_result_lock_, 0L)) {
|
||||||
if (this->scan_result_index_ < 16) {
|
if (this->scan_result_index_ < ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE) {
|
||||||
this->scan_result_buffer_[this->scan_result_index_++] = param;
|
this->scan_result_buffer_[this->scan_result_index_++] = param;
|
||||||
}
|
}
|
||||||
xSemaphoreGive(this->scan_result_lock_);
|
xSemaphoreGive(this->scan_result_lock_);
|
||||||
|
|
|
@ -101,7 +101,7 @@ class ESPBTDevice {
|
||||||
std::vector<int8_t> tx_powers_{};
|
std::vector<int8_t> tx_powers_{};
|
||||||
optional<uint16_t> appearance_{};
|
optional<uint16_t> appearance_{};
|
||||||
optional<uint8_t> ad_flag_{};
|
optional<uint8_t> ad_flag_{};
|
||||||
std::vector<ESPBTUUID> service_uuids_;
|
std::vector<ESPBTUUID> service_uuids_{};
|
||||||
std::vector<ServiceData> manufacturer_datas_{};
|
std::vector<ServiceData> manufacturer_datas_{};
|
||||||
std::vector<ServiceData> service_datas_{};
|
std::vector<ServiceData> service_datas_{};
|
||||||
esp_ble_gap_cb_param_t::ble_scan_result_evt_param scan_result_{};
|
esp_ble_gap_cb_param_t::ble_scan_result_evt_param scan_result_{};
|
||||||
|
@ -231,7 +231,12 @@ class ESP32BLETracker : public Component, public GAPEventHandler, public GATTcEv
|
||||||
SemaphoreHandle_t scan_result_lock_;
|
SemaphoreHandle_t scan_result_lock_;
|
||||||
SemaphoreHandle_t scan_end_lock_;
|
SemaphoreHandle_t scan_end_lock_;
|
||||||
size_t scan_result_index_{0};
|
size_t scan_result_index_{0};
|
||||||
esp_ble_gap_cb_param_t::ble_scan_result_evt_param scan_result_buffer_[16];
|
#if CONFIG_SPIRAM
|
||||||
|
const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 32;
|
||||||
|
#else
|
||||||
|
const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 16;
|
||||||
|
#endif // CONFIG_SPIRAM
|
||||||
|
esp_ble_gap_cb_param_t::ble_scan_result_evt_param *scan_result_buffer_;
|
||||||
esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
|
esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
|
||||||
esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
|
esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue