Просмотр исходного кода

Have a seperate type selection ui on startup

Sanjay Govind 11 месяцев назад
Родитель
Сommit
df9dd633e6

+ 2 - 0
helpers/pof_usb.c

@@ -408,5 +408,7 @@ PoFUsb* pof_usb_start(VirtualPortal* virtual_portal) {
 void pof_usb_stop(PoFUsb* pof_usb) {
     if(pof_usb) {
         furi_hal_usb_set_config(pof_usb->usb_prev, NULL);
+        free(pof_usb);
+        pof_usb = NULL;
     }
 }

+ 2 - 0
helpers/pof_usb_xbox360.c

@@ -580,5 +580,7 @@ PoFUsb* pof_usb_start_xbox360(VirtualPortal* virtual_portal) {
 void pof_usb_stop_xbox360(PoFUsb* pof_usb) {
     if(pof_usb) {
         furi_hal_usb_set_config(pof_usb->usb_prev, NULL);
+        free(pof_usb);
+        pof_usb = NULL;
     }
 }

+ 1 - 3
portal_of_flipper.c

@@ -70,10 +70,8 @@ PoFApp* pof_app_alloc() {
     view_dispatcher_add_view(app->view_dispatcher, PoFViewWidget, widget_get_view(app->widget));
 
     app->virtual_portal = virtual_portal_alloc(app->notifications);
-    // PoF emulation Start
-    pof_start(app);
 
-    scene_manager_next_scene(app->scene_manager, PoFSceneMain);
+    scene_manager_next_scene(app->scene_manager, PoFSceneTypeSelect);
     return app;
 }
 

+ 1 - 0
scenes/pof_scene_config.h

@@ -1,2 +1,3 @@
 ADD_SCENE(pof, main, Main)
 ADD_SCENE(pof, file_select, FileSelect)
+ADD_SCENE(pof, type_select, TypeSelect)

+ 1 - 30
scenes/pof_scene_main.c

@@ -2,9 +2,7 @@
 #include "../pof_token.h"
 
 enum SubmenuIndex {
-    SubmenuIndexLoad = POF_TOKEN_LIMIT,
-    SubmenuIndexSwapHid,
-    SubmenuIndexSwapXbox360
+    SubmenuIndexLoad = POF_TOKEN_LIMIT
 };
 
 void pof_scene_main_submenu_callback(void* context, uint32_t index) {
@@ -21,21 +19,6 @@ void pof_scene_main_on_update(void* context) {
     FuriString* token_name = furi_string_alloc();
 
     if(pof->pof_usb) {
-        if (pof->type == PoFHid) {
-            submenu_add_item(
-            submenu,
-            "Emulate Xbox 360",
-            SubmenuIndexSwapXbox360,
-            pof_scene_main_submenu_callback,
-            pof);
-        } else if (pof->type == PoFXbox360) {
-            submenu_add_item(
-            submenu,
-            "Emulate HID",
-            SubmenuIndexSwapHid,
-            pof_scene_main_submenu_callback,
-            pof);
-        }
         int count = 0;
         for(int i = 0; i < POF_TOKEN_LIMIT; i++) {
             if(virtual_portal->tokens[i]->loaded) {
@@ -88,18 +71,6 @@ bool pof_scene_main_on_event(void* context, SceneManagerEvent event) {
                 scene_manager_next_scene(pof->scene_manager, PoFSceneFileSelect);
             }
             consumed = true;
-        } else if (event.event == SubmenuIndexSwapHid) {
-            pof_stop(pof);
-            pof->type = PoFHid;
-            pof_start(pof);
-            pof_scene_main_on_update(context);
-            consumed = true;
-        } else if (event.event == SubmenuIndexSwapXbox360) {
-            pof_stop(pof);
-            pof->type = PoFXbox360;
-            pof_start(pof);
-            pof_scene_main_on_update(context);
-            consumed = true;
         } else {
             scene_manager_set_scene_state(pof->scene_manager, PoFSceneMain, event.event);
             pof_token_clear(virtual_portal->tokens[event.event], true);

+ 56 - 0
scenes/pof_scene_type_select.c

@@ -0,0 +1,56 @@
+#include "../portal_of_flipper_i.h"
+#include "../pof_token.h"
+
+#define TAG "PoFSceneTypeSelect"
+
+enum SubmenuIndex {
+    SubmenuIndexSwapHid,
+    SubmenuIndexSwapXbox360
+};
+
+void pof_scene_type_select_submenu_callback(void* context, uint32_t index) {
+    PoFApp* pof = context;
+    view_dispatcher_send_custom_event(pof->view_dispatcher, index);
+}
+
+void pof_scene_type_select_on_enter(void* context) {
+    PoFApp* pof = context;
+    Submenu* submenu = pof->submenu;
+    submenu_reset(pof->submenu);
+    submenu_add_item(
+    submenu,
+    "Emulate Xbox 360",
+    SubmenuIndexSwapXbox360,
+    pof_scene_type_select_submenu_callback,
+    pof);
+    submenu_add_item(
+    submenu,
+    "Emulate HID",
+    SubmenuIndexSwapHid,
+    pof_scene_type_select_submenu_callback,
+    pof);
+    view_dispatcher_switch_to_view(pof->view_dispatcher, PoFViewSubmenu);
+}
+
+bool pof_scene_type_select_on_event(void* context, SceneManagerEvent event) {
+    PoFApp* pof = context;
+    if(event.type == SceneManagerEventTypeCustom) {
+        if (event.event == SubmenuIndexSwapHid) {
+            pof->type = PoFHid;
+            pof_start(pof);
+            scene_manager_next_scene(pof->scene_manager, PoFSceneFileSelect);
+            return true;
+        } else if (event.event == SubmenuIndexSwapXbox360) {
+            pof->type = PoFXbox360;
+            pof_start(pof);
+            scene_manager_next_scene(pof->scene_manager, PoFSceneFileSelect);
+            return true;
+        } 
+    }
+    return false;
+}
+
+void pof_scene_type_select_on_exit(void* context) {
+    PoFApp* pof = context;
+    submenu_reset(pof->submenu);
+}