Fix safe mode ota flashing under certain configurations (#1534)

* Fix safe mode ota flashing under certain configurations by allowing the arduino loop to run instead of while(true)

* rename to should_enter_safe_mode

* Fix line length
This commit is contained in:
Jesse Hills 2021-02-18 12:26:59 +13:00
parent eacac78099
commit c519c02de8
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A
3 changed files with 8 additions and 6 deletions

View File

@ -1,3 +1,4 @@
from esphome.cpp_generator import RawExpression
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.const import (
@ -31,7 +32,9 @@ def to_code(config):
yield cg.register_component(var, config)
if config[CONF_SAFE_MODE]:
cg.add(var.start_safe_mode(config[CONF_NUM_ATTEMPTS], config[CONF_REBOOT_TIMEOUT]))
condition = var.should_enter_safe_mode(config[CONF_NUM_ATTEMPTS],
config[CONF_REBOOT_TIMEOUT])
cg.add(RawExpression(f"if ({condition}) return"))
if CORE.is_esp8266:
cg.add_library('Update', None)

View File

@ -355,7 +355,7 @@ void OTAComponent::set_auth_password(const std::string &password) { this->passwo
float OTAComponent::get_setup_priority() const { return setup_priority::AFTER_WIFI; }
uint16_t OTAComponent::get_port() const { return this->port_; }
void OTAComponent::set_port(uint16_t port) { this->port_ = port; }
void OTAComponent::start_safe_mode(uint8_t num_attempts, uint32_t enable_time) {
bool OTAComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time) {
this->has_safe_mode_ = true;
this->safe_mode_start_time_ = millis();
this->safe_mode_enable_time_ = enable_time;
@ -380,12 +380,11 @@ void OTAComponent::start_safe_mode(uint8_t num_attempts, uint32_t enable_time) {
ESP_LOGI(TAG, "Waiting for OTA attempt.");
while (true) {
App.loop();
}
return true;
} else {
// increment counter
this->write_rtc_(this->safe_mode_rtc_value_ + 1);
return false;
}
}
void OTAComponent::write_rtc_(uint32_t val) { this->rtc_.save(&val); }

View File

@ -47,7 +47,7 @@ class OTAComponent : public Component {
/// Manually set the port OTA should listen on.
void set_port(uint16_t port);
void start_safe_mode(uint8_t num_attempts, uint32_t enable_time);
bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time);
// ========== INTERNAL METHODS ==========
// (In most use cases you won't need these)