ibutton-view-manager.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "ibutton-view-manager.h"
  2. #include "ibutton-event.h"
  3. #include <callback-connector.h>
  4. iButtonAppViewManager::iButtonAppViewManager() {
  5. event_queue = osMessageQueueNew(10, sizeof(iButtonEvent), NULL);
  6. view_dispatcher = view_dispatcher_alloc();
  7. auto callback = cbc::obtain_connector(this, &iButtonAppViewManager::previous_view_callback);
  8. dialog_ex = dialog_ex_alloc();
  9. view_dispatcher_add_view(
  10. view_dispatcher,
  11. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewDialogEx),
  12. dialog_ex_get_view(dialog_ex));
  13. submenu = submenu_alloc();
  14. view_dispatcher_add_view(
  15. view_dispatcher,
  16. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewSubmenu),
  17. submenu_get_view(submenu));
  18. text_input = text_input_alloc();
  19. view_dispatcher_add_view(
  20. view_dispatcher,
  21. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewTextInput),
  22. text_input_get_view(text_input));
  23. byte_input = byte_input_alloc();
  24. view_dispatcher_add_view(
  25. view_dispatcher,
  26. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewByteInput),
  27. byte_input_get_view(byte_input));
  28. popup = popup_alloc();
  29. view_dispatcher_add_view(
  30. view_dispatcher,
  31. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewPopup),
  32. popup_get_view(popup));
  33. widget = widget_alloc();
  34. view_dispatcher_add_view(
  35. view_dispatcher,
  36. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewWidget),
  37. widget_get_view(widget));
  38. gui = static_cast<Gui*>(furi_record_open("gui"));
  39. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  40. //TODO think about that method, seems unsafe and over-engineered
  41. view_set_previous_callback(dialog_ex_get_view(dialog_ex), callback);
  42. view_set_previous_callback(submenu_get_view(submenu), callback);
  43. view_set_previous_callback(text_input_get_view(text_input), callback);
  44. view_set_previous_callback(byte_input_get_view(byte_input), callback);
  45. view_set_previous_callback(popup_get_view(popup), callback);
  46. view_set_previous_callback(widget_get_view(widget), callback);
  47. }
  48. iButtonAppViewManager::~iButtonAppViewManager() {
  49. // remove views
  50. view_dispatcher_remove_view(
  51. view_dispatcher,
  52. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewDialogEx));
  53. view_dispatcher_remove_view(
  54. view_dispatcher,
  55. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewSubmenu));
  56. view_dispatcher_remove_view(
  57. view_dispatcher,
  58. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewTextInput));
  59. view_dispatcher_remove_view(
  60. view_dispatcher, static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewPopup));
  61. view_dispatcher_remove_view(
  62. view_dispatcher,
  63. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewByteInput));
  64. view_dispatcher_remove_view(
  65. view_dispatcher, static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewWidget));
  66. // free view modules
  67. popup_free(popup);
  68. text_input_free(text_input);
  69. byte_input_free(byte_input);
  70. submenu_free(submenu);
  71. dialog_ex_free(dialog_ex);
  72. widget_free(widget);
  73. // free dispatcher
  74. view_dispatcher_free(view_dispatcher);
  75. // free event queue
  76. osMessageQueueDelete(event_queue);
  77. }
  78. void iButtonAppViewManager::switch_to(Type type) {
  79. view_dispatcher_switch_to_view(view_dispatcher, static_cast<uint32_t>(type));
  80. }
  81. Submenu* iButtonAppViewManager::get_submenu() {
  82. return submenu;
  83. }
  84. Popup* iButtonAppViewManager::get_popup() {
  85. return popup;
  86. }
  87. DialogEx* iButtonAppViewManager::get_dialog_ex() {
  88. return dialog_ex;
  89. }
  90. TextInput* iButtonAppViewManager::get_text_input() {
  91. return text_input;
  92. }
  93. ByteInput* iButtonAppViewManager::get_byte_input() {
  94. return byte_input;
  95. }
  96. Widget* iButtonAppViewManager::get_widget() {
  97. return widget;
  98. }
  99. void iButtonAppViewManager::receive_event(iButtonEvent* event) {
  100. if(osMessageQueueGet(event_queue, event, NULL, 100) != osOK) {
  101. event->type = iButtonEvent::Type::EventTypeTick;
  102. }
  103. }
  104. void iButtonAppViewManager::send_event(iButtonEvent* event) {
  105. osStatus_t result = osMessageQueuePut(event_queue, event, 0, 0);
  106. furi_check(result == osOK);
  107. }
  108. uint32_t iButtonAppViewManager::previous_view_callback(void* context) {
  109. if(event_queue != NULL) {
  110. iButtonEvent event;
  111. event.type = iButtonEvent::Type::EventTypeBack;
  112. send_event(&event);
  113. }
  114. return VIEW_IGNORE;
  115. }