13#if defined(FL_LOG_SPI_ENABLED) && !defined(FASTLED_LOG_SPI_ENABLED)
14 #define FASTLED_LOG_SPI_ENABLED
16#if defined(FL_LOG_RMT_ENABLED) && !defined(FASTLED_LOG_RMT_ENABLED)
17 #define FASTLED_LOG_RMT_ENABLED
19#if defined(FL_LOG_PARLIO_ENABLED) && !defined(FASTLED_LOG_PARLIO_ENABLED)
20 #define FASTLED_LOG_PARLIO_ENABLED
22#if defined(FL_LOG_AUDIO_ENABLED) && !defined(FASTLED_LOG_AUDIO_ENABLED)
23 #define FASTLED_LOG_AUDIO_ENABLED
25#if defined(FL_LOG_INTERRUPT_ENABLED) && !defined(FASTLED_LOG_INTERRUPT_ENABLED)
26 #define FASTLED_LOG_INTERRUPT_ENABLED
28#if defined(FL_LOG_FLEXIO_ENABLED) && !defined(FASTLED_LOG_FLEXIO_ENABLED)
29 #define FASTLED_LOG_FLEXIO_ENABLED
31#if defined(FL_LOG_OBJECTFLED_ENABLED) && !defined(FASTLED_LOG_OBJECTFLED_ENABLED)
32 #define FASTLED_LOG_OBJECTFLED_ENABLED
36#if defined(FASTLED_LOG_SPI_ENABLED) || defined(FASTLED_LOG_RMT_ENABLED) || defined(FASTLED_LOG_PARLIO_ENABLED) || defined(FASTLED_LOG_AUDIO_ENABLED) || defined(FASTLED_LOG_INTERRUPT_ENABLED)
83 #if !defined(FASTLED_LOG_VERBOSITY) || FASTLED_LOG_VERBOSITY < 1
84 #undef FASTLED_LOG_VERBOSITY
85 #define FASTLED_LOG_VERBOSITY 1
88 #ifndef FASTLED_LOG_VERBOSITY
90 #define FASTLED_LOG_VERBOSITY 0
92 #define FASTLED_LOG_VERBOSITY 1
102#if SKETCH_HAS_LARGE_MEMORY && (FASTLED_LOG_VERBOSITY >= 1)
103 #define FASTLED_LOG_RUNTIME_ENABLED 1
105 #define FASTLED_LOG_RUNTIME_ENABLED 0
114#if FASTLED_LOG_VERBOSITY >= 1
115 #define FASTLED_LOG_LITE_ENABLED 1
117 #define FASTLED_LOG_LITE_ENABLED 0
126#ifndef FL_PRINTLN_DECLARED
127#define FL_PRINTLN_DECLARED
202#define FASTLED_ERROR(MSG) fl::detail::log_emit( \
203 fl::detail::log_kind::ERROR, \
204 fl::fastled_file_offset(__FILE__), int(__LINE__), \
205 fl::sstream() << MSG)
206#define FASTLED_ERROR_IF(COND, MSG) do { if (COND) FASTLED_ERROR(MSG); } while(0)
210#if FASTLED_LOG_RUNTIME_ENABLED
212#define FL_ERROR(X) fl::detail::log_emit( \
213 fl::detail::log_kind::ERROR, \
214 fl::fastled_file_offset(__FILE__), int(__LINE__), \
216#define FL_ERROR_IF(COND, MSG) do { if (COND) FL_ERROR(MSG); } while(0)
219#define FL_ERROR(X) do { } while(0)
220#define FL_ERROR_IF(COND, MSG) do { } while(0)
230#define FASTLED_WARN(MSG) fl::detail::log_emit( \
231 fl::detail::log_kind::WARN, \
232 fl::fastled_file_offset(__FILE__), int(__LINE__), \
233 fl::sstream() << MSG)
234#define FASTLED_WARN_IF(COND, MSG) do { if (COND) FASTLED_WARN(MSG); } while(0)
238#if FASTLED_LOG_RUNTIME_ENABLED
240#define FL_WARN(X) fl::detail::log_emit( \
241 fl::detail::log_kind::WARN, \
242 fl::fastled_file_offset(__FILE__), int(__LINE__), \
244#define FL_WARN_IF(COND, MSG) do { if (COND) FL_WARN(MSG); } while(0)
248#define FL_WARN_ONCE(X) do { \
249 static bool _warned = false; \
257#define FL_WARN_FMT(X) FL_WARN(X)
258#define FL_WARN_FMT_IF(COND, MSG) FL_WARN_IF(COND, MSG)
266#define FL_WARN_EVERY(MILLIS, X) do { \
267 static fl::u32 _last_warn_time = 0; \
268 fl::u32 _now = fl::millis(); \
269 if (_now - _last_warn_time >= (MILLIS)) { \
270 _last_warn_time = _now; \
276#define FL_WARN(X) do { } while(0)
277#define FL_WARN_IF(COND, MSG) if(false) { void(fl::sstream_noop() << MSG); }
278#define FL_WARN_ONCE(X) do { } while(0)
279#define FL_WARN_FMT(X) do { } while(0)
280#define FL_WARN_FMT_IF(COND, MSG) do { } while(0)
281#define FL_WARN_EVERY(MILLIS, X) do { } while(0)
290#if FASTLED_LOG_LITE_ENABLED
291#define FL_WARN_LIT(LITERAL) fl::println(LITERAL)
292#define FL_LOG_LIT(LITERAL) fl::println(LITERAL)
294#define FL_WARN_LIT(LITERAL) do { } while(0)
295#define FL_LOG_LIT(LITERAL) do { } while(0)
305#define FASTLED_INFO(MSG) fl::detail::log_emit( \
306 fl::detail::log_kind::INFO, \
307 fl::fastled_file_offset(__FILE__), int(__LINE__), \
308 fl::sstream() << MSG)
309#define FASTLED_INFO_IF(COND, MSG) do { if (COND) FASTLED_INFO(MSG); } while(0)
313#if FASTLED_LOG_RUNTIME_ENABLED
315#define FL_INFO(X) fl::detail::log_emit( \
316 fl::detail::log_kind::INFO, \
317 fl::fastled_file_offset(__FILE__), int(__LINE__), \
319#define FL_INFO_IF(COND, MSG) do { if (COND) FL_INFO(MSG); } while(0)
323#define FL_INFO_ONCE(X) do { \
324 static bool _infoed = false; \
332#define FL_INFO(X) do { } while(0)
333#define FL_INFO_IF(COND, MSG) do { } while(0)
334#define FL_INFO_ONCE(X) do { } while(0)
342#if defined(FL_IS_WASM) || !defined(RELEASE) || defined(FASTLED_TESTING)
343#define FASTLED_FORCE_DBG 1
347#define FL_DBG_NO_OP(X) do { if (false) { fl::sstream_noop() << X; } } while(0)
356#if defined(FASTLED_DISABLE_DBG) && FASTLED_DISABLE_DBG
358#define FASTLED_HAS_DBG 0
359#define _FASTLED_DGB(X) FL_DBG_NO_OP(X)
360#elif FASTLED_LOG_VERBOSITY < 1
362#define FASTLED_HAS_DBG 0
363#define _FASTLED_DGB(X) FL_DBG_NO_OP(X)
364#elif !defined(FASTLED_FORCE_DBG) && !SKETCH_HAS_LARGE_MEMORY
366#define FASTLED_HAS_DBG 0
367#define _FASTLED_DGB(X) FL_DBG_NO_OP(X)
370#define FASTLED_HAS_DBG 1
371#define _FASTLED_DGB(X) \
373 (fl::sstream() << (fl::fastled_file_offset(__FILE__)) \
374 << "(" << int(__LINE__) << "): " << X) \
378#define FASTLED_DBG(X) _FASTLED_DGB(X)
380#ifndef FASTLED_DBG_IF
381#define FASTLED_DBG_IF(COND, MSG) \
388#define FL_DBG FASTLED_DBG
389#define FL_DBG_IF FASTLED_DBG_IF
394#define FL_DBG_EVERY(MILLIS, X) do { \
395 static fl::u32 _last_dbg_time = 0; \
396 fl::u32 _now = fl::millis(); \
397 if (_now - _last_dbg_time >= (MILLIS)) { \
398 _last_dbg_time = _now; \
403#define FL_DBG_EVERY(MILLIS, X) FL_DBG_NO_OP(X)
442#if FASTLED_LOG_RUNTIME_ENABLED
443#define FL_PRINT(X) fl::println((fl::sstream() << X).c_str())
447#define FL_PRINT_EVERY(MILLIS, X) do { \
448 static fl::u32 _last_print_time = 0; \
449 fl::u32 _now = fl::millis(); \
450 if (_now - _last_print_time >= (MILLIS)) { \
451 _last_print_time = _now; \
457#define FL_PRINT(X) do { } while(0)
458#define FL_PRINT_EVERY(MILLIS, X) do { } while(0)
471#ifdef FASTLED_LOG_SPI_ENABLED
472 #define FL_LOG_SPI(X) FL_WARN(X)
474 #define FL_LOG_SPI(X) FL_DBG_NO_OP(X)
479#ifdef FASTLED_LOG_RMT_ENABLED
480 #define FL_LOG_RMT(X) FL_WARN(X)
482 #define FL_LOG_RMT(X) FL_DBG_NO_OP(X)
487#ifdef FASTLED_LOG_PARLIO_ENABLED
488 #define FL_LOG_PARLIO(X) FL_WARN(X)
490 #define FL_LOG_PARLIO(X) FL_DBG_NO_OP(X)
495#ifdef FASTLED_LOG_AUDIO_ENABLED
496 #define FL_LOG_AUDIO(X) FL_WARN(X)
498 #define FL_LOG_AUDIO(X) FL_DBG_NO_OP(X)
503#ifdef FASTLED_LOG_INTERRUPT_ENABLED
504 #define FL_LOG_INTERRUPT(X) FL_WARN(X)
506 #define FL_LOG_INTERRUPT(X) FL_DBG_NO_OP(X)
511#ifdef FASTLED_LOG_FLEXIO_ENABLED
512 #define FL_LOG_FLEXIO(X) FL_WARN(X)
514 #define FL_LOG_FLEXIO(X) FL_DBG_NO_OP(X)
519#ifdef FASTLED_LOG_OBJECTFLED_ENABLED
520 #define FL_LOG_OBJECTFLED(X) FL_WARN(X)
522 #define FL_LOG_OBJECTFLED(X) FL_DBG_NO_OP(X)
589#define FL_LOG_ASYNC(logger, X) \
591 (logger).push((fl::sstream() << X).str()); \
600#define FL_LOG_ASYNC_ISR(logger, msg) \
602 (logger).push(msg); \
609#ifdef FASTLED_LOG_SPI_ENABLED
610 #define FL_LOG_SPI_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_spi_async_logger_isr(), X)
611 #define FL_LOG_SPI_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_spi_async_logger_main(), X)
612 #define FL_LOG_SPI_ASYNC_FLUSH() do { \
613 fl::get_spi_async_logger_isr().flush(); \
614 fl::get_spi_async_logger_main().flush(); \
617 #define FL_LOG_SPI_ASYNC_ISR(X) FL_DBG_NO_OP(X)
618 #define FL_LOG_SPI_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
619 #define FL_LOG_SPI_ASYNC_FLUSH() do {} while(0)
626#ifdef FASTLED_LOG_RMT_ENABLED
627 #define FL_LOG_RMT_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_rmt_async_logger_isr(), X)
628 #define FL_LOG_RMT_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_rmt_async_logger_main(), X)
629 #define FL_LOG_RMT_ASYNC_FLUSH() do { \
630 fl::get_rmt_async_logger_isr().flush(); \
631 fl::get_rmt_async_logger_main().flush(); \
634 #define FL_LOG_RMT_ASYNC_ISR(X) FL_DBG_NO_OP(X)
635 #define FL_LOG_RMT_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
636 #define FL_LOG_RMT_ASYNC_FLUSH() do {} while(0)
643#ifdef FASTLED_LOG_PARLIO_ENABLED
644 #define FL_LOG_PARLIO_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_parlio_async_logger_isr(), X)
645 #define FL_LOG_PARLIO_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_parlio_async_logger_main(), X)
646 #define FL_LOG_PARLIO_ASYNC_FLUSH() do { \
647 fl::get_parlio_async_logger_isr().flush(); \
648 fl::get_parlio_async_logger_main().flush(); \
651 #define FL_LOG_PARLIO_ASYNC_ISR(X) FL_DBG_NO_OP(X)
652 #define FL_LOG_PARLIO_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
653 #define FL_LOG_PARLIO_ASYNC_FLUSH() do {} while(0)
660#ifdef FASTLED_LOG_AUDIO_ENABLED
661 #define FL_LOG_AUDIO_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_audio_async_logger_isr(), X)
662 #define FL_LOG_AUDIO_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_audio_async_logger_main(), X)
663 #define FL_LOG_AUDIO_ASYNC_FLUSH() do { \
664 fl::get_audio_async_logger_isr().flush(); \
665 fl::get_audio_async_logger_main().flush(); \
668 #define FL_LOG_AUDIO_ASYNC_ISR(X) FL_DBG_NO_OP(X)
669 #define FL_LOG_AUDIO_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
670 #define FL_LOG_AUDIO_ASYNC_FLUSH() do {} while(0)
677#ifdef FASTLED_LOG_INTERRUPT_ENABLED
678 #define FL_LOG_INTERRUPT_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_interrupt_async_logger_isr(), X)
679 #define FL_LOG_INTERRUPT_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_interrupt_async_logger_main(), X)
680 #define FL_LOG_INTERRUPT_ASYNC_FLUSH() do { \
681 fl::get_interrupt_async_logger_isr().flush(); \
682 fl::get_interrupt_async_logger_main().flush(); \
685 #define FL_LOG_INTERRUPT_ASYNC_ISR(X) FL_DBG_NO_OP(X)
686 #define FL_LOG_INTERRUPT_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
687 #define FL_LOG_INTERRUPT_ASYNC_FLUSH() do {} while(0)
694#ifdef FASTLED_LOG_FLEXIO_ENABLED
695 #define FL_LOG_FLEXIO_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_flexio_async_logger_isr(), X)
696 #define FL_LOG_FLEXIO_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_flexio_async_logger_main(), X)
697 #define FL_LOG_FLEXIO_ASYNC_FLUSH() do { \
698 fl::get_flexio_async_logger_isr().flush(); \
699 fl::get_flexio_async_logger_main().flush(); \
702 #define FL_LOG_FLEXIO_ASYNC_ISR(X) FL_DBG_NO_OP(X)
703 #define FL_LOG_FLEXIO_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
704 #define FL_LOG_FLEXIO_ASYNC_FLUSH() do {} while(0)
711#ifdef FASTLED_LOG_OBJECTFLED_ENABLED
712 #define FL_LOG_OBJECTFLED_ASYNC_ISR(X) FL_LOG_ASYNC_ISR(fl::get_objectfled_async_logger_isr(), X)
713 #define FL_LOG_OBJECTFLED_ASYNC_MAIN(X) FL_LOG_ASYNC(fl::get_objectfled_async_logger_main(), X)
714 #define FL_LOG_OBJECTFLED_ASYNC_FLUSH() do { \
715 fl::get_objectfled_async_logger_isr().flush(); \
716 fl::get_objectfled_async_logger_main().flush(); \
719 #define FL_LOG_OBJECTFLED_ASYNC_ISR(X) FL_DBG_NO_OP(X)
720 #define FL_LOG_OBJECTFLED_ASYNC_MAIN(X) FL_DBG_NO_OP(X)
721 #define FL_LOG_OBJECTFLED_ASYNC_FLUSH() do {} while(0)
ISR-safe async logger using SPSC queue backend (zero heap allocation)
FastLED chrono implementation - duration types for time measurements.
FL_NO_INLINE void log_emit(log_kind kind, const char *file, int line, fl::sstream &body) FL_NOEXCEPT
Compile-time linker keep-alive hook for a single fl::Bus.
void configureAsyncLogService(u32 interval_ms, fl::size messages_per_tick)
Configure async logger automatic servicing task.
void println(const char *str) FL_NOEXCEPT
const char * fastled_file_offset(const char *file)
Base definition for an LED controller.