瀏覽代碼

[FL-2961] SubGhz: properly handle storage loss (#1990)

Co-authored-by: あく <alleteam@gmail.com>
Skorpionm 3 年之前
父節點
當前提交
2d059223c3

+ 27 - 11
applications/main/subghz/scenes/subghz_scene_more_raw.c

@@ -38,18 +38,34 @@ bool subghz_scene_more_raw_on_event(void* context, SceneManagerEvent event) {
 
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == SubmenuIndexDelete) {
-            scene_manager_set_scene_state(
-                subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
-            scene_manager_set_scene_state(
-                subghz->scene_manager, SubGhzSceneMoreRAW, SubmenuIndexDelete);
-            scene_manager_next_scene(subghz->scene_manager, SubGhzSceneDeleteRAW);
-            return true;
+            if(subghz_file_available(subghz)) {
+                scene_manager_set_scene_state(
+                    subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
+                scene_manager_set_scene_state(
+                    subghz->scene_manager, SubGhzSceneMoreRAW, SubmenuIndexDelete);
+                scene_manager_next_scene(subghz->scene_manager, SubGhzSceneDeleteRAW);
+                return true;
+            } else {
+                if(!scene_manager_search_and_switch_to_previous_scene(
+                       subghz->scene_manager, SubGhzSceneStart)) {
+                    scene_manager_stop(subghz->scene_manager);
+                    view_dispatcher_stop(subghz->view_dispatcher);
+                }
+            }
         } else if(event.event == SubmenuIndexEdit) {
-            furi_string_reset(subghz->file_path_tmp);
-            scene_manager_set_scene_state(
-                subghz->scene_manager, SubGhzSceneMoreRAW, SubmenuIndexEdit);
-            scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
-            return true;
+            if(subghz_file_available(subghz)) {
+                furi_string_reset(subghz->file_path_tmp);
+                scene_manager_set_scene_state(
+                    subghz->scene_manager, SubGhzSceneMoreRAW, SubmenuIndexEdit);
+                scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
+                return true;
+            } else {
+                if(!scene_manager_search_and_switch_to_previous_scene(
+                       subghz->scene_manager, SubGhzSceneStart)) {
+                    scene_manager_stop(subghz->scene_manager);
+                    view_dispatcher_stop(subghz->view_dispatcher);
+                }
+            }
         }
     }
     return false;

+ 29 - 9
applications/main/subghz/scenes/subghz_scene_read_raw.c

@@ -198,20 +198,28 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
             break;
 
         case SubGhzCustomEventViewReadRAWMore:
-            if(subghz_scene_read_raw_update_filename(subghz)) {
-                scene_manager_set_scene_state(
-                    subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet);
-                subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad;
-                scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW);
-                consumed = true;
+            if(subghz_file_available(subghz)) {
+                if(subghz_scene_read_raw_update_filename(subghz)) {
+                    scene_manager_set_scene_state(
+                        subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet);
+                    subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad;
+                    scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW);
+                    consumed = true;
+                } else {
+                    furi_crash("SubGhz: RAW file name update error.");
+                }
             } else {
-                furi_crash("SubGhz: RAW file name update error.");
+                if(!scene_manager_search_and_switch_to_previous_scene(
+                       subghz->scene_manager, SubGhzSceneStart)) {
+                    scene_manager_stop(subghz->scene_manager);
+                    view_dispatcher_stop(subghz->view_dispatcher);
+                }
             }
             break;
 
         case SubGhzCustomEventViewReadRAWSendStart:
 
-            if(subghz_scene_read_raw_update_filename(subghz)) {
+            if(subghz_file_available(subghz) && subghz_scene_read_raw_update_filename(subghz)) {
                 //start send
                 subghz->state_notifications = SubGhzNotificationStateIDLE;
                 if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
@@ -238,6 +246,12 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
                         subghz->state_notifications = SubGhzNotificationStateTx;
                     }
                 }
+            } else {
+                if(!scene_manager_search_and_switch_to_previous_scene(
+                       subghz->scene_manager, SubGhzSceneStart)) {
+                    scene_manager_stop(subghz->scene_manager);
+                    view_dispatcher_stop(subghz->view_dispatcher);
+                }
             }
             consumed = true;
             break;
@@ -314,11 +328,17 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
             break;
 
         case SubGhzCustomEventViewReadRAWSave:
-            if(subghz_scene_read_raw_update_filename(subghz)) {
+            if(subghz_file_available(subghz) && subghz_scene_read_raw_update_filename(subghz)) {
                 scene_manager_set_scene_state(
                     subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSetRAW);
                 subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
                 scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
+            } else {
+                if(!scene_manager_search_and_switch_to_previous_scene(
+                       subghz->scene_manager, SubGhzSceneStart)) {
+                    scene_manager_stop(subghz->scene_manager);
+                    view_dispatcher_stop(subghz->view_dispatcher);
+                }
             }
             consumed = true;
             break;

+ 17 - 0
applications/main/subghz/subghz_i.c

@@ -490,6 +490,23 @@ bool subghz_rename_file(SubGhz* subghz) {
     return ret;
 }
 
+bool subghz_file_available(SubGhz* subghz) {
+    furi_assert(subghz);
+    bool ret = true;
+    Storage* storage = furi_record_open(RECORD_STORAGE);
+
+    FS_Error fs_result =
+        storage_common_stat(storage, furi_string_get_cstr(subghz->file_path), NULL);
+
+    if(fs_result != FSE_OK) {
+        dialog_message_show_storage_error(subghz->dialogs, "File not available\n file/directory");
+        ret = false;
+    }
+
+    furi_record_close(RECORD_STORAGE);
+    return ret;
+}
+
 bool subghz_delete_file(SubGhz* subghz) {
     furi_assert(subghz);
 

+ 1 - 0
applications/main/subghz/subghz_i.h

@@ -124,6 +124,7 @@ bool subghz_save_protocol_to_file(
     const char* dev_file_name);
 bool subghz_load_protocol_from_file(SubGhz* subghz);
 bool subghz_rename_file(SubGhz* subghz);
+bool subghz_file_available(SubGhz* subghz);
 bool subghz_delete_file(SubGhz* subghz);
 void subghz_file_name_clear(SubGhz* subghz);
 bool subghz_path_is_file(FuriString* path);