template <typename ItemType, size_t size>
class RtosStaticQueueUPTR
{
private:
// Constants
static constexpr size_t item_size_ = sizeof(ItemType*);
// Fields
bool is_initialized_ = false;
QueueHandle_t handle_;
StaticQueue_t data_;
uint8_t buffer_[size * item_size_];
public:
// Methods
/// Constructor & destructor
///
RtosStaticQueueUPTR() {};
~RtosStaticQueueUPTR() { assert(false); };
/// Initialization method
///
void Init(void)
{
assert(not is_initialized_);
handle_ = xQueueCreateStatic(size, item_size_, buffer_, &data_);
is_initialized_ = true;
}
/// Reset method
///
void Reset(void)
{
assert(is_initialized_);
ItemType* object = nullptr;
while(true) {
xQueueReceive(handle_, &object, 0);
if(object == nullptr) { break; }
else { delete object; }
}
}
/// Try to put in queue
/// @param - Item
/// @return - Item, null if sent
///
unique_ptr<ItemType> TryPut(unique_ptr<ItemType> item_uptr)
{
assert(is_initialized_);
if(not item_uptr) { return nullptr; }
ItemType* item_ptr = item_uptr.get();
auto result = xQueueSend(handle_, &item_ptr, 0);
if(result != pdPASS) { return item_uptr; }
else {
item_uptr.release();
return nullptr;
}
}
/// Get from queue
/// @return - Item pointer
///
unique_ptr<ItemType> TryGet(void)
{
assert(is_initialized_);
ItemType* item_ptr = nullptr;
auto result = xQueueReceive(handle_, &item_ptr, 0);
if((result == pdTRUE) and (item_ptr)) {
return unique_ptr<ItemType>(item_ptr);
}
else { return nullptr; }
}
/// Get from queue
/// @param - Blocking time ticks
/// @return - Item pointer
///
unique_ptr<ItemType> TryGetBlocking(TickType_t blocking_time_ticks)
{
assert(is_initialized_);
ItemType* item_ptr = nullptr;
auto result = xQueueReceive(handle_, &item_ptr, blocking_time_ticks);
if((result == pdTRUE) and (item_ptr)) {
return unique_ptr<ItemType>(item_ptr);
}
else { return nullptr; }
}
};