ESPHome 2026.1.4
Loading...
Searching...
No Matches
task_log_buffer_esp32.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4
7
8#ifdef USE_ESPHOME_TASK_LOG_BUFFER
9#include <cstddef>
10#include <cstring>
11#include <memory>
12#include <atomic>
13#include <freertos/FreeRTOS.h>
14#include <freertos/ringbuf.h>
15
16namespace esphome::logger {
17
35 public:
36 // Structure for a log message header (text data follows immediately after)
37 struct LogMessage {
38 const char *tag; // We store the pointer, assuming tags are static
39 char thread_name[16]; // Store thread name directly (only used for non-main threads)
40 uint16_t text_length; // Length of the message text (up to ~64KB)
41 uint16_t line; // Source code line number
42 uint8_t level; // Log level (0-7)
43
44 // Methods for accessing message contents
45 inline char *text_data() { return reinterpret_cast<char *>(this) + sizeof(LogMessage); }
46
47 inline const char *text_data() const { return reinterpret_cast<const char *>(this) + sizeof(LogMessage); }
48 };
49
50 // Constructor that takes a total buffer size
51 explicit TaskLogBuffer(size_t total_buffer_size);
53
54 // NOT thread-safe - borrow a message from the ring buffer, only call from main loop
55 bool borrow_message_main_loop(LogMessage **message, const char **text, void **received_token);
56
57 // NOT thread-safe - release a message buffer and update the counter, only call from main loop
58 void release_message_main_loop(void *token);
59
60 // Thread-safe - send a message to the ring buffer from any thread
61 bool send_message_thread_safe(uint8_t level, const char *tag, uint16_t line, TaskHandle_t task_handle,
62 const char *format, va_list args);
63
64 // Check if there are messages ready to be processed using an atomic counter for performance
65 inline bool HOT has_messages() const {
66 return message_counter_.load(std::memory_order_relaxed) != last_processed_counter_;
67 }
68
69 // Get the total buffer size in bytes
70 inline size_t size() const { return size_; }
71
72 private:
73 RingbufHandle_t ring_buffer_{nullptr}; // FreeRTOS ring buffer handle
74 StaticRingbuffer_t structure_; // Static structure for the ring buffer
75 uint8_t *storage_{nullptr}; // Pointer to allocated memory
76 size_t size_{0}; // Size of allocated memory
77
78 // Atomic counter for message tracking (only differences matter)
79 std::atomic<uint16_t> message_counter_{0}; // Incremented when messages are committed
80 mutable uint16_t last_processed_counter_{0}; // Tracks last processed message
81};
82
83} // namespace esphome::logger
84
85#endif // USE_ESPHOME_TASK_LOG_BUFFER
86#endif // USE_ESP32
Task log buffer for ESP32 platform using FreeRTOS ring buffer.
TaskLogBuffer(size_t total_buffer_size)
bool borrow_message_main_loop(LogMessage **message, const char **text, void **received_token)
bool send_message_thread_safe(uint8_t level, const char *tag, uint16_t line, TaskHandle_t task_handle, const char *format, va_list args)
const char * message
Definition component.cpp:38