From bb3784204153192b163e90eea1aa337044080760 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Oct 2026 17:40:19 -1000 Subject: [PATCH] [epaper_spi] Keep the state name table in flash --- esphome/components/epaper_spi/epaper_spi.cpp | 27 +++++++++----------- esphome/components/epaper_spi/epaper_spi.h | 2 +- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/esphome/components/epaper_spi/epaper_spi.cpp b/esphome/components/epaper_spi/epaper_spi.cpp index 7b962d59ea8..1c55f1cd391 100644 --- a/esphome/components/epaper_spi/epaper_spi.cpp +++ b/esphome/components/epaper_spi/epaper_spi.cpp @@ -3,21 +3,18 @@ #include "esphome/core/application.h" #include "esphome/core/helpers.h" #include "esphome/core/log.h" +#include "esphome/core/progmem.h" namespace esphome::epaper_spi { ESPHOME_LOG_TAG(TAG, "epaper_spi"); static constexpr size_t EPAPER_MAX_CMD_LOG_BYTES = 128; -static constexpr const char *const EPAPER_STATE_STRINGS[] = { - "IDLE", "UPDATE", "RESET", "RESET_END", "SHOULD_WAIT", "INITIALISE", - "TRANSFER_DATA", "POWER_ON", "REFRESH_SCREEN", "POWER_OFF", "DEEP_SLEEP", -}; +PROGMEM_STRING_TABLE(EPaperStateStrings, "IDLE", "UPDATE", "RESET", "RESET_END", "SHOULD_WAIT", "INITIALISE", + "TRANSFER_DATA", "POWER_ON", "REFRESH_SCREEN", "POWER_OFF", "DEEP_SLEEP", "Unknown"); -const char *EPaperBase::epaper_state_to_string_() { - if (auto idx = static_cast(this->state_); idx < std::size(EPAPER_STATE_STRINGS)) - return EPAPER_STATE_STRINGS[idx]; - return "Unknown"; +const LogString *EPaperBase::epaper_state_to_string_() { + return EPaperStateStrings::get_log_str(static_cast(this->state_), EPaperStateStrings::LAST_INDEX); } void EPaperBase::setup() { @@ -120,7 +117,7 @@ void EPaperBase::update_effective_transform_() { void EPaperBase::update() { if (this->state_ != EPaperState::IDLE) { - ESP_LOGE(TAG, "Display already in state %s", epaper_state_to_string_()); + ESP_LOGE(TAG, "Display already in state %s", LOG_STR_ARG(epaper_state_to_string_())); return; } this->set_state_(EPaperState::UPDATE); @@ -160,7 +157,7 @@ void EPaperBase::loop() { } #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE if (now - this->waiting_for_idle_last_print_ >= 1000) { - ESP_LOGV(TAG, "Waiting for idle in state %s", this->epaper_state_to_string_()); + ESP_LOGV(TAG, "Waiting for idle in state %s", LOG_STR_ARG(this->epaper_state_to_string_())); this->waiting_for_idle_last_print_ = millis(); } #endif @@ -173,7 +170,7 @@ void EPaperBase::loop() { // The busy pin never cleared: give up on this update so later ones are not refused, and make the next one full void EPaperBase::abandon_update_() { ESP_LOGE(TAG, "Display stayed busy for %u s in state %s; check the busy pin", (unsigned) this->busy_timeout_seconds_, - this->epaper_state_to_string_()); + LOG_STR_ARG(this->epaper_state_to_string_())); this->status_set_warning(LOG_STR("Busy pin timeout")); if (this->state_ == EPaperState::TRANSFER_DATA) this->abort_transfer(); @@ -193,10 +190,10 @@ void EPaperBase::abandon_update_() { * Should a subclassed class need to override this, the method will need to be made virtual. */ void EPaperBase::process_state_() { - ESP_LOGV(TAG, "Process state entered in state %s", epaper_state_to_string_()); + ESP_LOGV(TAG, "Process state entered in state %s", LOG_STR_ARG(epaper_state_to_string_())); switch (this->state_) { default: - ESP_LOGE(TAG, "Display is in unhandled state %s", epaper_state_to_string_()); + ESP_LOGE(TAG, "Display is in unhandled state %s", LOG_STR_ARG(epaper_state_to_string_())); this->set_state_(EPaperState::IDLE); break; case EPaperState::IDLE: @@ -266,7 +263,7 @@ void EPaperBase::process_state_() { } void EPaperBase::set_state_(EPaperState state, uint16_t delay) { - ESP_LOGV(TAG, "Exit state %s", this->epaper_state_to_string_()); + ESP_LOGV(TAG, "Exit state %s", LOG_STR_ARG(this->epaper_state_to_string_())); this->state_ = state; this->wait_for_idle_(state > EPaperState::SHOULD_WAIT); // allow subclasses to nominate delays @@ -274,7 +271,7 @@ void EPaperBase::set_state_(EPaperState state, uint16_t delay) { delay = this->next_delay_; this->next_delay_ = 0; this->delay_until_ = millis() + delay; - ESP_LOGV(TAG, "Enter state %s, delay %u, wait_for_idle=%s", this->epaper_state_to_string_(), delay, + ESP_LOGV(TAG, "Enter state %s, delay %u, wait_for_idle=%s", LOG_STR_ARG(this->epaper_state_to_string_()), delay, TRUEFALSE(this->waiting_for_idle_)); if (state == EPaperState::IDLE) { this->disable_loop(); diff --git a/esphome/components/epaper_spi/epaper_spi.h b/esphome/components/epaper_spi/epaper_spi.h index 384b9cb0181..415d518acf4 100644 --- a/esphome/components/epaper_spi/epaper_spi.h +++ b/esphome/components/epaper_spi/epaper_spi.h @@ -121,7 +121,7 @@ class EPaperBase : public Display, bool is_using_partial_update_() const { return this->full_update_every_ > 1; } void process_state_(); - const char *epaper_state_to_string_(); + const LogString *epaper_state_to_string_(); bool is_idle_() const; void setup_pins_() const; virtual bool reset();