dispatcher.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "dispatcher.h"
  2. #include <flipper.h>
  3. struct Dispatcher {
  4. void* message;
  5. size_t message_size;
  6. osMessageQueueId_t mqueue;
  7. osMutexId_t lock_mutex;
  8. };
  9. Dispatcher* dispatcher_alloc(size_t queue_size, size_t message_size) {
  10. Dispatcher* dispatcher = furi_alloc(sizeof(Dispatcher));
  11. dispatcher->message = furi_alloc(message_size);
  12. dispatcher->message_size = message_size;
  13. dispatcher->mqueue = osMessageQueueNew(queue_size, message_size, NULL);
  14. assert(dispatcher->mqueue);
  15. dispatcher->lock_mutex = osMutexNew(NULL);
  16. assert(dispatcher->lock_mutex);
  17. dispatcher_lock(dispatcher);
  18. return dispatcher;
  19. }
  20. void dispatcher_free(Dispatcher* dispatcher) {
  21. assert(dispatcher);
  22. free(dispatcher);
  23. }
  24. void dispatcher_send(Dispatcher* dispatcher, Message* message) {
  25. assert(dispatcher);
  26. assert(message);
  27. assert(osMessageQueuePut(dispatcher->mqueue, message, 0, osWaitForever) == osOK);
  28. }
  29. void dispatcher_recieve(Dispatcher* dispatcher, Message* message) {
  30. assert(dispatcher);
  31. assert(message);
  32. dispatcher_unlock(dispatcher);
  33. assert(osMessageQueueGet(dispatcher->mqueue, message, NULL, osWaitForever) == osOK);
  34. dispatcher_lock(dispatcher);
  35. }
  36. void dispatcher_lock(Dispatcher* dispatcher) {
  37. assert(dispatcher);
  38. assert(osMutexAcquire(dispatcher->lock_mutex, osWaitForever) == osOK);
  39. }
  40. void dispatcher_unlock(Dispatcher* dispatcher) {
  41. assert(dispatcher);
  42. assert(osMutexRelease(dispatcher->lock_mutex) == osOK);
  43. }