ibutton-view-manager.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. gui = static_cast<Gui*>(furi_record_open("gui"));
  34. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  35. //TODO think about that method, seems unsafe and over-engineered
  36. view_set_previous_callback(dialog_ex_get_view(dialog_ex), callback);
  37. view_set_previous_callback(submenu_get_view(submenu), callback);
  38. view_set_previous_callback(text_input_get_view(text_input), callback);
  39. view_set_previous_callback(byte_input_get_view(byte_input), callback);
  40. view_set_previous_callback(popup_get_view(popup), callback);
  41. }
  42. iButtonAppViewManager::~iButtonAppViewManager() {
  43. // remove views
  44. view_dispatcher_remove_view(
  45. view_dispatcher,
  46. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewDialogEx));
  47. view_dispatcher_remove_view(
  48. view_dispatcher,
  49. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewSubmenu));
  50. view_dispatcher_remove_view(
  51. view_dispatcher,
  52. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewTextInput));
  53. view_dispatcher_remove_view(
  54. view_dispatcher, static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewPopup));
  55. view_dispatcher_remove_view(
  56. view_dispatcher,
  57. static_cast<uint32_t>(iButtonAppViewManager::Type::iButtonAppViewByteInput));
  58. // free view modules
  59. popup_free(popup);
  60. text_input_free(text_input);
  61. byte_input_free(byte_input);
  62. submenu_free(submenu);
  63. dialog_ex_free(dialog_ex);
  64. // free dispatcher
  65. view_dispatcher_free(view_dispatcher);
  66. // free event queue
  67. osMessageQueueDelete(event_queue);
  68. }
  69. void iButtonAppViewManager::switch_to(Type type) {
  70. view_dispatcher_switch_to_view(view_dispatcher, static_cast<uint32_t>(type));
  71. }
  72. Submenu* iButtonAppViewManager::get_submenu() {
  73. return submenu;
  74. }
  75. Popup* iButtonAppViewManager::get_popup() {
  76. return popup;
  77. }
  78. DialogEx* iButtonAppViewManager::get_dialog_ex() {
  79. return dialog_ex;
  80. }
  81. TextInput* iButtonAppViewManager::get_text_input() {
  82. return text_input;
  83. }
  84. ByteInput* iButtonAppViewManager::get_byte_input() {
  85. return byte_input;
  86. }
  87. void iButtonAppViewManager::receive_event(iButtonEvent* event) {
  88. if(osMessageQueueGet(event_queue, event, NULL, 100) != osOK) {
  89. event->type = iButtonEvent::Type::EventTypeTick;
  90. }
  91. }
  92. void iButtonAppViewManager::send_event(iButtonEvent* event) {
  93. osStatus_t result = osMessageQueuePut(event_queue, event, 0, 0);
  94. furi_check(result == osOK);
  95. }
  96. uint32_t iButtonAppViewManager::previous_view_callback(void* context) {
  97. if(event_queue != NULL) {
  98. iButtonEvent event;
  99. event.type = iButtonEvent::Type::EventTypeBack;
  100. send_event(&event);
  101. }
  102. return VIEW_IGNORE;
  103. }