2025-06-24 15:18:08 -07:00

52 lines
1.3 KiB
C++

/// © MiroZ 2024
#ifndef __MUTEX_H__
#define __MUTEX_H__
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include <freertos/queue.h>
#include <assert.h>
#include <stdint.h>
class Mutex
{
protected:
SemaphoreHandle_t m_mutex = nullptr;
public:
Mutex(){ assert(m_mutex = xSemaphoreCreateMutex()); }
Mutex(SemaphoreHandle_t handle) { m_mutex = handle; }
bool take(uint32_t ticks = portMAX_DELAY) { return xSemaphoreTake(m_mutex, ticks); }
bool give() { return xSemaphoreGive(m_mutex); }
};
template <typename T>
class Queue
{
protected:
QueueHandle_t m_queue = nullptr;
public:
Queue(uint32_t len) { m_queue = xQueueCreate(len, sizeof(T)); }
Queue(QueueHandle_t handle, uint32_t len) { m_queue = handle; }
void send(T * data, uint32_t ticks = portMAX_DELAY) { xQueueSend(m_queue, data, ticks); }
bool receive(T * data, uint32_t ticks = portMAX_DELAY) { return xQueueReceive(m_queue, data, ticks); }
};
class CountingSemaphore
{
protected:
SemaphoreHandle_t m_semaphore = nullptr;
public:
CountingSemaphore(uint32_t max, uint32_t initial){ assert(m_semaphore = xSemaphoreCreateCounting(max, initial)); }
bool take(uint32_t ticks = portMAX_DELAY) { return xSemaphoreTake(m_semaphore, ticks); }
bool give() { return xSemaphoreGive(m_semaphore); }
};
#endif