pof_scene_main.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "../portal_of_flipper_i.h"
  2. #include "../pof_token.h"
  3. enum SubmenuIndex {
  4. SubmenuIndexLoad = POF_TOKEN_LIMIT,
  5. };
  6. void pof_scene_main_submenu_callback(void* context, uint32_t index) {
  7. PoFApp* pof = context;
  8. view_dispatcher_send_custom_event(pof->view_dispatcher, index);
  9. }
  10. void pof_scene_main_submenu_type_callback(void* context, PoFType type) {
  11. PoFApp* pof = context;
  12. pof_stop(pof);
  13. pof->type = type;
  14. pof_start(pof);
  15. }
  16. void pof_scene_main_on_update(void* context) {
  17. PoFApp* pof = context;
  18. VirtualPortal* virtual_portal = pof->virtual_portal;
  19. Submenu* submenu = pof->submenu;
  20. submenu_reset(pof->submenu);
  21. FuriString* token_name = furi_string_alloc();
  22. if(pof->pof_usb) {
  23. if (pof->type == PoFHid) {
  24. submenu_add_item(
  25. submenu,
  26. "Emulate Xbox 360",
  27. PoFXbox360,
  28. pof_scene_main_submenu_type_callback,
  29. pof);
  30. } else if (pof->type == PoFXbox360) {
  31. submenu_add_item(
  32. submenu,
  33. "Emulate HID",
  34. PoFHid,
  35. pof_scene_main_submenu_type_callback,
  36. pof);
  37. }
  38. int count = 0;
  39. for(int i = 0; i < POF_TOKEN_LIMIT; i++) {
  40. if(virtual_portal->tokens[i]->loaded) {
  41. PoFToken* pof_token = virtual_portal->tokens[i];
  42. furi_string_reset(token_name);
  43. //TODO: only do if debug mode
  44. furi_string_cat_printf(token_name, "%d: %s", i, pof_token->dev_name);
  45. // Unload figure
  46. submenu_add_item(
  47. submenu,
  48. furi_string_get_cstr(token_name),
  49. i,
  50. pof_scene_main_submenu_callback,
  51. pof);
  52. count++;
  53. }
  54. }
  55. if(count < POF_TOKEN_LIMIT) {
  56. submenu_add_item(
  57. submenu, "<Load figure>", SubmenuIndexLoad, pof_scene_main_submenu_callback, pof);
  58. }
  59. submenu_set_selected_item(
  60. submenu, scene_manager_get_scene_state(pof->scene_manager, PoFSceneMain));
  61. } else {
  62. submenu_add_item(
  63. submenu, "Failed to start", SubmenuIndexLoad, pof_scene_main_submenu_callback, pof);
  64. }
  65. furi_string_free(token_name);
  66. view_dispatcher_switch_to_view(pof->view_dispatcher, PoFViewSubmenu);
  67. }
  68. void pof_scene_main_on_enter(void* context) {
  69. pof_scene_main_on_update(context);
  70. }
  71. bool pof_scene_main_on_event(void* context, SceneManagerEvent event) {
  72. PoFApp* pof = context;
  73. VirtualPortal* virtual_portal = pof->virtual_portal;
  74. bool consumed = false;
  75. if(event.type == SceneManagerEventTypeCustom) {
  76. if(event.event == SubmenuIndexLoad) {
  77. if(pof->pof_usb) {
  78. // Explicitly save state so that the correct item is
  79. // reselected if the user cancels loading a file.
  80. scene_manager_set_scene_state(pof->scene_manager, PoFSceneMain, SubmenuIndexLoad);
  81. scene_manager_next_scene(pof->scene_manager, PoFSceneFileSelect);
  82. }
  83. consumed = true;
  84. } else {
  85. scene_manager_set_scene_state(pof->scene_manager, PoFSceneMain, event.event);
  86. pof_token_clear(virtual_portal->tokens[event.event], true);
  87. pof_scene_main_on_update(context);
  88. }
  89. } else if(event.type == SceneManagerEventTypeBack) {
  90. scene_manager_stop(pof->scene_manager);
  91. view_dispatcher_stop(pof->view_dispatcher);
  92. consumed = true;
  93. }
  94. return consumed;
  95. }
  96. void pof_scene_main_on_exit(void* context) {
  97. PoFApp* pof = context;
  98. submenu_reset(pof->submenu);
  99. }