acegoal07 1 год назад
Родитель
Сommit
0e7428b6b3

+ 1 - 1
application.fam

@@ -12,7 +12,7 @@ App(
     fap_icon="assets/icon.png",
     fap_private_libs=[
         Lib(
-            name="worker",
+            name="emulation_worker",
         ),
     ],
 )

+ 73 - 0
lib/emulation_worker/nfc_playlist_emulation_worker.c

@@ -0,0 +1,73 @@
+#include "nfc_playlist_emulation_worker.h"
+
+NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker_alloc() {
+   NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker = malloc(sizeof(NfcPlaylistEmulationWorker));
+   nfc_playlist_emulation_worker->thread = furi_thread_alloc_ex("NfcPlaylistEmulationWorker", 8192, nfc_playlist_emulation_worker_task, nfc_playlist_emulation_worker);
+   nfc_playlist_emulation_worker->state = NfcPlaylistEmulationWorkerState_Stopped;
+   nfc_playlist_emulation_worker->nfc = nfc_alloc();
+   nfc_playlist_emulation_worker->nfc_device = nfc_device_alloc();
+   return nfc_playlist_emulation_worker;
+}
+
+void nfc_playlist_emulation_worker_free(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker) {
+   furi_assert(nfc_playlist_emulation_worker);
+   furi_thread_free(nfc_playlist_emulation_worker->thread);
+   nfc_free(nfc_playlist_emulation_worker->nfc);
+   nfc_device_free(nfc_playlist_emulation_worker->nfc_device);
+   free(nfc_playlist_emulation_worker);
+}
+
+void nfc_playlist_emulation_worker_stop(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker) {
+   furi_assert(nfc_playlist_emulation_worker);
+   if (nfc_playlist_emulation_worker->state != NfcPlaylistEmulationWorkerState_Stopped) {
+      nfc_playlist_emulation_worker->state = NfcPlaylistEmulationWorkerState_Stopped;
+      furi_thread_join(nfc_playlist_emulation_worker->thread);
+   }
+}
+
+void nfc_playlist_emulation_worker_start(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker) {
+   furi_assert(nfc_playlist_emulation_worker);
+   nfc_playlist_emulation_worker->state = NfcPlaylistEmulationWorkerState_Emulating;
+   furi_thread_start(nfc_playlist_emulation_worker->thread);
+}
+
+int32_t nfc_playlist_emulation_worker_task(void* context) {
+   NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker = context;
+
+   if (nfc_playlist_emulation_worker->state == NfcPlaylistEmulationWorkerState_Emulating) {
+
+      nfc_playlist_emulation_worker->nfc_listener =
+         nfc_listener_alloc(nfc_playlist_emulation_worker->nfc,
+            nfc_playlist_emulation_worker->nfc_protocol,
+            nfc_device_get_data(nfc_playlist_emulation_worker->nfc_device, nfc_playlist_emulation_worker->nfc_protocol)
+         );
+      nfc_listener_start(nfc_playlist_emulation_worker->nfc_listener, NULL, NULL);
+
+      while(nfc_playlist_emulation_worker->state == NfcPlaylistEmulationWorkerState_Emulating) {
+         furi_delay_ms(50);
+      }
+
+      nfc_listener_stop(nfc_playlist_emulation_worker->nfc_listener);
+      nfc_listener_free(nfc_playlist_emulation_worker->nfc_listener);
+   }
+
+   nfc_playlist_emulation_worker->state = NfcPlaylistEmulationWorkerState_Stopped;
+
+   return 0;
+}
+
+bool nfc_playlist_emulation_worker_is_emulating(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker) {
+   furi_assert(nfc_playlist_emulation_worker);
+   return nfc_playlist_emulation_worker->state == NfcPlaylistEmulationWorkerState_Emulating;
+}
+
+void nfc_playlist_emulation_worker_set_nfc_data(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker, char* file_path) {
+   furi_assert(nfc_playlist_emulation_worker);
+   nfc_device_load(nfc_playlist_emulation_worker->nfc_device, file_path);
+   nfc_playlist_emulation_worker->nfc_protocol = nfc_device_get_protocol(nfc_playlist_emulation_worker->nfc_device);
+}
+
+void nfc_playlist_emulation_worker_clear_nfc_data(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker) {
+   furi_assert(nfc_playlist_emulation_worker);
+   nfc_device_clear(nfc_playlist_emulation_worker->nfc_device);
+}

+ 31 - 0
lib/emulation_worker/nfc_playlist_emulation_worker.h

@@ -0,0 +1,31 @@
+#pragma once
+#include <furi.h>
+#include <furi_hal.h>
+#include <nfc/nfc.h>
+#include <nfc/nfc_device.h>
+#include <nfc/nfc_listener.h>
+
+typedef enum NfcPlaylistEmulationWorkerState {
+   NfcPlaylistEmulationWorkerState_Emulating,
+   NfcPlaylistEmulationWorkerState_Stopped
+} NfcPlaylistEmulationWorkerState;
+
+typedef struct NfcPlaylistEmulationWorker {
+   FuriThread* thread;
+   NfcPlaylistEmulationWorkerState state;
+   NfcListener* nfc_listener;
+   NfcDevice* nfc_device;
+   NfcProtocol nfc_protocol;
+   Nfc* nfc;
+} NfcPlaylistEmulationWorker;
+
+NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker_alloc();
+void nfc_playlist_emulation_worker_free(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker);
+void nfc_playlist_emulation_worker_stop(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker);
+void nfc_playlist_emulation_worker_start(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker);
+
+int32_t nfc_playlist_emulation_worker_task(void* context);
+
+bool nfc_playlist_emulation_worker_is_emulating(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker);
+void nfc_playlist_emulation_worker_set_nfc_data(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker, char* file_path);
+void nfc_playlist_emulation_worker_clear_nfc_data(NfcPlaylistEmulationWorker* nfc_playlist_emulation_worker);

+ 0 - 73
lib/worker/nfc_playlist_worker.c

@@ -1,73 +0,0 @@
-#include "nfc_playlist_worker.h"
-
-NfcPlaylistWorker* nfc_playlist_worker_alloc() {
-   NfcPlaylistWorker* nfc_playlist_worker = malloc(sizeof(NfcPlaylistWorker));
-   nfc_playlist_worker->thread = furi_thread_alloc_ex("NfcPlaylistWorker", 8192, nfc_playlist_worker_task, nfc_playlist_worker);
-   nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
-   nfc_playlist_worker->nfc = nfc_alloc();
-   nfc_playlist_worker->nfc_device = nfc_device_alloc();
-   return nfc_playlist_worker;
-}
-
-void nfc_playlist_worker_free(NfcPlaylistWorker* nfc_playlist_worker) {
-   furi_assert(nfc_playlist_worker);
-   furi_thread_free(nfc_playlist_worker->thread);
-   nfc_free(nfc_playlist_worker->nfc);
-   nfc_device_free(nfc_playlist_worker->nfc_device);
-   free(nfc_playlist_worker);
-}
-
-void nfc_playlist_worker_stop(NfcPlaylistWorker* nfc_playlist_worker) {
-   furi_assert(nfc_playlist_worker);
-   if (nfc_playlist_worker->state != NfcPlaylistWorkerState_Stopped) {
-      nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
-      furi_thread_join(nfc_playlist_worker->thread);
-   }
-}
-
-void nfc_playlist_worker_start(NfcPlaylistWorker* nfc_playlist_worker) {
-   furi_assert(nfc_playlist_worker);
-   nfc_playlist_worker->state = NfcPlaylistWorkerState_Emulating;
-   furi_thread_start(nfc_playlist_worker->thread);
-}
-
-int32_t nfc_playlist_worker_task(void* context) {
-   NfcPlaylistWorker* nfc_playlist_worker = context;
-
-   if (nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
-
-      nfc_playlist_worker->nfc_listener =
-         nfc_listener_alloc(nfc_playlist_worker->nfc,
-            nfc_playlist_worker->nfc_protocol,
-            nfc_device_get_data(nfc_playlist_worker->nfc_device, nfc_playlist_worker->nfc_protocol)
-         );
-      nfc_listener_start(nfc_playlist_worker->nfc_listener, NULL, NULL);
-
-      while(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
-         furi_delay_ms(50);
-      }
-
-      nfc_listener_stop(nfc_playlist_worker->nfc_listener);
-      nfc_listener_free(nfc_playlist_worker->nfc_listener);
-   }
-
-   nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
-
-   return 0;
-}
-
-bool nfc_playlist_worker_is_emulating(NfcPlaylistWorker* nfc_playlist_worker) {
-   furi_assert(nfc_playlist_worker);
-   return nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating;
-}
-
-void nfc_playlist_worker_set_nfc_data(NfcPlaylistWorker* nfc_playlist_worker, char* file_path) {
-   furi_assert(nfc_playlist_worker);
-   nfc_device_load(nfc_playlist_worker->nfc_device, file_path);
-   nfc_playlist_worker->nfc_protocol = nfc_device_get_protocol(nfc_playlist_worker->nfc_device);
-}
-
-void nfc_playlist_worker_clear_nfc_data(NfcPlaylistWorker* nfc_playlist_worker) {
-   furi_assert(nfc_playlist_worker);
-   nfc_device_clear(nfc_playlist_worker->nfc_device);
-}

+ 0 - 31
lib/worker/nfc_playlist_worker.h

@@ -1,31 +0,0 @@
-#pragma once
-#include <furi.h>
-#include <furi_hal.h>
-#include <nfc/nfc.h>
-#include <nfc/nfc_device.h>
-#include <nfc/nfc_listener.h>
-
-typedef enum NfcPlaylistWorkerState {
-   NfcPlaylistWorkerState_Emulating,
-   NfcPlaylistWorkerState_Stopped
-} NfcPlaylistWorkerState;
-
-typedef struct NfcPlaylistWorker {
-   FuriThread* thread;
-   NfcPlaylistWorkerState state;
-   NfcListener* nfc_listener;
-   NfcDevice* nfc_device;
-   NfcProtocol nfc_protocol;
-   Nfc* nfc;
-} NfcPlaylistWorker;
-
-NfcPlaylistWorker* nfc_playlist_worker_alloc();
-void nfc_playlist_worker_free(NfcPlaylistWorker* nfc_playlist_worker);
-void nfc_playlist_worker_stop(NfcPlaylistWorker* nfc_playlist_worker);
-void nfc_playlist_worker_start(NfcPlaylistWorker* nfc_playlist_worker);
-
-int32_t nfc_playlist_worker_task(void* context);
-
-bool nfc_playlist_worker_is_emulating(NfcPlaylistWorker* nfc_playlist_worker);
-void nfc_playlist_worker_set_nfc_data(NfcPlaylistWorker* nfc_playlist_worker, char* file_path);
-void nfc_playlist_worker_clear_nfc_data(NfcPlaylistWorker* nfc_playlist_worker);

+ 2 - 1
nfc_playlist.h

@@ -23,6 +23,7 @@
 
 #include <toolbox/stream/stream.h>
 #include <toolbox/stream/file_stream.h>
+#include <toolbox/name_generator.h>
 
 #include "lib/emulation_worker/nfc_playlist_emulation_worker.h"
 
@@ -30,7 +31,7 @@
 
 #define PLAYLIST_LOCATION "/ext/apps_data/nfc_playlist/"
 #define PLAYLIST_DIR "/ext/apps_data/nfc_playlist"
-#define PLAYLIST_NAME_LEN 50
+#define MAX_PLAYLIST_NAME_LEN 50
 
 typedef enum {
    NfcPlaylistView_Submenu,

+ 5 - 4
scenes/nfc_playlist_scene_name_new_playlist.c

@@ -8,6 +8,7 @@ void nfc_playlist_name_new_playlist_menu_callback(void* context) {
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    File* file = storage_file_alloc(storage);
+
    if (!storage_file_exists(storage, file_name_cstr)) {
       if (storage_file_open(file, file_name_cstr, FSAM_READ_WRITE, FSOM_CREATE_NEW)) {
          storage_file_close(file);
@@ -15,20 +16,20 @@ void nfc_playlist_name_new_playlist_menu_callback(void* context) {
          nfc_playlist->settings.playlist_length = 0;
       }
    }
-   storage_file_free(file);
-   furi_record_close(RECORD_STORAGE);
 
    furi_string_free(file_name);
+   storage_file_free(file);
+   furi_record_close(RECORD_STORAGE);
    scene_manager_previous_scene(nfc_playlist->scene_manager);
 }
 
 void nfc_playlist_name_new_playlist_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
-   nfc_playlist->text_input_output = malloc(PLAYLIST_NAME_LEN);
+   name_generator_make_auto(nfc_playlist->text_input_output, MAX_PLAYLIST_NAME_LEN, "playlist-");
    text_input_set_header_text(nfc_playlist->text_input, "Enter file name");
    text_input_set_minimum_length(nfc_playlist->text_input, 1);
-   text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_name_new_playlist_menu_callback, nfc_playlist, nfc_playlist->text_input_output, PLAYLIST_NAME_LEN, true);
+   text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_name_new_playlist_menu_callback, nfc_playlist, nfc_playlist->text_input_output, MAX_PLAYLIST_NAME_LEN, true);
 
    view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
 }

+ 12 - 12
scenes/nfc_playlist_scene_playlist_rename.c

@@ -4,20 +4,20 @@ void nfc_playlist_playlist_rename_menu_callback(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
    char const* old_file_path = furi_string_get_cstr(nfc_playlist->settings.playlist_path);
-   FuriString* new_file_path = furi_string_alloc_set(nfc_playlist->settings.playlist_path);
-   furi_string_replace(new_file_path, strchr(old_file_path, '/') != NULL ? &strrchr(old_file_path, '/')[1] : old_file_path, nfc_playlist->text_input_output);
+   char const* old_file_name = strchr(old_file_path, '/') != NULL ? &strrchr(old_file_path, '/')[1] : old_file_path;
+   FuriString* new_file_path = furi_string_alloc_set_str(old_file_path);
+   furi_string_replace(new_file_path, old_file_name, nfc_playlist->text_input_output);
    furi_string_cat_str(new_file_path, ".txt");
    
    Storage* storage = furi_record_open(RECORD_STORAGE);
 
    if (!storage_file_exists(storage, furi_string_get_cstr(new_file_path))) {
-      storage_common_rename(storage, old_file_path, furi_string_get_cstr(new_file_path));
-      furi_string_swap(nfc_playlist->settings.playlist_path, new_file_path);
+      if (storage_common_rename(storage, old_file_path, furi_string_get_cstr(new_file_path)) == 0) {
+         furi_string_move(nfc_playlist->settings.playlist_path, new_file_path);
+      }
    }
 
    furi_record_close(RECORD_STORAGE);
-   furi_string_free(new_file_path);
-
    scene_manager_search_and_switch_to_previous_scene(nfc_playlist->scene_manager, NfcPlaylistScene_MainMenu);
 }
 
@@ -25,16 +25,16 @@ void nfc_playlist_playlist_rename_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
    char const* tmp_file_path = furi_string_get_cstr(nfc_playlist->settings.playlist_path);
-   FuriString* tmp_file_name = furi_string_alloc_set_str(strchr(tmp_file_path, '/') != NULL ? &strrchr(tmp_file_path, '/')[1] : tmp_file_path);
-   furi_string_replace(tmp_file_name, ".txt", "");
+   char const* tmp_file_name = strchr(tmp_file_path, '/') != NULL ? &strrchr(tmp_file_path, '/')[1] : tmp_file_path;
+   FuriString* tmp_file_name_furi = furi_string_alloc_set_str(tmp_file_name);
+   furi_string_replace(tmp_file_name_furi, ".txt", "");
 
-   nfc_playlist->text_input_output = malloc(PLAYLIST_NAME_LEN);
-   strcpy(nfc_playlist->text_input_output, furi_string_get_cstr(tmp_file_name));
-   furi_string_free(tmp_file_name);
+   nfc_playlist->text_input_output = strdup(furi_string_get_cstr(tmp_file_name_furi));
+   furi_string_free(tmp_file_name_furi);
 
    text_input_set_header_text(nfc_playlist->text_input, "Enter new file name");
    text_input_set_minimum_length(nfc_playlist->text_input, 1);
-   text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_playlist_rename_menu_callback, nfc_playlist, nfc_playlist->text_input_output, PLAYLIST_NAME_LEN, false);
+   text_input_set_result_callback(nfc_playlist->text_input, nfc_playlist_playlist_rename_menu_callback, nfc_playlist, nfc_playlist->text_input_output, MAX_PLAYLIST_NAME_LEN, false);
 
    view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_TextInput);
 }