19template <fl::size DescriptorCount, fl::size ArenaSize>
27template <fl::size DescriptorCount, fl::size ArenaSize>
31 for (fl::size i = 0; i < DescriptorCount; i++) {
36template <fl::size DescriptorCount, fl::size ArenaSize>
38 fl::size len = msg.length();
42 return push(msg.c_str(),
static_cast<fl::u16
>(len));
45template <fl::size DescriptorCount, fl::size ArenaSize>
48 return push(str, len);
51template <fl::size DescriptorCount, fl::size ArenaSize>
65 *outPtr = &
mArena[desc.mStartIdx];
66 *outLen = desc.mLength;
71template <fl::size DescriptorCount, fl::size ArenaSize>
77 fl::u32 newArenaTail = (
mArenaTail + desc.mLength) & (ArenaSize - 1);
88 fl::u32 newTail = (tail + 1) & (DescriptorCount - 1);
96template <fl::size DescriptorCount, fl::size ArenaSize>
101template <fl::size DescriptorCount, fl::size ArenaSize>
104 fl::u32 tail =
mTail;
105 return (head - tail) & (DescriptorCount - 1);
108template <fl::size DescriptorCount, fl::size ArenaSize>
117template <fl::size DescriptorCount, fl::size ArenaSize>
124 fl::u32 head =
mHead;
126 fl::u32 next = (head + 1) & (DescriptorCount - 1);
144 fl::u32 start = aHead;
147 if (start + len > ArenaSize) {
149 fl::u32 padding = ArenaSize - start;
152 if (!
arenaHasSpace(aHead, aTail,
static_cast<fl::u16
>(padding + len))) {
158 aHead = (aHead + padding) & (ArenaSize - 1);
164 for (fl::u16 i = 0; i < len; i++) {
165 mArena[start + i] = str[i];
169 fl::u32 newArenaHead = (aHead + len) & (ArenaSize - 1);
188template <fl::size DescriptorCount, fl::size ArenaSize>
191 while (len < maxLen && str[len] !=
'\0') {
197template <fl::size DescriptorCount, fl::size ArenaSize>
200 fl::u32 used = (aHead - aTail) & (ArenaSize - 1);
201 fl::u32
free = ArenaSize - used - 1;
206template <fl::size DescriptorCount, fl::size ArenaSize>
212template <fl::size DescriptorCount, fl::size ArenaSize>
218template <fl::size DescriptorCount, fl::size ArenaSize>
224template <fl::size DescriptorCount, fl::size ArenaSize>
High-performance ISR-safe async logging queue (SPSC ring buffer) - declarations only.
fl::size size() const FL_NO_EXCEPT
Get current number of messages in queue.
bool push(const fl::string &msg) FL_NO_EXCEPT
Push a message from fl::string (ISR-safe)
static fl::u16 boundedStrlen(const char *str, fl::u16 maxLen) FL_NO_EXCEPT
AsyncLogQueue() FL_NO_EXCEPT
bool arenaHasSpace(fl::u32 aHead, fl::u32 aTail, fl::u16 len) const FL_NO_EXCEPT
volatile fl::u32 mArenaHead
Producer write position (arena)
bool tryPop(const char **outPtr, fl::u16 *outLen) FL_NO_EXCEPT
Consumer: Try to pop one message (main thread only)
volatile fl::u32 mTail
Consumer read position (descriptor ring)
fl::u32 droppedCount() const FL_NO_EXCEPT
Get number of messages dropped due to overflow.
fl::u32 loadArenaTail() const FL_NO_EXCEPT
volatile fl::u32 mDropped
Count of dropped messages (overflow)
void atomicIncDropped() FL_NO_EXCEPT
fl::u32 loadHead() const FL_NO_EXCEPT
bool empty() const FL_NO_EXCEPT
Check if queue is empty.
fl::u32 loadTail() const FL_NO_EXCEPT
void commit() FL_NO_EXCEPT
Consumer: Commit the popped message to free space (main thread only)
Descriptor mDescriptors[DescriptorCount]
Ring of message descriptors.
volatile fl::u32 mHead
Producer write position (descriptor ring)
volatile fl::u32 mArenaTail
Consumer read position (arena)
High-performance SPSC async log queue.
RAII helper for critical sections (interrupt disable/enable) Automatically disables interrupts on con...
RAII critical section helper and interrupt control declarations.
u8 u8 fract8 blur_amount FL_NO_EXCEPT
FASTLED_FORCE_INLINE void free(void *ptr) FL_NO_EXCEPT
Base definition for an LED controller.
fl::u32 mStartIdx
Offset into arena where message starts.
fl::u16 mLength
Length of message in bytes.
fl::u16 mPadding
Reserved for alignment (unused)
Descriptor() FL_NO_EXCEPT
Descriptor for one log message.