20 FL_ERROR(category_name <<
" ASYNC LOGGING NOT ENABLED. "
21 <<
"Add '#define " << define_name <<
"' before including FastLED.h");
46 state->mNeedsFlush =
true;
48 static volatile fl::u32 isr_fire_count = 0;
49 isr_fire_count = isr_fire_count + 1;
75 while (
mQueue.tryPop(&msg, &len)) {
80 fl::u16 chunk_size =
min(len -
offset,
static_cast<fl::u16
>(
sizeof(buffer) - 1));
82 buffer[chunk_size] =
'\0';
111 while (
mQueue.tryPop(&msg, &len)) {
117 return mQueue.droppedCount();
121 fl::size flushed = 0;
129 while (flushed < maxMessages &&
mQueue.tryPop(&msg, &len)) {
134 fl::u16 chunk_size =
min(len -
offset,
static_cast<fl::u16
>(
sizeof(buffer) - 1));
136 buffer[chunk_size] =
'\0';
160 if (
state.mEnabled) {
165 state.mMessagesPerTick = messages_per_tick;
180 state.mEnabled =
true;
187 if (
state.mEnabled &&
state.mTimerHandle.is_valid()) {
190 state.mEnabled =
false;
191 state.mNeedsFlush =
false;
208 if (!
state.mNeedsFlush) {
213 state.mNeedsFlush =
false;
217 fl::size n =
state.mMessagesPerTick;
254 if (
mTask.is_valid()) {
255 mTask.set_interval_ms(interval_ms);
ISR-safe async logger using SPSC queue backend (zero heap allocation)
fl::size flushN(fl::size maxMessages)
Flush up to N messages from queue (bounded flush)
fl::u32 droppedCount() const
bool isBackgroundFlushEnabled() const
Check if background flushing is enabled.
void push(const fl::string &msg)
AsyncLogQueue< 128, 4096 > mQueue
bool enableBackgroundFlush(fl::u32 interval_ms, fl::size messages_per_tick=5)
Enable background timer-based flushing (opt-in)
AsyncLogger() FL_NOEXCEPT
void disableBackgroundFlush()
Disable background flushing.
ISR-safe async logger wrapper (zero heap allocation) Uses embedded AsyncLogQueue instead of heap-allo...
static T & instance() FL_NOEXCEPT
fl::size mMessagesPerTick
void setMessagesPerTick(fl::size messages_per_tick)
Configure number of messages to flush per service call.
AsyncLoggerServiceTask() FL_NOEXCEPT
void serviceLoggers()
Service all registered loggers (called by task)
void setInterval(u32 interval_ms)
Change the service interval (default 16ms)
static AsyncLoggerServiceTask & instance()
Handle & then(function< void()> on_then) FL_NOEXCEPT
static Scheduler & instance()
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
ISR handler types and API declarations.
Centralized logging categories for FastLED hardware interfaces and subsystems.
void FL_IRAM async_log_flush_timer_isr(void *user_data)
void printLoggerDisabledError(const char *category_name, const char *define_name)
Print error message for disabled logger (non-template helper) Called from checkLoggerEnabled template...
Compile-time linker keep-alive hook for a single fl::Bus.
constexpr u32 ISR_FLAG_IRAM_SAFE
int detach_handler(handle &h)
Detach an ISR handler.
int attach_timer_handler(const config &cfg, handle *out_handle)
Attach a timer-based ISR handler.
constexpr u8 ISR_PRIORITY_LOW
Handle every_ms(int interval_ms)
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
void print(const char *str)
void configureAsyncLogService(u32 interval_ms, fl::size messages_per_tick)
Configure async logger automatic servicing task.
void println(const char *str) FL_NOEXCEPT
Base definition for an LED controller.
Task scheduler — manages timer and frame-based tasks.
static ActiveLoggerRegistry & instance()
BackgroundFlushState() FL_NOEXCEPT
fl::size mMessagesPerTick
volatile bool mNeedsFlush
fl::isr::handle mTimerHandle
Configuration for ISR attachment.
Opaque handle to an attached ISR.