1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-26 23:22:21 +01:00

Merge branch 'esp8266_component_source_progmem' into integration

This commit is contained in:
J. Nick Koston
2025-09-03 22:06:22 -05:00
3 changed files with 29 additions and 2 deletions

View File

@@ -12,6 +12,9 @@
#ifdef USE_RUNTIME_STATS
#include "esphome/components/runtime_stats/runtime_stats.h"
#endif
#ifdef USE_ESP8266
#include <pgmspace.h>
#endif
namespace esphome {
@@ -185,7 +188,19 @@ void Component::call() {
const char *Component::get_component_source() const {
if (this->component_source_ == nullptr)
return "<unknown>";
#ifdef USE_ESP8266
// On ESP8266, component_source_ is stored in PROGMEM
// We need a static buffer to hold the string when read from flash
// Since this is only used for logging, a single shared buffer is fine
static char buffer[64]; // Component names are typically short
// Copy from PROGMEM to buffer
strncpy_P(buffer, this->component_source_, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0'; // Ensure null termination
return buffer;
#else
return this->component_source_;
#endif
}
bool Component::should_warn_of_blocking(uint32_t blocking_time) {
if (blocking_time > this->warn_if_blocking_over_) {

View File

@@ -6,3 +6,14 @@
#ifdef USE_ARDUINO
#include <Arduino.h>
#endif
// Portable PROGMEM string macro
// On ESP8266, PSTR() stores strings in flash memory
// On other platforms, it's a no-op
#ifndef ESPHOME_PSTR
#ifdef USE_ESP8266
#define ESPHOME_PSTR(x) PSTR(x)
#else
#define ESPHOME_PSTR(x) (x)
#endif
#endif

View File

@@ -9,7 +9,7 @@ from esphome.const import (
)
from esphome.core import CORE, ID, coroutine
from esphome.coroutine import FakeAwaitable
from esphome.cpp_generator import add, get_variable
from esphome.cpp_generator import RawExpression, add, get_variable
from esphome.cpp_types import App
from esphome.types import ConfigFragmentType, ConfigType
from esphome.util import Registry, RegistryEntry
@@ -76,7 +76,8 @@ async def register_component(var, config):
"Error while finding name of component, please report this", exc_info=e
)
if name is not None:
add(var.set_component_source(name))
# Use ESPHOME_PSTR macro which stores strings in PROGMEM on ESP8266, no-op on other platforms
add(var.set_component_source(RawExpression(f'ESPHOME_PSTR("{name}")')))
add(App.register_component(var))
return var