subghz-app.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "subghz-app.h"
  2. #include <api-hal-power.h>
  3. #include <stdarg.h>
  4. void SubghzApp::run(void) {
  5. SubghzEvent event;
  6. bool consumed;
  7. bool exit = false;
  8. scenes[current_scene]->on_enter(this);
  9. while(!exit) {
  10. view.receive_event(&event);
  11. consumed = scenes[current_scene]->on_event(this, &event);
  12. if(!consumed) {
  13. if(event.type == SubghzEvent::Type::Back) {
  14. exit = switch_to_previous_scene();
  15. }
  16. }
  17. };
  18. scenes[current_scene]->on_exit(this);
  19. }
  20. SubghzApp::SubghzApp() {
  21. api_hal_power_insomnia_enter();
  22. }
  23. SubghzApp::~SubghzApp() {
  24. api_hal_power_insomnia_exit();
  25. }
  26. SubghzAppViewManager* SubghzApp::get_view_manager() {
  27. return &view;
  28. }
  29. void SubghzApp::switch_to_next_scene(Scene next_scene) {
  30. previous_scenes_list.push_front(current_scene);
  31. if(next_scene != Scene::SceneExit) {
  32. scenes[current_scene]->on_exit(this);
  33. current_scene = next_scene;
  34. scenes[current_scene]->on_enter(this);
  35. }
  36. }
  37. void SubghzApp::search_and_switch_to_previous_scene(std::initializer_list<Scene> scenes_list) {
  38. Scene previous_scene = Scene::SceneStart;
  39. bool scene_found = false;
  40. while(!scene_found) {
  41. previous_scene = get_previous_scene();
  42. for(Scene element : scenes_list) {
  43. if(previous_scene == element || previous_scene == Scene::SceneStart) {
  44. scene_found = true;
  45. break;
  46. }
  47. }
  48. }
  49. scenes[current_scene]->on_exit(this);
  50. current_scene = previous_scene;
  51. scenes[current_scene]->on_enter(this);
  52. }
  53. bool SubghzApp::switch_to_previous_scene(uint8_t count) {
  54. Scene previous_scene = Scene::SceneStart;
  55. for(uint8_t i = 0; i < count; i++) {
  56. previous_scene = get_previous_scene();
  57. if(previous_scene == Scene::SceneExit) break;
  58. }
  59. if(previous_scene == Scene::SceneExit) {
  60. return true;
  61. } else {
  62. scenes[current_scene]->on_exit(this);
  63. current_scene = previous_scene;
  64. scenes[current_scene]->on_enter(this);
  65. return false;
  66. }
  67. }
  68. SubghzApp::Scene SubghzApp::get_previous_scene() {
  69. Scene scene = previous_scenes_list.front();
  70. previous_scenes_list.pop_front();
  71. return scene;
  72. }