xremote_scene_ir_remote.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "../xremote.h"
  2. typedef enum {
  3. ButtonIndexPlus = -2,
  4. ButtonIndexEdit = -1,
  5. ButtonIndexNA = 0,
  6. } ButtonIndex;
  7. static void xremote_scene_ir_remote_button_menu_callback(void* context, int32_t index, InputType type) {
  8. XRemote* app = context;
  9. uint16_t custom_type;
  10. if(type == InputTypePress) {
  11. custom_type = XRemoteCustomEventMenuVoid;
  12. } else if(type == InputTypeRelease) {
  13. custom_type = XRemoteCustomEventMenuAddIrSelected;
  14. } else if(type == InputTypeShort) {
  15. custom_type = XRemoteCustomEventMenuVoid;
  16. } else {
  17. furi_crash("Unexpected IR input type");
  18. }
  19. view_dispatcher_send_custom_event(
  20. app->view_dispatcher, xremote_custom_menu_event_pack(custom_type, index));
  21. }
  22. void xremote_scene_ir_remote_on_enter(void* context) {
  23. XRemote* app = context;
  24. ButtonMenu* button_menu = app->button_menu_ir;
  25. size_t button_count = xremote_ir_remote_get_button_count(app->ir_remote_buffer);
  26. for(size_t i = 0; i < button_count; i++) {
  27. InfraredRemoteButton* button = xremote_ir_remote_get_button(app->ir_remote_buffer, i);
  28. button_menu_add_item(
  29. button_menu,
  30. xremote_ir_remote_button_get_name(button),
  31. i,
  32. xremote_scene_ir_remote_button_menu_callback,
  33. ButtonMenuItemTypeCommon,
  34. context);
  35. }
  36. button_menu_set_header(button_menu, "Select Cmd");
  37. const int16_t button_index =
  38. (signed)scene_manager_get_scene_state(app->scene_manager, XRemoteViewIdIrRemote);
  39. button_menu_set_selected_item(button_menu, button_index);
  40. view_dispatcher_switch_to_view(app->view_dispatcher, XRemoteViewIdIrRemote);
  41. }
  42. bool xremote_scene_ir_remote_on_event(void* context, SceneManagerEvent event) {
  43. XRemote* app = context;
  44. bool consumed = false;
  45. if(event.type == SceneManagerEventTypeCustom) {
  46. const uint16_t custom_type = xremote_custom_menu_event_get_type(event.event);
  47. const int16_t button_index = xremote_custom_menu_event_get_value(event.event);
  48. if (custom_type == XRemoteCustomEventMenuAddIrSelected) {
  49. scene_manager_set_scene_state(
  50. app->scene_manager, XRemoteSceneIrRemote, (unsigned)button_index);
  51. InfraredRemoteButton* ir_button = xremote_ir_remote_get_button(app->ir_remote_buffer, button_index);
  52. const char* button_name = xremote_ir_remote_button_get_name(ir_button);
  53. InfraredSignal* signal = xremote_ir_remote_button_get_signal(ir_button);
  54. cross_remote_add_ir_item(app->cross_remote, button_name, signal);
  55. scene_manager_next_scene(app->scene_manager, XRemoteSceneCreate);
  56. consumed = true;
  57. }
  58. }
  59. return consumed;
  60. }
  61. void xremote_scene_ir_remote_on_exit(void* context) {
  62. XRemote* app = context;
  63. button_menu_reset(app->button_menu_ir);
  64. }