Selaa lähdekoodia

Apply Ufbt Format

Esteban Fuentealba 2 vuotta sitten
vanhempi
commit
d1a2816f56

+ 191 - 0
.clang-format

@@ -0,0 +1,191 @@
+---
+Language:        Cpp
+AccessModifierOffset: -4
+AlignAfterOpenBracket: AlwaysBreak
+AlignArrayOfStructures: None
+AlignConsecutiveMacros: None
+AlignConsecutiveAssignments: None
+AlignConsecutiveBitFields: None
+AlignConsecutiveDeclarations: None
+AlignEscapedNewlines: Left
+AlignOperands:   Align
+AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortEnumsOnASingleLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: WithoutElse
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: Yes
+AttributeMacros:
+  - __capability
+BinPackArguments: false
+BinPackParameters: false
+BraceWrapping:
+  AfterCaseLabel:  false
+  AfterClass:      false
+  AfterControlStatement: Never
+  AfterEnum:       false
+  AfterFunction:   false
+  AfterNamespace:  false
+  AfterObjCDeclaration: false
+  AfterStruct:     false
+  AfterUnion:      false
+  AfterExternBlock: false
+  BeforeCatch:     false
+  BeforeElse:      false
+  BeforeLambdaBody: false
+  BeforeWhile:     false
+  IndentBraces:    false
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeConceptDeclarations: true
+BreakBeforeBraces: Attach
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: false
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeComma
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: false
+ColumnLimit:     99
+CommentPragmas:  '^ IWYU pragma:'
+QualifierAlignment: Leave
+CompactNamespaces: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat:   false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
+ExperimentalAutoDetectBinPacking: false
+PackConstructorInitializers: BinPack
+BasedOnStyle:    ''
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+AllowAllConstructorInitializersOnNextLine: true
+FixNamespaceComments: false
+ForEachMacros:
+  - foreach
+  - Q_FOREACH
+  - BOOST_FOREACH
+IfMacros:
+  - KJ_IF_MAYBE
+IncludeBlocks:   Preserve
+IncludeCategories:
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
+    Priority:        3
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+    CaseSensitive:   false
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentAccessModifiers: false
+IndentCaseLabels: false
+IndentCaseBlocks: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentExternBlock: AfterExternBlock
+IndentRequires:  false
+IndentWidth:     4
+IndentWrappedFunctionNames: true
+InsertTrailingCommas: None
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: Signature
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 4
+ObjCBreakBeforeNestedBlockParam: true
+ObjCSpaceAfterProperty: true
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 10
+PenaltyBreakBeforeFirstCallParameter: 30
+PenaltyBreakComment: 10
+PenaltyBreakFirstLessLess: 0
+PenaltyBreakOpenParenthesis: 0
+PenaltyBreakString: 10
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 100
+PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+PointerAlignment: Left
+PPIndentWidth:   -1
+ReferenceAlignment: Pointer
+ReflowComments:  false
+RemoveBracesLLVM: false
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SortIncludes:    Never
+SortJavaStaticImport: Before
+SortUsingDeclarations: false
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: Never
+SpaceBeforeParensOptions:
+  AfterControlStatements: false
+  AfterForeachMacros: false
+  AfterFunctionDefinitionName: false
+  AfterFunctionDeclarationName: false
+  AfterIfMacros:   false
+  AfterOverloadedOperator: false
+  BeforeNonEmptyParentheses: false
+SpaceAroundPointerQualifiers: Default
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  Never
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: false
+SpacesInCStyleCastParentheses: false
+SpacesInLineCommentPrefix:
+  Minimum:         1
+  Maximum:         -1
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+BitFieldColonSpacing: Both
+Standard:        c++03
+StatementAttributeLikeMacros:
+  - Q_EMIT
+StatementMacros:
+  - Q_UNUSED
+  - QT_REQUIRE_VERSION
+TabWidth:        4
+UseCRLF:         false
+UseTab:          Never
+WhitespaceSensitiveMacros:
+  - STRINGIZE
+  - PP_STRINGIZE
+  - BOOST_PP_STRINGIZE
+  - NS_SWIFT_NAME
+  - CF_SWIFT_NAME
+...
+

+ 49 - 29
gb_cartridge_app.c

@@ -24,7 +24,7 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     app->gui = furi_record_open(RECORD_GUI);
     app->storage = furi_record_open(RECORD_STORAGE);
     app->notification = furi_record_open(RECORD_NOTIFICATION);
-    
+
     //  Create MALVEKE dir
     if(storage_common_stat(app->storage, MALVEKE_APP_FOLDER, NULL) == FSE_NOT_EXIST) {
         storage_simply_mkdir(app->storage, MALVEKE_APP_FOLDER);
@@ -41,7 +41,7 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     if(storage_common_stat(app->storage, MALVEKE_APP_FOLDER_PHOTOS, NULL) == FSE_NOT_EXIST) {
         storage_simply_mkdir(app->storage, MALVEKE_APP_FOLDER_PHOTOS);
     }
-    
+
     //Turn backlight on, believe me this makes testing your app easier
     notification_message(app->notification, &sequence_display_backlight_on);
 
@@ -51,9 +51,12 @@ GBCartridge* gb_cartridge_app_app_alloc() {
 
     app->scene_manager = scene_manager_alloc(&gb_cartridge_scene_handlers, app);
     view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
-    view_dispatcher_set_navigation_event_callback(app->view_dispatcher, gb_cartridge_app_navigation_event_callback);
-    view_dispatcher_set_tick_event_callback(app->view_dispatcher, gb_cartridge_app_tick_event_callback, 100);
-    view_dispatcher_set_custom_event_callback(app->view_dispatcher, gb_cartridge_app_custom_event_callback);
+    view_dispatcher_set_navigation_event_callback(
+        app->view_dispatcher, gb_cartridge_app_navigation_event_callback);
+    view_dispatcher_set_tick_event_callback(
+        app->view_dispatcher, gb_cartridge_app_tick_event_callback, 100);
+    view_dispatcher_set_custom_event_callback(
+        app->view_dispatcher, gb_cartridge_app_custom_event_callback);
     app->submenu = variable_item_list_alloc();
 
     // Set defaults, in case no config loaded
@@ -65,13 +68,12 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     app->save_settings = 1;
 
     app->cart_title = " - ";
-    app->cart_dump_rom_filename  = "malveke_rom";
+    app->cart_dump_rom_filename = "malveke_rom";
     app->cart_dump_rom_extension = "gb";
 
     app->cart_dump_ram_filename = "malveke_ram";
     app->cart_dump_ram_extension = "sav";
 
-
     // Used for File Browser
     app->dialogs = furi_record_open(RECORD_DIALOGS);
     app->file_path = furi_string_alloc();
@@ -82,32 +84,53 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     app->uart = usart_init(app);
     app->lp_uart = lp_uart_init(app);
 
-    
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdMenu, variable_item_list_get_view(app->submenu));
+    view_dispatcher_add_view(
+        app->view_dispatcher, GBCartridgeViewIdMenu, variable_item_list_get_view(app->submenu));
     app->gb_cartridge_startscreen = gb_cartridge_startscreen_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdStartscreen, gb_cartridge_startscreen_get_view(app->gb_cartridge_startscreen));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdStartscreen,
+        gb_cartridge_startscreen_get_view(app->gb_cartridge_startscreen));
     app->gb_cartridge_scene_1 = gb_cartridge_scene_1_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene1, gb_cartridge_scene_1_get_view(app->gb_cartridge_scene_1));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdScene1,
+        gb_cartridge_scene_1_get_view(app->gb_cartridge_scene_1));
     app->gb_cartridge_scene_2 = gb_cartridge_scene_2_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene2, gb_cartridge_scene_2_get_view(app->gb_cartridge_scene_2));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdScene2,
+        gb_cartridge_scene_2_get_view(app->gb_cartridge_scene_2));
     app->gb_cartridge_scene_3 = gb_cartridge_scene_3_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene3, gb_cartridge_scene_3_get_view(app->gb_cartridge_scene_3));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdScene3,
+        gb_cartridge_scene_3_get_view(app->gb_cartridge_scene_3));
     app->gb_cartridge_scene_4 = gb_cartridge_scene_4_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene4, gb_cartridge_scene_4_get_view(app->gb_cartridge_scene_4));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdScene4,
+        gb_cartridge_scene_4_get_view(app->gb_cartridge_scene_4));
     app->gb_cartridge_scene_5 = gb_cartridge_scene_5_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene5, gb_cartridge_scene_5_get_view(app->gb_cartridge_scene_5));
-    
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdScene5,
+        gb_cartridge_scene_5_get_view(app->gb_cartridge_scene_5));
+
     // app->button_menu = button_menu_alloc();
     // view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdScene3, button_menu_get_view(app->button_menu));
-    
+
     app->variable_item_list = variable_item_list_alloc();
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdSettings, variable_item_list_get_view(app->variable_item_list));
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        GBCartridgeViewIdSettings,
+        variable_item_list_get_view(app->variable_item_list));
 
     //End Scene Additions
 
     //  Enable 5v
     furi_hal_power_enable_otg();
-    furi_delay_ms(1); 
+    furi_delay_ms(1);
     return app;
 }
 
@@ -126,12 +149,12 @@ void gb_cartridge_app_app_free(GBCartridge* app) {
     view_dispatcher_free(app->view_dispatcher);
     furi_record_close(RECORD_GUI);
     furi_record_close(RECORD_STORAGE);
-    
+
     app->gui = NULL;
     app->notification = NULL;
     app->storage = NULL;
 
-    //  
+    //
     uart_free(app->uart);
     uart_free(app->lp_uart);
     // Close File Browser
@@ -156,16 +179,16 @@ int32_t gb_cartridge_app(void* p) {
     // furi_delay_ms(200);
 
     GBCartridge* app = gb_cartridge_app_app_alloc();
-    
+
     // if user hasn't confirmed whether to save pcaps and logs to sdcard, then prompt when scene starts
     // app->need_to_prompt_settings_init =
     //     (!storage_file_exists(app->storage, SAVE_PCAP_SETTING_FILEPATH) ||
     //      !storage_file_exists(app->storage, SAVE_LOGS_SETTING_FILEPATH));
 
-
     view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
-    
-    scene_manager_next_scene(app->scene_manager, GBCartridgeSceneStartscreen); //Start with start screen
+
+    scene_manager_next_scene(
+        app->scene_manager, GBCartridgeSceneStartscreen); //Start with start screen
     //scene_manager_next_scene(app->scene_manager, GBCartridgeSceneMenu); //if you want to directly start with Menu
     // scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_4);
 
@@ -173,7 +196,7 @@ int32_t gb_cartridge_app(void* p) {
 
     view_dispatcher_run(app->view_dispatcher);
     gb_cartridge_save_settings(app);
-    
+
     furi_hal_power_suppress_charge_exit();
     gb_cartridge_app_app_free(app);
     // if(furi_hal_power_is_otg_enabled()) {
@@ -181,6 +204,3 @@ int32_t gb_cartridge_app(void* p) {
     // }
     return 0;
 }
-
-
-

+ 2 - 7
gb_cartridge_app.h

@@ -33,7 +33,6 @@
 #define MALVEKE_APP_FOLDER_RAMS MALVEKE_APP_FOLDER "/rams"
 #define MALVEKE_APP_FOLDER_PHOTOS MALVEKE_APP_FOLDER "/photos"
 
-
 #define UI_PADDING 3
 #define UI_PROGRESS_COLS 8
 #define UI_PROGRESS_ROWS 4
@@ -48,7 +47,6 @@
 #define MIN(a, b) ((a) < (b)) ? (a) : (b)
 #endif
 
-
 typedef struct {
     Gui* gui;
     Storage* storage;
@@ -64,10 +62,10 @@ typedef struct {
     GBCartridgeScene3* gb_cartridge_scene_3;
     GBCartridgeScene4* gb_cartridge_scene_4;
     GBCartridgeScene5* gb_cartridge_scene_5;
-    
+
     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;
@@ -99,7 +97,6 @@ typedef struct {
 
 } GBCartridge;
 
-
 typedef enum {
     GBCartridgeViewIdStartscreen,
     GBCartridgeViewIdMenu,
@@ -135,5 +132,3 @@ typedef enum {
     GBCartridgeRomOptionGB,
     GBCartridgeRomOptionGBC,
 } GBCartridgeRomOptionState;
-
-

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 214 - 339
helpers/cJSON.c


+ 138 - 110
helpers/cJSON.h

@@ -24,11 +24,11 @@
 #define cJSON__h
 
 #ifdef __cplusplus
-extern "C"
-{
+extern "C" {
 #endif
 
-#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
+#if !defined(__WINDOWS__) && \
+    (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
 #define __WINDOWS__
 #endif
 
@@ -56,23 +56,25 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
 #define CJSON_STDCALL __stdcall
 
 /* export symbols by default, this is necessary for copy pasting the C and header file */
-#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
+#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && \
+    !defined(CJSON_EXPORT_SYMBOLS)
 #define CJSON_EXPORT_SYMBOLS
 #endif
 
 #if defined(CJSON_HIDE_SYMBOLS)
-#define CJSON_PUBLIC(type)   type CJSON_STDCALL
+#define CJSON_PUBLIC(type) type CJSON_STDCALL
 #elif defined(CJSON_EXPORT_SYMBOLS)
-#define CJSON_PUBLIC(type)   __declspec(dllexport) type CJSON_STDCALL
+#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
 #elif defined(CJSON_IMPORT_SYMBOLS)
-#define CJSON_PUBLIC(type)   __declspec(dllimport) type CJSON_STDCALL
+#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
 #endif
 #else /* !__WINDOWS__ */
 #define CJSON_CDECL
 #define CJSON_STDCALL
 
-#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
-#define CJSON_PUBLIC(type)   __attribute__((visibility("default"))) type
+#if(defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C)) && \
+    defined(CJSON_API_VISIBILITY)
+#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
 #else
 #define CJSON_PUBLIC(type) type
 #endif
@@ -87,46 +89,44 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
 
 /* cJSON Types: */
 #define cJSON_Invalid (0)
-#define cJSON_False  (1 << 0)
-#define cJSON_True   (1 << 1)
-#define cJSON_NULL   (1 << 2)
+#define cJSON_False (1 << 0)
+#define cJSON_True (1 << 1)
+#define cJSON_NULL (1 << 2)
 #define cJSON_Number (1 << 3)
 #define cJSON_String (1 << 4)
-#define cJSON_Array  (1 << 5)
+#define cJSON_Array (1 << 5)
 #define cJSON_Object (1 << 6)
-#define cJSON_Raw    (1 << 7) /* raw json */
+#define cJSON_Raw (1 << 7) /* raw json */
 
 #define cJSON_IsReference 256
 #define cJSON_StringIsConst 512
 
 /* The cJSON structure: */
-typedef struct cJSON
-{
+typedef struct cJSON {
     /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
-    struct cJSON *next;
-    struct cJSON *prev;
+    struct cJSON* next;
+    struct cJSON* prev;
     /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
-    struct cJSON *child;
+    struct cJSON* child;
 
     /* The type of the item, as above. */
     int type;
 
     /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
-    char *valuestring;
+    char* valuestring;
     /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
     int valueint;
     /* The item's number, if type==cJSON_Number */
     double valuedouble;
 
     /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
-    char *string;
+    char* string;
 } cJSON;
 
-typedef struct cJSON_Hooks
-{
-      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
-      void *(CJSON_CDECL *malloc_fn)(size_t sz);
-      void (CJSON_CDECL *free_fn)(void *ptr);
+typedef struct cJSON_Hooks {
+    /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
+    void*(CJSON_CDECL* malloc_fn)(size_t sz);
+    void(CJSON_CDECL* free_fn)(void* ptr);
 } cJSON_Hooks;
 
 typedef int cJSON_bool;
@@ -145,153 +145,181 @@ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
 
 /* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
 /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
-CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
-CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
+CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value);
+CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length);
 /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
 /* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
-CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
-CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
+CJSON_PUBLIC(cJSON*)
+cJSON_ParseWithOpts(
+    const char* value,
+    const char** return_parse_end,
+    cJSON_bool require_null_terminated);
+CJSON_PUBLIC(cJSON*)
+cJSON_ParseWithLengthOpts(
+    const char* value,
+    size_t buffer_length,
+    const char** return_parse_end,
+    cJSON_bool require_null_terminated);
 
 /* Render a cJSON entity to text for transfer/storage. */
-CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
+CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item);
 /* Render a cJSON entity to text for transfer/storage without any formatting. */
-CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
+CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item);
 /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
-CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
+CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt);
 /* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
 /* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
-CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format);
 /* Delete a cJSON entity and all subentities. */
-CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
+CJSON_PUBLIC(void) cJSON_Delete(cJSON* item);
 
 /* Returns the number of items in an array (or object). */
-CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
+CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array);
 /* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
-CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
+CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index);
 /* Get item "string" from object. Case insensitive. */
-CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
-CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
-CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
+CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string);
+CJSON_PUBLIC(cJSON*)
+cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string);
+CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string);
 /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
-CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
+CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void);
 
 /* Check item type and return its value */
-CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
-CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
+CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item);
+CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item);
 
 /* These functions check the type of an item */
-CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
-CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item);
 
 /* These calls create a cJSON item of the appropriate type. */
-CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
-CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
-CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
-CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
-CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
-CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
+CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void);
+CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void);
+CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void);
+CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean);
+CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num);
+CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string);
 /* raw json */
-CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
-CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
-CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
+CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw);
+CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void);
+CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void);
 
 /* Create a string where valuestring references a string so
  * it will not be freed by cJSON_Delete */
-CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
+CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string);
 /* Create an object/array that only references it's elements so
  * they will not be freed by cJSON_Delete */
-CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
-CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
+CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child);
+CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child);
 
 /* These utilities create an Array of count items.
  * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
-CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
-CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
-CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
-CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
+CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count);
+CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count);
+CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count);
+CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count);
 
 /* Append item to the specified array/object. */
-CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
-CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item);
 /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
  * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
  * writing to `item->string` */
-CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item);
 /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
-CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
-CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item);
 
 /* Remove/Detach items from Arrays/Objects. */
-CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
-CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
-CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
-CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
-CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
-CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
-CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
+CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item);
+CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which);
+CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string);
+CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string);
 
 /* Update array items. */
-CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
-CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
-CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
-CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
-CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_InsertItemInArray(
+    cJSON* array,
+    int which,
+    cJSON* newitem); /* Shifts pre-existing items to the right. */
+CJSON_PUBLIC(cJSON_bool)
+cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement);
+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem);
 
 /* Duplicate a cJSON item */
-CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
+CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse);
 /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
  * need to be released. With recurse!=0, it will duplicate any children connected to the item.
  * The item->next and ->prev pointers are always zero on return from Duplicate. */
 /* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
  * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
-CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
+CJSON_PUBLIC(cJSON_bool)
+cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive);
 
 /* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
  * The input pointer json cannot point to a read-only address area, such as a string constant, 
  * but should point to a readable and writable address area. */
-CJSON_PUBLIC(void) cJSON_Minify(char *json);
+CJSON_PUBLIC(void) cJSON_Minify(char* json);
 
 /* Helper functions for creating and adding items to an object at the same time.
  * They return the added item or NULL on failure. */
-CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
-CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
-CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
-CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
-CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
-CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
-CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
-CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
-CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name);
+CJSON_PUBLIC(cJSON*)
+cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean);
+CJSON_PUBLIC(cJSON*)
+cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number);
+CJSON_PUBLIC(cJSON*)
+cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string);
+CJSON_PUBLIC(cJSON*)
+cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw);
+CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name);
 
 /* When assigning an integer value, it needs to be propagated to valuedouble too. */
-#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
+#define cJSON_SetIntValue(object, number) \
+    ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
 /* helper for the cJSON_SetNumberValue macro */
-CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
-#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
+CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number);
+#define cJSON_SetNumberValue(object, number) \
+    ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
 /* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
-CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
+CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring);
 
 /* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/
-#define cJSON_SetBoolValue(object, boolValue) ( \
-    (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \
-    (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \
-    cJSON_Invalid\
-)
+#define cJSON_SetBoolValue(object, boolValue)                                \
+    ((object != NULL && ((object)->type & (cJSON_False | cJSON_True))) ?     \
+         (object)->type = ((object)->type & (~(cJSON_False | cJSON_True))) | \
+                          ((boolValue) ? cJSON_True : cJSON_False) :         \
+         cJSON_Invalid)
 
 /* Macro for iterating over an array or object */
-#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
+#define cJSON_ArrayForEach(element, array)                                  \
+    for(element = (array != NULL) ? (array)->child : NULL; element != NULL; \
+        element = element->next)
 
 /* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
-CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
-CJSON_PUBLIC(void) cJSON_free(void *object);
+CJSON_PUBLIC(void*) cJSON_malloc(size_t size);
+CJSON_PUBLIC(void) cJSON_free(void* object);
 
 #ifdef __cplusplus
 }

+ 3 - 2
helpers/gb_cartridge_custom_event.h

@@ -13,7 +13,7 @@ typedef enum {
     GBCartridgeCustomEventScene1Right,
     GBCartridgeCustomEventScene1Ok,
     GBCartridgeCustomEventScene1Back,
-    
+
     GBCartridgeCustomEventScene2Up,
     GBCartridgeCustomEventScene2Down,
     GBCartridgeCustomEventScene2Left,
@@ -63,7 +63,8 @@ static inline uint32_t gb_cartridge_custom_menu_event_pack(uint16_t type, int16_
     GBCartridgeCustomEventMenu event = {.content = {.type = type, .value = value}};
     return event.packed_value;
 }
-static inline void gb_cartridge_custom_menu_event_unpack(uint32_t packed_value, uint16_t* type, int16_t* value) {
+static inline void
+    gb_cartridge_custom_menu_event_unpack(uint32_t packed_value, uint16_t* type, int16_t* value) {
     GBCartridgeCustomEventMenu event = {.packed_value = packed_value};
     if(type) *type = event.content.type;
     if(value) *value = event.content.value;

+ 2 - 3
helpers/gb_cartridge_speaker.c

@@ -5,19 +5,18 @@
 
 void gb_cartridge_play_input_sound(void* context) {
     GBCartridge* app = context;
-    if (app->speaker != 1) {
+    if(app->speaker != 1) {
         return;
     }
     float volume = 1.0f;
     if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
         furi_hal_speaker_start(NOTE_INPUT, volume);
     }
-    
 }
 
 void gb_cartridge_stop_all_sound(void* context) {
     GBCartridge* app = context;
-    if (app->speaker != 1) {
+    if(app->speaker != 1) {
         return;
     }
     if(furi_hal_speaker_is_mine()) {

+ 14 - 18
helpers/gb_cartridge_storage.c

@@ -1,6 +1,5 @@
 #include "gb_cartridge_storage.h"
 
-
 static Storage* gb_cartridge_open_storage() {
     return furi_record_open(RECORD_STORAGE);
 }
@@ -10,21 +9,21 @@ static void gb_cartridge_close_storage() {
 }
 
 static void gb_cartridge_close_config_file(FlipperFormat* file) {
-    if (file == NULL) return;
+    if(file == NULL) return;
     flipper_format_file_close(file);
     flipper_format_free(file);
 }
 
 void gb_cartridge_save_settings(void* context) {
     GBCartridge* app = context;
-    if (app->save_settings == 0) {
+    if(app->save_settings == 0) {
         return;
     }
 
     FURI_LOG_D(TAG, "Saving Settings");
     Storage* storage = gb_cartridge_open_storage();
     FlipperFormat* fff_file = flipper_format_file_alloc(storage);
-    
+
     // Overwrite wont work, so delete first
     if(storage_file_exists(storage, BOILERPLATE_SETTINGS_SAVE_PATH)) {
         storage_simply_remove(storage, BOILERPLATE_SETTINGS_SAVE_PATH);
@@ -32,12 +31,11 @@ void gb_cartridge_save_settings(void* context) {
 
     // Open File, create if not exists
     if(!storage_common_stat(storage, BOILERPLATE_SETTINGS_SAVE_PATH, NULL) == FSE_OK) {
-        FURI_LOG_D(TAG, "Config file %s is not found. Will create new.", BOILERPLATE_SETTINGS_SAVE_PATH);
+        FURI_LOG_D(
+            TAG, "Config file %s is not found. Will create new.", BOILERPLATE_SETTINGS_SAVE_PATH);
         if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
             FURI_LOG_D(
-                TAG,
-                "Directory %s doesn't exist. Will create new.",
-                CONFIG_FILE_DIRECTORY_PATH);
+                TAG, "Directory %s doesn't exist. Will create new.", CONFIG_FILE_DIRECTORY_PATH);
             if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
                 FURI_LOG_E(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
             }
@@ -50,19 +48,16 @@ void gb_cartridge_save_settings(void* context) {
         gb_cartridge_close_storage();
         return;
     }
-    
+
     // Store Settings
     flipper_format_write_header_cstr(
         fff_file, BOILERPLATE_SETTINGS_HEADER, BOILERPLATE_SETTINGS_FILE_VERSION);
-    flipper_format_write_uint32(
-        fff_file, BOILERPLATE_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
-    flipper_format_write_uint32(
-        fff_file, BOILERPLATE_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
-    flipper_format_write_uint32(
-        fff_file, BOILERPLATE_SETTINGS_KEY_LED, &app->led, 1);
+    flipper_format_write_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
+    flipper_format_write_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
+    flipper_format_write_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_LED, &app->led, 1);
     flipper_format_write_uint32(
         fff_file, BOILERPLATE_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
-    
+
     if(!flipper_format_rewind(fff_file)) {
         gb_cartridge_close_config_file(fff_file);
         FURI_LOG_E(TAG, "Rewind error");
@@ -87,7 +82,7 @@ void gb_cartridge_read_settings(void* context) {
     uint32_t file_version;
     FuriString* temp_str = furi_string_alloc();
 
-    if (!flipper_format_file_open_existing(fff_file, BOILERPLATE_SETTINGS_SAVE_PATH)) {
+    if(!flipper_format_file_open_existing(fff_file, BOILERPLATE_SETTINGS_SAVE_PATH)) {
         FURI_LOG_E(TAG, "Cannot open file %s", BOILERPLATE_SETTINGS_SAVE_PATH);
         gb_cartridge_close_config_file(fff_file);
         gb_cartridge_close_storage();
@@ -111,7 +106,8 @@ void gb_cartridge_read_settings(void* context) {
     flipper_format_read_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
     flipper_format_read_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
     flipper_format_read_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_LED, &app->led, 1);
-    flipper_format_read_uint32(fff_file, BOILERPLATE_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
+    flipper_format_read_uint32(
+        fff_file, BOILERPLATE_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
 
     flipper_format_rewind(fff_file);
 

+ 2 - 5
malveke_notifications.c

@@ -1,6 +1,5 @@
 #include "malveke_notifications.h"
 
-
 const NotificationMessage message_delay_note_325 = {
     .type = NotificationMessageTypeDelay,
     .data.delay.length = 325,
@@ -14,7 +13,6 @@ const NotificationMessage message_delay_note_216 = {
     .data.delay.length = 216,
 };
 
-
 const NotificationMessage message_delay_note_1302 = {
     .type = NotificationMessageTypeDelay,
     .data.delay.length = 1302,
@@ -49,13 +47,12 @@ static const NotificationSequence sequence_get_item = {
 
     &message_vibro_on,
 
-
     &message_note_1047,
     &message_delay_note_325,
     &message_sound_off,
 
     &message_vibro_off,
-    
+
     &message_note_1047,
     &message_delay_note_108,
     &message_sound_off,
@@ -87,6 +84,6 @@ static const NotificationSequence sequence_get_item = {
     NULL,
 };
 
-void notification_success(NotificationApp *notification) {
+void notification_success(NotificationApp* notification) {
     notification_message(notification, &sequence_get_item);
 }

+ 1 - 1
malveke_notifications.h

@@ -16,5 +16,5 @@
 // extern const NotificationMessage message_note_1047;
 // extern const NotificationMessage message_note_1109;
 
-void notification_success(NotificationApp *notification);
+void notification_success(NotificationApp* notification);
 #endif // MALVEKE_NOTIFICATIONS_H

+ 9 - 9
scenes/gb_cartridge_scene_menu.c

@@ -21,8 +21,8 @@ const uint32_t gameboy_rom_option_value[2] = {
     GBCartridgeRomOptionGBC,
 };
 
-void toUpperCase(char *str) {
-    while (*str) {
+void toUpperCase(char* str) {
+    while(*str) {
         *str = toupper((unsigned char)*str);
         str++;
     }
@@ -71,12 +71,12 @@ void gb_cartridge_scene_menu_on_enter(void* context) {
     // app->gameboy_rom_option_selected_index = value_index_uint32(app->gameboy_rom_option_selected_index, gameboy_rom_option_value, 2);
     // variable_item_set_current_value_index(item, app->gameboy_rom_option_selected_index);
     // variable_item_set_current_value_text(item, rom_option_uppercase(app->gameboy_rom_option_selected_index));
-    
 
     variable_item_list_add(app->submenu, "Write RAM", 1, NULL, NULL);
     // variable_item_list_add(app->submenu, "Settings", 1, NULL, NULL);
 
-    variable_item_list_set_enter_callback(app->submenu, gb_cartridge_scene_menu_submenu_callback, app);
+    variable_item_list_set_enter_callback(
+        app->submenu, gb_cartridge_scene_menu_submenu_callback, app);
 
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdMenu);
 }
@@ -95,24 +95,24 @@ bool gb_cartridge_scene_menu_on_event(void* context, SceneManagerEvent event) {
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene1);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_1);
             return true;
-        } else if (event.event == SubmenuIndexScene2) {
+        } else if(event.event == SubmenuIndexScene2) {
             scene_manager_set_scene_state(
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene2);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_2);
             return true;
-        } else if (event.event == SubmenuIndexScene3) {
+        } else if(event.event == SubmenuIndexScene3) {
             scene_manager_set_scene_state(
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene3);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_3);
-        } else if (event.event == SubmenuIndexScene4) {
+        } else if(event.event == SubmenuIndexScene4) {
             scene_manager_set_scene_state(
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene4);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_4);
-        } else if (event.event == SubmenuIndexScene5) {
+        } else if(event.event == SubmenuIndexScene5) {
             scene_manager_set_scene_state(
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene5);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_5);
-        } else if (event.event == SubmenuIndexSettings) {
+        } else if(event.event == SubmenuIndexSettings) {
             scene_manager_set_scene_state(
                 app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexSettings);
             scene_manager_next_scene(app->scene_manager, GBCartridgeSceneSettings);

+ 21 - 20
scenes/gb_cartridge_scene_scene_1.c

@@ -11,37 +11,38 @@ void gb_cartridge_scene_1_callback(GBCartridgeCustomEvent event, void* context)
 void gb_cartridge_scene_scene_1_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_scene_1_set_callback(app->gb_cartridge_scene_1, gb_cartridge_scene_1_callback, app);
+    gb_cartridge_scene_1_set_callback(
+        app->gb_cartridge_scene_1, gb_cartridge_scene_1_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdScene1);
 }
 
 bool gb_cartridge_scene_scene_1_on_event(void* context, SceneManagerEvent event) {
     GBCartridge* app = context;
     bool consumed = false;
-    
+
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventScene1Left:
-            case GBCartridgeCustomEventScene1Right:
-                break;
-            case GBCartridgeCustomEventScene1Up:
-            case GBCartridgeCustomEventScene1Down:
-                break;
-            case GBCartridgeCustomEventScene1Back:
-                notification_message(app->notification, &sequence_reset_red);
-                notification_message(app->notification, &sequence_reset_green);
-                notification_message(app->notification, &sequence_reset_blue);
+        case GBCartridgeCustomEventScene1Left:
+        case GBCartridgeCustomEventScene1Right:
+            break;
+        case GBCartridgeCustomEventScene1Up:
+        case GBCartridgeCustomEventScene1Down:
+            break;
+        case GBCartridgeCustomEventScene1Back:
+            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, GBCartridgeSceneMenu)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+            if(!scene_manager_search_and_switch_to_previous_scene(
+                   app->scene_manager, GBCartridgeSceneMenu)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
-    
+
     return consumed;
 }
 

+ 19 - 19
scenes/gb_cartridge_scene_scene_2.c

@@ -11,7 +11,8 @@ void gb_cartridge_scene_2_callback(GBCartridgeCustomEvent event, void* context)
 void gb_cartridge_scene_scene_2_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_scene_2_set_callback(app->gb_cartridge_scene_2, gb_cartridge_scene_2_callback, app);
+    gb_cartridge_scene_2_set_callback(
+        app->gb_cartridge_scene_2, gb_cartridge_scene_2_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdScene2);
 }
 
@@ -21,23 +22,23 @@ bool gb_cartridge_scene_scene_2_on_event(void* context, SceneManagerEvent event)
 
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventScene2Left:
-            case GBCartridgeCustomEventScene2Right:
-                break;
-            case GBCartridgeCustomEventScene2Up:
-            case GBCartridgeCustomEventScene2Down:
-                break;
-            case GBCartridgeCustomEventScene2Back:
-                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, GBCartridgeSceneMenu)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+        case GBCartridgeCustomEventScene2Left:
+        case GBCartridgeCustomEventScene2Right:
+            break;
+        case GBCartridgeCustomEventScene2Up:
+        case GBCartridgeCustomEventScene2Down:
+            break;
+        case GBCartridgeCustomEventScene2Back:
+            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, GBCartridgeSceneMenu)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
 
@@ -48,4 +49,3 @@ void gb_cartridge_scene_scene_2_on_exit(void* context) {
     GBCartridge* app = context;
     UNUSED(app);
 }
-

+ 20 - 21
scenes/gb_cartridge_scene_scene_3.c

@@ -11,7 +11,8 @@ void gb_cartridge_scene_3_callback(GBCartridgeCustomEvent event, void* context)
 void gb_cartridge_scene_scene_3_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_scene_3_set_callback(app->gb_cartridge_scene_3, gb_cartridge_scene_3_callback, app);
+    gb_cartridge_scene_3_set_callback(
+        app->gb_cartridge_scene_3, gb_cartridge_scene_3_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdScene3);
 }
 
@@ -21,23 +22,23 @@ bool gb_cartridge_scene_scene_3_on_event(void* context, SceneManagerEvent event)
 
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventScene3Left:
-            case GBCartridgeCustomEventScene3Right:
-                break;
-            case GBCartridgeCustomEventScene3Up:
-            case GBCartridgeCustomEventScene3Down:
-                break;
-            case GBCartridgeCustomEventScene3Back:
-                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, GBCartridgeSceneMenu)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+        case GBCartridgeCustomEventScene3Left:
+        case GBCartridgeCustomEventScene3Right:
+            break;
+        case GBCartridgeCustomEventScene3Up:
+        case GBCartridgeCustomEventScene3Down:
+            break;
+        case GBCartridgeCustomEventScene3Back:
+            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, GBCartridgeSceneMenu)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
 
@@ -50,10 +51,8 @@ void gb_cartridge_scene_scene_3_on_exit(void* context) {
     //  with_view_model(
     //     app->gb_cartridge_scene_3->view,
     //     GameBoyCartridgeRAMBackupModel * model,
-    //     {   
-
+    //     {
 
     //     },false);
     UNUSED(app);
 }
-

+ 19 - 19
scenes/gb_cartridge_scene_scene_4.c

@@ -11,7 +11,8 @@ void gb_cartridge_scene_4_callback(GBCartridgeCustomEvent event, void* context)
 void gb_cartridge_scene_scene_4_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_scene_4_set_callback(app->gb_cartridge_scene_4, gb_cartridge_scene_4_callback, app);
+    gb_cartridge_scene_4_set_callback(
+        app->gb_cartridge_scene_4, gb_cartridge_scene_4_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdScene4);
 }
 
@@ -21,23 +22,23 @@ bool gb_cartridge_scene_scene_4_on_event(void* context, SceneManagerEvent event)
 
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventScene4Left:
-            case GBCartridgeCustomEventScene4Right:
-                break;
-            case GBCartridgeCustomEventScene4Up:
-            case GBCartridgeCustomEventScene4Down:
-                break;
-            case GBCartridgeCustomEventScene4Back:
-                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, GBCartridgeSceneMenu)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+        case GBCartridgeCustomEventScene4Left:
+        case GBCartridgeCustomEventScene4Right:
+            break;
+        case GBCartridgeCustomEventScene4Up:
+        case GBCartridgeCustomEventScene4Down:
+            break;
+        case GBCartridgeCustomEventScene4Back:
+            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, GBCartridgeSceneMenu)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
 
@@ -48,4 +49,3 @@ void gb_cartridge_scene_scene_4_on_exit(void* context) {
     GBCartridge* app = context;
     UNUSED(app);
 }
-

+ 19 - 19
scenes/gb_cartridge_scene_scene_5.c

@@ -11,7 +11,8 @@ void gb_cartridge_scene_5_callback(GBCartridgeCustomEvent event, void* context)
 void gb_cartridge_scene_scene_5_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_scene_5_set_callback(app->gb_cartridge_scene_5, gb_cartridge_scene_5_callback, app);
+    gb_cartridge_scene_5_set_callback(
+        app->gb_cartridge_scene_5, gb_cartridge_scene_5_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdScene5);
 }
 
@@ -21,23 +22,23 @@ bool gb_cartridge_scene_scene_5_on_event(void* context, SceneManagerEvent event)
 
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventScene5Left:
-            case GBCartridgeCustomEventScene5Right:
-                break;
-            case GBCartridgeCustomEventScene5Up:
-            case GBCartridgeCustomEventScene5Down:
-                break;
-            case GBCartridgeCustomEventScene5Back:
-                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, GBCartridgeSceneMenu)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+        case GBCartridgeCustomEventScene5Left:
+        case GBCartridgeCustomEventScene5Right:
+            break;
+        case GBCartridgeCustomEventScene5Up:
+        case GBCartridgeCustomEventScene5Down:
+            break;
+        case GBCartridgeCustomEventScene5Back:
+            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, GBCartridgeSceneMenu)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
 
@@ -48,4 +49,3 @@ void gb_cartridge_scene_scene_5_on_exit(void* context) {
     GBCartridge* app = context;
     UNUSED(app);
 }
-

+ 4 - 18
scenes/gb_cartridge_scene_settings.c

@@ -43,7 +43,6 @@ const uint32_t settings_value[2] = {
     GBCartridgeSettingsOn,
 };
 
-
 static void gb_cartridge_scene_settings_set_haptic(VariableItem* item) {
     GBCartridge* app = variable_item_get_context(item);
     uint8_t index = variable_item_get_current_value_index(item);
@@ -85,33 +84,21 @@ void gb_cartridge_scene_settings_on_enter(void* context) {
 
     // Vibro on/off
     item = variable_item_list_add(
-        app->variable_item_list,
-        "Vibro/Haptic:",
-        2,
-        gb_cartridge_scene_settings_set_haptic,
-        app);
+        app->variable_item_list, "Vibro/Haptic:", 2, gb_cartridge_scene_settings_set_haptic, app);
     value_index = value_index_uint32(app->haptic, haptic_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, haptic_text[value_index]);
 
     // Sound on/off
     item = variable_item_list_add(
-        app->variable_item_list,
-        "Sound:",
-        2,
-        gb_cartridge_scene_settings_set_speaker,
-        app);
+        app->variable_item_list, "Sound:", 2, gb_cartridge_scene_settings_set_speaker, app);
     value_index = value_index_uint32(app->speaker, speaker_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, speaker_text[value_index]);
 
     // LED Effects on/off
     item = variable_item_list_add(
-        app->variable_item_list,
-        "LED FX:",
-        2,
-        gb_cartridge_scene_settings_set_led,
-        app);
+        app->variable_item_list, "LED FX:", 2, gb_cartridge_scene_settings_set_led, app);
     value_index = value_index_uint32(app->led, led_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, led_text[value_index]);
@@ -126,7 +113,7 @@ void gb_cartridge_scene_settings_on_enter(void* context) {
     value_index = value_index_uint32(app->save_settings, settings_value, 2);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, settings_text[value_index]);
-    
+
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdSettings);
 }
 
@@ -135,7 +122,6 @@ bool gb_cartridge_scene_settings_on_event(void* context, SceneManagerEvent event
     UNUSED(app);
     bool consumed = false;
     if(event.type == SceneManagerEventTypeCustom) {
-        
     }
     return consumed;
 }

+ 25 - 24
scenes/gb_cartridge_scene_startscreen.c

@@ -11,40 +11,41 @@ void gb_cartridge_scene_startscreen_callback(GBCartridgeCustomEvent event, void*
 void gb_cartridge_scene_startscreen_on_enter(void* context) {
     furi_assert(context);
     GBCartridge* app = context;
-    gb_cartridge_startscreen_set_callback(app->gb_cartridge_startscreen, gb_cartridge_scene_startscreen_callback, app);
+    gb_cartridge_startscreen_set_callback(
+        app->gb_cartridge_startscreen, gb_cartridge_scene_startscreen_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdStartscreen);
 }
 
 bool gb_cartridge_scene_startscreen_on_event(void* context, SceneManagerEvent event) {
     GBCartridge* app = context;
     bool consumed = false;
-    
+
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
-            case GBCartridgeCustomEventStartscreenLeft:
-            case GBCartridgeCustomEventStartscreenRight:
-                break;
-            case GBCartridgeCustomEventStartscreenUp:
-            case GBCartridgeCustomEventStartscreenDown:
-                break;
-            case GBCartridgeCustomEventStartscreenOk:
-                scene_manager_next_scene(app->scene_manager, GBCartridgeSceneMenu);
-                consumed = true;
-                break;
-            case GBCartridgeCustomEventStartscreenBack:
-                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, GBCartridgeSceneStartscreen)) {
-                        scene_manager_stop(app->scene_manager);
-                        view_dispatcher_stop(app->view_dispatcher);
-                    }
-                consumed = true;
-                break;
+        case GBCartridgeCustomEventStartscreenLeft:
+        case GBCartridgeCustomEventStartscreenRight:
+            break;
+        case GBCartridgeCustomEventStartscreenUp:
+        case GBCartridgeCustomEventStartscreenDown:
+            break;
+        case GBCartridgeCustomEventStartscreenOk:
+            scene_manager_next_scene(app->scene_manager, GBCartridgeSceneMenu);
+            consumed = true;
+            break;
+        case GBCartridgeCustomEventStartscreenBack:
+            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, GBCartridgeSceneStartscreen)) {
+                scene_manager_stop(app->scene_manager);
+                view_dispatcher_stop(app->view_dispatcher);
+            }
+            consumed = true;
+            break;
         }
     }
-    
+
     return consumed;
 }
 

+ 16 - 20
uart.c

@@ -13,7 +13,6 @@ struct Uart {
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
 };
 
-
 typedef enum {
     WorkerEvtStop = (1 << 0),
     WorkerEvtRxDone = (1 << 1),
@@ -32,12 +31,11 @@ void uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
     Uart* uart = (Uart*)context;
 
     if(ev == UartIrqEventRXNE) {
-        furi_stream_buffer_send(uart->rx_stream, &data,  1, 0);
+        furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
     }
 }
 
-
 // Define una constante para el prefijo que estamos buscando
 #define JSON_PREFIX "JSON:"
 
@@ -50,26 +48,25 @@ static bool json_capture_active = false;
 // Prototipo de la función
 // static void process_json_buffer();
 
-
 static void process_json_buffer(void* context) {
     Uart* uart = (Uart*)context;
     // Agregamos el terminador nulo al final del buffer
     json_buffer[json_buffer_index] = '\0';
-    if (uart->handle_rx_data_cb) {
-        uart->handle_rx_data_cb((uint8_t *)json_buffer, json_buffer_index, uart->app);
+    if(uart->handle_rx_data_cb) {
+        uart->handle_rx_data_cb((uint8_t*)json_buffer, json_buffer_index, uart->app);
         memset(json_buffer, 0, sizeof(json_buffer));
     }
-    
+
     // Reiniciamos el buffer
     json_buffer_index = 0;
 }
 
 static void uart_echo_push_to_list(void* context, uint8_t data) {
     Uart* uart = (Uart*)context;
-    if (!json_capture_active) {
-        if (data == JSON_PREFIX[json_buffer_index]) {
+    if(!json_capture_active) {
+        if(data == JSON_PREFIX[json_buffer_index]) {
             json_buffer[json_buffer_index++] = data; // Agregar el carácter al buffer
-            if (json_buffer_index == strlen(JSON_PREFIX)) {
+            if(json_buffer_index == strlen(JSON_PREFIX)) {
                 // Encontramos el prefijo, comenzamos a capturar
                 json_buffer_index = 0;
                 json_capture_active = true;
@@ -81,7 +78,7 @@ static void uart_echo_push_to_list(void* context, uint8_t data) {
     } else {
         // Capturamos caracteres hasta encontrar '\n'
         json_buffer[json_buffer_index++] = data;
-        if (data == '\n') {
+        if(data == '\n') {
             // Terminamos de capturar la línea, procesamos el buffer
             json_capture_active = false;
             process_json_buffer(uart);
@@ -93,7 +90,8 @@ static int32_t uart_worker(void* context) {
     Uart* uart = (Uart*)context;
 
     while(1) {
-        uint32_t events = furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
+        uint32_t events =
+            furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
         furi_check((events & FuriFlagError) == 0);
 
         if(events & WorkerEvtStop) break;
@@ -103,21 +101,20 @@ static int32_t uart_worker(void* context) {
                 do {
                     uint8_t data[64];
                     length = furi_stream_buffer_receive(uart->rx_stream, data, 64, 0);
-                    
+
                     if(length > 0) {
-                        
                         for(size_t i = 0; i < length; i++) {
                             uart_echo_push_to_list(uart, data[i]);
                             // FURI_LOG_I("UART", "[in]: %c - %d", (const char)data[i], data[i]);
                         }
-
-                        
                     }
                 } while(length > 0);
             } else if(uart->channel == LP_UART_CH) {
-                size_t len = furi_stream_buffer_receive(uart->rx_stream, uart->rx_buf, RX_BUF_SIZE, 0);
+                size_t len =
+                    furi_stream_buffer_receive(uart->rx_stream, uart->rx_buf, RX_BUF_SIZE, 0);
                 if(len > 0) {
-                    if(uart->handle_rx_data_cb) uart->handle_rx_data_cb(uart->rx_buf, len, uart->app);
+                    if(uart->handle_rx_data_cb)
+                        uart->handle_rx_data_cb(uart->rx_buf, len, uart->app);
                 }
             }
         }
@@ -135,8 +132,7 @@ void lp_uart_tx(uint8_t* data, size_t len) {
     furi_hal_uart_tx(LP_UART_CH, data, len);
 }
 
-Uart*
-    _uart_init(void* app, FuriHalUartId channel, const char* thread_name) {
+Uart* _uart_init(void* app, FuriHalUartId channel, const char* thread_name) {
     Uart* uart = (Uart*)malloc(sizeof(Uart));
 
     uart->app = app;

+ 3 - 2
uart.h

@@ -5,12 +5,13 @@
 
 #include "furi_hal.h"
 
-
 #define RX_BUF_SIZE (1024)
 
 typedef struct Uart Uart;
 
-void uart_set_handle_rx_data_cb(Uart* uart, void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
+void uart_set_handle_rx_data_cb(
+    Uart* uart,
+    void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
 void uart_tx(uint8_t* data, size_t len);
 void lp_uart_tx(uint8_t* data, size_t len);
 Uart* usart_init(void* app);

+ 126 - 150
views/gb_cartridge_scene_1.c

@@ -4,8 +4,8 @@
 #include <input/input.h>
 #include <gui/elements.h>
 #include <dolphin/dolphin.h>
-#include <stdio.h>   // Para sprintf
-#include <string.h>  // Para strlen
+#include <stdio.h> // Para sprintf
+#include <string.h> // Para strlen
 
 struct GBCartridgeScene1 {
     View* view;
@@ -14,7 +14,7 @@ struct GBCartridgeScene1 {
     GBCartridge* app;
 };
 
-typedef struct  {
+typedef struct {
     char* cart_title;
     char* cart_serial;
     char* cart_checksum;
@@ -24,12 +24,10 @@ typedef struct  {
     bool cart_gb_sgb;
     int ramBanks;
     int romBanks;
-    uint8_t cart_logo[48*8];
+    uint8_t cart_logo[48 * 8];
 
 } GameBoyCartridgeModel;
 
-
-
 void gameboy_information_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
     furi_assert(context);
     UNUSED(len);
@@ -41,64 +39,57 @@ void gameboy_information_handle_rx_data_cb(uint8_t* buf, size_t len, void* conte
         GameBoyCartridgeModel * model,
         {
             cJSON* json = cJSON_Parse((char*)buf);
-            if (json == NULL) {
+            if(json == NULL) {
                 model->cart_title = "Parse error";
-            } else {;
+            } else {
+                ;
                 //  Title
-                cJSON* title =  cJSON_GetObjectItemCaseSensitive(json, "title");
-                if (cJSON_IsString(title) && (title->valuestring != NULL))
-                {
+                cJSON* title = cJSON_GetObjectItemCaseSensitive(json, "title");
+                if(cJSON_IsString(title) && (title->valuestring != NULL)) {
                     model->cart_title = strdup(title->valuestring);
-                    
+
                 } else {
                     model->cart_title = "None";
                 }
                 //  Serial
-                cJSON* serial =  cJSON_GetObjectItemCaseSensitive(json, "serial");
-                if (cJSON_IsString(serial) && (serial->valuestring != NULL))
-                {
+                cJSON* serial = cJSON_GetObjectItemCaseSensitive(json, "serial");
+                if(cJSON_IsString(serial) && (serial->valuestring != NULL)) {
                     model->cart_serial = strdup(serial->valuestring);
                 } else {
                     model->cart_serial = "";
-                }                
+                }
                 //  Checksum
-                cJSON* checksum =  cJSON_GetObjectItemCaseSensitive(json, "checksum");
-                if (cJSON_IsString(checksum) && (checksum->valuestring != NULL))
-                {
+                cJSON* checksum = cJSON_GetObjectItemCaseSensitive(json, "checksum");
+                if(cJSON_IsString(checksum) && (checksum->valuestring != NULL)) {
                     model->cart_checksum = strdup(checksum->valuestring);
                 } else {
                     model->cart_checksum = "None";
                 }
                 //  ROMSize
-                cJSON* ROMSize =  cJSON_GetObjectItemCaseSensitive(json, "ROMSize");
-                if (cJSON_IsString(ROMSize) && (ROMSize->valuestring != NULL))
-                {
+                cJSON* ROMSize = cJSON_GetObjectItemCaseSensitive(json, "ROMSize");
+                if(cJSON_IsString(ROMSize) && (ROMSize->valuestring != NULL)) {
                     model->cart_ROMSize = strdup(ROMSize->valuestring);
                 } else {
                     model->cart_ROMSize = "None";
                 }
                 //  RAMSize
-                cJSON* RAMSize =  cJSON_GetObjectItemCaseSensitive(json, "RAMSize");
-                if (cJSON_IsString(RAMSize) && (RAMSize->valuestring != NULL))
-                {
+                cJSON* RAMSize = cJSON_GetObjectItemCaseSensitive(json, "RAMSize");
+                if(cJSON_IsString(RAMSize) && (RAMSize->valuestring != NULL)) {
                     model->cart_RAMSize = strdup(RAMSize->valuestring);
                 } else {
                     model->cart_RAMSize = "None";
                 }
                 //  GB Type
-                cJSON* gb_type =  cJSON_GetObjectItemCaseSensitive(json, "gb_type");
-                if (cJSON_IsString(gb_type) && (gb_type->valuestring != NULL))
-                {
+                cJSON* gb_type = cJSON_GetObjectItemCaseSensitive(json, "gb_type");
+                if(cJSON_IsString(gb_type) && (gb_type->valuestring != NULL)) {
                     model->cart_gb_type = strdup(gb_type->valuestring);
                 } else {
                     model->cart_gb_type = "dump";
                 }
 
-                
                 //  SGB ?
-                cJSON* gb_sgb =  cJSON_GetObjectItemCaseSensitive(json, "gb_sgb");
-                if (cJSON_IsBool(gb_sgb))
-                {
+                cJSON* gb_sgb = cJSON_GetObjectItemCaseSensitive(json, "gb_sgb");
+                if(cJSON_IsBool(gb_sgb)) {
                     model->cart_gb_sgb = cJSON_IsTrue(gb_sgb);
                 } else {
                     model->cart_gb_sgb = false;
@@ -120,14 +111,12 @@ void gameboy_information_handle_rx_data_cb(uint8_t* buf, size_t len, void* conte
                     model->ramBanks = 0;
                 }
 
-
-
-                cJSON* gb_logo =  cJSON_GetObjectItemCaseSensitive(json, "logo");
-                if (cJSON_IsArray(gb_logo)) {
+                cJSON* gb_logo = cJSON_GetObjectItemCaseSensitive(json, "logo");
+                if(cJSON_IsArray(gb_logo)) {
                     // Leer los elementos del arreglo "logo"
-                    for (int i = 0; i < cJSON_GetArraySize(gb_logo); i++) {
-                        cJSON *logoElement = cJSON_GetArrayItem(gb_logo, i);
-                        if (cJSON_IsNumber(logoElement)) {
+                    for(int i = 0; i < cJSON_GetArraySize(gb_logo); i++) {
+                        cJSON* logoElement = cJSON_GetArrayItem(gb_logo, i);
+                        if(cJSON_IsNumber(logoElement)) {
                             model->cart_logo[i] = logoElement->valueint;
                         }
                     }
@@ -136,7 +125,7 @@ void gameboy_information_handle_rx_data_cb(uint8_t* buf, size_t len, void* conte
                 FuriString* path = furi_string_alloc();
                 //  int buffer_size = strlen(model->cart_title) + strlen(model->cart_serial) + strlen(model->cart_gb_type) + 3; // 3 para los guiones bajos y el punto
                 // char filename[255];
-                if (strcmp(model->cart_serial, "") == 0) {
+                if(strcmp(model->cart_serial, "") == 0) {
                     furi_string_cat_printf(path, "%s", model->cart_title);
                 } else {
                     furi_string_cat_printf(path, "%s_%s", model->cart_title, model->cart_serial);
@@ -150,9 +139,9 @@ void gameboy_information_handle_rx_data_cb(uint8_t* buf, size_t len, void* conte
 
                 instance->rom_banks = model->romBanks;
                 instance->ram_banks = model->ramBanks;
-                
             }
-        },true);
+        },
+        true);
 }
 void gb_cartridge_scene_1_set_callback(
     GBCartridgeScene1* instance,
@@ -168,71 +157,71 @@ void gb_cartridge_scene_1_set_callback(
 //  https://www.youtube.com/watch?v=ix5yZm4fwFQ
 void draw_logo(Canvas* canvas, GameBoyCartridgeModel* model, int start_x, int start_y) {
     uint16_t x, y;
-    uint8_t row[4];  
-    uint8_t list[48*8] = {0};
-    for (x = 0; x < 48/2; x += 2) {
+    uint8_t row[4];
+    uint8_t list[48 * 8] = {0};
+    for(x = 0; x < 48 / 2; x += 2) {
         row[0] = (model->cart_logo[x] >> 4) & 0xF;
         row[1] = model->cart_logo[x] & 0xF;
         row[2] = (model->cart_logo[x + 1] >> 4) & 0xF;
         row[3] = model->cart_logo[x + 1] & 0xF;
-        for (y = 0; y < 4; y++) {
+        for(y = 0; y < 4; y++) {
             // set first bit
-            if ((row[y] / 8) == 1) {
-                list[(x*2) + (y * 48)] = 1;
+            if((row[y] / 8) == 1) {
+                list[(x * 2) + (y * 48)] = 1;
                 row[y] -= 8;
             }
             // then second bit
-            if ((row[y] / 4) == 1) {
-                list[((x*2) + 1) + (y * 48)] = 1;
+            if((row[y] / 4) == 1) {
+                list[((x * 2) + 1) + (y * 48)] = 1;
                 row[y] -= 4;
             }
             // then third bit
-            if ((row[y] / 2) == 1) {
-                list[((x*2) + 2) + (y * 48)] = 1;
+            if((row[y] / 2) == 1) {
+                list[((x * 2) + 2) + (y * 48)] = 1;
                 row[y] -= 2;
             }
             // then fourth bit
-            if ((row[y] / 1) == 1) {
-                list[((x*2) + 3) + (y * 48)] = 1;
+            if((row[y] / 1) == 1) {
+                list[((x * 2) + 3) + (y * 48)] = 1;
             }
         }
     }
-    
+
     // then do bottom half
-    for (x = 48/2; x < 96/2; x += 2) {
+    for(x = 48 / 2; x < 96 / 2; x += 2) {
         // convert 2 bytes of data
         row[0] = (model->cart_logo[x] >> 4) & 0xF;
         row[1] = model->cart_logo[x] & 0xF;
         row[2] = (model->cart_logo[x + 1] >> 4) & 0xF;
         row[3] = model->cart_logo[x + 1] & 0xF;
-        
-        for (y = 0; y < 4; y++) {
+
+        for(y = 0; y < 4; y++) {
             // set first bit
-            if ((row[y] / 8) == 1) {
-                list[144 + (x*2) + (y * 48)] = 1;
+            if((row[y] / 8) == 1) {
+                list[144 + (x * 2) + (y * 48)] = 1;
                 row[y] -= 8;
             }
             // then second bit
-            if ((row[y] / 4) == 1) {
-                list[145 + (x*2) + (y * 48)] = 1;
+            if((row[y] / 4) == 1) {
+                list[145 + (x * 2) + (y * 48)] = 1;
                 row[y] -= 4;
             }
             // then third bit
-            if ((row[y] / 2) == 1) {
-                list[146 + (x*2) + (y * 48)] = 1;
+            if((row[y] / 2) == 1) {
+                list[146 + (x * 2) + (y * 48)] = 1;
                 row[y] -= 2;
             }
             // then fourth bit
-            if ((row[y] / 1) == 1) {
-                list[147 + (x*2) + (y * 48)] = 1;
+            if((row[y] / 1) == 1) {
+                list[147 + (x * 2) + (y * 48)] = 1;
             }
         }
     }
     // UNUSED(row);
-    
+
     //  ESCALA 1
-    for (y = 0; y < 8; y++) {
-        for (x = 0; x < 48; x++) {
+    for(y = 0; y < 8; y++) {
+        for(x = 0; x < 48; x++) {
             int indice = y * 48 + x;
             if(list[indice] == 1) {
                 canvas_draw_dot(canvas, x + start_x, y + start_y);
@@ -245,10 +234,10 @@ void gb_cartridge_scene_1_draw(Canvas* canvas, GameBoyCartridgeModel* model) {
     canvas_clear(canvas);
     // canvas_set_color(canvas, ColorBlack);
     // canvas_set_font(canvas, FontPrimary);
-    // canvas_draw_str_aligned(canvas, 0, 10, AlignLeft, AlignTop, "This is Scene 1"); 
+    // canvas_draw_str_aligned(canvas, 0, 10, AlignLeft, AlignTop, "This is Scene 1");
     // canvas_set_font(canvas, FontSecondary);
-    // canvas_draw_str_aligned(canvas, 0, 22, AlignLeft, AlignTop, "An empty scene to be"); 
-    // canvas_draw_str_aligned(canvas, 0, 32, AlignLeft, AlignTop, "used as boilerplate"); 
+    // canvas_draw_str_aligned(canvas, 0, 22, AlignLeft, AlignTop, "An empty scene to be");
+    // canvas_draw_str_aligned(canvas, 0, 32, AlignLeft, AlignTop, "used as boilerplate");
     // Clear the screen.
     canvas_set_color(canvas, ColorBlack);
 
@@ -260,26 +249,26 @@ void gb_cartridge_scene_1_draw(Canvas* canvas, GameBoyCartridgeModel* model) {
     canvas_draw_str(canvas, 2, 20, "Game Code / REV");
     canvas_set_font(canvas, FontPrimary);
     // canvas_draw_str(canvas, 87, 20, "APSS-0");  //  serial
-    canvas_draw_str_aligned(canvas, 126, 20,  AlignRight, AlignBottom, model->cart_serial);
+    canvas_draw_str_aligned(canvas, 126, 20, AlignRight, AlignBottom, model->cart_serial);
     canvas_set_font(canvas, FontSecondary);
-    canvas_draw_str(canvas, 2, 30, "Boot Logo");    
+    canvas_draw_str(canvas, 2, 30, "Boot Logo");
     // canvas_draw_box(canvas, 78, 22, 48, 8); //  TODO: Implementar
     draw_logo(canvas, model, 78, 22);
     canvas_set_font(canvas, FontSecondary);
-    canvas_draw_str(canvas, 2, 40, "ROM Checksum"); 
+    canvas_draw_str(canvas, 2, 40, "ROM Checksum");
     canvas_set_font(canvas, FontPrimary);
     // canvas_draw_str(canvas, 87, 40, "0X04C7"); //  checksum
-    canvas_draw_str_aligned(canvas, 126, 39,  AlignRight, AlignBottom, model->cart_checksum);
+    canvas_draw_str_aligned(canvas, 126, 39, AlignRight, AlignBottom, model->cart_checksum);
     canvas_set_font(canvas, FontSecondary);
     canvas_draw_str(canvas, 2, 50, "ROM Size");
     canvas_set_font(canvas, FontPrimary);
     // canvas_draw_str(canvas, 98, 49, "1 MiB"); //  ROMSize
-    canvas_draw_str_aligned(canvas, 126, 49,  AlignRight, AlignBottom, model->cart_ROMSize);
+    canvas_draw_str_aligned(canvas, 126, 49, AlignRight, AlignBottom, model->cart_ROMSize);
     canvas_set_font(canvas, FontSecondary);
     canvas_draw_str(canvas, 2, 60, "Save Type");
     canvas_set_font(canvas, FontPrimary);
     // canvas_draw_str(canvas, 63, 60, "SRAM 32KiB"); //  RAMSize
-    canvas_draw_str_aligned(canvas, 126, 59,  AlignRight, AlignBottom, model->cart_RAMSize);
+    canvas_draw_str_aligned(canvas, 126, 59, AlignRight, AlignBottom, model->cart_RAMSize);
 }
 
 static void gb_cartridge_scene_1_model_init(GameBoyCartridgeModel* const model) {
@@ -296,67 +285,65 @@ static void gb_cartridge_scene_1_model_init(GameBoyCartridgeModel* const model)
     model->cart_RAMSize = "";
     model->cart_gb_type = "";
     model->cart_gb_sgb = false;
-    for (int i = 0; i < 48*8; i++) {
+    for(int i = 0; i < 48 * 8; i++) {
         model->cart_logo[i] = 0;
     }
 }
 
 bool gb_cartridge_scene_1_input(InputEvent* event, void* context) {
-    furi_assert(context); 
+    furi_assert(context);
     GBCartridgeScene1* instance = context;
     bool consumed = false;
-    if (event->type == InputTypeRelease) {
+    if(event->type == InputTypeRelease) {
         switch(event->key) {
-            case InputKeyBack:
-                // with_view_model(
-                //     instance->view,
-                //     GameBoyCartridgeModel * model,
-                //     {
-                //         UNUSED(model);
-                //         instance->callback(GBCartridgeCustomEventScene1Back, instance->context);
-                //     },
-                //     true);
-                consumed = true;
-                break;
-            case InputKeyOk:
+        case InputKeyBack:
+            // with_view_model(
+            //     instance->view,
+            //     GameBoyCartridgeModel * model,
+            //     {
+            //         UNUSED(model);
+            //         instance->callback(GBCartridgeCustomEventScene1Back, instance->context);
+            //     },
+            //     true);
+            consumed = true;
+            break;
+        case InputKeyOk:
 
-                with_view_model(
-                    ((GBCartridge*)instance->app)->gb_cartridge_scene_1->view,
-                    GameBoyCartridgeModel * model,
-                    { 
-                        model->cart_title = "Refresh...";
-                        model->cart_serial = "";
-                        model->cart_checksum = "";
-                        model->cart_ROMSize = "";
-                        model->cart_RAMSize = "";
-                        // Reiniciar el array a 0 utilizando un bucle
-                        for (size_t i = 0; i < sizeof(model->cart_logo)/sizeof(model->cart_logo[0]); i++) {
-                            model->cart_logo[i] = 0;
-                        }
-                        // Register callbacks to receive data
-                        uart_set_handle_rx_data_cb(((GBCartridge*)instance->app)->uart, gameboy_information_handle_rx_data_cb); // setup callback for general log rx thread
-                        const char gbcartridge_command[] = "gbcartridge -i\n";
-                        uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
-                    },
-                    true);
-                consumed = true;
-                break;
-            case InputKeyLeft:
-            case InputKeyRight:
-            case InputKeyUp:
-            case InputKeyDown:
-            
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeModel* model,
-                    {
-                        UNUSED(model);
-                    },
-                    true);
-                consumed = true;
-                break;
-            case InputKeyMAX:
-                break;
+            with_view_model(
+                ((GBCartridge*)instance->app)->gb_cartridge_scene_1->view,
+                GameBoyCartridgeModel * model,
+                {
+                    model->cart_title = "Refresh...";
+                    model->cart_serial = "";
+                    model->cart_checksum = "";
+                    model->cart_ROMSize = "";
+                    model->cart_RAMSize = "";
+                    // Reiniciar el array a 0 utilizando un bucle
+                    for(size_t i = 0; i < sizeof(model->cart_logo) / sizeof(model->cart_logo[0]);
+                        i++) {
+                        model->cart_logo[i] = 0;
+                    }
+                    // Register callbacks to receive data
+                    uart_set_handle_rx_data_cb(
+                        ((GBCartridge*)instance->app)->uart,
+                        gameboy_information_handle_rx_data_cb); // setup callback for general log rx thread
+                    const char gbcartridge_command[] = "gbcartridge -i\n";
+                    uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
+                },
+                true);
+            consumed = true;
+            break;
+        case InputKeyLeft:
+        case InputKeyRight:
+        case InputKeyUp:
+        case InputKeyDown:
+
+            with_view_model(
+                instance->view, GameBoyCartridgeModel * model, { UNUSED(model); }, true);
+            consumed = true;
+            break;
+        case InputKeyMAX:
+            break;
         }
     }
     return consumed;
@@ -372,14 +359,13 @@ void gb_cartridge_scene_1_enter(void* context) {
     with_view_model(
         instance->view,
         GameBoyCartridgeModel * model,
-        {
-            gb_cartridge_scene_1_model_init(model);
-        },
-        true
-    );
-    
+        { gb_cartridge_scene_1_model_init(model); },
+        true);
+
     // Register callbacks to receive data
-    uart_set_handle_rx_data_cb(((GBCartridge*)instance->app)->uart, gameboy_information_handle_rx_data_cb); // setup callback for general log rx thread
+    uart_set_handle_rx_data_cb(
+        ((GBCartridge*)instance->app)->uart,
+        gameboy_information_handle_rx_data_cb); // setup callback for general log rx thread
     const char gbcartridge_command[] = "gbcartridge -i\n";
     uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
 }
@@ -397,12 +383,8 @@ GBCartridgeScene1* gb_cartridge_scene_1_alloc() {
     with_view_model(
         instance->view,
         GameBoyCartridgeModel * model,
-        {
-            gb_cartridge_scene_1_model_init(model);
-        },
-        true
-    );
-    
+        { gb_cartridge_scene_1_model_init(model); },
+        true);
 
     return instance;
 }
@@ -411,12 +393,7 @@ void gb_cartridge_scene_1_free(GBCartridgeScene1* instance) {
     furi_assert(instance);
 
     with_view_model(
-        instance->view,
-        GameBoyCartridgeModel * model,
-        {
-            UNUSED(model);
-        },
-        true);
+        instance->view, GameBoyCartridgeModel * model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }
@@ -425,4 +402,3 @@ View* gb_cartridge_scene_1_get_view(GBCartridgeScene1* instance) {
     furi_assert(instance);
     return instance->view;
 }
-

+ 0 - 3
views/gb_cartridge_scene_1.h

@@ -3,13 +3,10 @@
 #include <gui/view.h>
 #include "../helpers/gb_cartridge_custom_event.h"
 
-
 typedef struct GBCartridgeScene1 GBCartridgeScene1;
 
 typedef void (*GBCartridgeScene1Callback)(GBCartridgeCustomEvent event, void* context);
 
-
-
 void gb_cartridge_scene_1_set_callback(
     GBCartridgeScene1* gb_cartridge_scene_1,
     GBCartridgeScene1Callback callback,

+ 114 - 94
views/gb_cartridge_scene_2.c

@@ -8,8 +8,8 @@
 #include <notification/notification_messages.h>
 #include "../helpers/gb_cartridge_speaker.h"
 #include "../helpers/sequential_file.h"
-#include <stdio.h>   // Para sprintf
-#include <string.h>  // Para strlen
+#include <stdio.h> // Para sprintf
+#include <string.h> // Para strlen
 
 struct GBCartridgeScene2 {
     View* view;
@@ -43,11 +43,11 @@ void dump_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
     with_view_model(
         instance->gb_cartridge_scene_2->view,
         GameBoyCartridgeROMBackupModel * model,
-        { 
+        {
             model->transfered += len;
             uint64_t current_time = furi_hal_rtc_get_timestamp();
             model->elapsed_time = current_time - model->start_time;
-            if (current_time - last_toggle_time >= 0.2) {
+            if(current_time - last_toggle_time >= 0.2) {
                 model->rx_active = !model->rx_active;
                 last_toggle_time = current_time;
             }
@@ -109,7 +109,7 @@ void gameboy_rom_backup_handle_rx_data_cb(uint8_t* buf, size_t len, void* contex
                     model->romBanks = 0;
                 }
             }
-            if (strcmp(model->event_type, "success") == 0) {
+            if(strcmp(model->event_type, "success") == 0) {
                 model->progress = 100;
                 // cJSON* total = cJSON_GetObjectItemCaseSensitive(json, "total");
                 // if(cJSON_IsNumber(total)) {
@@ -124,13 +124,15 @@ void gameboy_rom_backup_handle_rx_data_cb(uint8_t* buf, size_t len, void* contex
         true);
 }
 static void drawProgressBar(Canvas* canvas, int progress) {
-    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING -UI_PADDING - UI_PADDING; x += 5) {
+    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5) {
         for(int row = 0; row < 20; row += 5) {
             if(progress > 0) {
-                canvas_draw_box(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_box(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
                 progress--;
             } else {
-                canvas_draw_frame(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_frame(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
             }
         }
     }
@@ -143,7 +145,7 @@ void gb_cartridge_scene_2_draw(Canvas* canvas, GameBoyCartridgeROMBackupModel* m
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_set_font(canvas, FontKeyboard);
-    canvas_draw_frame(canvas, 0, 23, (128/2), 25);
+    canvas_draw_frame(canvas, 0, 23, (128 / 2), 25);
 
     canvas_set_bitmap_mode(canvas, 1);
     canvas_set_font(canvas, FontPrimary);
@@ -156,31 +158,41 @@ void gb_cartridge_scene_2_draw(Canvas* canvas, GameBoyCartridgeROMBackupModel* m
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_set_font(canvas, FontSecondary);
 
-    char *filename = strrchr(model->cart_dump_rom_filename_sequential, '/');
+    char* filename = strrchr(model->cart_dump_rom_filename_sequential, '/');
     filename++;
 
-    canvas_draw_str_aligned(canvas, 128/2, 12, AlignCenter, AlignTop, filename);
+    canvas_draw_str_aligned(canvas, 128 / 2, 12, AlignCenter, AlignTop, filename);
 
     char total_rom_str[20]; // Declarar un buffer para almacenar la versión en cadena del entero
-    snprintf(total_rom_str, sizeof(total_rom_str), "of %.2lf MiB", (double)(model->total_rom / 1024.0 / 1024.0));
+    snprintf(
+        total_rom_str,
+        sizeof(total_rom_str),
+        "of %.2lf MiB",
+        (double)(model->total_rom / 1024.0 / 1024.0));
 
     char transfered_rom_str[20];
-    snprintf(transfered_rom_str, sizeof(transfered_rom_str), "%.2lf MiB", (double)(model->transfered / 1024.0 / 1024.0));
-
+    snprintf(
+        transfered_rom_str,
+        sizeof(transfered_rom_str),
+        "%.2lf MiB",
+        (double)(model->transfered / 1024.0 / 1024.0));
 
     // Calcula la Tasa de Transferencia en KiB/s
     char transfer_rate_str[20];
-    if(model->transfered>0 && model->elapsed_time > 0) {
-        double transfer_rate_kibps = (double)model->transfered / ((double)model->elapsed_time ) / (double)1024.0;
+    if(model->transfered > 0 && model->elapsed_time > 0) {
+        double transfer_rate_kibps =
+            (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
     } else {
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
     }
-    
 
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_rom_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_rom_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_rom_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_rom_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
 
     if(model->rx_active) {
         canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
@@ -191,7 +203,10 @@ void gb_cartridge_scene_2_draw(Canvas* canvas, GameBoyCartridgeROMBackupModel* m
     char totalText[32];
     snprintf(totalText, sizeof(totalText), "%d", model->total_rom);
 
-    drawProgressBar(canvas, (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) / 100); // Pinta las primeras 10 cajas de negro
+    drawProgressBar(
+        canvas,
+        (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) /
+            100); // Pinta las primeras 10 cajas de negro
 
     elements_button_center(canvas, "Start");
 }
@@ -209,66 +224,71 @@ static void gb_cartridge_scene_2_model_init(GameBoyCartridgeROMBackupModel* cons
 bool gb_cartridge_scene_2_input(InputEvent* event, void* context) {
     furi_assert(context);
     GBCartridgeScene2* instance = context;
-    
-    if (event->type == InputTypeRelease) {
+
+    if(event->type == InputTypeRelease) {
         switch(event->key) {
-            case InputKeyBack:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeROMBackupModel * model,
-                    {
-                        UNUSED(model);
-                        GBCartridge* app = (GBCartridge*)instance->context;
-                        UNUSED(app);
-
-                        model->total_rom = 0;
-                        model->transfered = 0;
-                        model->elapsed_time = 0;
-
-                        // // Unregister rx callback
-                        uart_set_handle_rx_data_cb(app->uart, NULL);
-                        uart_set_handle_rx_data_cb(app->lp_uart, NULL);
-                        //  Close file
-                        app->is_writing_rom = false;
-                        if(app->cart_rom && storage_file_is_open(app->cart_rom)) {
-                            storage_file_close(app->cart_rom);
-                        }
-                        notification_message(app->notification, &sequence_display_backlight_enforce_auto);
-                        instance->callback(GBCartridgeCustomEventScene2Back, instance->context);
-                    },
-                    true);
-                break;
-            case InputKeyUp:
-            case InputKeyDown:
-            case InputKeyLeft:
-            case InputKeyRight:
+        case InputKeyBack:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeROMBackupModel * model,
+                {
+                    UNUSED(model);
+                    GBCartridge* app = (GBCartridge*)instance->context;
+                    UNUSED(app);
+
+                    model->total_rom = 0;
+                    model->transfered = 0;
+                    model->elapsed_time = 0;
+
+                    // // Unregister rx callback
+                    uart_set_handle_rx_data_cb(app->uart, NULL);
+                    uart_set_handle_rx_data_cb(app->lp_uart, NULL);
+                    //  Close file
+                    app->is_writing_rom = false;
+                    if(app->cart_rom && storage_file_is_open(app->cart_rom)) {
+                        storage_file_close(app->cart_rom);
+                    }
+                    notification_message(
+                        app->notification, &sequence_display_backlight_enforce_auto);
+                    instance->callback(GBCartridgeCustomEventScene2Back, instance->context);
+                },
+                true);
+            break;
+        case InputKeyUp:
+        case InputKeyDown:
+        case InputKeyLeft:
+        case InputKeyRight:
+            break;
+        case InputKeyOk:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeROMBackupModel * model,
+                {
+                    GBCartridge* app = ((GBCartridge*)instance->context);
+                    UNUSED(app);
+                    model->start_time =
+                        furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
+                    app->cart_rom = storage_file_alloc(app->storage);
+
+                    if(storage_file_open(
+                           app->cart_rom,
+                           model->cart_dump_rom_filename_sequential,
+                           FSAM_WRITE,
+                           FSOM_CREATE_ALWAYS)) {
+                        const char gbcartridge_command[] = "gbcartridge -d -o\n";
+                        uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
+                    } else {
+                        dialog_message_show_storage_error(app->dialogs, "Cannot open dump file");
+                    }
+                },
+                true);
+
             break;
-            case InputKeyOk:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeROMBackupModel * model,
-                    {
-                        GBCartridge* app = ((GBCartridge*)instance->context);
-                        UNUSED(app);
-                        model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
-                        app->cart_rom = storage_file_alloc(app->storage);
-
-                        if(storage_file_open(app->cart_rom, model->cart_dump_rom_filename_sequential, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
-                            const char gbcartridge_command[] = "gbcartridge -d -o\n";
-                            uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
-                        } else {
-                            dialog_message_show_storage_error(app->dialogs, "Cannot open dump file");
-                        }
-                    },
-                    true);
-                    
-                
+        case InputKeyMAX:
             break;
-            case InputKeyMAX:
-                break;
         }
     }
-    
+
     return true;
 }
 
@@ -295,28 +315,33 @@ void gb_cartridge_scene_2_enter(void* context) {
         app->gb_cartridge_scene_2->view,
         GameBoyCartridgeROMBackupModel * model,
         {
-            model->cart_dump_rom_filename  = app->cart_dump_rom_filename;
+            model->cart_dump_rom_filename = app->cart_dump_rom_filename;
             model->cart_dump_rom_extension = app->cart_dump_rom_extension;
-            model->total_rom =  app->rom_banks * 16 * 1024;
+            model->total_rom = app->rom_banks * 16 * 1024;
             // char *filename = strrchr(model->cart_dump_rom_filename_sequential, '/');
             // filename++;
-            char *filename = sequential_file_resolve_path(app->storage, MALVEKE_APP_FOLDER_ROMS, app->cart_dump_rom_filename, model->cart_dump_rom_extension);
-            model->cart_dump_rom_filename_sequential =  filename;
-             // Register callbacks to receive data
-            uart_set_handle_rx_data_cb(app->uart, gameboy_rom_backup_handle_rx_data_cb); // setup callback for general log rx thread
-            uart_set_handle_rx_data_cb(app->lp_uart, dump_handle_rx_data_cb); // setup callback for general log rx thread
+            char* filename = sequential_file_resolve_path(
+                app->storage,
+                MALVEKE_APP_FOLDER_ROMS,
+                app->cart_dump_rom_filename,
+                model->cart_dump_rom_extension);
+            model->cart_dump_rom_filename_sequential = filename;
+            // Register callbacks to receive data
+            uart_set_handle_rx_data_cb(
+                app->uart,
+                gameboy_rom_backup_handle_rx_data_cb); // setup callback for general log rx thread
+            uart_set_handle_rx_data_cb(
+                app->lp_uart, dump_handle_rx_data_cb); // setup callback for general log rx thread
             app->is_writing_rom = true;
         },
         false);
-   
-
-   
 }
 
 GBCartridgeScene2* gb_cartridge_scene_2_alloc() {
     GBCartridgeScene2* instance = malloc(sizeof(GBCartridgeScene2));
     instance->view = view_alloc();
-    view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeROMBackupModel));
+    view_allocate_model(
+        instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeROMBackupModel));
     view_set_context(instance->view, instance);
     view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_2_draw);
     view_set_input_callback(instance->view, gb_cartridge_scene_2_input);
@@ -326,18 +351,15 @@ GBCartridgeScene2* gb_cartridge_scene_2_alloc() {
     with_view_model(
         instance->view,
         GameBoyCartridgeROMBackupModel * model,
-        {
-            gb_cartridge_scene_2_model_init(model);
-        },
+        { gb_cartridge_scene_2_model_init(model); },
         true);
-    
+
     return instance;
 }
 
 void gb_cartridge_scene_2_free(GBCartridgeScene2* instance) {
     furi_assert(instance);
 
-
     view_free(instance->view);
     free(instance);
 }
@@ -345,7 +367,5 @@ void gb_cartridge_scene_2_free(GBCartridgeScene2* instance) {
 View* gb_cartridge_scene_2_get_view(GBCartridgeScene2* instance) {
     furi_assert(instance);
 
-
     return instance->view;
 }
-

+ 1 - 1
views/gb_cartridge_scene_2.h

@@ -10,7 +10,7 @@ typedef void (*GBCartridgeScene2Callback)(GBCartridgeCustomEvent event, void* co
 void gb_cartridge_scene_2_set_callback(
     GBCartridgeScene2* instance,
     GBCartridgeScene2Callback callback,
-    void * context);
+    void* context);
 
 GBCartridgeScene2* gb_cartridge_scene_2_alloc();
 

+ 109 - 92
views/gb_cartridge_scene_3.c

@@ -8,8 +8,8 @@
 #include <notification/notification_messages.h>
 #include "../helpers/gb_cartridge_speaker.h"
 #include "../helpers/sequential_file.h"
-#include <stdio.h>   // Para sprintf
-#include <string.h>  // Para strlen
+#include <stdio.h> // Para sprintf
+#include <string.h> // Para strlen
 
 struct GBCartridgeScene3 {
     View* view;
@@ -59,11 +59,11 @@ void dump_ram_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
     with_view_model(
         instance->gb_cartridge_scene_3->view,
         GameBoyCartridgeRAMBackupModel * model,
-        { 
+        {
             model->transfered += len;
             uint64_t current_time = furi_hal_rtc_get_timestamp();
             model->elapsed_time = current_time - model->start_time;
-            if (current_time - last_toggle_time >= 0.2) {
+            if(current_time - last_toggle_time >= 0.2) {
                 model->rx_active = !model->rx_active;
                 last_toggle_time = current_time;
             }
@@ -121,7 +121,7 @@ void gameboy_ram_backup_handle_rx_data_cb(uint8_t* buf, size_t len, void* contex
                     model->ramBanks = 0;
                 }
             }
-            if (strcmp(model->event_type, "success") == 0) {
+            if(strcmp(model->event_type, "success") == 0) {
                 model->progress = 100;
                 // if(instance->cart_ram && storage_file_is_open(instance->cart_ram)) {
                 //     storage_file_close(instance->cart_ram);
@@ -132,13 +132,15 @@ void gameboy_ram_backup_handle_rx_data_cb(uint8_t* buf, size_t len, void* contex
         true);
 }
 static void drawProgressBar(Canvas* canvas, int progress) {
-    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING -UI_PADDING - UI_PADDING; x += 5) {
+    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5) {
         for(int row = 0; row < 20; row += 5) {
             if(progress > 0) {
-                canvas_draw_box(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_box(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
                 progress--;
             } else {
-                canvas_draw_frame(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_frame(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
             }
         }
     }
@@ -151,7 +153,7 @@ void gb_cartridge_scene_3_draw(Canvas* canvas, GameBoyCartridgeRAMBackupModel* m
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_set_font(canvas, FontKeyboard);
-    canvas_draw_frame(canvas, 0, 23, (128/2), 25);
+    canvas_draw_frame(canvas, 0, 23, (128 / 2), 25);
 
     canvas_set_bitmap_mode(canvas, 1);
     canvas_set_font(canvas, FontPrimary);
@@ -164,30 +166,40 @@ void gb_cartridge_scene_3_draw(Canvas* canvas, GameBoyCartridgeRAMBackupModel* m
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_set_font(canvas, FontSecondary);
 
-    char *filename = strrchr(model->cart_dump_ram_filename_sequential, '/');
+    char* filename = strrchr(model->cart_dump_ram_filename_sequential, '/');
     filename++;
-    canvas_draw_str_aligned(canvas, 128/2, 12, AlignCenter, AlignTop, filename);
+    canvas_draw_str_aligned(canvas, 128 / 2, 12, AlignCenter, AlignTop, filename);
 
     char total_ram_str[20];
-    snprintf(total_ram_str, sizeof(total_ram_str), "of %.2lf MiB", (double)(model->total_ram / 1024.0 / 1024.0));
+    snprintf(
+        total_ram_str,
+        sizeof(total_ram_str),
+        "of %.2lf MiB",
+        (double)(model->total_ram / 1024.0 / 1024.0));
 
     char transfered_ram_str[20];
-    snprintf(transfered_ram_str, sizeof(transfered_ram_str), "%.2lf MiB", (double)(model->transfered / 1024.0 / 1024.0));
-
+    snprintf(
+        transfered_ram_str,
+        sizeof(transfered_ram_str),
+        "%.2lf MiB",
+        (double)(model->transfered / 1024.0 / 1024.0));
 
     // Calcula la Tasa de Transferencia en KiB/s
     char transfer_rate_str[20];
-    if(model->transfered>0 && model->elapsed_time > 0) {
-        double transfer_rate_kibps = (double)model->transfered / ((double)model->elapsed_time ) / (double)1024.0;
+    if(model->transfered > 0 && model->elapsed_time > 0) {
+        double transfer_rate_kibps =
+            (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
     } else {
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
     }
-    
 
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
 
     if(model->rx_active) {
         canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
@@ -199,7 +211,10 @@ void gb_cartridge_scene_3_draw(Canvas* canvas, GameBoyCartridgeRAMBackupModel* m
     snprintf(totalText, sizeof(totalText), "%d", model->total_ram);
     // canvas_draw_str(canvas, 69, 38, totalText);
 
-    drawProgressBar(canvas, (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) / 100); // Pinta las primeras 10 cajas de negro
+    drawProgressBar(
+        canvas,
+        (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) /
+            100); // Pinta las primeras 10 cajas de negro
     // free(totalText);
 
     elements_button_center(canvas, "Start");
@@ -217,63 +232,66 @@ static void gb_cartridge_scene_3_model_init(GameBoyCartridgeRAMBackupModel* cons
 bool gb_cartridge_scene_3_input(InputEvent* event, void* context) {
     furi_assert(context);
     GBCartridgeScene3* instance = context;
-    
-    
-    if (event->type == InputTypeRelease) {
+
+    if(event->type == InputTypeRelease) {
         switch(event->key) {
-            case InputKeyBack:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeRAMBackupModel * model,
-                    {
-                        UNUSED(model);
-                        GBCartridge* app = (GBCartridge*)instance->context;
-                        UNUSED(app);
-                        model->total_ram = 0;
-                        model->transfered = 0;
-                        model->elapsed_time = 0;
-                        // Unregister rx callback
-                        uart_set_handle_rx_data_cb(app->uart, NULL);
-                        uart_set_handle_rx_data_cb(app->lp_uart, NULL);
-
-                        app->is_writing_ram = false;
-                        if(app->cart_ram && storage_file_is_open(app->cart_ram)) {
-                            storage_file_close(app->cart_ram);
-                        }
-                        instance->callback(GBCartridgeCustomEventScene3Back, instance->context);
-                    },
-                    true);
-                break;
-            case InputKeyUp:
-            case InputKeyDown:
-            case InputKeyLeft:
-            case InputKeyRight:
+        case InputKeyBack:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeRAMBackupModel * model,
+                {
+                    UNUSED(model);
+                    GBCartridge* app = (GBCartridge*)instance->context;
+                    UNUSED(app);
+                    model->total_ram = 0;
+                    model->transfered = 0;
+                    model->elapsed_time = 0;
+                    // Unregister rx callback
+                    uart_set_handle_rx_data_cb(app->uart, NULL);
+                    uart_set_handle_rx_data_cb(app->lp_uart, NULL);
+
+                    app->is_writing_ram = false;
+                    if(app->cart_ram && storage_file_is_open(app->cart_ram)) {
+                        storage_file_close(app->cart_ram);
+                    }
+                    instance->callback(GBCartridgeCustomEventScene3Back, instance->context);
+                },
+                true);
             break;
-            case InputKeyOk:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeRAMBackupModel * model,
-                    {
-                        GBCartridge* app = ((GBCartridge*)instance->context);
-                        UNUSED(app);
-                        model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
-                        app->cart_ram = storage_file_alloc(app->storage);
-
-                        
-                        if(storage_file_open(app->cart_ram, model->cart_dump_ram_filename_sequential, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
-                            const char gbcartridge_command[] = "gbcartridge -d -a\n";
-                            uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
-                        } else {
-                            dialog_message_show_storage_error(app->dialogs, "Cannot open dump file");
-                        }
-                    },
-                    true);
+        case InputKeyUp:
+        case InputKeyDown:
+        case InputKeyLeft:
+        case InputKeyRight:
+            break;
+        case InputKeyOk:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeRAMBackupModel * model,
+                {
+                    GBCartridge* app = ((GBCartridge*)instance->context);
+                    UNUSED(app);
+                    model->start_time =
+                        furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
+                    app->cart_ram = storage_file_alloc(app->storage);
+
+                    if(storage_file_open(
+                           app->cart_ram,
+                           model->cart_dump_ram_filename_sequential,
+                           FSAM_WRITE,
+                           FSOM_CREATE_ALWAYS)) {
+                        const char gbcartridge_command[] = "gbcartridge -d -a\n";
+                        uart_tx((uint8_t*)gbcartridge_command, strlen(gbcartridge_command));
+                    } else {
+                        dialog_message_show_storage_error(app->dialogs, "Cannot open dump file");
+                    }
+                },
+                true);
+            break;
+        case InputKeyMAX:
             break;
-            case InputKeyMAX:
-                break;
         }
     }
-    
+
     return true;
 }
 
@@ -284,7 +302,6 @@ void gb_cartridge_scene_3_exit(void* context) {
     // uart_tx((uint8_t*)("stopscan\n"), strlen("stopscan\n"));
     // furi_delay_ms(50);
 
-    
     gb_cartridge_stop_all_sound(app);
 }
 
@@ -298,21 +315,25 @@ void gb_cartridge_scene_3_enter(void* context) {
         app->gb_cartridge_scene_3->view,
         GameBoyCartridgeRAMBackupModel * model,
         {
-            
-
             // gb_cartridge_scene_3_model_init(model);
             // model->cart_dump_ram_filename  = app->cart_dump_ram_filename;
             // model->cart_dump_ram_extension = app->cart_dump_ram_extension;
             // char *filename = strrchr(sequential_file_resolve_path(app->storage, MALVEKE_APP_FOLDER_RAMS, app->cart_dump_ram_filename, app->cart_dump_ram_extension), '/');
             // filename++;
-            char *filename = sequential_file_resolve_path(app->storage, MALVEKE_APP_FOLDER_RAMS, app->cart_dump_ram_filename, app->cart_dump_ram_extension);
-            model->cart_dump_ram_filename_sequential =  filename;
+            char* filename = sequential_file_resolve_path(
+                app->storage,
+                MALVEKE_APP_FOLDER_RAMS,
+                app->cart_dump_ram_filename,
+                app->cart_dump_ram_extension);
+            model->cart_dump_ram_filename_sequential = filename;
             app->is_writing_ram = true;
-             // Register callbacks to receive data
-            uart_set_handle_rx_data_cb(app->uart, gameboy_ram_backup_handle_rx_data_cb); // setup callback for general log rx thread
-            uart_set_handle_rx_data_cb(app->lp_uart, dump_ram_handle_rx_data_cb); // setup callback for general log rx thread
-
-
+            // Register callbacks to receive data
+            uart_set_handle_rx_data_cb(
+                app->uart,
+                gameboy_ram_backup_handle_rx_data_cb); // setup callback for general log rx thread
+            uart_set_handle_rx_data_cb(
+                app->lp_uart,
+                dump_ram_handle_rx_data_cb); // setup callback for general log rx thread
         },
         false);
 }
@@ -320,27 +341,25 @@ void gb_cartridge_scene_3_enter(void* context) {
 GBCartridgeScene3* gb_cartridge_scene_3_alloc() {
     GBCartridgeScene3* instance = malloc(sizeof(GBCartridgeScene3));
     instance->view = view_alloc();
-    view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMBackupModel));
+    view_allocate_model(
+        instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMBackupModel));
     view_set_context(instance->view, instance);
     view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_3_draw);
     view_set_input_callback(instance->view, gb_cartridge_scene_3_input);
     view_set_enter_callback(instance->view, gb_cartridge_scene_3_enter);
     view_set_exit_callback(instance->view, gb_cartridge_scene_3_exit);
-    
+
     with_view_model(
         instance->view,
         GameBoyCartridgeRAMBackupModel * model,
-        {
-            gb_cartridge_scene_3_model_init(model);
-        },
+        { gb_cartridge_scene_3_model_init(model); },
         true);
-    
+
     return instance;
 }
 
 void gb_cartridge_scene_3_free(GBCartridgeScene3* instance) {
     furi_assert(instance);
-    
 
     view_free(instance->view);
     free(instance);
@@ -349,7 +368,5 @@ void gb_cartridge_scene_3_free(GBCartridgeScene3* instance) {
 View* gb_cartridge_scene_3_get_view(GBCartridgeScene3* instance) {
     furi_assert(instance);
 
-
     return instance->view;
 }
-

+ 1 - 1
views/gb_cartridge_scene_3.h

@@ -10,7 +10,7 @@ typedef void (*GBCartridgeScene3Callback)(GBCartridgeCustomEvent event, void* co
 void gb_cartridge_scene_3_set_callback(
     GBCartridgeScene3* instance,
     GBCartridgeScene3Callback callback,
-    void * context);
+    void* context);
 
 GBCartridgeScene3* gb_cartridge_scene_3_alloc();
 

+ 97 - 85
views/gb_cartridge_scene_4.c

@@ -11,8 +11,8 @@
 #include <toolbox/stream/file_stream.h>
 #include "../helpers/gb_cartridge_speaker.h"
 #include "../helpers/sequential_file.h"
-#include <stdio.h>   // Para sprintf
-#include <string.h>  // Para strlen
+#include <stdio.h> // Para sprintf
+#include <string.h> // Para strlen
 #include <lib/toolbox/stream/file_stream.h>
 
 struct GBCartridgeScene4 {
@@ -30,7 +30,7 @@ typedef struct {
     int romBanks;
     int elapsed_time;
     int start_time;
-    
+
     char* cart_dump_rom_filename_sequential;
     bool rx_active;
 
@@ -48,13 +48,15 @@ void gb_cartridge_scene_4_set_callback(
 }
 
 static void drawProgressBar(Canvas* canvas, int progress) {
-    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING -UI_PADDING - UI_PADDING; x += 5) {
+    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5) {
         for(int row = 0; row < 20; row += 5) {
             if(progress > 0) {
-                canvas_draw_box(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_box(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
                 progress--;
             } else {
-                canvas_draw_frame(canvas, 14 /*ARROW*/ + UI_PADDING + 2+ x + 4, /*45*/ 26 + row, 4, 4);
+                canvas_draw_frame(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
             }
         }
     }
@@ -67,7 +69,7 @@ void gb_cartridge_scene_4_draw(Canvas* canvas, GameBoyCartridgeROMWriteModel* mo
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_set_font(canvas, FontKeyboard);
-    canvas_draw_frame(canvas, 0, 24, (128/2), 25);
+    canvas_draw_frame(canvas, 0, 24, (128 / 2), 25);
 
     canvas_set_bitmap_mode(canvas, 1);
     canvas_set_font(canvas, FontPrimary);
@@ -76,7 +78,12 @@ void gb_cartridge_scene_4_draw(Canvas* canvas, GameBoyCartridgeROMWriteModel* mo
     if(model->total_rom > 0 && model->transfered > 0) {
         progress = model->transfered * 100 / model->total_rom;
     }
-    snprintf(progressText, sizeof(progressText), "%d%% Write ROM... GB: %s", progress, model->gameboy_rom_option_selected_text);
+    snprintf(
+        progressText,
+        sizeof(progressText),
+        "%d%% Write ROM... GB: %s",
+        progress,
+        model->gameboy_rom_option_selected_text);
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_set_font(canvas, FontSecondary);
 
@@ -85,25 +92,35 @@ void gb_cartridge_scene_4_draw(Canvas* canvas, GameBoyCartridgeROMWriteModel* mo
     // canvas_draw_str_aligned(canvas, 128/2, 12, AlignCenter, AlignTop, filename);
 
     char total_rom_str[20];
-    snprintf(total_rom_str, sizeof(total_rom_str), "of %.2lf MiB", (double)(model->total_rom / 1024.0 / 1024.0));
+    snprintf(
+        total_rom_str,
+        sizeof(total_rom_str),
+        "of %.2lf MiB",
+        (double)(model->total_rom / 1024.0 / 1024.0));
 
     char transfered_rom_str[20];
-    snprintf(transfered_rom_str, sizeof(transfered_rom_str), "%.2lf MiB", (double)(model->transfered / 1024.0 / 1024.0));
-
+    snprintf(
+        transfered_rom_str,
+        sizeof(transfered_rom_str),
+        "%.2lf MiB",
+        (double)(model->transfered / 1024.0 / 1024.0));
 
     // Calcula la Tasa de Transferencia en KiB/s
     char transfer_rate_str[20];
-    if(model->transfered>0 && model->elapsed_time > 0) {
-        double transfer_rate_kibps = (double)model->transfered / ((double)model->elapsed_time ) / (double)1024.0;
+    if(model->transfered > 0 && model->elapsed_time > 0) {
+        double transfer_rate_kibps =
+            (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
     } else {
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
     }
-    
 
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_rom_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 40 + 2, AlignLeft, AlignTop, total_rom_str);
-    canvas_draw_str_aligned(canvas, (128/2) + UI_PADDING, 48 + 2, AlignLeft, AlignTop, transfer_rate_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_rom_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 40 + 2, AlignLeft, AlignTop, total_rom_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 48 + 2, AlignLeft, AlignTop, transfer_rate_str);
 
     if(model->rx_active) {
         canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
@@ -115,9 +132,12 @@ void gb_cartridge_scene_4_draw(Canvas* canvas, GameBoyCartridgeROMWriteModel* mo
     snprintf(totalText, sizeof(totalText), "%d", model->total_rom);
     // canvas_draw_str(canvas, 69, 48, totalText);
 
-    drawProgressBar(canvas, (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) / 100); // Pinta las primeras 10 cajas de negro
+    drawProgressBar(
+        canvas,
+        (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) /
+            100); // Pinta las primeras 10 cajas de negro
     // free(totalText);
-    
+
     elements_button_center(canvas, "Write");
 }
 
@@ -158,66 +178,64 @@ static void gb_cartridge_scene_4_model_init(GameBoyCartridgeROMWriteModel* const
 bool gb_cartridge_scene_4_input(InputEvent* event, void* context) {
     furi_assert(context);
     GBCartridgeScene4* instance = context;
-    
-    
-    if (event->type == InputTypeRelease) {
+
+    if(event->type == InputTypeRelease) {
         switch(event->key) {
-            case InputKeyBack:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeROMWriteModel * model,
-                    {
-                        UNUSED(model);
-                        GBCartridge* app = (GBCartridge*)instance->context;
-                        // Unregister rx callback
-                        uart_set_handle_rx_data_cb(app->uart, NULL);
-                        // uart_set_handle_rx_data_cb(app->lp_uart, NULL);
-                        instance->callback(GBCartridgeCustomEventScene4Back, instance->context);
-                    },
-                    true);
-                break;
-            case InputKeyUp:
-            case InputKeyDown:
-            case InputKeyLeft:
-            case InputKeyRight:
+        case InputKeyBack:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeROMWriteModel * model,
+                {
+                    UNUSED(model);
+                    GBCartridge* app = (GBCartridge*)instance->context;
+                    // Unregister rx callback
+                    uart_set_handle_rx_data_cb(app->uart, NULL);
+                    // uart_set_handle_rx_data_cb(app->lp_uart, NULL);
+                    instance->callback(GBCartridgeCustomEventScene4Back, instance->context);
+                },
+                true);
             break;
-            case InputKeyOk:
-                with_view_model(
-                    instance->view,
-                    GameBoyCartridgeROMWriteModel * model,
-                    {
-                        GBCartridge* app = ((GBCartridge*)instance->context);
-                        UNUSED(model);
-                        UNUSED(app);
-                        // uint8_t buffer[BUFFER_SIZE];
-                        // size_t bytesRead;
-                        // Stream* file_stream = file_stream_alloc(app->storage);
-                       
-                        // if(select_rom_file(app, file_stream)) {
-                        //     const char gbcartridge_start_command[] = "gbcartridge -w -o -s\n";
-                        //     uart_tx((uint8_t*)gbcartridge_start_command, strlen(gbcartridge_start_command));
-                        //     furi_delay_ms(500);
-                            
-                        //     while (file_stream_read(file_stream, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
-                        //         // Send 64 bytes at a time
-                        //         lp_uart_tx((uint8_t*)buffer, bytesRead);
-                        //     }
-
-                        //     const char gbcartridge_end_command[] = "gbcartridge -w -o -e\n";
-                        //     uart_tx((uint8_t*)gbcartridge_end_command, strlen(gbcartridge_end_command));
-
-                            
-                        //     file_stream_close(file_stream);
-                        // }
-                        // stream_free(file_stream);
-                    },
-                    true);
+        case InputKeyUp:
+        case InputKeyDown:
+        case InputKeyLeft:
+        case InputKeyRight:
+            break;
+        case InputKeyOk:
+            with_view_model(
+                instance->view,
+                GameBoyCartridgeROMWriteModel * model,
+                {
+                    GBCartridge* app = ((GBCartridge*)instance->context);
+                    UNUSED(model);
+                    UNUSED(app);
+                    // uint8_t buffer[BUFFER_SIZE];
+                    // size_t bytesRead;
+                    // Stream* file_stream = file_stream_alloc(app->storage);
+
+                    // if(select_rom_file(app, file_stream)) {
+                    //     const char gbcartridge_start_command[] = "gbcartridge -w -o -s\n";
+                    //     uart_tx((uint8_t*)gbcartridge_start_command, strlen(gbcartridge_start_command));
+                    //     furi_delay_ms(500);
+
+                    //     while (file_stream_read(file_stream, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
+                    //         // Send 64 bytes at a time
+                    //         lp_uart_tx((uint8_t*)buffer, bytesRead);
+                    //     }
+
+                    //     const char gbcartridge_end_command[] = "gbcartridge -w -o -e\n";
+                    //     uart_tx((uint8_t*)gbcartridge_end_command, strlen(gbcartridge_end_command));
+
+                    //     file_stream_close(file_stream);
+                    // }
+                    // stream_free(file_stream);
+                },
+                true);
+            break;
+        case InputKeyMAX:
             break;
-            case InputKeyMAX:
-                break;
         }
     }
-    
+
     return true;
 }
 
@@ -237,11 +255,9 @@ void gb_cartridge_scene_4_enter(void* context) {
         app->gb_cartridge_scene_4->view,
         GameBoyCartridgeROMWriteModel * model,
         {
-            
             UNUSED(model);
             gb_cartridge_scene_4_model_init(model);
             model->gameboy_rom_option_selected_text = app->gameboy_rom_option_selected_text;
-
         },
         false);
 }
@@ -249,27 +265,25 @@ void gb_cartridge_scene_4_enter(void* context) {
 GBCartridgeScene4* gb_cartridge_scene_4_alloc() {
     GBCartridgeScene4* instance = malloc(sizeof(GBCartridgeScene4));
     instance->view = view_alloc();
-    view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeROMWriteModel));
+    view_allocate_model(
+        instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeROMWriteModel));
     view_set_context(instance->view, instance);
     view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_4_draw);
     view_set_input_callback(instance->view, gb_cartridge_scene_4_input);
     view_set_enter_callback(instance->view, gb_cartridge_scene_4_enter);
     view_set_exit_callback(instance->view, gb_cartridge_scene_4_exit);
-    
+
     with_view_model(
         instance->view,
         GameBoyCartridgeROMWriteModel * model,
-        {
-            gb_cartridge_scene_4_model_init(model);
-        },
+        { gb_cartridge_scene_4_model_init(model); },
         true);
-    
+
     return instance;
 }
 
 void gb_cartridge_scene_4_free(GBCartridgeScene4* instance) {
     furi_assert(instance);
-    
 
     view_free(instance->view);
     free(instance);
@@ -278,7 +292,5 @@ void gb_cartridge_scene_4_free(GBCartridgeScene4* instance) {
 View* gb_cartridge_scene_4_get_view(GBCartridgeScene4* instance) {
     furi_assert(instance);
 
-
     return instance->view;
 }
-

+ 1 - 1
views/gb_cartridge_scene_4.h

@@ -10,7 +10,7 @@ typedef void (*GBCartridgeScene4Callback)(GBCartridgeCustomEvent event, void* co
 void gb_cartridge_scene_4_set_callback(
     GBCartridgeScene4* instance,
     GBCartridgeScene4Callback callback,
-    void * context);
+    void* context);
 
 GBCartridgeScene4* gb_cartridge_scene_4_alloc();
 

+ 99 - 121
views/gb_cartridge_scene_5.c

@@ -14,21 +14,19 @@
 #include <toolbox/stream/file_stream.h>
 #include "../helpers/gb_cartridge_speaker.h"
 #include "../helpers/sequential_file.h"
-#include <stdio.h>  // Para sprintf
+#include <stdio.h> // Para sprintf
 #include <string.h> // Para strlen
 
 static uint64_t last_toggle_time = 0;
-struct GBCartridgeScene5
-{
-    View *view;
+struct GBCartridgeScene5 {
+    View* view;
     GBCartridgeScene5Callback callback;
-    void *context;
-    GBCartridge *app;
+    void* context;
+    GBCartridge* app;
 };
 
-typedef struct
-{
-    char *event_type;
+typedef struct {
+    char* event_type;
     int progress;
     int total_ram;
     int transfered;
@@ -36,7 +34,7 @@ typedef struct
     int elapsed_time;
     int start_time;
 
-    char *cart_dump_ram_filename_sequential;
+    char* cart_dump_ram_filename_sequential;
     bool rx_active;
 
     char* event_title;
@@ -48,10 +46,9 @@ typedef struct
 
 } GameBoyCartridgeRAMWriteModel;
 
-static bool select_ram_file(GBCartridge *app, File *file)
-{
+static bool select_ram_file(GBCartridge* app, File* file) {
     bool result = false;
-    FuriString *file_path = furi_string_alloc();
+    FuriString* file_path = furi_string_alloc();
     furi_string_set(file_path, MALVEKE_APP_FOLDER_RAMS);
     DialogsFileBrowserOptions browser_options;
     dialog_file_browser_set_basic_options(&browser_options, "sav", NULL);
@@ -62,16 +59,13 @@ static bool select_ram_file(GBCartridge *app, File *file)
     bool res = dialog_file_browser_show(app->dialogs, file_path, file_path, &browser_options);
     // UNUSED(res);
     // FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path));
-    if (res)
-    {   
+    if(res) {
         if(!storage_file_open(file, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
         // if (!file_stream_open(stream, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING))
         {
             // FURI_LOG_D(TAG, "Cannot open file \"%s\"", furi_string_get_cstr(file_path));
             // file_stream_close(stream);
-        }
-        else
-        {
+        } else {
             // FURI_LOG_D(TAG, "Open file \"%s\"", furi_string_get_cstr(file_path));
             result = true;
         }
@@ -85,13 +79,11 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
     UNUSED(app);
     File* file = storage_file_alloc(app->storage);
 
-    if (select_ram_file(app, file))
-    {
+    if(select_ram_file(app, file)) {
         uint16_t fileSize = storage_file_size(file);
-        
-        
-        FURI_LOG_I(TAG, "fileSize: %d " , fileSize);
-       with_view_model(
+
+        FURI_LOG_I(TAG, "fileSize: %d ", fileSize);
+        with_view_model(
             app->gb_cartridge_scene_5->view,
             GameBoyCartridgeRAMWriteModel * model,
             {
@@ -100,24 +92,27 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
             },
             true);
 
-
         char gbcartridge_start_command[80]; // A reasonably sized buffer.
-        snprintf(gbcartridge_start_command, sizeof(gbcartridge_start_command), "gbcartridge -w -a %d\n", fileSize);
-   
-        uart_tx((uint8_t *)gbcartridge_start_command, strlen(gbcartridge_start_command));
-        
+        snprintf(
+            gbcartridge_start_command,
+            sizeof(gbcartridge_start_command),
+            "gbcartridge -w -a %d\n",
+            fileSize);
+
+        uart_tx((uint8_t*)gbcartridge_start_command, strlen(gbcartridge_start_command));
+
         furi_delay_ms(500); // wait
         uint8_t* the_savefile = NULL;
         size_t savefile_size = 0;
         with_view_model(
-                app->gb_cartridge_scene_5->view,
-                GameBoyCartridgeRAMWriteModel * model,
-                {
-                    model->event_title = "Transferring...";
-                    model->transfered = 0;
-                    model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
-                },
-                true);
+            app->gb_cartridge_scene_5->view,
+            GameBoyCartridgeRAMWriteModel * model,
+            {
+                model->event_title = "Transferring...";
+                model->transfered = 0;
+                model->start_time = furi_hal_rtc_get_timestamp(); // Registra el tiempo de inicio
+            },
+            true);
         the_savefile = malloc(fileSize); // to be freed by caller
         uint8_t* buf_ptr = the_savefile;
         size_t read = 0;
@@ -134,9 +129,7 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
         with_view_model(
             app->gb_cartridge_scene_5->view,
             GameBoyCartridgeRAMWriteModel * model,
-            {
-                model->event_title = "Writing Cartridge...";
-            },
+            { model->event_title = "Writing Cartridge..."; },
             true);
         free(the_savefile);
 
@@ -144,40 +137,34 @@ static int32_t cartridge_writting_worker_thread(void* thread_context) {
             storage_file_close(file);
         }
     }
-    
+
     return 0;
 }
 void gb_cartridge_scene_5_set_callback(
-    GBCartridgeScene5 *instance,
+    GBCartridgeScene5* instance,
     GBCartridgeScene5Callback callback,
-    void *context)
-{
+    void* context) {
     furi_assert(instance);
     furi_assert(callback);
     instance->callback = callback;
     instance->context = context;
 }
-static void drawProgressBar(Canvas *canvas, int progress)
-{
-    for (int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5)
-    {
-        for (int row = 0; row < 20; row += 5)
-        {
-            if (progress > 0)
-            {
-                canvas_draw_box(canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
+static void drawProgressBar(Canvas* canvas, int progress) {
+    for(int x = 0; x < 64 - 14 - UI_PADDING - UI_PADDING - UI_PADDING - UI_PADDING; x += 5) {
+        for(int row = 0; row < 20; row += 5) {
+            if(progress > 0) {
+                canvas_draw_box(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
                 progress--;
-            }
-            else
-            {
-                canvas_draw_frame(canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
+            } else {
+                canvas_draw_frame(
+                    canvas, 14 /*ARROW*/ + UI_PADDING + 2 + x + 4, /*45*/ 26 + row, 4, 4);
             }
         }
     }
 }
 
-void gb_cartridge_scene_5_draw(Canvas *canvas, GameBoyCartridgeRAMWriteModel *model)
-{
+void gb_cartridge_scene_5_draw(Canvas* canvas, GameBoyCartridgeRAMWriteModel* model) {
     // Clear the screen.
     canvas_set_color(canvas, ColorBlack);
 
@@ -190,57 +177,64 @@ void gb_cartridge_scene_5_draw(Canvas *canvas, GameBoyCartridgeRAMWriteModel *mo
     canvas_set_font(canvas, FontPrimary);
     char progressText[42];
     int progress = 0;
-    if (model->total_ram > 0 && model->transfered > 0)
-    {
+    if(model->total_ram > 0 && model->transfered > 0) {
         progress = model->transfered * 100 / model->total_ram;
     }
     snprintf(progressText, sizeof(progressText), "%d%% Write RAM...", progress);
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_set_font(canvas, FontSecondary);
 
-    canvas_draw_str_aligned(canvas, 128/2, 12, AlignCenter, AlignTop, model->event_title);
+    canvas_draw_str_aligned(canvas, 128 / 2, 12, AlignCenter, AlignTop, model->event_title);
 
     char total_ram_str[20];
-    snprintf(total_ram_str, sizeof(total_ram_str), "of %.2lf MiB", (double)(model->total_ram / 1024.0 / 1024.0));
+    snprintf(
+        total_ram_str,
+        sizeof(total_ram_str),
+        "of %.2lf MiB",
+        (double)(model->total_ram / 1024.0 / 1024.0));
 
     char transfered_ram_str[20];
-    snprintf(transfered_ram_str, sizeof(transfered_ram_str), "%.2lf MiB", (double)(model->transfered / 1024.0 / 1024.0));
+    snprintf(
+        transfered_ram_str,
+        sizeof(transfered_ram_str),
+        "%.2lf MiB",
+        (double)(model->transfered / 1024.0 / 1024.0));
 
     // Calcula la Tasa de Transferencia en KiB/s
     char transfer_rate_str[20];
-    if (model->transfered > 0 && model->elapsed_time > 0)
-    {
-        double transfer_rate_kibps = (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
+    if(model->transfered > 0 && model->elapsed_time > 0) {
+        double transfer_rate_kibps =
+            (double)model->transfered / ((double)model->elapsed_time) / (double)1024.0;
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "%.2lf KiB/s", transfer_rate_kibps);
-    }
-    else
-    {
+    } else {
         snprintf(transfer_rate_str, sizeof(transfer_rate_str), "0 KiB/s");
     }
 
-    canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
-    canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
-    canvas_draw_str_aligned(canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 22 + 2, AlignLeft, AlignTop, transfered_ram_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 30 + 2, AlignLeft, AlignTop, total_ram_str);
+    canvas_draw_str_aligned(
+        canvas, (128 / 2) + UI_PADDING, 38 + 2, AlignLeft, AlignTop, transfer_rate_str);
 
-    if (model->rx_active)
-    {
+    if(model->rx_active) {
         canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpFilled_14x15, IconRotation180);
-    }
-    else
-    {
+    } else {
         canvas_draw_icon_ex(canvas, UI_PADDING, 28, &I_ArrowUpEmpty_14x15, IconRotation180);
     }
 
     char totalText[42];
     snprintf(totalText, sizeof(totalText), "%d", model->total_ram);
 
-    drawProgressBar(canvas, (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) / 100); // Pinta las primeras 10 cajas de negro
-    
+    drawProgressBar(
+        canvas,
+        (progress * UI_PROGRESS_ROWS * UI_PROGRESS_COLS) /
+            100); // Pinta las primeras 10 cajas de negro
+
     elements_button_center(canvas, "Write");
 }
 
-static void gb_cartridge_scene_5_model_init(GameBoyCartridgeRAMWriteModel *const model)
-{
+static void gb_cartridge_scene_5_model_init(GameBoyCartridgeRAMWriteModel* const model) {
     model->progress = 0;
     model->total_ram = 0;
     model->transfered = 0;
@@ -255,8 +249,6 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
     UNUSED(buf);
     GBCartridge* instance = context;
 
-           
-
     with_view_model(
         instance->gb_cartridge_scene_5->view,
         GameBoyCartridgeRAMWriteModel * model,
@@ -265,12 +257,11 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
 
             uint64_t current_time = furi_hal_rtc_get_timestamp();
             model->elapsed_time = current_time - model->start_time;
-            if (current_time - last_toggle_time >= 0.2) {
+            if(current_time - last_toggle_time >= 0.2) {
                 model->rx_active = !model->rx_active;
                 last_toggle_time = current_time;
             }
 
-
             cJSON* json = cJSON_Parse((char*)buf);
             if(json == NULL) {
             } else {
@@ -296,16 +287,15 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
                 } else {
                     model->value = 0;
                 }
-                
             }
-            if (strcmp(model->event_type, "progress") == 0) {
+            if(strcmp(model->event_type, "progress") == 0) {
                 //  progress
                 cJSON* progress = cJSON_GetObjectItemCaseSensitive(json, "progress");
                 if(cJSON_IsNumber(progress)) {
                     model->transfered += progress->valueint;
                 }
             }
-            if (strcmp(model->event_type, "success") == 0) {
+            if(strcmp(model->event_type, "success") == 0) {
                 notification_success(instance->notification);
                 model->transfered = model->total_ram;
                 model->event_title = "Done!";
@@ -313,22 +303,19 @@ void gameboy_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
         },
         true);
 }
-bool gb_cartridge_scene_5_input(InputEvent *event, void *context)
-{
+bool gb_cartridge_scene_5_input(InputEvent* event, void* context) {
     furi_assert(context);
-    GBCartridgeScene5 *instance = context;
+    GBCartridgeScene5* instance = context;
 
-    if (event->type == InputTypeRelease)
-    {
-        switch (event->key)
-        {
+    if(event->type == InputTypeRelease) {
+        switch(event->key) {
         case InputKeyBack:
             with_view_model(
                 instance->view,
                 GameBoyCartridgeRAMWriteModel * model,
                 {
                     UNUSED(model);
-                    GBCartridge *app = (GBCartridge *)instance->context;
+                    GBCartridge* app = (GBCartridge*)instance->context;
                     // Unregister rx callback
                     uart_set_handle_rx_data_cb(app->uart, NULL);
                     uart_set_handle_rx_data_cb(app->lp_uart, NULL);
@@ -342,13 +329,11 @@ bool gb_cartridge_scene_5_input(InputEvent *event, void *context)
         case InputKeyLeft:
         case InputKeyRight:
             break;
-        case InputKeyOk:
-        {
-            GBCartridge *app = ((GBCartridge *)instance->context);
+        case InputKeyOk: {
+            GBCartridge* app = ((GBCartridge*)instance->context);
             uart_set_handle_rx_data_cb(app->uart, gameboy_handle_rx_data_cb);
             cartridge_writting_worker_thread(app);
-        }
-            break;
+        } break;
         case InputKeyMAX:
             break;
         }
@@ -357,19 +342,16 @@ bool gb_cartridge_scene_5_input(InputEvent *event, void *context)
     return true;
 }
 
-void gb_cartridge_scene_5_exit(void *context)
-{
+void gb_cartridge_scene_5_exit(void* context) {
     furi_assert(context);
-    GBCartridge *app = context;
+    GBCartridge* app = context;
     gb_cartridge_stop_all_sound(app);
 }
 
-void gb_cartridge_scene_5_enter(void *context)
-{
-    
+void gb_cartridge_scene_5_enter(void* context) {
     furi_assert(context);
-    GBCartridgeScene5 *instance = context;
-    GBCartridge *app = (GBCartridge *)instance->context;
+    GBCartridgeScene5* instance = context;
+    GBCartridge* app = (GBCartridge*)instance->context;
 
     UNUSED(app);
     with_view_model(
@@ -382,11 +364,11 @@ void gb_cartridge_scene_5_enter(void *context)
         false);
 }
 
-GBCartridgeScene5 *gb_cartridge_scene_5_alloc()
-{
-    GBCartridgeScene5 *instance = malloc(sizeof(GBCartridgeScene5));
+GBCartridgeScene5* gb_cartridge_scene_5_alloc() {
+    GBCartridgeScene5* instance = malloc(sizeof(GBCartridgeScene5));
     instance->view = view_alloc();
-    view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMWriteModel));
+    view_allocate_model(
+        instance->view, ViewModelTypeLocking, sizeof(GameBoyCartridgeRAMWriteModel));
 
     view_set_context(instance->view, instance);
     view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_scene_5_draw);
@@ -397,16 +379,13 @@ GBCartridgeScene5 *gb_cartridge_scene_5_alloc()
     with_view_model(
         instance->view,
         GameBoyCartridgeRAMWriteModel * model,
-        {
-            gb_cartridge_scene_5_model_init(model);
-        },
+        { gb_cartridge_scene_5_model_init(model); },
         true);
 
     return instance;
 }
 
-void gb_cartridge_scene_5_free(GBCartridgeScene5 *instance)
-{
+void gb_cartridge_scene_5_free(GBCartridgeScene5* instance) {
     GBCartridge* app = instance->context;
     UNUSED(app);
     furi_assert(instance);
@@ -414,8 +393,7 @@ void gb_cartridge_scene_5_free(GBCartridgeScene5 *instance)
     free(instance);
 }
 
-View *gb_cartridge_scene_5_get_view(GBCartridgeScene5 *instance)
-{
+View* gb_cartridge_scene_5_get_view(GBCartridgeScene5* instance) {
     furi_assert(instance);
 
     return instance->view;

+ 1 - 1
views/gb_cartridge_scene_5.h

@@ -10,7 +10,7 @@ typedef void (*GBCartridgeScene5Callback)(GBCartridgeCustomEvent event, void* co
 void gb_cartridge_scene_5_set_callback(
     GBCartridgeScene5* instance,
     GBCartridgeScene5Callback callback,
-    void * context);
+    void* context);
 
 GBCartridgeScene5* gb_cartridge_scene_5_alloc();
 

+ 42 - 56
views/gb_cartridge_startscreen.c

@@ -11,7 +11,6 @@ struct GBCartridgeStartscreen {
     void* context;
 };
 
-
 typedef struct {
     int some_value;
 } GBCartridgeStartscreenModel;
@@ -55,17 +54,16 @@ void gb_cartridge_startscreen_draw(Canvas* canvas, GBCartridgeStartscreenModel*
     UNUSED(model);
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
-    
-    
-    canvas_draw_icon(canvas, 0 /*128/2 - (42/2)*/, 64/2 - (64/2), &I_cartridge_42x64);
+
+    canvas_draw_icon(canvas, 0 /*128/2 - (42/2)*/, 64 / 2 - (64 / 2), &I_cartridge_42x64);
 
     canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str_aligned(canvas, 64 + 20, 6, AlignCenter, AlignTop, "Connect Malveke"); 
+    canvas_draw_str_aligned(canvas, 64 + 20, 6, AlignCenter, AlignTop, "Connect Malveke");
     canvas_set_font(canvas, FontSecondary);
-    canvas_draw_str_aligned(canvas, 64+ 20, 18, AlignCenter, AlignTop, "to the Flipper and"); 
-    canvas_draw_str_aligned(canvas, 64+ 20, 28, AlignCenter, AlignTop, "and Insert Game Boy");
-    canvas_draw_str_aligned(canvas, 64+ 20, 38, AlignCenter, AlignTop, "Cartridge");
-    elements_button_center(canvas, "Ok"); 
+    canvas_draw_str_aligned(canvas, 64 + 20, 18, AlignCenter, AlignTop, "to the Flipper and");
+    canvas_draw_str_aligned(canvas, 64 + 20, 28, AlignCenter, AlignTop, "and Insert Game Boy");
+    canvas_draw_str_aligned(canvas, 64 + 20, 38, AlignCenter, AlignTop, "Cartridge");
+    elements_button_center(canvas, "Ok");
 }
 
 static void gb_cartridge_startscreen_model_init(GBCartridgeStartscreenModel* const model) {
@@ -73,37 +71,37 @@ static void gb_cartridge_startscreen_model_init(GBCartridgeStartscreenModel* con
 }
 
 bool gb_cartridge_startscreen_input(InputEvent* event, void* context) {
-    furi_assert(context); 
+    furi_assert(context);
     GBCartridgeStartscreen* instance = context;
-    if (event->type == InputTypeRelease) {
+    if(event->type == InputTypeRelease) {
         switch(event->key) {
-            case InputKeyBack:
-                with_view_model(
-                    instance->view,
-                    GBCartridgeStartscreenModel * model,
-                    {
-                        UNUSED(model);
-                        instance->callback(GBCartridgeCustomEventStartscreenBack, instance->context);
-                    },
-                    true);
-                break;
-            case InputKeyLeft:
-            case InputKeyRight:
-            case InputKeyUp:
-            case InputKeyDown:
-            case InputKeyOk:
-                notification_message(((GBCartridge*)instance->context)->notification, &sequence_alarm);
-                with_view_model(
-                    instance->view,
-                    GBCartridgeStartscreenModel* model,
-                    {
-                        UNUSED(model);
-                        instance->callback(GBCartridgeCustomEventStartscreenOk, instance->context);
-                    },
-                    true);
-                break;
-            case InputKeyMAX:
-                break;
+        case InputKeyBack:
+            with_view_model(
+                instance->view,
+                GBCartridgeStartscreenModel * model,
+                {
+                    UNUSED(model);
+                    instance->callback(GBCartridgeCustomEventStartscreenBack, instance->context);
+                },
+                true);
+            break;
+        case InputKeyLeft:
+        case InputKeyRight:
+        case InputKeyUp:
+        case InputKeyDown:
+        case InputKeyOk:
+            notification_message(((GBCartridge*)instance->context)->notification, &sequence_alarm);
+            with_view_model(
+                instance->view,
+                GBCartridgeStartscreenModel * model,
+                {
+                    UNUSED(model);
+                    instance->callback(GBCartridgeCustomEventStartscreenOk, instance->context);
+                },
+                true);
+            break;
+        case InputKeyMAX:
+            break;
         }
     }
     return true;
@@ -119,11 +117,8 @@ void gb_cartridge_startscreen_enter(void* context) {
     with_view_model(
         instance->view,
         GBCartridgeStartscreenModel * model,
-        {
-            gb_cartridge_startscreen_model_init(model);
-        },
-        true
-    );
+        { gb_cartridge_startscreen_model_init(model); },
+        true);
 }
 
 GBCartridgeStartscreen* gb_cartridge_startscreen_alloc() {
@@ -139,12 +134,9 @@ GBCartridgeStartscreen* gb_cartridge_startscreen_alloc() {
     with_view_model(
         instance->view,
         GBCartridgeStartscreenModel * model,
-        {
-            gb_cartridge_startscreen_model_init(model);
-        },
-        true
-    );
-    
+        { gb_cartridge_startscreen_model_init(model); },
+        true);
+
     return instance;
 }
 
@@ -152,12 +144,7 @@ void gb_cartridge_startscreen_free(GBCartridgeStartscreen* instance) {
     furi_assert(instance);
 
     with_view_model(
-        instance->view,
-        GBCartridgeStartscreenModel * model,
-        {
-            UNUSED(model);
-        },
-        true);
+        instance->view, GBCartridgeStartscreenModel * model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }
@@ -166,4 +153,3 @@ View* gb_cartridge_startscreen_get_view(GBCartridgeStartscreen* instance) {
     furi_assert(instance);
     return instance->view;
 }
-

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä