menu_event.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "menu_event.h"
  2. #include <cmsis_os.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <flipper.h>
  6. #include <flipper_v2.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. furi_check(menu_event->mqueue);
  22. menu_event->timeout_timer =
  23. osTimerNew(MenuEventimeout_callback, osTimerOnce, menu_event, NULL);
  24. furi_check(menu_event->timeout_timer);
  25. return menu_event;
  26. }
  27. void menu_event_free(MenuEvent* menu_event) {
  28. furi_assert(menu_event);
  29. furi_check(osMessageQueueDelete(menu_event->mqueue) == osOK);
  30. free(menu_event);
  31. }
  32. void menu_event_activity_notify(MenuEvent* menu_event) {
  33. furi_assert(menu_event);
  34. osTimerStart(menu_event->timeout_timer, 60000U); // 1m timeout, return to main
  35. }
  36. MenuMessage menu_event_next(MenuEvent* menu_event) {
  37. furi_assert(menu_event);
  38. MenuMessage message;
  39. while(osMessageQueueGet(menu_event->mqueue, &message, NULL, osWaitForever) != osOK) {
  40. };
  41. return message;
  42. }
  43. void menu_event_input_callback(InputEvent* input_event, void* context) {
  44. MenuEvent* menu_event = context;
  45. MenuMessage message;
  46. if(!input_event->state) return;
  47. if(input_event->input == InputUp) {
  48. message.type = MenuMessageTypeUp;
  49. } else if(input_event->input == InputDown) {
  50. message.type = MenuMessageTypeDown;
  51. } else if(input_event->input == InputRight) {
  52. message.type = MenuMessageTypeRight;
  53. } else if(input_event->input == InputLeft) {
  54. message.type = MenuMessageTypeLeft;
  55. } else if(input_event->input == InputOk) {
  56. message.type = MenuMessageTypeOk;
  57. } else if(input_event->input == InputBack) {
  58. message.type = MenuMessageTypeBack;
  59. } else {
  60. message.type = MenuMessageTypeUnknown;
  61. }
  62. osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever);
  63. }