dispatcher.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. // TODO: bad side-effect
  30. void dispatcher_recieve(Dispatcher* dispatcher, Message* message) {
  31. assert(dispatcher);
  32. assert(message);
  33. dispatcher_unlock(dispatcher);
  34. assert(osMessageQueueGet(dispatcher->mqueue, message, NULL, osWaitForever) == osOK);
  35. dispatcher_lock(dispatcher);
  36. }
  37. void dispatcher_lock(Dispatcher* dispatcher) {
  38. assert(dispatcher);
  39. assert(osMutexAcquire(dispatcher->lock_mutex, osWaitForever) == osOK);
  40. }
  41. void dispatcher_unlock(Dispatcher* dispatcher) {
  42. assert(dispatcher);
  43. assert(osMutexRelease(dispatcher->lock_mutex) == osOK);
  44. }