mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-22 02:32:23 +00:00
Make phone queues use a static pointer queue (#7919)
* Make phone queues use a static pointer queue * Static init * Compile time constants now * Instead, lets just use the normal pointerqueue for linux native builds and static for IoT platforms * Add missing method * Missing methods * Update variant.h
This commit is contained in:
77
src/mesh/StaticPointerQueue.h
Normal file
77
src/mesh/StaticPointerQueue.h
Normal file
@@ -0,0 +1,77 @@
|
||||
#pragma once
|
||||
|
||||
#include "concurrency/OSThread.h"
|
||||
#include "freertosinc.h"
|
||||
#include <cassert>
|
||||
|
||||
/**
|
||||
* A static circular buffer queue for pointers.
|
||||
* This provides the same interface as PointerQueue but uses a statically allocated
|
||||
* buffer instead of dynamic allocation.
|
||||
*/
|
||||
template <class T, int MaxElements> class StaticPointerQueue
|
||||
{
|
||||
static_assert(MaxElements > 0, "MaxElements must be greater than 0");
|
||||
|
||||
T *buffer[MaxElements];
|
||||
int head = 0;
|
||||
int tail = 0;
|
||||
int count = 0;
|
||||
concurrency::OSThread *reader = nullptr;
|
||||
|
||||
public:
|
||||
StaticPointerQueue()
|
||||
{
|
||||
// Initialize all buffer elements to nullptr to silence warnings and ensure clean state
|
||||
for (int i = 0; i < MaxElements; i++) {
|
||||
buffer[i] = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
int numFree() const { return MaxElements - count; }
|
||||
|
||||
bool isEmpty() const { return count == 0; }
|
||||
|
||||
int numUsed() const { return count; }
|
||||
|
||||
bool enqueue(T *x, TickType_t maxWait = portMAX_DELAY)
|
||||
{
|
||||
if (count >= MaxElements) {
|
||||
return false; // Queue is full
|
||||
}
|
||||
|
||||
if (reader) {
|
||||
reader->setInterval(0);
|
||||
concurrency::mainDelay.interrupt();
|
||||
}
|
||||
|
||||
buffer[tail] = x;
|
||||
tail = (tail + 1) % MaxElements;
|
||||
count++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dequeue(T **p, TickType_t maxWait = portMAX_DELAY)
|
||||
{
|
||||
if (count == 0) {
|
||||
return false; // Queue is empty
|
||||
}
|
||||
|
||||
*p = buffer[head];
|
||||
head = (head + 1) % MaxElements;
|
||||
count--;
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns a ptr or null if the queue was empty
|
||||
T *dequeuePtr(TickType_t maxWait = portMAX_DELAY)
|
||||
{
|
||||
T *p;
|
||||
return dequeue(&p, maxWait) ? p : nullptr;
|
||||
}
|
||||
|
||||
void setReader(concurrency::OSThread *t) { reader = t; }
|
||||
|
||||
// For compatibility with PointerQueue interface
|
||||
int getMaxLen() const { return MaxElements; }
|
||||
};
|
||||
Reference in New Issue
Block a user