mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
[wifi] Use StringRef for WiFiConnectStateListener to avoid heap allocation
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include "esphome/core/automation.h"
|
||||
#include "esphome/core/component.h"
|
||||
#include "esphome/core/helpers.h"
|
||||
#include "esphome/core/string_ref.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -274,7 +275,7 @@ class WiFiScanResultsListener {
|
||||
*/
|
||||
class WiFiConnectStateListener {
|
||||
public:
|
||||
virtual void on_wifi_connect_state(const std::string &ssid, const bssid_t &bssid) = 0;
|
||||
virtual void on_wifi_connect_state(StringRef ssid, const bssid_t &bssid) = 0;
|
||||
};
|
||||
|
||||
/** Listener interface for WiFi power save mode changes.
|
||||
|
||||
@@ -525,8 +525,10 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) {
|
||||
it.channel);
|
||||
s_sta_connected = true;
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
bssid_t bssid;
|
||||
std::copy_n(it.bssid, 6, bssid.begin());
|
||||
for (auto *listener : global_wifi_component->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state(global_wifi_component->wifi_ssid(), global_wifi_component->wifi_bssid());
|
||||
listener->on_wifi_connect_state(StringRef(buf, it.ssid_len), bssid);
|
||||
}
|
||||
// For static IP configurations, GOT_IP event may not fire, so notify IP listeners here
|
||||
#ifdef USE_WIFI_MANUAL_IP
|
||||
@@ -560,7 +562,7 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) {
|
||||
s_sta_connecting = false;
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
for (auto *listener : global_wifi_component->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state("", bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
listener->on_wifi_connect_state(StringRef(), bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
@@ -736,8 +736,10 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
|
||||
format_mac_address_pretty(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode));
|
||||
s_sta_connected = true;
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
bssid_t bssid;
|
||||
std::copy_n(it.bssid, 6, bssid.begin());
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state(this->wifi_ssid(), this->wifi_bssid());
|
||||
listener->on_wifi_connect_state(StringRef(buf, it.ssid_len), bssid);
|
||||
}
|
||||
// For static IP configurations, GOT_IP event may not fire, so notify IP listeners here
|
||||
#ifdef USE_WIFI_MANUAL_IP
|
||||
@@ -773,7 +775,7 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
|
||||
error_from_callback_ = true;
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state("", bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
listener->on_wifi_connect_state(StringRef(), bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -302,8 +302,10 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
|
||||
ESP_LOGV(TAG, "Connected ssid='%s' bssid=" LOG_SECRET("%s") " channel=%u, authmode=%s", buf,
|
||||
format_mac_address_pretty(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode));
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
bssid_t bssid;
|
||||
std::copy_n(it.bssid, 6, bssid.begin());
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state(this->wifi_ssid(), this->wifi_bssid());
|
||||
listener->on_wifi_connect_state(StringRef(buf, it.ssid_len), bssid);
|
||||
}
|
||||
// For static IP configurations, GOT_IP event may not fire, so notify IP listeners here
|
||||
#ifdef USE_WIFI_MANUAL_IP
|
||||
@@ -358,7 +360,7 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
|
||||
s_sta_connecting = false;
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state("", bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
listener->on_wifi_connect_state(StringRef(), bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
@@ -256,8 +256,10 @@ void WiFiComponent::wifi_loop_() {
|
||||
s_sta_was_connected = true;
|
||||
ESP_LOGV(TAG, "Connected");
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
String ssid = WiFi.SSID();
|
||||
bssid_t bssid = this->wifi_bssid();
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state(this->wifi_ssid(), this->wifi_bssid());
|
||||
listener->on_wifi_connect_state(StringRef(ssid.c_str(), ssid.length()), bssid);
|
||||
}
|
||||
// For static IP configurations, notify IP listeners immediately as the IP is already configured
|
||||
#ifdef USE_WIFI_MANUAL_IP
|
||||
@@ -276,7 +278,7 @@ void WiFiComponent::wifi_loop_() {
|
||||
ESP_LOGV(TAG, "Disconnected");
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
for (auto *listener : this->connect_state_listeners_) {
|
||||
listener->on_wifi_connect_state("", bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
listener->on_wifi_connect_state(StringRef(), bssid_t({0, 0, 0, 0, 0, 0}));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -103,8 +103,8 @@ void SSIDWiFiInfo::setup() { wifi::global_wifi_component->add_connect_state_list
|
||||
|
||||
void SSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "SSID", this); }
|
||||
|
||||
void SSIDWiFiInfo::on_wifi_connect_state(const std::string &ssid, const wifi::bssid_t &bssid) {
|
||||
this->publish_state(ssid);
|
||||
void SSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, const wifi::bssid_t &bssid) {
|
||||
this->publish_state(ssid.str());
|
||||
}
|
||||
|
||||
/****************
|
||||
@@ -115,7 +115,7 @@ void BSSIDWiFiInfo::setup() { wifi::global_wifi_component->add_connect_state_lis
|
||||
|
||||
void BSSIDWiFiInfo::dump_config() { LOG_TEXT_SENSOR("", "BSSID", this); }
|
||||
|
||||
void BSSIDWiFiInfo::on_wifi_connect_state(const std::string &ssid, const wifi::bssid_t &bssid) {
|
||||
void BSSIDWiFiInfo::on_wifi_connect_state(StringRef ssid, const wifi::bssid_t &bssid) {
|
||||
char buf[18] = "unknown";
|
||||
if (mac_address_is_valid(bssid.data())) {
|
||||
format_mac_addr_upper(bssid.data(), buf);
|
||||
|
||||
@@ -52,7 +52,7 @@ class SSIDWiFiInfo final : public Component, public text_sensor::TextSensor, pub
|
||||
void dump_config() override;
|
||||
|
||||
// WiFiConnectStateListener interface
|
||||
void on_wifi_connect_state(const std::string &ssid, const wifi::bssid_t &bssid) override;
|
||||
void on_wifi_connect_state(StringRef ssid, const wifi::bssid_t &bssid) override;
|
||||
};
|
||||
|
||||
class BSSIDWiFiInfo final : public Component, public text_sensor::TextSensor, public wifi::WiFiConnectStateListener {
|
||||
@@ -61,7 +61,7 @@ class BSSIDWiFiInfo final : public Component, public text_sensor::TextSensor, pu
|
||||
void dump_config() override;
|
||||
|
||||
// WiFiConnectStateListener interface
|
||||
void on_wifi_connect_state(const std::string &ssid, const wifi::bssid_t &bssid) override;
|
||||
void on_wifi_connect_state(StringRef ssid, const wifi::bssid_t &bssid) override;
|
||||
};
|
||||
|
||||
class PowerSaveModeWiFiInfo final : public Component,
|
||||
|
||||
@@ -28,7 +28,7 @@ class WiFiSignalSensor : public sensor::Sensor, public PollingComponent {
|
||||
|
||||
#ifdef USE_WIFI_LISTENERS
|
||||
// WiFiConnectStateListener interface - update RSSI immediately on connect
|
||||
void on_wifi_connect_state(const std::string &ssid, const wifi::bssid_t &bssid) override { this->update(); }
|
||||
void on_wifi_connect_state(StringRef ssid, const wifi::bssid_t &bssid) override { this->update(); }
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user