subghz-view-manager.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "subghz-view-manager.h"
  2. #include "subghz-event.h"
  3. #include <callback-connector.h>
  4. SubghzAppViewManager::SubghzAppViewManager() {
  5. event_queue = osMessageQueueNew(10, sizeof(SubghzEvent), NULL);
  6. view_dispatcher = view_dispatcher_alloc();
  7. auto callback = cbc::obtain_connector(this, &SubghzAppViewManager::previous_view_callback);
  8. // allocate views
  9. submenu = submenu_alloc();
  10. view_dispatcher_add_view(
  11. view_dispatcher,
  12. static_cast<uint32_t>(SubghzAppViewManager::ViewType::Submenu),
  13. submenu_get_view(submenu));
  14. spectrum_settings = new SubghzViewSpectrumSettings();
  15. view_dispatcher_add_view(
  16. view_dispatcher,
  17. static_cast<uint32_t>(SubghzAppViewManager::ViewType::SpectrumSettings),
  18. spectrum_settings->get_view());
  19. gui = static_cast<Gui*>(furi_record_open("gui"));
  20. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  21. // set previous view callback for all views
  22. view_set_previous_callback(submenu_get_view(submenu), callback);
  23. view_set_previous_callback(spectrum_settings->get_view(), callback);
  24. }
  25. SubghzAppViewManager::~SubghzAppViewManager() {
  26. // remove views
  27. view_dispatcher_remove_view(
  28. view_dispatcher, static_cast<uint32_t>(SubghzAppViewManager::ViewType::Submenu));
  29. view_dispatcher_remove_view(
  30. view_dispatcher, static_cast<uint32_t>(SubghzAppViewManager::ViewType::SpectrumSettings));
  31. // free view modules
  32. submenu_free(submenu);
  33. free(spectrum_settings);
  34. // free dispatcher
  35. view_dispatcher_free(view_dispatcher);
  36. // free event queue
  37. osMessageQueueDelete(event_queue);
  38. }
  39. void SubghzAppViewManager::switch_to(ViewType type) {
  40. view_dispatcher_switch_to_view(view_dispatcher, static_cast<uint32_t>(type));
  41. }
  42. Submenu* SubghzAppViewManager::get_submenu() {
  43. return submenu;
  44. }
  45. SubghzViewSpectrumSettings* SubghzAppViewManager::get_spectrum_settings() {
  46. return spectrum_settings;
  47. }
  48. void SubghzAppViewManager::receive_event(SubghzEvent* event) {
  49. if(osMessageQueueGet(event_queue, event, NULL, 100) != osOK) {
  50. event->type = SubghzEvent::Type::Tick;
  51. }
  52. }
  53. void SubghzAppViewManager::send_event(SubghzEvent* event) {
  54. osStatus_t result = osMessageQueuePut(event_queue, event, 0, 0);
  55. furi_check(result == osOK);
  56. }
  57. uint32_t SubghzAppViewManager::previous_view_callback(void* context) {
  58. if(event_queue != NULL) {
  59. SubghzEvent event;
  60. event.type = SubghzEvent::Type::Back;
  61. send_event(&event);
  62. }
  63. return VIEW_IGNORE;
  64. }