5 #include <driver/uart.h> 7 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \ 8 defined(USE_ESP32_VARIANT_ESP32H2) 9 #include <driver/usb_serial_jtag.h> 10 #include <esp_vfs_dev.h> 11 #include <esp_vfs_usb_serial_jtag.h> 14 #include "freertos/FreeRTOS.h" 15 #include "esp_idf_version.h" 23 #if defined(USE_ESP32_FRAMEWORK_ARDUINO) || defined(USE_ESP_IDF) 25 #endif // USE_ESP32_FRAMEWORK_ARDUINO || USE_ESP_IDF 32 static const char *
const TAG =
"logger";
34 static const char *
const LOG_LEVEL_COLORS[] = {
36 ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED),
37 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_YELLOW),
38 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GREEN),
39 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_MAGENTA),
40 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_CYAN),
41 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GRAY),
42 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_WHITE),
44 static const char *
const LOG_LEVEL_LETTERS[] = {
61 const char *color = LOG_LEVEL_COLORS[level];
62 const char *letter = LOG_LEVEL_LETTERS[level];
78 #ifdef USE_STORE_LOG_STR_IN_FLASH 87 auto *format_pgm_p =
reinterpret_cast<const uint8_t *
>(format);
111 uart_config_t uart_config{};
113 uart_config.data_bits = UART_DATA_8_BITS;
114 uart_config.parity = UART_PARITY_DISABLE;
115 uart_config.stop_bits = UART_STOP_BITS_1;
116 uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
117 #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) 118 uart_config.source_clk = UART_SCLK_DEFAULT;
120 uart_param_config(this->
uart_num_, &uart_config);
123 uart_driver_install(this->
uart_num_, uart_buffer_size, uart_buffer_size, 10,
nullptr, 0);
126 #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 130 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \ 131 defined(USE_ESP32_VARIANT_ESP32H2) 133 setvbuf(stdin, NULL, _IONBF, 0);
136 esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR);
138 esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF);
141 fcntl(fileno(stdout), F_SETFL, 0);
142 fcntl(fileno(stdin), F_SETFL, 0);
144 usb_serial_jtag_driver_config_t usb_serial_jtag_config{};
145 usb_serial_jtag_config.rx_buffer_size = 512;
146 usb_serial_jtag_config.tx_buffer_size = 512;
148 esp_err_t ret = ESP_OK;
150 ret = usb_serial_jtag_driver_install(&usb_serial_jtag_config);
156 esp_vfs_usb_serial_jtag_use_driver();
170 return ESPHOME_LOG_LEVEL;
184 #endif // USE_ARDUINO 187 #
if defined(USE_ESP32_VARIANT_ESP32S2)
189 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2)
191 #elif defined(USE_ESP32_VARIANT_ESP32S3)
199 uart_write_bytes(this->
uart_num_, msg, strlen(msg));
200 uart_write_bytes(this->
uart_num_,
"\n", 1);
211 if (xPortGetFreeHeapSize() < 2048)
226 #ifndef USE_LIBRETINY 230 switch (this->
uart_) {
246 Serial.setDebugOutput(ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE);
258 Serial1.setDebugOutput(ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE);
261 #if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \ 262 !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) 275 #endif // USE_ARDUINO 278 switch (this->
uart_) {
285 #if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \ 286 !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) && !defined(USE_ESP32_VARIANT_ESP32H2) 290 #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 && 292 #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 297 #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 298 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \ 299 defined(USE_ESP32_VARIANT_ESP32H2) 304 #endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || 310 #endif // USE_ESP_IDF 314 uart_set_debug(UART_NO);
316 #endif // USE_ESP8266 319 #if defined(USE_ESP_IDF) || defined(USE_ESP32_FRAMEWORK_ARDUINO) 321 if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE) {
322 esp_log_level_set(
"*", ESP_LOG_VERBOSE);
324 #endif // USE_ESP_IDF || USE_ESP32_FRAMEWORK_ARDUINO 326 ESP_LOGI(TAG,
"Log initialized");
328 #else // USE_LIBRETINY 331 switch (this->
uart_) {
354 ESP_LOGW(TAG,
" The chosen logger UART port is not available on this board." 355 "The default port was used instead.");
363 lt_log_set_port(LT_UART_DEFAULT_SERIAL);
365 lt_log_set_port(this->
uart_ - 1);
370 ESP_LOGI(TAG,
"Log initialized");
372 #endif // USE_LIBRETINY 379 #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) 387 const char *
const LOG_LEVELS[] = {
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE"};
391 #if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \ 392 !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) && !defined(USE_ESP32_VARIANT_ESP32H2) 394 #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARINT_ESP32C6 && !USE_ESP32_VARIANT_ESP32S2 && 396 #if defined(USE_ESP_IDF) 397 #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 399 #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 400 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3) 402 #endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32S3 403 #endif // USE_ESP_IDF 407 const char *
const UART_SELECTIONS[] = {
"UART0",
"UART1",
"UART0_SWAP"};
408 #endif // USE_ESP8266 410 const char *
const UART_SELECTIONS[] = {
"UART0",
"UART1",
"USB_CDC"};
413 const char *
const UART_SELECTIONS[] = {
"DEFAULT",
"UART0",
"UART1",
"UART2"};
414 #endif // USE_LIBRETINY 416 ESP_LOGCONFIG(TAG,
"Logger:");
417 ESP_LOGCONFIG(TAG,
" Level: %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
418 ESP_LOGCONFIG(TAG,
" Log Baud Rate: %" PRIu32, this->
baud_rate_);
419 #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) 420 ESP_LOGCONFIG(TAG,
" Hardware UART: %s", UART_SELECTIONS[this->
uart_]);
424 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.tag.c_str(), LOG_LEVELS[it.level]);
void set_baud_rate(uint32_t baud_rate)
Manually set the baud rate for serial, set to 0 to disable.
void add_on_log_callback(std::function< void(int, const char *, const char *)> &&callback)
Register a callback that will be called for every log message sent.
UARTSelection
Enum for logging UART selection.
int level_for(const char *tag)
void log_vprintf_(int level, const char *tag, int line, const char *format, va_list args)
void vprintf_to_buffer_(const char *format, va_list args)
void dump_config() override
float get_setup_priority() const override
Logger(uint32_t baud_rate, size_t tx_buffer_size)
void write_header_(int level, const char *tag, int line)
const float BUS
For communication buses like i2c/spi.
UARTSelection get_uart() const
Get the UART used by the logger.
void set_null_terminator_()
void printf_to_buffer_(const char *format,...)
void write_to_buffer_(char value)
const char *const LOG_LEVELS[]
void pre_setup()
Set up this component.
uint8_t progmem_read_byte(const uint8_t *addr)
const char *const UART_SELECTIONS[]
void log_message_(int level, const char *tag, int offset=0)
void init_usb_serial_jtag_()
Implementation of SPI Controller mode.
std::vector< LogLevelOverride > log_levels_
void set_log_level(const std::string &tag, int log_level)
Set the log level of the specified tag.
bool recursion_guard_
Prevents recursive log calls, if true a log message is already being processed.
CallbackManager< void(int, const char *, const char *)> log_callback_
int HOT esp_idf_log_vprintf_(const char *format, va_list args)
bool is_buffer_full_() const