shared_data.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef _SHARED_DATA_H_
  2. #define _SHARED_DATA_H_
  3. #include "freertos/semphr.h"
  4. template <typename T>
  5. class SharedData
  6. {
  7. public:
  8. SharedData()
  9. {
  10. _mutex = xSemaphoreCreateMutex();
  11. _data_ready = false;
  12. }
  13. ~SharedData()
  14. {
  15. if (_mutex != NULL)
  16. {
  17. vSemaphoreDelete(_mutex);
  18. }
  19. }
  20. bool write(const T& data)
  21. {
  22. if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE)
  23. {
  24. _data = data;
  25. _data_ready = true;
  26. xSemaphoreGive(_mutex);
  27. return true;
  28. }
  29. return false;
  30. }
  31. bool read(T& data)
  32. {
  33. if (xSemaphoreTake(_mutex, pdMS_TO_TICKS(portMAX_DELAY)) == pdTRUE)
  34. {
  35. if (_data_ready)
  36. {
  37. data = _data;
  38. _data_ready = false;
  39. xSemaphoreGive(_mutex);
  40. return true;
  41. }
  42. xSemaphoreGive(_mutex);
  43. }
  44. return false;
  45. }
  46. void clear()
  47. {
  48. if (xSemaphoreTake(_mutex, pdMS_TO_TICKS(portMAX_DELAY)) == pdTRUE)
  49. {
  50. _data_ready = false;
  51. xSemaphoreGive(_mutex);
  52. }
  53. }
  54. private:
  55. T _data;
  56. bool _data_ready;
  57. SemaphoreHandle_t _mutex;
  58. };
  59. #endif // _SHARED_DATA_H_