Parcourir la source

Update nfc_playlist.c

- Adds timer
- Trims most of the useless information form the file name
acegoal07 il y a 2 ans
Parent
commit
0d7fc57758
1 fichiers modifiés avec 50 ajouts et 61 suppressions
  1. 50 61
      nfc_playlist.c

+ 50 - 61
nfc_playlist.c

@@ -10,69 +10,67 @@
 #include <gui/gui.h>
 #include <gui/view_dispatcher.h>
 #include <gui/scene_manager.h>
-#include <gui/modules/menu.h>
 #include <gui/modules/submenu.h>
 #include <gui/modules/popup.h>
 
 // Define log tag
 #define TAG "NfcPlaylist"
 
-/** ids for all scenes used by the app */
+// IDs for all scenes used by the app
 typedef enum {
    NfcPlaylistScene_MainMenu,
-   NfcPlaylistScene_FirstPopup,
+   NfcPlaylistScene_EmulatingPopup,
    NfcPlaylistScene_count
 } NfcPlaylistScene;
 
-/** ids for the 2 types of view used by the app */
+// IDs for the view used by the app
 typedef enum { NfcPlaylistView_Menu, NfcPlaylistView_Popup } NfcPlaylistView;
 
-/** the app context struct */
+// The app context struct
 typedef struct {
    SceneManager* scene_manager;
    ViewDispatcher* view_dispatcher;
-   Submenu* menu;
+   Submenu* submenu;
    Popup* popup;
    NfcPlaylistWorker* nfc_worker;
    int emulate_timeout;
-   bool cancel_emulate;
 } NfcPlaylist;
 
-/** all custom events */
-typedef enum { NfcPlaylistEvent_ShowPopupOne } NfcPlaylistEvent;
+// All custom events
+typedef enum { NfcPlaylistEvent_ShowEmulatingPopup } NfcPlaylistEvent;
 
 /* main menu scene */
 
-/** indices for menu items */
-typedef enum { NfcPlaylistMenuSelection_One } NfcPlaylistMenuSelection;
+// Indices for menu items
+typedef enum { NfcPlaylistMenuSelection_Start, NfcPlaylistMenuSelection_Settings } NfcPlaylistMenuSelection;
 
-/** main menu callback - sends a custom event to the scene manager based on the menu selection */
+// Main menu callback - sends a custom event to the scene manager based on the menu selection
 void nfc_playlist_menu_callback_main_menu(void* context, uint32_t index) {
    FURI_LOG_T(TAG, "nfc_playlist_menu_callback_main_menu");
    NfcPlaylist* app = context;
    switch(index) {
-      case NfcPlaylistMenuSelection_One:
-         scene_manager_handle_custom_event(app->scene_manager, NfcPlaylistEvent_ShowPopupOne);
+      case NfcPlaylistMenuSelection_Start:
+         scene_manager_handle_custom_event(app->scene_manager, NfcPlaylistEvent_ShowEmulatingPopup);
          break;
    }
 }
 
-/** resets the menu, gives it content, callbacks and selection enums */
+// Resets the menu, gives it content, callbacks and selection enums
 void nfc_playlist_scene_on_enter_main_menu(void* context) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_on_enter_main_menu");
    NfcPlaylist* app = context;
-   submenu_reset(app->menu);
-   submenu_set_header(app->menu, "NFC Playlist");
+   submenu_reset(app->submenu);
+   submenu_set_header(app->submenu, "NFC Playlist");
    submenu_add_item(
-      app->menu,
+      app->submenu,
       "Start",
-      NfcPlaylistMenuSelection_One,
+      NfcPlaylistMenuSelection_Start,
       nfc_playlist_menu_callback_main_menu,
       app);
    view_dispatcher_switch_to_view(app->view_dispatcher, NfcPlaylistView_Menu);
 }
 
-/** main menu event handler - switches scene based on the event */
+// Main menu event handler - switches scene based on the event
 bool nfc_playlist_scene_on_event_main_menu(void* context, SceneManagerEvent event) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_on_event_main_menu");
    NfcPlaylist* app = context;
@@ -80,8 +78,8 @@ bool nfc_playlist_scene_on_event_main_menu(void* context, SceneManagerEvent even
    switch(event.type) {
       case SceneManagerEventTypeCustom:
          switch(event.event) {
-            case NfcPlaylistEvent_ShowPopupOne:
-               scene_manager_next_scene(app->scene_manager, NfcPlaylistScene_FirstPopup);
+            case NfcPlaylistEvent_ShowEmulatingPopup:
+               scene_manager_next_scene(app->scene_manager, NfcPlaylistScene_EmulatingPopup);
                consumed = true;
                break;
          }
@@ -96,11 +94,10 @@ bool nfc_playlist_scene_on_event_main_menu(void* context, SceneManagerEvent even
 void nfc_playlist_scene_on_exit_main_menu(void* context) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_on_exit_main_menu");
    NfcPlaylist* app = context;
-   submenu_reset(app->menu);
+   submenu_reset(app->submenu);
 }
 
-/* popup 1 scene */
-
+// Emulating scene
 void nfc_playlist_scene_on_enter_popup_emulating(void* context) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_on_enter_popup_emulating");
    NfcPlaylist* app = context;
@@ -117,31 +114,31 @@ void nfc_playlist_scene_on_enter_popup_emulating(void* context) {
       popup_set_header(app->popup, "Emulating", 64, 10, AlignCenter, AlignTop);
       view_dispatcher_switch_to_view(app->view_dispatcher, NfcPlaylistView_Popup);
       // read the file line by line and print the text
-      while(stream_read_line(stream, line) && !app->cancel_emulate) {
-
+      while(stream_read_line(stream, line)) {
          char* file_path = (char*)furi_string_get_cstr(line);
-         char* file_name = strrchr(file_path, (int)"/");
-
-         popup_set_text(app->popup, file_name, 64, 30, AlignCenter, AlignTop);
+         char* file_name = &strrchr(file_path, '/')[1];
+         int time_counter_ms = app->emulate_timeout;
 
          nfc_playlist_worker_set_nfc_data(app->nfc_worker, file_path);
          nfc_playlist_worker_start(app->nfc_worker);
 
-         int time_counter_ms = app->emulate_timeout;
-         while(nfc_playlist_worker_is_emulating(app->nfc_worker)) {
-            furi_delay_ms(50);
-            time_counter_ms -= 50;
+         do {
+            int size = (strlen(file_name) + 4);
+            char display_text[size];
+            snprintf(display_text, size, "%s\n%ds", file_name, (time_counter_ms/1000));
+            popup_set_text(app->popup, display_text, 64, 25, AlignCenter, AlignTop);
+            furi_delay_ms(500);
+            time_counter_ms -= 500;
             if (time_counter_ms <= 0) {
                break;
             }
-         }
+         } while(nfc_playlist_worker_is_emulating(app->nfc_worker));
 
          if (nfc_playlist_worker_is_emulating(app->nfc_worker)) {
             nfc_playlist_worker_stop(app->nfc_worker);
          }
 
          furi_string_reset(line);
-
       }
    } else {
       FURI_LOG_E(TAG, "Failed to open file");
@@ -152,7 +149,6 @@ void nfc_playlist_scene_on_enter_popup_emulating(void* context) {
    stream_free(stream);
    nfc_playlist_worker_free(app->nfc_worker);
    app->nfc_worker = NULL;
-   app->cancel_emulate = false;
    // Close storage
    furi_record_close(RECORD_STORAGE);
 
@@ -170,36 +166,32 @@ bool nfc_playlist_scene_on_event_popup_emulating(void* context, SceneManagerEven
 void nfc_playlist_scene_on_exit_popup_emulating(void* context) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_on_exit_popup_emulating");
    NfcPlaylist* app = context;
-   if (nfc_playlist_worker_is_emulating(app->nfc_worker)) {
-      nfc_playlist_worker_stop(app->nfc_worker);
-      app->cancel_emulate = true;
-   }
    popup_reset(app->popup);
 }
 
-/** collection of all scene on_enter handlers - in the same order as their enum */
+// Collection of all scene on_enter handlers - in the same order as their enum
 void (*const nfc_playlist_scene_on_enter_handlers[])(void*) = {
    nfc_playlist_scene_on_enter_main_menu,
    nfc_playlist_scene_on_enter_popup_emulating};
 
-/** collection of all scene on event handlers - in the same order as their enum */
+// Collection of all scene on event handlers - in the same order as their enum
 bool (*const nfc_playlist_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
    nfc_playlist_scene_on_event_main_menu,
    nfc_playlist_scene_on_event_popup_emulating};
 
-/** collection of all scene on exit handlers - in the same order as their enum */
+// Collection of all scene on exit handlers - in the same order as their enum
 void (*const nfc_playlist_scene_on_exit_handlers[])(void*) = {
    nfc_playlist_scene_on_exit_main_menu,
    nfc_playlist_scene_on_exit_popup_emulating};
 
-/** collection of all on_enter, on_event, on_exit handlers */
+// Collection of all on_enter, on_event, on_exit handlers */
 const SceneManagerHandlers nfc_playlist_scene_event_handlers = {
    .on_enter_handlers = nfc_playlist_scene_on_enter_handlers,
    .on_event_handlers = nfc_playlist_scene_on_event_handlers,
    .on_exit_handlers = nfc_playlist_scene_on_exit_handlers,
    .scene_num = NfcPlaylistScene_count};
 
-/** custom event handler - passes the event to the scene manager */
+// Custom event handler - passes the event to the scene manager
 bool nfc_playlist_scene_manager_custom_event_callback(void* context, uint32_t custom_event) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_manager_custom_event_callback");
    furi_assert(context);
@@ -207,7 +199,7 @@ bool nfc_playlist_scene_manager_custom_event_callback(void* context, uint32_t cu
    return scene_manager_handle_custom_event(app->scene_manager, custom_event);
 }
 
-/** navigation event handler - passes the event to the scene manager */
+// Navigation event handler - passes the event to the scene manager
 bool nfc_playlist_scene_manager_navigation_event_callback(void* context) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_manager_navigation_event_callback");
    furi_assert(context);
@@ -215,13 +207,13 @@ bool nfc_playlist_scene_manager_navigation_event_callback(void* context) {
    return scene_manager_handle_back_event(app->scene_manager);
 }
 
-/** initialise the scene manager with all handlers */
+// Initialise the scene manager with all handlers
 void nfc_playlist_scene_manager_init(NfcPlaylist* app) {
    FURI_LOG_T(TAG, "nfc_playlist_scene_manager_init");
    app->scene_manager = scene_manager_alloc(&nfc_playlist_scene_event_handlers, app);
 }
 
-/** initialise the views, and initialise the view dispatcher with all views */
+// Initialise the views, and initialise the view dispatcher with all views
 void nfc_playlist_view_dispatcher_init(NfcPlaylist* app) {
    FURI_LOG_T(TAG, "nfc_playlist_view_dispatcher_init");
    app->view_dispatcher = view_dispatcher_alloc();
@@ -229,28 +221,25 @@ void nfc_playlist_view_dispatcher_init(NfcPlaylist* app) {
 
    // allocate each view
    FURI_LOG_D(TAG, "nfc_playlist_view_dispatcher_init allocating views");
-   app->menu = submenu_alloc();
+   app->submenu = submenu_alloc();
    app->popup = popup_alloc();
-   app->emulate_timeout = 2000;
-   app->cancel_emulate = false;
+   app->emulate_timeout = 4000;
 
    // assign callback that pass events from views to the scene manager
    FURI_LOG_D(TAG, "nfc_playlist_view_dispatcher_init setting callbacks");
    view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
-   view_dispatcher_set_custom_event_callback(
-      app->view_dispatcher, nfc_playlist_scene_manager_custom_event_callback);
-   view_dispatcher_set_navigation_event_callback(
-      app->view_dispatcher, nfc_playlist_scene_manager_navigation_event_callback);
+   view_dispatcher_set_custom_event_callback( app->view_dispatcher, nfc_playlist_scene_manager_custom_event_callback);
+   view_dispatcher_set_navigation_event_callback(app->view_dispatcher, nfc_playlist_scene_manager_navigation_event_callback);
 
    // add views to the dispatcher, indexed by their enum value
    FURI_LOG_D(TAG, "nfc_playlist_view_dispatcher_init adding view menu");
-   view_dispatcher_add_view(app->view_dispatcher, NfcPlaylistView_Menu, submenu_get_view(app->menu));
+   view_dispatcher_add_view(app->view_dispatcher, NfcPlaylistView_Menu, submenu_get_view(app->submenu));
 
    FURI_LOG_D(TAG, "nfc_playlist_view_dispatcher_init adding view popup");
    view_dispatcher_add_view(app->view_dispatcher, NfcPlaylistView_Popup, popup_get_view(app->popup));
 }
 
-/** initialise app data, scene manager, and view dispatcher */
+// Initialise app data, scene manager, and view dispatcher
 NfcPlaylist* nfc_playlist_init() {
    FURI_LOG_T(TAG, "nfc_playlist_init");
    NfcPlaylist* app = malloc(sizeof(NfcPlaylist));
@@ -259,19 +248,19 @@ NfcPlaylist* nfc_playlist_init() {
    return app;
 }
 
-/** free all app data, scene manager, and view dispatcher */
+// Free all app data, scene manager, and view dispatcher
 void nfc_playlist_free(NfcPlaylist* app) {
    FURI_LOG_T(TAG, "nfc_playlist_free");
    scene_manager_free(app->scene_manager);
    view_dispatcher_remove_view(app->view_dispatcher, NfcPlaylistView_Menu);
    view_dispatcher_remove_view(app->view_dispatcher, NfcPlaylistView_Popup);
    view_dispatcher_free(app->view_dispatcher);
-   submenu_free(app->menu);
+   submenu_free(app->submenu);
    popup_free(app->popup);
    free(app);
 }
 
-/** go to trace log level in the dev environment */
+// Go to trace log level in the dev environment
 void nfc_playlist_set_log_level() {
 #ifdef FURI_DEBUG
    furi_log_set_level(FuriLogLevelTrace);