acegoal07 1 год назад
Родитель
Сommit
340a3d5dfb
10 измененных файлов с 106 добавлено и 12 удалено
  1. 0 1
      README.md
  2. 11 3
      nfc_playlist.c
  3. 4 1
      nfc_playlist.h
  4. 2 1
      nfc_playlist_i.h
  5. 13 0
      scences/file_edit.c
  6. 2 1
      scences/file_edit.h
  7. 56 0
      scences/nfc_select.c
  8. 12 0
      scences/nfc_select.h
  9. 3 4
      scences/view_playlist_content.c
  10. 3 1
      scences/view_playlist_content.h

+ 0 - 1
README.md

@@ -27,7 +27,6 @@ As i know these firmwares are supported and working if you know any more please
 - View playlist content (Allows you to view the items in the playlist)
 - View playlist content (Allows you to view the items in the playlist)
 ## Development plans/ideas:
 ## Development plans/ideas:
 Things i would like to add:
 Things i would like to add:
-- Ability to add cards to playlists
 - Ability to remove cards from the playlist
 - Ability to remove cards from the playlist
 
 
 These features are not guaranteed to be added but are being looked at as features to add
 These features are not guaranteed to be added but are being looked at as features to add

+ 11 - 3
nfc_playlist.c

@@ -9,7 +9,8 @@ static void (*const nfc_playlist_scene_on_enter_handlers[])(void*) = {
    nfc_playlist_file_edit_scene_on_enter,
    nfc_playlist_file_edit_scene_on_enter,
    nfc_playlist_file_rename_scene_on_enter,
    nfc_playlist_file_rename_scene_on_enter,
    nfc_playlist_confirm_delete_scene_on_enter,
    nfc_playlist_confirm_delete_scene_on_enter,
-   nfc_playlist_view_playlist_content_scene_on_enter
+   nfc_playlist_view_playlist_content_scene_on_enter,
+   nfc_playlist_nfc_select_scene_on_enter
 };
 };
 
 
 static bool (*const nfc_playlist_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
 static bool (*const nfc_playlist_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
@@ -20,7 +21,8 @@ static bool (*const nfc_playlist_scene_on_event_handlers[])(void*, SceneManagerE
    nfc_playlist_file_edit_scene_on_event,
    nfc_playlist_file_edit_scene_on_event,
    nfc_playlist_file_rename_scene_on_event,
    nfc_playlist_file_rename_scene_on_event,
    nfc_playlist_confirm_delete_scene_on_event,
    nfc_playlist_confirm_delete_scene_on_event,
-   nfc_playlist_view_playlist_content_scene_on_event
+   nfc_playlist_view_playlist_content_scene_on_event,
+   nfc_playlist_nfc_select_scene_on_event
 };
 };
 
 
 static void (*const nfc_playlist_scene_on_exit_handlers[])(void*) = {
 static void (*const nfc_playlist_scene_on_exit_handlers[])(void*) = {
@@ -31,7 +33,8 @@ static void (*const nfc_playlist_scene_on_exit_handlers[])(void*) = {
    nfc_playlist_file_edit_scene_on_exit,
    nfc_playlist_file_edit_scene_on_exit,
    nfc_playlist_file_rename_scene_on_exit,
    nfc_playlist_file_rename_scene_on_exit,
    nfc_playlist_confirm_delete_scene_on_exit,
    nfc_playlist_confirm_delete_scene_on_exit,
-   nfc_playlist_view_playlist_content_scene_on_exit
+   nfc_playlist_view_playlist_content_scene_on_exit,
+   nfc_playlist_nfc_select_scene_on_exit
 };
 };
 
 
 static const SceneManagerHandlers nfc_playlist_scene_manager_handlers = {
 static const SceneManagerHandlers nfc_playlist_scene_manager_handlers = {
@@ -72,6 +75,8 @@ static NfcPlaylist* nfc_playlist_alloc() {
 
 
    nfc_playlist->notification = furi_record_open(RECORD_NOTIFICATION);
    nfc_playlist->notification = furi_record_open(RECORD_NOTIFICATION);
    nfc_playlist->playlist_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
    nfc_playlist->playlist_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
+   nfc_playlist->nfc_file_browser = file_browser_alloc(nfc_playlist->file_browser_output);
+
    nfc_playlist->text_input = text_input_alloc();
    nfc_playlist->text_input = text_input_alloc();
    nfc_playlist->popup = popup_alloc();
    nfc_playlist->popup = popup_alloc();
 
 
@@ -86,6 +91,7 @@ static NfcPlaylist* nfc_playlist_alloc() {
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileRename, text_input_get_view(nfc_playlist->text_input));
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileRename, text_input_get_view(nfc_playlist->text_input));
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ConfirmDelete, widget_get_view(nfc_playlist->widget));
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ConfirmDelete, widget_get_view(nfc_playlist->widget));
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ViewPlaylistContent, widget_get_view(nfc_playlist->widget));
    view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ViewPlaylistContent, widget_get_view(nfc_playlist->widget));
+   view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_NfcSelect, file_browser_get_view(nfc_playlist->nfc_file_browser));
 
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    Storage* storage = furi_record_open(RECORD_STORAGE);
    if (!storage_common_exists(storage, PLAYLIST_DIR)) {
    if (!storage_common_exists(storage, PLAYLIST_DIR)) {
@@ -107,6 +113,7 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileRename);
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileRename);
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ConfirmDelete);
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ConfirmDelete);
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ViewPlaylistContent);
    view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_ViewPlaylistContent);
+   view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_NfcSelect);
 
 
    scene_manager_free(nfc_playlist->scene_manager);
    scene_manager_free(nfc_playlist->scene_manager);
    view_dispatcher_free(nfc_playlist->view_dispatcher);
    view_dispatcher_free(nfc_playlist->view_dispatcher);
@@ -116,6 +123,7 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
 
 
    furi_record_close(RECORD_NOTIFICATION);
    furi_record_close(RECORD_NOTIFICATION);
    file_browser_free(nfc_playlist->playlist_file_browser);
    file_browser_free(nfc_playlist->playlist_file_browser);
+   file_browser_free(nfc_playlist->nfc_file_browser);
    text_input_free(nfc_playlist->text_input);
    text_input_free(nfc_playlist->text_input);
    popup_free(nfc_playlist->popup);
    popup_free(nfc_playlist->popup);
 
 

+ 4 - 1
nfc_playlist.h

@@ -24,7 +24,8 @@ typedef enum {
    NfcPlaylistView_FileEdit,
    NfcPlaylistView_FileEdit,
    NfcPlaylistView_FileRename,
    NfcPlaylistView_FileRename,
    NfcPlaylistView_ConfirmDelete,
    NfcPlaylistView_ConfirmDelete,
-   NfcPlaylistView_ViewPlaylistContent
+   NfcPlaylistView_ViewPlaylistContent,
+   NfcPlaylistView_NfcSelect,
 } NfcPlayScenesView;
 } NfcPlayScenesView;
 
 
 typedef enum {
 typedef enum {
@@ -36,6 +37,7 @@ typedef enum {
    NfcPlaylistScene_FileRename,
    NfcPlaylistScene_FileRename,
    NfcPlaylistScene_ConfirmDelete,
    NfcPlaylistScene_ConfirmDelete,
    NfcPlaylistScene_ViewPlaylistContent,
    NfcPlaylistScene_ViewPlaylistContent,
+   NfcPlaylistScene_NfcSelect,
    NfcPlaylistScene_count
    NfcPlaylistScene_count
 } NfcPlaylistScene;
 } NfcPlaylistScene;
 
 
@@ -52,6 +54,7 @@ typedef struct {
    ViewDispatcher* view_dispatcher;
    ViewDispatcher* view_dispatcher;
    VariableItemList* variable_item_list;
    VariableItemList* variable_item_list;
    FileBrowser* playlist_file_browser;
    FileBrowser* playlist_file_browser;
+   FileBrowser* nfc_file_browser;
    FuriString* file_browser_output;
    FuriString* file_browser_output;
    TextInput* text_input;
    TextInput* text_input;
    char* text_input_output;
    char* text_input_output;

+ 2 - 1
nfc_playlist_i.h

@@ -6,4 +6,5 @@
 #include "scences/file_edit.h"
 #include "scences/file_edit.h"
 #include "scences/file_rename.h"
 #include "scences/file_rename.h"
 #include "scences/confirm_delete.h"
 #include "scences/confirm_delete.h"
-#include "scences/view_playlist_content.h"
+#include "scences/view_playlist_content.h"
+#include "scences/nfc_select.h"

+ 13 - 0
scences/file_edit.c

@@ -38,6 +38,15 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
       furi_string_empty(nfc_playlist->settings.file_path),
       furi_string_empty(nfc_playlist->settings.file_path),
       "No\nplaylist\nselected");
       "No\nplaylist\nselected");
 
 
+   submenu_add_lockable_item(
+      nfc_playlist->submenu,
+      "Add NFC Item",
+      NfcPlaylistMenuSelection_AddNfcItem,
+      nfc_playlist_file_edit_menu_callback,
+      nfc_playlist,
+      furi_string_empty(nfc_playlist->settings.file_path),
+      "No\nplaylist\nselected");
+
    view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileEdit);
    view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_FileEdit);
 }
 }
 
 
@@ -58,6 +67,10 @@ bool nfc_playlist_file_edit_scene_on_event(void* context, SceneManagerEvent even
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
             consumed = true;
             consumed = true;
             break;
             break;
+         case NfcPlaylistMenuSelection_AddNfcItem:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcSelect);
+            consumed = true;
+            break;
          default:
          default:
             break;
             break;
       }
       }

+ 2 - 1
scences/file_edit.h

@@ -11,5 +11,6 @@ void nfc_playlist_file_edit_scene_on_exit(void* context);
 typedef enum {
 typedef enum {
    NfcPlaylistMenuSelection_DeletePlaylist,
    NfcPlaylistMenuSelection_DeletePlaylist,
    NfcPlaylistMenuSelection_RenamePlaylist,
    NfcPlaylistMenuSelection_RenamePlaylist,
-   NfcPlaylistMenuSelection_ViewPlaylistContent
+   NfcPlaylistMenuSelection_ViewPlaylistContent,
+   NfcPlaylistMenuSelection_AddNfcItem
 } NfcPlaylistFileEditMenuSelection;
 } NfcPlaylistFileEditMenuSelection;

+ 56 - 0
scences/nfc_select.c

@@ -0,0 +1,56 @@
+#include "nfc_playlist.h"
+#include "scences/nfc_select.h"
+
+void nfc_playlist_nfc_select_menu_callback(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+
+   Storage* storage = furi_record_open(RECORD_STORAGE);
+   File* file = storage_file_alloc(storage);
+   uint8_t buffer[MAX_PLAYLIST_SIZE];
+   storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING);
+   uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
+   FuriString* playlist_content = furi_string_alloc();
+
+   for(uint16_t i = 0; i < read_count; i++) {
+      furi_string_push_back(playlist_content, buffer[i]);
+   }
+
+   furi_string_printf(playlist_content, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
+
+   storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
+
+   furi_string_free(playlist_content);
+   storage_file_close(file);
+   storage_file_free(file);
+   furi_record_close(RECORD_STORAGE);
+   furi_string_reset(nfc_playlist->file_browser_output);
+   scene_manager_previous_scene(nfc_playlist->scene_manager);
+}
+
+void nfc_playlist_nfc_select_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   file_browser_configure(
+      nfc_playlist->playlist_file_browser,
+      ".nfc",
+      "/ext/nfc/",
+      true,
+      true,
+      &I_Nfc_10px,
+      true);
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_PlaylistSelect);
+   file_browser_set_callback(nfc_playlist->playlist_file_browser, nfc_playlist_nfc_select_menu_callback, nfc_playlist);
+   FuriString* tmp_str = furi_string_alloc_set_str("/ext/nfc/");
+   file_browser_start(nfc_playlist->playlist_file_browser, tmp_str);
+   furi_string_free(tmp_str);
+}
+
+bool nfc_playlist_nfc_select_scene_on_event(void* context, SceneManagerEvent event) {
+   UNUSED(event);
+   UNUSED(context);
+   return false;
+}
+
+void nfc_playlist_nfc_select_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   file_browser_stop(nfc_playlist->playlist_file_browser);
+}

+ 12 - 0
scences/nfc_select.h

@@ -0,0 +1,12 @@
+#pragma once
+#include <furi.h>
+#include <gui/view_dispatcher.h>
+#include <gui/scene_manager.h>
+#include <gui/modules/file_browser.h>
+#include <storage/storage.h>
+
+void nfc_playlist_nfc_select_scene_on_enter(void* context);
+bool nfc_playlist_nfc_select_scene_on_event(void* context, SceneManagerEvent event);
+void nfc_playlist_nfc_select_scene_on_exit(void* context);
+
+#define MAX_PLAYLIST_SIZE 1000

+ 3 - 4
scences/view_playlist_content.c

@@ -6,11 +6,10 @@ void nfc_playlist_view_playlist_content_scene_on_enter(void* context) {
 
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    Storage* storage = furi_record_open(RECORD_STORAGE);
    File* file = storage_file_alloc(storage);
    File* file = storage_file_alloc(storage);
-   uint8_t buffer[8000];
-   FuriString* playlist_content = furi_string_alloc();
-
+   uint8_t buffer[MAX_PLAYLIST_SIZE];
    storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING);
    storage_file_open(file, furi_string_get_cstr(nfc_playlist->settings.file_path), FSAM_READ, FSOM_OPEN_EXISTING);
-   uint16_t read_count = storage_file_read(file, buffer, 8000);
+   uint16_t read_count = storage_file_read(file, buffer, MAX_PLAYLIST_SIZE);
+   FuriString* playlist_content = furi_string_alloc();
 
 
    for(uint16_t i = 0; i < read_count; i++) {
    for(uint16_t i = 0; i < read_count; i++) {
       furi_string_push_back(playlist_content, buffer[i]);
       furi_string_push_back(playlist_content, buffer[i]);

+ 3 - 1
scences/view_playlist_content.h

@@ -7,4 +7,6 @@
 
 
 void nfc_playlist_view_playlist_content_scene_on_enter(void* context);
 void nfc_playlist_view_playlist_content_scene_on_enter(void* context);
 bool nfc_playlist_view_playlist_content_scene_on_event(void* context, SceneManagerEvent event);
 bool nfc_playlist_view_playlist_content_scene_on_event(void* context, SceneManagerEvent event);
-void nfc_playlist_view_playlist_content_scene_on_exit(void* context);
+void nfc_playlist_view_playlist_content_scene_on_exit(void* context);
+
+#define MAX_PLAYLIST_SIZE 1000