infrared_scene_remote.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. infrared_worker_tx_set_get_signal_callback(
  29. infrared->worker, infrared_worker_tx_get_signal_steady_callback, infrared);
  30. size_t button_count = infrared_remote_get_button_count(remote);
  31. for(size_t i = 0; i < button_count; ++i) {
  32. InfraredRemoteButton* button = infrared_remote_get_button(remote, i);
  33. button_menu_add_item(
  34. button_menu,
  35. infrared_remote_button_get_name(button),
  36. i,
  37. infrared_scene_remote_button_menu_callback,
  38. ButtonMenuItemTypeCommon,
  39. context);
  40. }
  41. button_menu_add_item(
  42. button_menu,
  43. "+",
  44. ButtonIndexPlus,
  45. infrared_scene_remote_button_menu_callback,
  46. ButtonMenuItemTypeControl,
  47. context);
  48. button_menu_add_item(
  49. button_menu,
  50. "Edit",
  51. ButtonIndexEdit,
  52. infrared_scene_remote_button_menu_callback,
  53. ButtonMenuItemTypeControl,
  54. context);
  55. button_menu_set_header(button_menu, infrared_remote_get_name(remote));
  56. const int16_t button_index =
  57. (signed)scene_manager_get_scene_state(scene_manager, InfraredSceneRemote);
  58. button_menu_set_selected_item(button_menu, button_index);
  59. scene_manager_set_scene_state(scene_manager, InfraredSceneRemote, ButtonIndexNA);
  60. view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewButtonMenu);
  61. }
  62. bool infrared_scene_remote_on_event(void* context, SceneManagerEvent event) {
  63. Infrared* infrared = context;
  64. SceneManager* scene_manager = infrared->scene_manager;
  65. bool consumed = false;
  66. if(event.type == SceneManagerEventTypeBack) {
  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 if(event.type == SceneManagerEventTypeCustom) {
  71. const uint16_t custom_type = infrared_custom_event_get_type(event.event);
  72. const int16_t button_index = infrared_custom_event_get_value(event.event);
  73. if(custom_type == InfraredCustomEventTypeTransmitStarted) {
  74. furi_assert(button_index >= 0);
  75. infrared_tx_start_button_index(infrared, button_index);
  76. consumed = true;
  77. } else if(custom_type == InfraredCustomEventTypeTransmitStopped) {
  78. infrared_tx_stop(infrared);
  79. consumed = true;
  80. } else if(custom_type == InfraredCustomEventTypeMenuSelected) {
  81. furi_assert(button_index < 0);
  82. scene_manager_set_scene_state(
  83. scene_manager, InfraredSceneRemote, (unsigned)button_index);
  84. if(button_index == ButtonIndexPlus) {
  85. infrared->app_state.is_learning_new_remote = false;
  86. scene_manager_next_scene(scene_manager, InfraredSceneLearn);
  87. consumed = true;
  88. } else if(button_index == ButtonIndexEdit) {
  89. scene_manager_next_scene(scene_manager, InfraredSceneEdit);
  90. consumed = true;
  91. }
  92. }
  93. }
  94. return consumed;
  95. }
  96. void infrared_scene_remote_on_exit(void* context) {
  97. Infrared* infrared = context;
  98. infrared_tx_stop(infrared);
  99. infrared_worker_tx_set_get_signal_callback(infrared->worker, NULL, NULL);
  100. button_menu_reset(infrared->button_menu);
  101. }