Fix descriptors not being deleted (#4104)

This commit is contained in:
J. Nick Koston 2022-11-28 08:49:41 -10:00 committed by GitHub
parent 1166d93805
commit 75573a3ed1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 6 deletions

View file

@ -109,8 +109,7 @@ void BluetoothProxy::loop() {
// after sending them to save memory. If something actually needs them // after sending them to save memory. If something actually needs them
// it can parse them again. // it can parse them again.
for (auto &characteristic : service->characteristics) { for (auto &characteristic : service->characteristics) {
characteristic->parsed = false; characteristic->release_descriptors();
characteristic->descriptors.clear();
} }
connection->send_service_++; connection->send_service_++;
} }

View file

@ -16,6 +16,13 @@ BLECharacteristic::~BLECharacteristic() {
delete desc; // NOLINT(cppcoreguidelines-owning-memory) delete desc; // NOLINT(cppcoreguidelines-owning-memory)
} }
void BLECharacteristic::release_descriptors() {
this->parsed = false;
for (auto &desc : this->descriptors)
delete desc; // NOLINT(cppcoreguidelines-owning-memory)
this->descriptors.clear();
}
void BLECharacteristic::parse_descriptors() { void BLECharacteristic::parse_descriptors() {
this->parsed = true; this->parsed = true;
uint16_t offset = 0; uint16_t offset = 0;

View file

@ -24,6 +24,7 @@ class BLECharacteristic {
esp_gatt_char_prop_t properties; esp_gatt_char_prop_t properties;
std::vector<BLEDescriptor *> descriptors; std::vector<BLEDescriptor *> descriptors;
void parse_descriptors(); void parse_descriptors();
void release_descriptors();
BLEDescriptor *get_descriptor(espbt::ESPBTUUID uuid); BLEDescriptor *get_descriptor(espbt::ESPBTUUID uuid);
BLEDescriptor *get_descriptor(uint16_t uuid); BLEDescriptor *get_descriptor(uint16_t uuid);
BLEDescriptor *get_descriptor_by_handle(uint16_t handle); BLEDescriptor *get_descriptor_by_handle(uint16_t handle);

View file

@ -76,6 +76,13 @@ void BLEClientBase::disconnect() {
} }
} }
void BLEClientBase::release_services() {
for (auto &svc : this->services_)
delete svc; // NOLINT(cppcoreguidelines-owning-memory)
this->services_.clear();
esp_ble_gattc_cache_clean(this->remote_bda_);
}
bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if, bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if,
esp_ble_gattc_cb_param_t *param) { esp_ble_gattc_cb_param_t *param) {
if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id) if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id)
@ -132,10 +139,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
return false; return false;
ESP_LOGV(TAG, "[%d] [%s] ESP_GATTC_DISCONNECT_EVT, reason %d", this->connection_index_, ESP_LOGV(TAG, "[%d] [%s] ESP_GATTC_DISCONNECT_EVT, reason %d", this->connection_index_,
this->address_str_.c_str(), param->disconnect.reason); this->address_str_.c_str(), param->disconnect.reason);
for (auto &svc : this->services_) this->release_services();
delete svc; // NOLINT(cppcoreguidelines-owning-memory)
this->services_.clear();
esp_ble_gattc_cache_clean(this->remote_bda_);
this->set_state(espbt::ClientState::IDLE); this->set_state(espbt::ClientState::IDLE);
break; break;
} }

View file

@ -34,6 +34,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override; void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
void connect() override; void connect() override;
void disconnect(); void disconnect();
void release_services();
bool connected() { return this->state_ == espbt::ClientState::ESTABLISHED; } bool connected() { return this->state_ == espbt::ClientState::ESTABLISHED; }

View file

@ -29,6 +29,13 @@ BLEService::~BLEService() {
delete chr; // NOLINT(cppcoreguidelines-owning-memory) delete chr; // NOLINT(cppcoreguidelines-owning-memory)
} }
void BLEService::release_characteristics() {
this->parsed = false;
for (auto &chr : this->characteristics)
delete chr; // NOLINT(cppcoreguidelines-owning-memory)
this->characteristics.clear();
}
void BLEService::parse_characteristics() { void BLEService::parse_characteristics() {
this->parsed = true; this->parsed = true;
uint16_t offset = 0; uint16_t offset = 0;

View file

@ -25,6 +25,7 @@ class BLEService {
std::vector<BLECharacteristic *> characteristics; std::vector<BLECharacteristic *> characteristics;
BLEClientBase *client; BLEClientBase *client;
void parse_characteristics(); void parse_characteristics();
void release_characteristics();
BLECharacteristic *get_characteristic(espbt::ESPBTUUID uuid); BLECharacteristic *get_characteristic(espbt::ESPBTUUID uuid);
BLECharacteristic *get_characteristic(uint16_t uuid); BLECharacteristic *get_characteristic(uint16_t uuid);
}; };