desktop_view_main.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include <gui/gui_i.h>
  2. #include <gui/view.h>
  3. #include <gui/elements.h>
  4. #include <gui/canvas.h>
  5. #include <furi.h>
  6. #include <input/input.h>
  7. #include <dolphin/dolphin.h>
  8. #include "../desktop_i.h"
  9. #include "desktop_view_main.h"
  10. struct DesktopMainView {
  11. View* view;
  12. DesktopMainViewCallback callback;
  13. void* context;
  14. TimerHandle_t poweroff_timer;
  15. bool dummy_mode;
  16. };
  17. #define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 5000
  18. static void desktop_main_poweroff_timer_callback(TimerHandle_t timer) {
  19. DesktopMainView* main_view = pvTimerGetTimerID(timer);
  20. main_view->callback(DesktopMainEventOpenPowerOff, main_view->context);
  21. }
  22. void desktop_main_set_callback(
  23. DesktopMainView* main_view,
  24. DesktopMainViewCallback callback,
  25. void* context) {
  26. furi_assert(main_view);
  27. furi_assert(callback);
  28. main_view->callback = callback;
  29. main_view->context = context;
  30. }
  31. View* desktop_main_get_view(DesktopMainView* main_view) {
  32. furi_assert(main_view);
  33. return main_view->view;
  34. }
  35. void desktop_main_set_dummy_mode_state(DesktopMainView* main_view, bool dummy_mode) {
  36. furi_assert(main_view);
  37. main_view->dummy_mode = dummy_mode;
  38. }
  39. bool desktop_main_input_callback(InputEvent* event, void* context) {
  40. furi_assert(event);
  41. furi_assert(context);
  42. DesktopMainView* main_view = context;
  43. if(main_view->dummy_mode == false) {
  44. if(event->type == InputTypeShort) {
  45. if(event->key == InputKeyOk) {
  46. main_view->callback(DesktopMainEventOpenMenu, main_view->context);
  47. } else if(event->key == InputKeyUp) {
  48. main_view->callback(DesktopMainEventOpenLockMenu, main_view->context);
  49. } else if(event->key == InputKeyDown) {
  50. main_view->callback(DesktopMainEventOpenArchive, main_view->context);
  51. } else if(event->key == InputKeyLeft) {
  52. main_view->callback(DesktopMainEventOpenFavoritePrimary, main_view->context);
  53. }
  54. // Right key is handled by animation manager
  55. } else if(event->type == InputTypeLong) {
  56. if(event->key == InputKeyDown) {
  57. main_view->callback(DesktopMainEventOpenDebug, main_view->context);
  58. } else if(event->key == InputKeyLeft) {
  59. main_view->callback(DesktopMainEventOpenFavoriteSecondary, main_view->context);
  60. }
  61. }
  62. } else {
  63. if(event->type == InputTypeShort) {
  64. if(event->key == InputKeyOk) {
  65. main_view->callback(DesktopMainEventOpenGameMenu, main_view->context);
  66. } else if(event->key == InputKeyUp) {
  67. main_view->callback(DesktopMainEventOpenLockMenu, main_view->context);
  68. } else if(event->key == InputKeyDown) {
  69. main_view->callback(DesktopMainEventOpenPassport, main_view->context);
  70. } else if(event->key == InputKeyLeft) {
  71. main_view->callback(DesktopMainEventOpenPassport, main_view->context);
  72. }
  73. // Right key is handled by animation manager
  74. }
  75. }
  76. if(event->key == InputKeyBack) {
  77. if(event->type == InputTypePress) {
  78. xTimerChangePeriod(
  79. main_view->poweroff_timer,
  80. pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT),
  81. portMAX_DELAY);
  82. } else if(event->type == InputTypeRelease) {
  83. xTimerStop(main_view->poweroff_timer, portMAX_DELAY);
  84. }
  85. }
  86. return true;
  87. }
  88. DesktopMainView* desktop_main_alloc() {
  89. DesktopMainView* main_view = malloc(sizeof(DesktopMainView));
  90. main_view->view = view_alloc();
  91. view_allocate_model(main_view->view, ViewModelTypeLockFree, 1);
  92. view_set_context(main_view->view, main_view);
  93. view_set_input_callback(main_view->view, desktop_main_input_callback);
  94. main_view->poweroff_timer = xTimerCreate(
  95. NULL,
  96. pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT),
  97. pdFALSE,
  98. main_view,
  99. desktop_main_poweroff_timer_callback);
  100. return main_view;
  101. }
  102. void desktop_main_free(DesktopMainView* main_view) {
  103. furi_assert(main_view);
  104. view_free(main_view->view);
  105. furi_timer_free(main_view->poweroff_timer);
  106. free(main_view);
  107. }