irda_app_scene_universal_tv.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <stdint.h>
  2. #include <gui/modules/loading.h>
  3. #include <gui/view_stack.h>
  4. #include "irda/scene/irda_app_scene.h"
  5. #include "irda/irda_app.h"
  6. void IrdaAppSceneUniversalTV::on_enter(IrdaApp* app) {
  7. IrdaAppViewManager* view_manager = app->get_view_manager();
  8. ButtonPanel* button_panel = view_manager->get_button_panel();
  9. button_panel_reserve(button_panel, 2, 3);
  10. int i = 0;
  11. button_panel_add_item(
  12. button_panel,
  13. i,
  14. 0,
  15. 0,
  16. 3,
  17. 19,
  18. &I_Power_25x27,
  19. &I_Power_hvr_25x27,
  20. irda_app_item_callback,
  21. app);
  22. brute_force.add_record(i, "POWER");
  23. ++i;
  24. button_panel_add_item(
  25. button_panel,
  26. i,
  27. 1,
  28. 0,
  29. 36,
  30. 19,
  31. &I_Mute_25x27,
  32. &I_Mute_hvr_25x27,
  33. irda_app_item_callback,
  34. app);
  35. brute_force.add_record(i, "MUTE");
  36. ++i;
  37. button_panel_add_item(
  38. button_panel,
  39. i,
  40. 0,
  41. 1,
  42. 3,
  43. 66,
  44. &I_Vol_up_25x27,
  45. &I_Vol_up_hvr_25x27,
  46. irda_app_item_callback,
  47. app);
  48. brute_force.add_record(i, "VOL+");
  49. ++i;
  50. button_panel_add_item(
  51. button_panel, i, 1, 1, 36, 66, &I_Up_25x27, &I_Up_hvr_25x27, irda_app_item_callback, app);
  52. brute_force.add_record(i, "CH+");
  53. ++i;
  54. button_panel_add_item(
  55. button_panel,
  56. i,
  57. 0,
  58. 2,
  59. 3,
  60. 98,
  61. &I_Vol_down_25x27,
  62. &I_Vol_down_hvr_25x27,
  63. irda_app_item_callback,
  64. app);
  65. brute_force.add_record(i, "VOL-");
  66. ++i;
  67. button_panel_add_item(
  68. button_panel,
  69. i,
  70. 1,
  71. 2,
  72. 36,
  73. 98,
  74. &I_Down_25x27,
  75. &I_Down_hvr_25x27,
  76. irda_app_item_callback,
  77. app);
  78. brute_force.add_record(i, "CH-");
  79. button_panel_add_label(button_panel, 6, 11, FontPrimary, "TV remote");
  80. button_panel_add_label(button_panel, 9, 64, FontSecondary, "Vol");
  81. button_panel_add_label(button_panel, 43, 64, FontSecondary, "Ch");
  82. view_manager->switch_to(IrdaAppViewManager::ViewType::UniversalRemote);
  83. auto stack_view = app->get_view_manager()->get_universal_view_stack();
  84. auto loading_view = app->get_view_manager()->get_loading();
  85. view_stack_add_view(stack_view, loading_get_view(loading_view));
  86. /**
  87. * Problem: Update events are not handled in Loading View, because:
  88. * 1) Timer task has least prio
  89. * 2) Storage service uses drivers that capture whole CPU time
  90. * to handle SD communication
  91. *
  92. * Ugly workaround, but it works for current situation:
  93. * raise timer task prio for DB scanning period.
  94. */
  95. TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
  96. TaskHandle_t storage_task = xTaskGetHandle("StorageSrv");
  97. uint32_t timer_prio = uxTaskPriorityGet(timer_task);
  98. uint32_t storage_prio = uxTaskPriorityGet(storage_task);
  99. vTaskPrioritySet(timer_task, storage_prio + 1);
  100. bool result = brute_force.calculate_messages();
  101. vTaskPrioritySet(timer_task, timer_prio);
  102. view_stack_remove_view(stack_view, loading_get_view(loading_view));
  103. if(!result) {
  104. app->switch_to_previous_scene();
  105. }
  106. }