menu_event.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "menu_event.h"
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <furi.h>
  5. #define MENU_MESSAGE_MQUEUE_SIZE 8
  6. struct MenuEvent {
  7. osMessageQueueId_t mqueue;
  8. osTimerId_t timeout_timer;
  9. };
  10. void MenuEventimeout_callback(void* arg) {
  11. MenuEvent* menu_event = arg;
  12. MenuMessage message;
  13. message.type = MenuMessageTypeIdle;
  14. osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever);
  15. }
  16. MenuEvent* menu_event_alloc() {
  17. MenuEvent* menu_event = furi_alloc(sizeof(MenuEvent));
  18. menu_event->mqueue = osMessageQueueNew(MENU_MESSAGE_MQUEUE_SIZE, sizeof(MenuMessage), NULL);
  19. furi_check(menu_event->mqueue);
  20. menu_event->timeout_timer =
  21. osTimerNew(MenuEventimeout_callback, osTimerOnce, menu_event, NULL);
  22. furi_check(menu_event->timeout_timer);
  23. return menu_event;
  24. }
  25. void menu_event_free(MenuEvent* menu_event) {
  26. furi_assert(menu_event);
  27. furi_check(osMessageQueueDelete(menu_event->mqueue) == osOK);
  28. free(menu_event);
  29. }
  30. void menu_event_activity_notify(MenuEvent* menu_event) {
  31. furi_assert(menu_event);
  32. osTimerStart(menu_event->timeout_timer, 60000U); // 1m timeout, return to main
  33. }
  34. MenuMessage menu_event_next(MenuEvent* menu_event) {
  35. furi_assert(menu_event);
  36. MenuMessage message;
  37. while(osMessageQueueGet(menu_event->mqueue, &message, NULL, osWaitForever) != osOK) {
  38. };
  39. return message;
  40. }
  41. void menu_event_input_callback(InputEvent* input_event, void* context) {
  42. MenuEvent* menu_event = context;
  43. MenuMessage message;
  44. if(input_event->type != InputTypeShort) return;
  45. if(input_event->key == InputKeyUp) {
  46. message.type = MenuMessageTypeUp;
  47. } else if(input_event->key == InputKeyDown) {
  48. message.type = MenuMessageTypeDown;
  49. } else if(input_event->key == InputKeyRight) {
  50. message.type = MenuMessageTypeRight;
  51. } else if(input_event->key == InputKeyLeft) {
  52. message.type = MenuMessageTypeLeft;
  53. } else if(input_event->key == InputKeyOk) {
  54. message.type = MenuMessageTypeOk;
  55. } else if(input_event->key == InputKeyBack) {
  56. message.type = MenuMessageTypeBack;
  57. } else {
  58. message.type = MenuMessageTypeUnknown;
  59. }
  60. osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever);
  61. }