Преглед изворни кода

fix: Few minor improvements. Lost events - to go

QtRoS пре 2 година
родитељ
комит
b6c3ee6f02

+ 2 - 0
helpers/hex_viewer_storage.c

@@ -120,9 +120,11 @@ bool hex_viewer_open_file(void* context, const char* file_path) {
     furi_assert(hex_viewer);
     furi_assert(file_path);
 
+    // TODO Separate function?
     if(hex_viewer->model->stream) {
         buffered_file_stream_close(hex_viewer->model->stream);
         stream_free(hex_viewer->model->stream); // TODO Check
+        hex_viewer->model->file_offset = 0;
     }
 
     hex_viewer->model->stream = buffered_file_stream_alloc(hex_viewer->storage);

+ 2 - 6
hex_viewer.h

@@ -38,7 +38,6 @@
 #define HEX_VIEWER_LINES_ON_SCREEN 4u
 #define HEX_VIEWER_BUF_SIZE (HEX_VIEWER_LINES_ON_SCREEN * HEX_VIEWER_BYTES_PER_LINE)
 
-
 // typedef struct HexViewerModel HexViewerModel;
 // typedef struct HexViewer HexViewer;
 
@@ -47,12 +46,10 @@ typedef struct {
     uint32_t file_offset;
     uint32_t file_read_bytes;
     uint32_t file_size;
-    bool mode; // Print address or content
-    
+
     Stream* stream;
 } HexViewerModel;
 
-
 // TODO Clean
 typedef struct {
     HexViewerModel* model;
@@ -70,14 +67,13 @@ typedef struct {
     HexViewerScene2* hex_viewer_scene_2;
     DialogsApp* dialogs; // File Browser
     FuriString* file_path; // File Browser
-    uint32_t haptic; 
+    uint32_t haptic;
     uint32_t speaker;
     uint32_t led;
     uint32_t save_settings;
     ButtonMenu* button_menu; // Button Menu
 } HexViewer;
 
-
 typedef enum {
     HexViewerViewIdStartscreen,
     HexViewerViewIdMenu,

+ 22 - 18
scenes/hex_viewer_scene_menu.c

@@ -17,13 +17,17 @@ void hex_viewer_scene_menu_submenu_callback(void* context, uint32_t index) {
 void hex_viewer_scene_menu_on_enter(void* context) {
     HexViewer* app = context;
 
-    submenu_add_item(app->submenu, "Open ...", SubmenuIndexScene4, hex_viewer_scene_menu_submenu_callback, app);
+    submenu_set_header(app->submenu, "Select action");
+    submenu_add_item(
+        app->submenu, "Open ...", SubmenuIndexScene4, hex_viewer_scene_menu_submenu_callback, app);
     // submenu_add_item(app->submenu, "Scene 2 (Inputs/Effects)", SubmenuIndexScene2, hex_viewer_scene_menu_submenu_callback, app);
     // submenu_add_item(app->submenu, "Scene 3 (Buttonmenu)", SubmenuIndexScene3, hex_viewer_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Go to ...", SubmenuIndexScene1, hex_viewer_scene_menu_submenu_callback, app);
+    submenu_add_item(
+        app->submenu, "Go to ...", SubmenuIndexScene1, hex_viewer_scene_menu_submenu_callback, app);
     // submenu_add_item(app->submenu, "Settings", SubmenuIndexSettings, hex_viewer_scene_menu_submenu_callback, app);
 
-    submenu_set_selected_item(app->submenu, scene_manager_get_scene_state(app->scene_manager, HexViewerSceneMenu));
+    submenu_set_selected_item(
+        app->submenu, scene_manager_get_scene_state(app->scene_manager, HexViewerSceneMenu));
 
     view_dispatcher_switch_to_view(app->view_dispatcher, HexViewerViewIdMenu);
 }
@@ -44,24 +48,24 @@ bool hex_viewer_scene_menu_on_event(void* context, SceneManagerEvent event) {
                 app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene1);
             scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_1);
             return true;
-        // } else if (event.event == SubmenuIndexScene2) {
-        //     scene_manager_set_scene_state(
-        //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene2);
-        //     scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_2);
-        //     return true;
-        // } else if (event.event == SubmenuIndexScene3) {
-        //     scene_manager_set_scene_state(
-        //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene3);
-        //     scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_3);
-        } else if (event.event == SubmenuIndexScene4) {
+            // } else if (event.event == SubmenuIndexScene2) {
+            //     scene_manager_set_scene_state(
+            //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene2);
+            //     scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_2);
+            //     return true;
+            // } else if (event.event == SubmenuIndexScene3) {
+            //     scene_manager_set_scene_state(
+            //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene3);
+            //     scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_3);
+        } else if(event.event == SubmenuIndexScene4) {
             scene_manager_set_scene_state(
                 app->scene_manager, HexViewerSceneMenu, SubmenuIndexScene4);
             scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_4);
-        // } else if (event.event == SubmenuIndexSettings) {
-        //     scene_manager_set_scene_state(
-        //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexSettings);
-        //     scene_manager_next_scene(app->scene_manager, HexViewerSceneSettings);
-        //     return true;
+            // } else if (event.event == SubmenuIndexSettings) {
+            //     scene_manager_set_scene_state(
+            //         app->scene_manager, HexViewerSceneMenu, SubmenuIndexSettings);
+            //     scene_manager_next_scene(app->scene_manager, HexViewerSceneSettings);
+            //     return true;
         }
     }
     return false;

+ 8 - 9
scenes/hex_viewer_scene_scene_4.c

@@ -1,6 +1,5 @@
 #include "../hex_viewer.h"
 
-
 void hex_viewer_scene_scene_4_on_enter(void* context) {
     furi_assert(context);
     HexViewer* app = context;
@@ -21,23 +20,24 @@ void hex_viewer_scene_scene_4_on_enter(void* context) {
     furi_string_set(initial_path, HEX_VIEWER_APP_PATH_FOLDER);
 
     DialogsFileBrowserOptions browser_options;
-    dialog_file_browser_set_basic_options(
-        &browser_options, HEX_VIEWER_APP_EXTENSION, &I_hex_10px);
+    dialog_file_browser_set_basic_options(&browser_options, HEX_VIEWER_APP_EXTENSION, &I_hex_10px);
     browser_options.hide_ext = false;
 
-    bool success = dialog_file_browser_show(app->dialogs, app->file_path, initial_path, &browser_options);
+    bool success =
+        dialog_file_browser_show(app->dialogs, app->file_path, initial_path, &browser_options);
     furi_string_free(initial_path);
 
-    if (success) {
+    if(success) {
         success = hex_viewer_open_file(app, furi_string_get_cstr(app->file_path));
-        if(success)
-            hex_viewer_read_file(app);
+        if(success) hex_viewer_read_file(app);
     }
 
     if(success) {
         // Load page to do something with result
         //scene_manager_next_scene(app->scene_manager, HexViewerViewIdMenu);
-        scene_manager_previous_scene(app->scene_manager); // temp for showcase
+        //scene_manager_previous_scene(app->scene_manager); // temp for showcase
+        scene_manager_search_and_switch_to_previous_scene(
+            app->scene_manager, HexViewerViewIdStartscreen);
     } else {
         // This is basically if someone quites the browser
         scene_manager_previous_scene(app->scene_manager);
@@ -55,4 +55,3 @@ bool hex_viewer_scene_scene_4_on_event(void* context, SceneManagerEvent event) {
 void hex_viewer_scene_scene_4_on_exit(void* context) {
     UNUSED(context);
 }
-

+ 49 - 49
scenes/hex_viewer_scene_startscreen.c

@@ -11,67 +11,67 @@ void hex_viewer_scene_startscreen_callback(HexViewerCustomEvent event, void* con
 void hex_viewer_scene_startscreen_on_enter(void* context) {
     furi_assert(context);
     HexViewer* app = context;
-    hex_viewer_startscreen_set_callback(app->hex_viewer_startscreen, hex_viewer_scene_startscreen_callback, app);
+    hex_viewer_startscreen_set_callback(
+        app->hex_viewer_startscreen, hex_viewer_scene_startscreen_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, HexViewerViewIdStartscreen);
 }
 
 bool hex_viewer_scene_startscreen_on_event(void* context, SceneManagerEvent event) {
     HexViewer* app = context;
     bool consumed = false;
-    
+    uint32_t last_byte_on_screen;
+
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case HexViewerCustomEventStartscreenLeft:
-                app->model->mode = !app->model->mode;
-                consumed = true;
-                break;
-            case HexViewerCustomEventStartscreenRight:
-                // TODO Dialog
-                consumed = true;
-                break;
-            case HexViewerCustomEventStartscreenUp:
-                //furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk);
-                if(app->model->file_offset > 0) {
-                    app->model->file_offset -= HEX_VIEWER_BYTES_PER_LINE;
-                    if(!hex_viewer_read_file(app)) break;
-                }
-                consumed = true;
-                //furi_mutex_release(hex_viewer->mutex);
-                break;
-            case HexViewerCustomEventStartscreenDown:
-            {
-                //furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk);
-                uint32_t last_byte_on_screen =
-                    app->model->file_offset + app->model->file_read_bytes;
+        case HexViewerCustomEventStartscreenLeft:
+            //app->model->mode = !app->model->mode;
+            consumed = true;
+            break;
+        case HexViewerCustomEventStartscreenRight:
+            // TODO Dialog
+            consumed = true;
+            break;
+        case HexViewerCustomEventStartscreenUp:
+            //furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk);
+            if(app->model->file_offset > 0) {
+                app->model->file_offset -= HEX_VIEWER_BYTES_PER_LINE;
+                if(!hex_viewer_read_file(app)) break; // TODO Do smth
+            }
+            consumed = true;
+            //furi_mutex_release(hex_viewer->mutex);
+            break;
+        case HexViewerCustomEventStartscreenDown:
+            //furi_check(furi_mutex_acquire(hex_viewer->mutex, FuriWaitForever) == FuriStatusOk);
+            last_byte_on_screen = app->model->file_offset + app->model->file_read_bytes;
 
-                if(app->model->file_size > last_byte_on_screen) {
-                    app->model->file_offset += HEX_VIEWER_BYTES_PER_LINE;
-                    if(!hex_viewer_read_file(app)) break; // TODO Do smth
-                }
-                consumed = true;
-                //furi_mutex_release(hex_viewer->mutex);
-                break;
+            if(app->model->file_size > last_byte_on_screen) {
+                app->model->file_offset += HEX_VIEWER_BYTES_PER_LINE;
+                if(!hex_viewer_read_file(app)) break; // TODO Do smth
             }
-            case HexViewerCustomEventStartscreenOk:
-                if (!app->model->file_size) // TODO
-                    scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_4);
-                else scene_manager_next_scene(app->scene_manager, HexViewerSceneMenu);
-                consumed = true;
-                break;
-            case HexViewerCustomEventStartscreenBack: // TODO DElete
-                notification_message(app->notification, &sequence_reset_red);
-                notification_message(app->notification, &sequence_reset_green);
-                notification_message(app->notification, &sequence_reset_blue);
-                if(!scene_manager_search_and_switch_to_previous_scene(
-                    app->scene_manager, HexViewerSceneStartscreen)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+            consumed = true;
+            //furi_mutex_release(hex_viewer->mutex);
+            break;
+        case HexViewerCustomEventStartscreenOk:
+            if(!app->model->file_size) // TODO
+                scene_manager_next_scene(app->scene_manager, HexViewerSceneScene_4);
+            else
+                scene_manager_next_scene(app->scene_manager, HexViewerSceneMenu);
+            consumed = true;
+            break;
+        case HexViewerCustomEventStartscreenBack: // TODO Delete
+            notification_message(app->notification, &sequence_reset_red);
+            notification_message(app->notification, &sequence_reset_green);
+            notification_message(app->notification, &sequence_reset_blue);
+            if(!scene_manager_search_and_switch_to_previous_scene(
+                   app->scene_manager, HexViewerSceneStartscreen)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
-    
+
     return consumed;
 }
 

+ 82 - 92
views/hex_viewer_startscreen.c

@@ -10,13 +10,12 @@ struct HexViewerStartscreen {
     void* context;
 };
 
-
 typedef struct {
     uint8_t file_bytes[HEX_VIEWER_LINES_ON_SCREEN][HEX_VIEWER_BYTES_PER_LINE];
     uint32_t file_offset;
     uint32_t file_read_bytes;
     uint32_t file_size;
-    bool mode; // Print address or content
+    bool mode;
 } HexViewerStartscreenModel;
 
 void hex_viewer_startscreen_set_callback(
@@ -32,12 +31,12 @@ void hex_viewer_startscreen_set_callback(
 void hex_viewer_startscreen_draw(Canvas* canvas, HexViewerStartscreenModel* model) {
     canvas_clear(canvas);
 
-    if (!model->file_size) {
+    if(!model->file_size) {
         canvas_set_color(canvas, ColorBlack);
         canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignTop, "HexViewer v2.0"); 
+        canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignTop, "HexViewer v2.0");
         canvas_set_font(canvas, FontSecondary);
-        canvas_draw_str_aligned(canvas, 64, 22, AlignCenter, AlignTop, "Basic hex viewer"); 
+        canvas_draw_str_aligned(canvas, 64, 22, AlignCenter, AlignTop, "Basic hex viewer");
         canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignTop, "for your Flipper");
         elements_button_center(canvas, "Open");
     } else {
@@ -70,8 +69,7 @@ void hex_viewer_startscreen_draw(Canvas* canvas, HexViewerStartscreenModel* mode
         if(model->file_read_bytes % HEX_VIEWER_BYTES_PER_LINE != 0) row_iters += 1;
 
         for(uint32_t i = 0; i < row_iters; ++i) {
-            uint32_t bytes_left_per_row =
-                model->file_read_bytes - i * HEX_VIEWER_BYTES_PER_LINE;
+            uint32_t bytes_left_per_row = model->file_read_bytes - i * HEX_VIEWER_BYTES_PER_LINE;
             bytes_left_per_row = MIN(bytes_left_per_row, HEX_VIEWER_BYTES_PER_LINE);
 
             if(model->mode) {
@@ -98,7 +96,6 @@ void hex_viewer_startscreen_draw(Canvas* canvas, HexViewerStartscreenModel* mode
             canvas_draw_str(canvas, LEFT_OFFSET + 41, TOP_OFFSET + i * ROW_HEIGHT, temp_buf);
         }
     }
-    
 }
 
 static void hex_viewer_startscreen_model_init(HexViewerStartscreenModel* const model) {
@@ -109,84 +106,87 @@ static void hex_viewer_startscreen_model_init(HexViewerStartscreenModel* const m
     model->mode = false;
 }
 
-static void update_local_model_from_app(HexViewer* const app, HexViewerStartscreenModel* const model)
-{
+static void
+    update_local_model_from_app(HexViewer* const app, HexViewerStartscreenModel* const model) {
     memcpy(model->file_bytes, app->model->file_bytes, sizeof(model->file_bytes));
     model->file_offset = app->model->file_offset;
     model->file_read_bytes = app->model->file_read_bytes;
     model->file_size = app->model->file_size;
-    model->mode = app->model->mode;
+    //model->mode = app->model->mode;
 }
 
 bool hex_viewer_startscreen_input(InputEvent* event, void* context) {
-    furi_assert(context); 
+    furi_assert(context);
     HexViewerStartscreen* instance = context;
-    if (event->type == InputTypeRelease) {
+    // TODO InputTypeShort?
+    if(event->type == InputTypeRelease || event->type == InputTypeRepeat) {
         switch(event->key) {
-            case InputKeyBack:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel * model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenBack, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyLeft:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel * model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenLeft, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyRight:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel * model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenRight, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyUp:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel * model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenUp, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyDown:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel * model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenDown, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyOk:
-                with_view_model(
-                    instance->view,
-                    HexViewerStartscreenModel* model,
-                    {
-                        instance->callback(HexViewerCustomEventStartscreenOk, instance->context);
-                        update_local_model_from_app(instance->context, model);
-                    },
-                    true);
-                break;
-            case InputKeyMAX:
-                break;
+        case InputKeyBack:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    instance->callback(HexViewerCustomEventStartscreenBack, instance->context);
+                    update_local_model_from_app(instance->context, model);
+                },
+                true);
+            break;
+        case InputKeyLeft:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    //instance->callback(HexViewerCustomEventStartscreenLeft, instance->context);
+                    //update_local_model_from_app(instance->context, model);
+                    model->mode = !model->mode;
+                },
+                true);
+            break;
+        case InputKeyRight:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    instance->callback(HexViewerCustomEventStartscreenRight, instance->context);
+                    update_local_model_from_app(instance->context, model);
+                },
+                true);
+            break;
+        case InputKeyUp:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    instance->callback(HexViewerCustomEventStartscreenUp, instance->context);
+                    update_local_model_from_app(instance->context, model);
+                },
+                true);
+            break;
+        case InputKeyDown:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    instance->callback(HexViewerCustomEventStartscreenDown, instance->context);
+                    update_local_model_from_app(instance->context, model);
+                },
+                true);
+            break;
+        case InputKeyOk:
+            with_view_model(
+                instance->view,
+                HexViewerStartscreenModel * model,
+                {
+                    instance->callback(HexViewerCustomEventStartscreenOk, instance->context);
+                    update_local_model_from_app(instance->context, model);
+                },
+                true);
+            break;
+        case InputKeyMAX:
+            break;
         }
     }
+
     return true;
 }
 
@@ -201,18 +201,17 @@ void hex_viewer_startscreen_enter(void* context) {
         instance->view,
         HexViewerStartscreenModel * model,
         {
-            hex_viewer_startscreen_model_init(model); 
+            //hex_viewer_startscreen_model_init(model);
             update_local_model_from_app(instance->context, model);
         },
-        true
-    );
+        true);
 }
 
 HexViewerStartscreen* hex_viewer_startscreen_alloc() {
     HexViewerStartscreen* instance = malloc(sizeof(HexViewerStartscreen));
     instance->view = view_alloc();
     view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(HexViewerStartscreenModel));
-    view_set_context(instance->view, instance); // furi_assert crashes in events without this
+    view_set_context(instance->view, instance);
     view_set_draw_callback(instance->view, (ViewDrawCallback)hex_viewer_startscreen_draw);
     view_set_input_callback(instance->view, hex_viewer_startscreen_input);
     view_set_enter_callback(instance->view, hex_viewer_startscreen_enter);
@@ -221,12 +220,9 @@ HexViewerStartscreen* hex_viewer_startscreen_alloc() {
     with_view_model(
         instance->view,
         HexViewerStartscreenModel * model,
-        {
-            hex_viewer_startscreen_model_init(model);
-        },
-        true
-    );
-    
+        { hex_viewer_startscreen_model_init(model); },
+        true);
+
     return instance;
 }
 
@@ -234,12 +230,7 @@ void hex_viewer_startscreen_free(HexViewerStartscreen* instance) {
     furi_assert(instance);
 
     with_view_model(
-        instance->view,
-        HexViewerStartscreenModel * model,
-        {
-            UNUSED(model);
-        },
-        true);
+        instance->view, HexViewerStartscreenModel * model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }
@@ -248,4 +239,3 @@ View* hex_viewer_startscreen_get_view(HexViewerStartscreen* instance) {
     furi_assert(instance);
     return instance->view;
 }
-