mirror of
https://github.com/esphome/esphome.git
synced 2025-07-30 23:26:36 +00:00
Openthread add Teardown (#9275)
Co-authored-by: mc <mc@debian> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
f733c43dec
commit
9d43ddd6f1
@ -1,6 +1,9 @@
|
|||||||
#include "esphome/core/defines.h"
|
#include "esphome/core/defines.h"
|
||||||
#ifdef USE_OPENTHREAD
|
#ifdef USE_OPENTHREAD
|
||||||
#include "openthread.h"
|
#include "openthread.h"
|
||||||
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
|
||||||
|
#include "esp_openthread.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <freertos/portmacro.h>
|
#include <freertos/portmacro.h>
|
||||||
|
|
||||||
@ -28,18 +31,6 @@ OpenThreadComponent *global_openthread_component = // NOLINT(cppcoreguidelines-
|
|||||||
|
|
||||||
OpenThreadComponent::OpenThreadComponent() { global_openthread_component = this; }
|
OpenThreadComponent::OpenThreadComponent() { global_openthread_component = this; }
|
||||||
|
|
||||||
OpenThreadComponent::~OpenThreadComponent() {
|
|
||||||
auto lock = InstanceLock::try_acquire(100);
|
|
||||||
if (!lock) {
|
|
||||||
ESP_LOGW(TAG, "Failed to acquire OpenThread lock in destructor, leaking memory");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
otInstance *instance = lock->get_instance();
|
|
||||||
otSrpClientClearHostAndServices(instance);
|
|
||||||
otSrpClientBuffersFreeAllServices(instance);
|
|
||||||
global_openthread_component = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OpenThreadComponent::is_connected() {
|
bool OpenThreadComponent::is_connected() {
|
||||||
auto lock = InstanceLock::try_acquire(100);
|
auto lock = InstanceLock::try_acquire(100);
|
||||||
if (!lock) {
|
if (!lock) {
|
||||||
@ -199,6 +190,33 @@ void *OpenThreadSrpComponent::pool_alloc_(size_t size) {
|
|||||||
|
|
||||||
void OpenThreadSrpComponent::set_mdns(esphome::mdns::MDNSComponent *mdns) { this->mdns_ = mdns; }
|
void OpenThreadSrpComponent::set_mdns(esphome::mdns::MDNSComponent *mdns) { this->mdns_ = mdns; }
|
||||||
|
|
||||||
|
bool OpenThreadComponent::teardown() {
|
||||||
|
if (!this->teardown_started_) {
|
||||||
|
this->teardown_started_ = true;
|
||||||
|
ESP_LOGD(TAG, "Clear Srp");
|
||||||
|
auto lock = InstanceLock::try_acquire(100);
|
||||||
|
if (!lock) {
|
||||||
|
ESP_LOGW(TAG, "Failed to acquire OpenThread lock during teardown, leaking memory");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
otInstance *instance = lock->get_instance();
|
||||||
|
otSrpClientClearHostAndServices(instance);
|
||||||
|
otSrpClientBuffersFreeAllServices(instance);
|
||||||
|
global_openthread_component = nullptr;
|
||||||
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
|
||||||
|
ESP_LOGD(TAG, "Exit main loop ");
|
||||||
|
int error = esp_openthread_mainloop_exit();
|
||||||
|
if (error != ESP_OK) {
|
||||||
|
ESP_LOGW(TAG, "Failed attempt to stop main loop %d", error);
|
||||||
|
this->teardown_complete_ = true;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
this->teardown_complete_ = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return this->teardown_complete_;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace openthread
|
} // namespace openthread
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ class OpenThreadComponent : public Component {
|
|||||||
OpenThreadComponent();
|
OpenThreadComponent();
|
||||||
~OpenThreadComponent();
|
~OpenThreadComponent();
|
||||||
void setup() override;
|
void setup() override;
|
||||||
|
bool teardown() override;
|
||||||
float get_setup_priority() const override { return setup_priority::WIFI; }
|
float get_setup_priority() const override { return setup_priority::WIFI; }
|
||||||
|
|
||||||
bool is_connected();
|
bool is_connected();
|
||||||
@ -30,6 +31,8 @@ class OpenThreadComponent : public Component {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::optional<otIp6Address> get_omr_address_(InstanceLock &lock);
|
std::optional<otIp6Address> get_omr_address_(InstanceLock &lock);
|
||||||
|
bool teardown_started_{false};
|
||||||
|
bool teardown_complete_{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern OpenThreadComponent *global_openthread_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
extern OpenThreadComponent *global_openthread_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
@ -143,10 +143,13 @@ void OpenThreadComponent::ot_main() {
|
|||||||
esp_openthread_launch_mainloop();
|
esp_openthread_launch_mainloop();
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
|
esp_openthread_deinit();
|
||||||
esp_openthread_netif_glue_deinit();
|
esp_openthread_netif_glue_deinit();
|
||||||
esp_netif_destroy(openthread_netif);
|
esp_netif_destroy(openthread_netif);
|
||||||
|
|
||||||
esp_vfs_eventfd_unregister();
|
esp_vfs_eventfd_unregister();
|
||||||
|
this->teardown_complete_ = true;
|
||||||
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
network::IPAddresses OpenThreadComponent::get_ip_addresses() {
|
network::IPAddresses OpenThreadComponent::get_ip_addresses() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user