mirror of
https://github.com/esphome/esphome.git
synced 2025-10-28 05:33:53 +00:00
[wifi] Optimize WiFi network storage with FixedVector (#11458)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
@@ -378,14 +378,19 @@ async def to_code(config):
|
|||||||
# Track if any network uses Enterprise authentication
|
# Track if any network uses Enterprise authentication
|
||||||
has_eap = False
|
has_eap = False
|
||||||
|
|
||||||
def add_sta(ap, network):
|
# Initialize FixedVector with the count of networks
|
||||||
ip_config = network.get(CONF_MANUAL_IP, config.get(CONF_MANUAL_IP))
|
networks = config.get(CONF_NETWORKS, [])
|
||||||
cg.add(var.add_sta(wifi_network(network, ap, ip_config)))
|
if networks:
|
||||||
|
cg.add(var.init_sta(len(networks)))
|
||||||
|
|
||||||
for network in config.get(CONF_NETWORKS, []):
|
def add_sta(ap: cg.MockObj, network: dict) -> None:
|
||||||
if CONF_EAP in network:
|
ip_config = network.get(CONF_MANUAL_IP, config.get(CONF_MANUAL_IP))
|
||||||
has_eap = True
|
cg.add(var.add_sta(wifi_network(network, ap, ip_config)))
|
||||||
cg.with_local_variable(network[CONF_ID], WiFiAP(), add_sta, network)
|
|
||||||
|
for network in networks:
|
||||||
|
if CONF_EAP in network:
|
||||||
|
has_eap = True
|
||||||
|
cg.with_local_variable(network[CONF_ID], WiFiAP(), add_sta, network)
|
||||||
|
|
||||||
if CONF_AP in config:
|
if CONF_AP in config:
|
||||||
conf = config[CONF_AP]
|
conf = config[CONF_AP]
|
||||||
|
|||||||
@@ -330,9 +330,11 @@ float WiFiComponent::get_loop_priority() const {
|
|||||||
return 10.0f; // before other loop components
|
return 10.0f; // before other loop components
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WiFiComponent::init_sta(size_t count) { this->sta_.init(count); }
|
||||||
void WiFiComponent::add_sta(const WiFiAP &ap) { this->sta_.push_back(ap); }
|
void WiFiComponent::add_sta(const WiFiAP &ap) { this->sta_.push_back(ap); }
|
||||||
void WiFiComponent::set_sta(const WiFiAP &ap) {
|
void WiFiComponent::set_sta(const WiFiAP &ap) {
|
||||||
this->clear_sta();
|
this->clear_sta();
|
||||||
|
this->init_sta(1);
|
||||||
this->add_sta(ap);
|
this->add_sta(ap);
|
||||||
}
|
}
|
||||||
void WiFiComponent::clear_sta() { this->sta_.clear(); }
|
void WiFiComponent::clear_sta() { this->sta_.clear(); }
|
||||||
|
|||||||
@@ -219,6 +219,7 @@ class WiFiComponent : public Component {
|
|||||||
|
|
||||||
void set_sta(const WiFiAP &ap);
|
void set_sta(const WiFiAP &ap);
|
||||||
WiFiAP get_sta() { return this->selected_ap_; }
|
WiFiAP get_sta() { return this->selected_ap_; }
|
||||||
|
void init_sta(size_t count);
|
||||||
void add_sta(const WiFiAP &ap);
|
void add_sta(const WiFiAP &ap);
|
||||||
void clear_sta();
|
void clear_sta();
|
||||||
|
|
||||||
@@ -393,7 +394,7 @@ class WiFiComponent : public Component {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string use_address_;
|
std::string use_address_;
|
||||||
std::vector<WiFiAP> sta_;
|
FixedVector<WiFiAP> sta_;
|
||||||
std::vector<WiFiSTAPriority> sta_priorities_;
|
std::vector<WiFiSTAPriority> sta_priorities_;
|
||||||
wifi_scan_vector_t<WiFiScanResult> scan_result_;
|
wifi_scan_vector_t<WiFiScanResult> scan_result_;
|
||||||
WiFiAP selected_ap_;
|
WiFiAP selected_ap_;
|
||||||
|
|||||||
@@ -194,12 +194,8 @@ template<typename T> class FixedVector {
|
|||||||
size_ = 0;
|
size_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
// Helper to assign from initializer list (shared by constructor and assignment operator)
|
||||||
FixedVector() = default;
|
void assign_from_initializer_list_(std::initializer_list<T> init_list) {
|
||||||
|
|
||||||
/// Constructor from initializer list - allocates exact size needed
|
|
||||||
/// This enables brace initialization: FixedVector<int> v = {1, 2, 3};
|
|
||||||
FixedVector(std::initializer_list<T> init_list) {
|
|
||||||
init(init_list.size());
|
init(init_list.size());
|
||||||
size_t idx = 0;
|
size_t idx = 0;
|
||||||
for (const auto &item : init_list) {
|
for (const auto &item : init_list) {
|
||||||
@@ -209,6 +205,13 @@ template<typename T> class FixedVector {
|
|||||||
size_ = init_list.size();
|
size_ = init_list.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
FixedVector() = default;
|
||||||
|
|
||||||
|
/// Constructor from initializer list - allocates exact size needed
|
||||||
|
/// This enables brace initialization: FixedVector<int> v = {1, 2, 3};
|
||||||
|
FixedVector(std::initializer_list<T> init_list) { assign_from_initializer_list_(init_list); }
|
||||||
|
|
||||||
~FixedVector() { cleanup_(); }
|
~FixedVector() { cleanup_(); }
|
||||||
|
|
||||||
// Disable copy operations (avoid accidental expensive copies)
|
// Disable copy operations (avoid accidental expensive copies)
|
||||||
@@ -234,6 +237,15 @@ template<typename T> class FixedVector {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Assignment from initializer list - avoids temporary and move overhead
|
||||||
|
/// This enables: FixedVector<int> v; v = {1, 2, 3};
|
||||||
|
FixedVector &operator=(std::initializer_list<T> init_list) {
|
||||||
|
cleanup_();
|
||||||
|
reset_();
|
||||||
|
assign_from_initializer_list_(init_list);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate capacity - can be called multiple times to reinit
|
// Allocate capacity - can be called multiple times to reinit
|
||||||
void init(size_t n) {
|
void init(size_t n) {
|
||||||
cleanup_();
|
cleanup_();
|
||||||
|
|||||||
Reference in New Issue
Block a user