#ifndef _SHARED_DATA_H_ #define _SHARED_DATA_H_ #include "freertos/semphr.h" template class SharedData { public: SharedData() { _mutex = xSemaphoreCreateMutex(); _data_ready = false; } ~SharedData() { if (_mutex != NULL) { vSemaphoreDelete(_mutex); } } bool write(const T& data) { if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { _data = data; _data_ready = true; xSemaphoreGive(_mutex); return true; } return false; } bool read(T& data) { if (xSemaphoreTake(_mutex, pdMS_TO_TICKS(portMAX_DELAY)) == pdTRUE) { if (_data_ready) { data = _data; _data_ready = false; xSemaphoreGive(_mutex); return true; } xSemaphoreGive(_mutex); } return false; } void clear() { if (xSemaphoreTake(_mutex, pdMS_TO_TICKS(portMAX_DELAY)) == pdTRUE) { _data_ready = false; xSemaphoreGive(_mutex); } } private: T _data; bool _data_ready; SemaphoreHandle_t _mutex; }; #endif // _SHARED_DATA_H_