gui_event.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "gui_event.h"
  2. #include <flipper_v2.h>
  3. #define GUI_EVENT_MQUEUE_SIZE 8
  4. struct GuiEvent {
  5. PubSub* input_event_record;
  6. osMessageQueueId_t mqueue;
  7. };
  8. void gui_event_input_events_callback(const void* value, void* ctx) {
  9. furi_assert(value);
  10. furi_assert(ctx);
  11. GuiEvent* gui_event = ctx;
  12. GuiMessage message;
  13. message.type = GuiMessageTypeInput;
  14. message.input = *(InputEvent*)value;
  15. osMessageQueuePut(gui_event->mqueue, &message, 0, osWaitForever);
  16. }
  17. GuiEvent* gui_event_alloc() {
  18. GuiEvent* gui_event = furi_alloc(sizeof(GuiEvent));
  19. // Allocate message queue
  20. gui_event->mqueue = osMessageQueueNew(GUI_EVENT_MQUEUE_SIZE, sizeof(GuiMessage), NULL);
  21. furi_check(gui_event->mqueue);
  22. // Input
  23. gui_event->input_event_record = furi_open("input_events");
  24. furi_check(gui_event->input_event_record != NULL);
  25. subscribe_pubsub(gui_event->input_event_record, gui_event_input_events_callback, gui_event);
  26. return gui_event;
  27. }
  28. void gui_event_free(GuiEvent* gui_event) {
  29. furi_assert(gui_event);
  30. furi_check(osMessageQueueDelete(gui_event->mqueue) == osOK);
  31. free(gui_event);
  32. }
  33. void gui_event_messsage_send(GuiEvent* gui_event, GuiMessage* message) {
  34. furi_assert(gui_event);
  35. furi_assert(message);
  36. osMessageQueuePut(gui_event->mqueue, message, 0, 0);
  37. }
  38. GuiMessage gui_event_message_next(GuiEvent* gui_event) {
  39. furi_assert(gui_event);
  40. GuiMessage message;
  41. furi_check(osMessageQueueGet(gui_event->mqueue, &message, NULL, osWaitForever) == osOK);
  42. return message;
  43. }