// // Created by Johnathon Slightham on 2025-07-12. // #ifndef PTRQUEUE_H #define PTRQUEUE_H #include #include "freertos/FreeRTOS.h" #include "portmacro.h" #include "freertos/projdefs.h" #include "freertos/queue.h" // Wrapped FreeRTOS queue to support unique_ptr template class PtrQueue { public: explicit PtrQueue(const UBaseType_t queueLength) : queue(xQueueCreate(queueLength, sizeof(T*))) {} ~PtrQueue() { if (queue) { vQueueDelete(queue); } } bool enqueue(std::unique_ptr&& item, const TickType_t timeout = portMAX_DELAY) { T* rawPtr = item.release(); // Release ownership and get raw pointer return xQueueSendToBack(queue, &rawPtr, timeout) == pdPASS; } std::unique_ptr dequeue(const TickType_t timeout = portMAX_DELAY) { T* rawPtr = nullptr; if (xQueueReceive(queue, &rawPtr, timeout) == pdPASS) { std::unique_ptr ptr(rawPtr); return ptr; } return nullptr; } private: QueueHandle_t queue; }; #endif //PTRQUEUE_H