gui_event.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. osTimerId_t timer;
  7. osMessageQueueId_t mqueue;
  8. };
  9. void gui_event_timer_callback(void* arg) {
  10. assert(arg);
  11. GuiEvent* gui_event = arg;
  12. GuiMessage message;
  13. message.type = GuiMessageTypeRedraw;
  14. osMessageQueuePut(gui_event->mqueue, &message, 0, osWaitForever);
  15. }
  16. void gui_event_input_events_callback(const void* value, void* ctx) {
  17. furi_assert(value);
  18. furi_assert(ctx);
  19. GuiEvent* gui_event = ctx;
  20. GuiMessage message;
  21. message.type = GuiMessageTypeInput;
  22. message.input = *(InputEvent*)value;
  23. osMessageQueuePut(gui_event->mqueue, &message, 0, osWaitForever);
  24. }
  25. GuiEvent* gui_event_alloc() {
  26. GuiEvent* gui_event = furi_alloc(sizeof(GuiEvent));
  27. // Allocate message queue
  28. gui_event->mqueue = osMessageQueueNew(GUI_EVENT_MQUEUE_SIZE, sizeof(GuiMessage), NULL);
  29. furi_check(gui_event->mqueue);
  30. gui_event->timer = osTimerNew(gui_event_timer_callback, osTimerPeriodic, gui_event, NULL);
  31. assert(gui_event->timer);
  32. osTimerStart(gui_event->timer, 1000 / 10);
  33. // Input
  34. gui_event->input_event_record = furi_open("input_events");
  35. furi_check(gui_event->input_event_record != NULL);
  36. subscribe_pubsub(gui_event->input_event_record, gui_event_input_events_callback, gui_event);
  37. return gui_event;
  38. }
  39. void gui_event_free(GuiEvent* gui_event) {
  40. furi_assert(gui_event);
  41. furi_check(osMessageQueueDelete(gui_event->mqueue) == osOK);
  42. free(gui_event);
  43. }
  44. void gui_event_messsage_send(GuiEvent* gui_event, GuiMessage* message) {
  45. furi_assert(gui_event);
  46. furi_assert(message);
  47. osMessageQueuePut(gui_event->mqueue, message, 0, 0);
  48. }
  49. GuiMessage gui_event_message_next(GuiEvent* gui_event) {
  50. furi_assert(gui_event);
  51. GuiMessage message;
  52. furi_check(osMessageQueueGet(gui_event->mqueue, &message, NULL, osWaitForever) == osOK);
  53. return message;
  54. }