menu_event.c 2.3 KB

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