infrared_scene_remote.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "../infrared_i.h"
  2. typedef enum {
  3. ButtonIndexPlus = -2,
  4. ButtonIndexEdit = -1,
  5. ButtonIndexNA = 0,
  6. } ButtonIndex;
  7. static void
  8. infrared_scene_remote_button_menu_callback(void* context, int32_t index, InputType type) {
  9. Infrared* infrared = context;
  10. uint16_t custom_type;
  11. if(type == InputTypePress) {
  12. custom_type = InfraredCustomEventTypeTransmitStarted;
  13. } else if(type == InputTypeRelease) {
  14. custom_type = InfraredCustomEventTypeTransmitStopped;
  15. } else if(type == InputTypeShort) {
  16. custom_type = InfraredCustomEventTypeMenuSelected;
  17. } else {
  18. furi_crash("Unexpected input type");
  19. }
  20. view_dispatcher_send_custom_event(
  21. infrared->view_dispatcher, infrared_custom_event_pack(custom_type, index));
  22. }
  23. void infrared_scene_remote_on_enter(void* context) {
  24. Infrared* infrared = context;
  25. InfraredRemote* remote = infrared->remote;
  26. ButtonMenu* button_menu = infrared->button_menu;
  27. SceneManager* scene_manager = infrared->scene_manager;
  28. size_t button_count = infrared_remote_get_button_count(remote);
  29. for(size_t i = 0; i < button_count; ++i) {
  30. InfraredRemoteButton* button = infrared_remote_get_button(remote, i);
  31. button_menu_add_item(
  32. button_menu,
  33. infrared_remote_button_get_name(button),
  34. i,
  35. infrared_scene_remote_button_menu_callback,
  36. ButtonMenuItemTypeCommon,
  37. context);
  38. }
  39. button_menu_add_item(
  40. button_menu,
  41. "+",
  42. ButtonIndexPlus,
  43. infrared_scene_remote_button_menu_callback,
  44. ButtonMenuItemTypeControl,
  45. context);
  46. button_menu_add_item(
  47. button_menu,
  48. "Edit",
  49. ButtonIndexEdit,
  50. infrared_scene_remote_button_menu_callback,
  51. ButtonMenuItemTypeControl,
  52. context);
  53. button_menu_set_header(button_menu, infrared_remote_get_name(remote));
  54. const int16_t button_index =
  55. (signed)scene_manager_get_scene_state(scene_manager, InfraredSceneRemote);
  56. button_menu_set_selected_item(button_menu, button_index);
  57. scene_manager_set_scene_state(scene_manager, InfraredSceneRemote, ButtonIndexNA);
  58. view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewButtonMenu);
  59. }
  60. bool infrared_scene_remote_on_event(void* context, SceneManagerEvent event) {
  61. Infrared* infrared = context;
  62. SceneManager* scene_manager = infrared->scene_manager;
  63. const bool is_transmitter_idle = !infrared->app_state.is_transmitting;
  64. bool consumed = false;
  65. if(event.type == SceneManagerEventTypeBack) {
  66. if(is_transmitter_idle) {
  67. const uint32_t possible_scenes[] = {InfraredSceneRemoteList, InfraredSceneStart};
  68. consumed = scene_manager_search_and_switch_to_previous_scene_one_of(
  69. scene_manager, possible_scenes, COUNT_OF(possible_scenes));
  70. } else {
  71. consumed = true;
  72. }
  73. } else if(event.type == SceneManagerEventTypeCustom) {
  74. const uint16_t custom_type = infrared_custom_event_get_type(event.event);
  75. const int16_t button_index = infrared_custom_event_get_value(event.event);
  76. if(custom_type == InfraredCustomEventTypeTransmitStarted) {
  77. furi_assert(button_index >= 0);
  78. infrared_tx_start_button_index(infrared, button_index);
  79. consumed = true;
  80. } else if(custom_type == InfraredCustomEventTypeTransmitStopped) {
  81. infrared_tx_stop(infrared);
  82. consumed = true;
  83. } else if(custom_type == InfraredCustomEventTypeMenuSelected) {
  84. furi_assert(button_index < 0);
  85. if(is_transmitter_idle) {
  86. scene_manager_set_scene_state(
  87. scene_manager, InfraredSceneRemote, (unsigned)button_index);
  88. if(button_index == ButtonIndexPlus) {
  89. infrared->app_state.is_learning_new_remote = false;
  90. scene_manager_next_scene(scene_manager, InfraredSceneLearn);
  91. consumed = true;
  92. } else if(button_index == ButtonIndexEdit) {
  93. scene_manager_next_scene(scene_manager, InfraredSceneEdit);
  94. consumed = true;
  95. }
  96. } else {
  97. consumed = true;
  98. }
  99. }
  100. }
  101. return consumed;
  102. }
  103. void infrared_scene_remote_on_exit(void* context) {
  104. Infrared* infrared = context;
  105. button_menu_reset(infrared->button_menu);
  106. }