From 67febb13c0719ca7eda6f52cceee0a06a7a3b45a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 30 Jan 2026 21:20:26 -0600 Subject: [PATCH] tweaks --- .../components/light/light_json_schema.cpp | 5 +++-- esphome/components/logger/logger.cpp | 8 +++++--- esphome/core/progmem.h | 19 +++++++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/esphome/components/light/light_json_schema.cpp b/esphome/components/light/light_json_schema.cpp index 874d3d547d..b44609fc02 100644 --- a/esphome/components/light/light_json_schema.cpp +++ b/esphome/components/light/light_json_schema.cpp @@ -15,11 +15,12 @@ PROGMEM_STRING_TABLE(ColorModeStrings, "onoff", "brightness", "white", "color_te "rgbww"); // Get JSON string for color mode. Returns nullptr for UNKNOWN (bit 0). -static const char *get_color_mode_json_str(ColorMode mode) { +// Returns ProgmemStr so ArduinoJson knows to handle PROGMEM strings on ESP8266. +static ProgmemStr get_color_mode_json_str(ColorMode mode) { unsigned bit = ColorModeBitPolicy::to_bit(mode); if (bit == 0) return nullptr; - return ColorModeStrings::get(bit - 1); + return ColorModeStrings::get_progmem_str(bit - 1); } void LightJSONSchema::dump_json(LightState &state, JsonObject root) { diff --git a/esphome/components/logger/logger.cpp b/esphome/components/logger/logger.cpp index c70520677a..fa732c2771 100644 --- a/esphome/components/logger/logger.cpp +++ b/esphome/components/logger/logger.cpp @@ -300,7 +300,8 @@ void Logger::dump_config() { "Logger:\n" " Max Level: %s\n" " Initial Level: %s", - LogLevelStrings::get(ESPHOME_LOG_LEVEL), LogLevelStrings::get(this->current_level_)); + LOG_STR_ARG(LogLevelStrings::get_log_str(ESPHOME_LOG_LEVEL)), + LOG_STR_ARG(LogLevelStrings::get_log_str(this->current_level_))); #ifndef USE_HOST ESP_LOGCONFIG(TAG, " Log Baud Rate: %" PRIu32 "\n" @@ -319,7 +320,7 @@ void Logger::dump_config() { #ifdef USE_LOGGER_RUNTIME_TAG_LEVELS for (auto &it : this->log_levels_) { - ESP_LOGCONFIG(TAG, " Level for '%s': %s", it.first, LogLevelStrings::get(it.second)); + ESP_LOGCONFIG(TAG, " Level for '%s': %s", it.first, LOG_STR_ARG(LogLevelStrings::get_log_str(it.second))); } #endif } @@ -327,7 +328,8 @@ void Logger::dump_config() { void Logger::set_log_level(uint8_t level) { if (level > ESPHOME_LOG_LEVEL) { level = ESPHOME_LOG_LEVEL; - ESP_LOGW(TAG, "Cannot set log level higher than pre-compiled %s", LogLevelStrings::get(ESPHOME_LOG_LEVEL)); + ESP_LOGW(TAG, "Cannot set log level higher than pre-compiled %s", + LOG_STR_ARG(LogLevelStrings::get_log_str(ESPHOME_LOG_LEVEL))); } this->current_level_ = level; #ifdef USE_LOGGER_LEVEL_LISTENERS diff --git a/esphome/core/progmem.h b/esphome/core/progmem.h index 581b063be9..7cf172dafc 100644 --- a/esphome/core/progmem.h +++ b/esphome/core/progmem.h @@ -20,7 +20,6 @@ #define ESPHOME_strcasecmp_P strcasecmp_P #define ESPHOME_strncmp_P strncmp_P #define ESPHOME_strncasecmp_P strncasecmp_P -#define progmem_read_byte(addr) pgm_read_byte(addr) // Type for pointers to PROGMEM strings (for use with ESPHOME_F return values) using ProgmemStr = const __FlashStringHelper *; #else @@ -34,7 +33,6 @@ using ProgmemStr = const __FlashStringHelper *; #define ESPHOME_strcasecmp_P strcasecmp #define ESPHOME_strncmp_P strncmp #define ESPHOME_strncasecmp_P strncasecmp -#define progmem_read_byte(addr) (*(addr)) // Type for pointers to strings (no PROGMEM on non-ESP8266 platforms) using ProgmemStr = const char *; #endif @@ -56,7 +54,8 @@ template struct FixedString { /// /// Example: /// PROGMEM_STRING_TABLE(MyStrings, "foo", "bar", "baz"); -/// const char *str = MyStrings::get(index); // 0-based index +/// ProgmemStr str = MyStrings::get_progmem_str(index); // For ArduinoJson +/// const LogString *log_str = MyStrings::get_log_str(index); // For ESP_LOG* /// template struct ProgmemStringTable { static constexpr size_t COUNT = sizeof...(Strs); @@ -83,8 +82,11 @@ template struct ProgmemStringTable { } }; +// Forward declaration for LogString (defined in log.h) +struct LogString; + /// Instantiate a ProgmemStringTable with PROGMEM storage. -/// Creates: Name::get(index), Name::COUNT, Name::BLOB_SIZE +/// Creates: Name::get_progmem_str(index), Name::get_log_str(index) #define PROGMEM_STRING_TABLE(Name, ...) \ struct Name { \ using Table = ProgmemStringTable<__VA_ARGS__>; \ @@ -92,10 +94,15 @@ template struct ProgmemStringTable { static constexpr size_t BLOB_SIZE = Table::BLOB_SIZE; \ static constexpr auto BLOB PROGMEM = Table::make_blob(); \ static constexpr auto OFFSETS PROGMEM = Table::make_offsets(); \ - static const char *get(uint8_t index) { \ + static ProgmemStr get_progmem_str(uint8_t index) { \ if (index >= COUNT) \ return nullptr; \ - return &BLOB[progmem_read_byte(&OFFSETS[index])]; \ + return reinterpret_cast(&BLOB[progmem_read_byte(&OFFSETS[index])]); \ + } \ + static const LogString *get_log_str(uint8_t index) { \ + if (index >= COUNT) \ + return nullptr; \ + return reinterpret_cast(&BLOB[progmem_read_byte(&OFFSETS[index])]); \ } \ }