dispatcher.c 1.6 KB

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