Selaa lähdekoodia

Merge flip_library from https://github.com/jblanked/FlipLibrary

Willy-JL 1 vuosi sitten
vanhempi
commit
0f756e9ffb

+ 18 - 22
flip_library/CHANGELOG.md

@@ -1,27 +1,23 @@
-## v1.3
+## v1.4
+- Merged **FlipTrader**.  
+- Merged **FlipWeather** with added topography data.  
+- Added **Next Holiday** feature (contributed by Derek Jamison).  
+- Introduced **Predict Name, Age, and Ethnicity** functionality.  
+- Added new features: **Random Trivia**, **Advice**, **Tech Phrase**, **UUID**, **Address**, **Credit Card Info**, and **User Info**.  
+
+## v1.3  
 Refactored by Derek Jamison:  
 - Improved progress display.  
-- Added connectivity check on startup.
-- Added Wikipedia API.
-
-## v1.2
-- Improved memory allocation.
-- Added in Dog Facts.
-- Added in Random Quotes.
-
-## v1.1
-- Update for app catalog.
-
-## v1.0
-- Initial Release.
+- Added a connectivity check on startup.  
+- Integrated the **Wikipedia API**.  
 
-## v1.2
-- Improved memory allocation.
-- Added in Dog Facts.
-- Added in Random Quotes.
+## v1.2  
+- Enhanced memory allocation.  
+- Added **Dog Facts**.  
+- Introduced **Random Quotes**.  
 
-## v1.1
-- Update for app catalog.
+## v1.1  
+- Updated for app catalog compatibility.  
 
-## v1.0
-- Initial Release.
+## v1.0  
+- Initial release.  

+ 41 - 41
flip_library/README.md

@@ -1,41 +1,41 @@
-The **FlipLibrary** app for Flipper Zero is a versatile and user-friendly application that offers a combination of useful features to enhance your Flipper Zero experience. 
-
-The app includes a **dictionary**, **random facts**, and additional functionalities, all accessible directly from your Flipper Zero device. It is designed for easy navigation and quick access to information, making it a handy companion for on-the-go learning and entertainment. Big shout out to [Derek Jamison](https://github.com/jamisonderek) for his contributions. 
-
-FlipLibrary uses the FlipperHTTP flash for the WiFi Devboard, first introduced in the WebCrawler app: https://github.com/jblanked/WebCrawler-FlipperZero/tree/main/assets/FlipperHTTP
-
-
-## Requirements
-- WiFi Developer Board or Raspberry Pi Pico W with FlipperHTTP Flash: https://github.com/jblanked/FlipperHTTP
-- WiFi Access Point
-
-
-## Features
-- **Dictionary**: Look up definitions of words directly on your Flipper Zero. Simply enter a word, and the app will provide its definition, making it easy to learn new vocabulary or clarify meaning.
-- **Random Facts**: Discover interesting and fun facts to share with friends or expand your general knowledge. The app offers various categories of facts, such as facts about cats, dogs, quotes, or completely random trivia.
-- **WiFi Settings Management**: Configure and manage WiFi settings (SSID and password) for future app updates that may utilize network connectivity.
-
-## Navigation
-- **Main Menu**: The main entry point for accessing all of the app's features. Options include:
-  - **Random Fact**: Displays a random fact from a selected category.
-  - **Dictionary**: Allows you to enter a word and view its definition.
-  - **About**: Information about the app and its version.
-  - **WiFi Settings**: Configure and view saved WiFi settings.
-
-## Setup
-The app automatically allocates necessary resources and initializes settings. If previously saved WiFi settings exist, they are loaded and displayed in the settings section.
-
-## How to Use
-1. **Flash**: Flash your WiFi Devboard: https://github.com/jblanked/FlipperHTTP
-2. **Install**: Install the app from the App Store: https://lab.flipper.net/apps/flip_library
-3. **Launch**: Open the FlipLibrary app.
-4. **Navigate**:
-   - Use the **Dictionary** section to look up word definitions.
-   - Visit **Random Facts** to read interesting trivia.
-   - Configure **WiFi settings** if network-related features are required in the future.
-   - Check the **About** section to learn more about the app.
-
-# Known Bugs
-
-1. **Screen Delay**: Occasionally, the Defition or Random Facts screen may get stuck on "Loading".
-   - Update to version 1.3 or higher.
+# FlipLibrary App for Flipper Zero  
+
+The **FlipLibrary** app for Flipper Zero is a versatile and user-friendly application that offers a wide range of features to enhance your Flipper Zero experience.  
+
+The app includes a **dictionary**, **random facts**, and numerous additional functionalities, all accessible directly from your Flipper Zero device. It is designed for easy navigation and quick access to information, making it a handy companion for on-the-go learning and entertainment. Big shout out to [Derek Jamison](https://github.com/jamisonderek) for his valuable contributions!  
+
+FlipLibrary leverages the FlipperHTTP flash for the WiFi Devboard, originally introduced in the WebCrawler app: https://github.com/jblanked/WebCrawler-FlipperZero/tree/main/assets/FlipperHTTP  
+
+## Requirements  
+- WiFi Developer Board, Raspberry Pi, or ESP32 Device with FlipperHTTP Flash: https://github.com/jblanked/FlipperHTTP  
+- WiFi Access Point  
+
+## Features  
+- **Random Cat Fact**  
+- **Random Dog Fact**  
+- **Random Quote**  
+- **Random Fact**  
+- **Wikipedia**  
+- **Dictionary**  
+- **Weather**  
+- **GPS**  
+- **Asset Price**  
+- **Next Holiday**  
+- **Predict Age**  
+- **Predict Ethnicity**  
+- **Predict Gender**  
+- **Random Advice**  
+- **Random Trivia Questions**  
+- **Random Tech Phrases**  
+- **Random UUID**  
+- **Random Address**  
+- **Random Credit Card Info**  
+- **Random User Info**  
+- **Topography**  
+
+## Video Tutorial  
+
+For detailed setup and usage instructions, watch the video tutorial: https://www.youtube.com/watch?v=xR1ZbpOVTwE
+
+## Known Bugs  
+For known issues and troubleshooting, visit: https://github.com/jblanked/FlipperHTTP/blob/main/HELP.md

+ 99 - 171
flip_library/alloc/flip_library_alloc.c

@@ -1,12 +1,14 @@
 #include "alloc/flip_library_alloc.h"
 
 // Function to allocate resources for the FlipLibraryApp
-FlipLibraryApp* flip_library_app_alloc() {
-    FlipLibraryApp* app = (FlipLibraryApp*)malloc(sizeof(FlipLibraryApp));
+FlipLibraryApp *flip_library_app_alloc()
+{
+    FlipLibraryApp *app = (FlipLibraryApp *)malloc(sizeof(FlipLibraryApp));
 
-    Gui* gui = furi_record_open(RECORD_GUI);
+    Gui *gui = furi_record_open(RECORD_GUI);
 
-    if(!flipper_http_init(flipper_http_rx_callback, app)) {
+    if (!flipper_http_init(flipper_http_rx_callback, app))
+    {
         FURI_LOG_E(TAG, "Failed to initialize flipper http");
         return NULL;
     }
@@ -15,221 +17,147 @@ FlipLibraryApp* flip_library_app_alloc() {
     app->uart_text_input_buffer_size_ssid = 64;
     app->uart_text_input_buffer_size_password = 64;
     app->uart_text_input_buffer_size_query = 64;
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_buffer_password, app->uart_text_input_buffer_size_password)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_buffer_password, app->uart_text_input_buffer_size_password))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_temp_buffer_password,
-           app->uart_text_input_buffer_size_password)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer_password, app->uart_text_input_buffer_size_password))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_buffer_query, app->uart_text_input_buffer_size_query)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_buffer_query, app->uart_text_input_buffer_size_query))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_buffer(
-           &app->uart_text_input_temp_buffer_query, app->uart_text_input_buffer_size_query)) {
+    if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer_query, app->uart_text_input_buffer_size_query))
+    {
         return NULL;
     }
 
     // Allocate ViewDispatcher
-    if(!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app)) {
+    if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
+    {
         return NULL;
     }
-    view_dispatcher_set_custom_event_callback(
-        app->view_dispatcher, flip_library_custom_event_callback);
+    view_dispatcher_set_custom_event_callback(app->view_dispatcher, flip_library_custom_event_callback);
 
     // Main view
-    if(!easy_flipper_set_view(
-           &app->view_loader,
-           FlipLibraryViewLoader,
-           flip_library_loader_draw_callback,
-           NULL,
-           callback_to_random_facts,
-           &app->view_dispatcher,
-           app)) {
+    if (!easy_flipper_set_view(&app->view_loader, FlipLibraryViewLoader, flip_library_loader_draw_callback, NULL, callback_to_random_facts, &app->view_dispatcher, app))
+    {
         return NULL;
     }
     flip_library_loader_init(app->view_loader);
 
     // Widget
-    if(!easy_flipper_set_widget(
-           &app->widget_about,
-           FlipLibraryViewAbout,
-           "FlipLibrary v1.3\n-----\nDictionary, random facts, and\nmore.\n-----\nwww.github.com/jblanked",
-           callback_to_submenu,
-           &app->view_dispatcher)) {
+    if (!easy_flipper_set_widget(&app->widget_about, FlipLibraryViewAbout, "FlipLibrary v1.4\n-----\nUtilize WiFi to retrieve data\nfrom 20 different APIs.\n-----\nCreated by JBlanked and\nDerek Jamison.\n-----\nwww.github.com/jblanked/\nFlipLibrary\n-----\nPress BACK to return.", callback_to_submenu, &app->view_dispatcher))
+    {
         return NULL;
     }
-    if(!easy_flipper_set_widget(
-           &app->widget_result,
-           FlipLibraryViewWidgetResult,
-           "Error, try again.",
-           callback_to_random_facts,
-           &app->view_dispatcher)) {
+    if (!easy_flipper_set_widget(&app->widget_result, FlipLibraryViewWidgetResult, "Error, try again.", callback_to_random_facts, &app->view_dispatcher))
+    {
         return NULL;
     }
 
     // Text Input
-    if(!easy_flipper_set_uart_text_input(
-           &app->uart_text_input_ssid,
-           FlipLibraryViewTextInputSSID,
-           "Enter SSID",
-           app->uart_text_input_temp_buffer_ssid,
-           app->uart_text_input_buffer_size_ssid,
-           text_updated_ssid,
-           callback_to_wifi_settings,
-           &app->view_dispatcher,
-           app)) {
-        return NULL;
-    }
-    if(!easy_flipper_set_uart_text_input(
-           &app->uart_text_input_password,
-           FlipLibraryViewTextInputPassword,
-           "Enter Password",
-           app->uart_text_input_temp_buffer_password,
-           app->uart_text_input_buffer_size_password,
-           text_updated_password,
-           callback_to_wifi_settings,
-           &app->view_dispatcher,
-           app)) {
-        return NULL;
-    }
-    if(!easy_flipper_set_uart_text_input(
-           &app->uart_text_input_query,
-           FlipLibraryViewTextInputQuery,
-           "Enter Query",
-           app->uart_text_input_temp_buffer_query,
-           app->uart_text_input_buffer_size_query,
-           text_updated_query,
-           callback_to_submenu,
-           &app->view_dispatcher,
-           app)) {
+    if (!easy_flipper_set_uart_text_input(&app->uart_text_input_ssid, FlipLibraryViewTextInputSSID, "Enter SSID", app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid, text_updated_ssid, callback_to_wifi_settings, &app->view_dispatcher, app))
+    {
+        return NULL;
+    }
+    if (!easy_flipper_set_uart_text_input(&app->uart_text_input_password, FlipLibraryViewTextInputPassword, "Enter Password", app->uart_text_input_temp_buffer_password, app->uart_text_input_buffer_size_password, text_updated_password, callback_to_wifi_settings, &app->view_dispatcher, app))
+    {
+        return NULL;
+    }
+    if (!easy_flipper_set_uart_text_input(&app->uart_text_input_query, FlipLibraryViewTextInputQuery, "Enter Query", app->uart_text_input_temp_buffer_query, app->uart_text_input_buffer_size_query, text_updated_query, callback_to_submenu_library, &app->view_dispatcher, app))
+    {
         return NULL;
     }
 
     // Variable Item List
-    if(!easy_flipper_set_variable_item_list(
-           &app->variable_item_list_wifi,
-           FlipLibraryViewSettings,
-           settings_item_selected,
-           callback_to_submenu,
-           &app->view_dispatcher,
-           app)) {
+    if (!easy_flipper_set_variable_item_list(&app->variable_item_list_wifi, FlipLibraryViewSettings, settings_item_selected, callback_to_submenu, &app->view_dispatcher, app))
+    {
         return NULL;
     }
 
-    app->variable_item_ssid =
-        variable_item_list_add(app->variable_item_list_wifi, "SSID", 0, NULL, NULL);
-    app->variable_item_password =
-        variable_item_list_add(app->variable_item_list_wifi, "Password", 0, NULL, NULL);
+    app->variable_item_ssid = variable_item_list_add(app->variable_item_list_wifi, "SSID", 0, NULL, NULL);
+    app->variable_item_password = variable_item_list_add(app->variable_item_list_wifi, "Password", 0, NULL, NULL);
     variable_item_set_current_value_text(app->variable_item_ssid, "");
     variable_item_set_current_value_text(app->variable_item_password, "");
 
     // Submenu
-    if(!easy_flipper_set_submenu(
-           &app->submenu_main,
-           FlipLibraryViewSubmenuMain,
-           "FlipLibrary v1.3",
-           callback_exit_app,
-           &app->view_dispatcher)) {
-        return NULL;
-    }
-    if(!easy_flipper_set_submenu(
-           &app->submenu_random_facts,
-           FlipLibraryViewRandomFacts,
-           "Random Facts",
-           callback_to_submenu,
-           &app->view_dispatcher)) {
-        return NULL;
-    }
-
-    submenu_add_item(
-        app->submenu_main,
-        "Random Fact",
-        FlipLibrarySubmenuIndexRandomFacts,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_main,
-        "Wikipedia",
-        FlipLibrarySubmenuIndexRandomFactsWiki,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_main,
-        "Dictionary",
-        FlipLibrarySubmenuIndexDictionary,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_main, "About", FlipLibrarySubmenuIndexAbout, callback_submenu_choices, app);
-    submenu_add_item(
-        app->submenu_main, "WiFi", FlipLibrarySubmenuIndexSettings, callback_submenu_choices, app);
+    if (!easy_flipper_set_submenu(&app->submenu_main, FlipLibraryViewSubmenuMain, "FlipLibrary v1.4", callback_exit_app, &app->view_dispatcher))
+    {
+        return NULL;
+    }
+    if (!easy_flipper_set_submenu(&app->submenu_library, FlipLibraryViewSubmenuLibrary, "Library", callback_to_submenu, &app->view_dispatcher))
+    {
+        return NULL;
+    }
+    if (!easy_flipper_set_submenu(&app->submenu_random_facts, FlipLibraryViewRandomFacts, "Random", callback_to_submenu_library, &app->view_dispatcher))
+    {
+        return NULL;
+    }
+    if (!easy_flipper_set_submenu(&app->submenu_predict, FlipLibraryViewPredict, "Predict", callback_to_submenu_library, &app->view_dispatcher))
+    {
+        return NULL;
+    }
+
+    submenu_add_item(app->submenu_main, "Library", FlipLibrarySubmenuIndexLibrary, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_main, "About", FlipLibrarySubmenuIndexAbout, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_main, "WiFi", FlipLibrarySubmenuIndexSettings, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Wikipedia", FlipLibrarySubmenuIndexWiki, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Dictionary", FlipLibrarySubmenuIndexDictionary, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Predict", FlipLibrarySubmenuIndexPredict, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Random", FlipLibrarySubmenuIndexRandomFacts, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Weather", FlipLibrarySubmenuIndexWeather, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "GPS", FlipLibrarySubmenuIndexGPS, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Elevation", FlipLibrarySubmenuIndexElevation, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Asset Price", FlipLibrarySubmenuIndexAssetPrice, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_library, "Next Holiday", FlipLibrarySubmenuIndexNextHoliday, callback_submenu_choices, app);
+    //
+    submenu_add_item(app->submenu_random_facts, "Trivia", FlipLibrarySubmenuIndexRandomTrivia, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Advice", FlipLibrarySubmenuIndexRandomAdvice, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Quote", FlipLibrarySubmenuIndexRandomFactsQuotes, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Fact", FlipLibrarySubmenuIndexRandomFactsAll, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Cat Fact", FlipLibrarySubmenuIndexRandomFactsCats, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Dog Fact", FlipLibrarySubmenuIndexRandomFactsDogs, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Tech Phrase", FlipLibrarySubmenuIndexRandomTechPhrase, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "UUID", FlipLibrarySubmenuIndexRandomUUID, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Address", FlipLibrarySubmenuIndexRandomAddress, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "Credit Card", FlipLibrarySubmenuIndexRandomCreditCard, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_random_facts, "User Info", FlipLibrarySubmenuIndexRandomUserInfo, callback_submenu_choices, app);
     //
-    submenu_add_item(
-        app->submenu_random_facts,
-        "Cats",
-        FlipLibrarySubmenuIndexRandomFactsCats,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_random_facts,
-        "Dogs",
-        FlipLibrarySubmenuIndexRandomFactsDogs,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_random_facts,
-        "Quotes",
-        FlipLibrarySubmenuIndexRandomFactsQuotes,
-        callback_submenu_choices,
-        app);
-    submenu_add_item(
-        app->submenu_random_facts,
-        "Random",
-        FlipLibrarySubmenuIndexRandomFactsAll,
-        callback_submenu_choices,
-        app);
+    submenu_add_item(app->submenu_predict, "Age", FlipLibrarySubmenuIndexPredictAge, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_predict, "Ethnicity", FlipLibrarySubmenuIndexPredictEthnicity, callback_submenu_choices, app);
+    submenu_add_item(app->submenu_predict, "Gender", FlipLibrarySubmenuIndexPredictGender, callback_submenu_choices, app);
 
     // load settings
-    if(load_settings(
-           app->uart_text_input_buffer_ssid,
-           app->uart_text_input_buffer_size_ssid,
-           app->uart_text_input_buffer_password,
-           app->uart_text_input_buffer_size_password)) {
+    if (load_settings(app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid, app->uart_text_input_buffer_password, app->uart_text_input_buffer_size_password))
+    {
         // Update variable items
-        if(app->variable_item_ssid) {
-            variable_item_set_current_value_text(
-                app->variable_item_ssid, app->uart_text_input_buffer_ssid);
+        if (app->variable_item_ssid)
+        {
+            variable_item_set_current_value_text(app->variable_item_ssid, app->uart_text_input_buffer_ssid);
         }
         // dont show password
 
         // Copy items into their temp buffers with safety checks
-        if(app->uart_text_input_buffer_ssid && app->uart_text_input_temp_buffer_ssid) {
-            strncpy(
-                app->uart_text_input_temp_buffer_ssid,
-                app->uart_text_input_buffer_ssid,
-                app->uart_text_input_buffer_size_ssid - 1);
-            app->uart_text_input_temp_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] =
-                '\0';
+        if (app->uart_text_input_buffer_ssid && app->uart_text_input_temp_buffer_ssid)
+        {
+            strncpy(app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid - 1);
+            app->uart_text_input_temp_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] = '\0';
         }
-        if(app->uart_text_input_buffer_password && app->uart_text_input_temp_buffer_password) {
-            strncpy(
-                app->uart_text_input_temp_buffer_password,
-                app->uart_text_input_buffer_password,
-                app->uart_text_input_buffer_size_password - 1);
-            app->uart_text_input_temp_buffer_password[app->uart_text_input_buffer_size_password - 1] =
-                '\0';
+        if (app->uart_text_input_buffer_password && app->uart_text_input_temp_buffer_password)
+        {
+            strncpy(app->uart_text_input_temp_buffer_password, app->uart_text_input_buffer_password, app->uart_text_input_buffer_size_password - 1);
+            app->uart_text_input_temp_buffer_password[app->uart_text_input_buffer_size_password - 1] = '\0';
         }
     }
 
@@ -240,4 +168,4 @@ FlipLibraryApp* flip_library_app_alloc() {
     view_dispatcher_switch_to_view(app->view_dispatcher, FlipLibraryViewSubmenuMain);
 
     return app;
-}
+}

+ 2 - 2
flip_library/alloc/flip_library_alloc.h

@@ -5,6 +5,6 @@
 #include <callback/flip_library_callback.h>
 
 // Function to allocate resources for the FlipLibraryApp
-FlipLibraryApp* flip_library_app_alloc();
+FlipLibraryApp *flip_library_app_alloc();
 
-#endif // FLIP_LIBRARY_I_H
+#endif // FLIP_LIBRARY_I_H

+ 15 - 9
flip_library/app.c

@@ -2,34 +2,40 @@
 #include <alloc/flip_library_alloc.h>
 
 // Entry point for the FlipLibrary application
-int32_t flip_library_app(void* p) {
+int32_t flip_library_app(void *p)
+{
     // Suppress unused parameter warning
     UNUSED(p);
 
     // Initialize the FlipLibrary application
     app_instance = flip_library_app_alloc();
-    if(!app_instance) {
+    if (!app_instance)
+    {
         FURI_LOG_E(TAG, "Failed to allocate FlipLibraryApp");
         return -1;
     }
 
-    if(!flipper_http_ping()) {
+    if (!flipper_http_ping())
+    {
         FURI_LOG_E(TAG, "Failed to ping the device");
         return -1;
     }
 
-    if(app_instance->uart_text_input_buffer_ssid != NULL &&
-       app_instance->uart_text_input_buffer_password != NULL) {
+    if (app_instance->uart_text_input_buffer_ssid != NULL &&
+        app_instance->uart_text_input_buffer_password != NULL)
+    {
         // Try to wait for pong response.
         uint8_t counter = 10;
-        while(fhttp.state == INACTIVE && --counter > 0) {
+        while (fhttp.state == INACTIVE && --counter > 0)
+        {
             FURI_LOG_D(TAG, "Waiting for PONG");
             furi_delay_ms(100);
         }
 
-        if(counter == 0) {
-            DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
-            DialogMessage* message = dialog_message_alloc();
+        if (counter == 0)
+        {
+            DialogsApp *dialogs = furi_record_open(RECORD_DIALOGS);
+            DialogMessage *message = dialog_message_alloc();
             dialog_message_set_header(
                 message, "[FlipperHTTP Error]", 64, 0, AlignCenter, AlignTop);
             dialog_message_set_text(

+ 2 - 2
flip_library/application.fam

@@ -7,8 +7,8 @@ App(
     fap_icon="app.png",
     fap_category="GPIO/FlipperHTTP",
     fap_icon_assets="assets",
-    fap_description="Dictionary, random facts, and more.",
+    fap_description="Utilize WiFi to retrieve data from 20 different APIs",
     fap_author="JBlanked",
     fap_weburl="https://github.com/jblanked/FlipLibrary",
-    fap_version="1.3.1",
+    fap_version = "1.4",
 )

BIN
flip_library/assets/01-main.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 873 - 132
flip_library/callback/flip_library_callback.c


+ 30 - 32
flip_library/callback/flip_library_callback.h

@@ -6,7 +6,8 @@
 #define MAX_TOKENS 512 // Adjust based on expected JSON size
 
 typedef enum FactState FactState;
-enum FactState {
+enum FactState
+{
     FactStateInitial,
     FactStateRequested,
     FactStateReceived,
@@ -16,70 +17,67 @@ enum FactState {
 };
 
 typedef enum FlipLibraryCustomEvent FlipLibraryCustomEvent;
-enum FlipLibraryCustomEvent {
+enum FlipLibraryCustomEvent
+{
     FlipLibraryCustomEventProcess,
 };
 
 typedef struct FactLoaderModel FactLoaderModel;
-typedef bool (*FactLoaderFetch)(FactLoaderModel* model);
-typedef char* (*FactLoaderParser)(FactLoaderModel* model);
-struct FactLoaderModel {
-    char* title;
-    char* fact_text;
+typedef bool (*FactLoaderFetch)(FactLoaderModel *model);
+typedef char *(*FactLoaderParser)(FactLoaderModel *model);
+struct FactLoaderModel
+{
+    char *title;
+    char *fact_text;
     FactState fact_state;
     FactLoaderFetch fetcher;
     FactLoaderParser parser;
-    void* parser_context;
+    void *parser_context;
     size_t request_index;
     size_t request_count;
     ViewNavigationCallback back_callback;
-    FuriTimer* timer;
+    FuriTimer *timer;
 };
 
 extern uint32_t random_facts_index;
 extern bool sent_random_fact_request;
 extern bool random_fact_request_success;
 extern bool random_fact_request_success_all;
-extern char* random_fact;
+extern char *random_fact;
 
-void flip_library_generic_switch_to_view(
-    FlipLibraryApp* app,
-    char* title,
-    FactLoaderFetch fetcher,
-    FactLoaderParser parser,
-    size_t request_count,
-    ViewNavigationCallback back,
-    uint32_t view_id);
+void flip_library_generic_switch_to_view(FlipLibraryApp *app, char *title, FactLoaderFetch fetcher, FactLoaderParser parser, size_t request_count, ViewNavigationCallback back, uint32_t view_id);
 
-void flip_library_loader_draw_callback(Canvas* canvas, void* model);
+void flip_library_loader_draw_callback(Canvas *canvas, void *model);
 
-void flip_library_loader_init(View* view);
+void flip_library_loader_init(View *view);
 
-void flip_library_loader_free_model(View* view);
+void flip_library_loader_free_model(View *view);
 
-bool flip_library_custom_event_callback(void* context, uint32_t index);
+bool flip_library_custom_event_callback(void *context, uint32_t index);
 
-void callback_submenu_choices(void* context, uint32_t index);
+void callback_submenu_choices(void *context, uint32_t index);
 
-void text_updated_ssid(void* context);
+void text_updated_ssid(void *context);
 
-void text_updated_password(void* context);
+void text_updated_password(void *context);
 
-void text_updated_query(void* context);
+void text_updated_query(void *context);
 
-uint32_t callback_to_submenu(void* context);
+uint32_t callback_to_submenu(void *context);
 
-uint32_t callback_to_wifi_settings(void* context);
+uint32_t callback_to_wifi_settings(void *context);
 
-uint32_t callback_to_random_facts(void* context);
+uint32_t callback_to_random_facts(void *context);
 
-void settings_item_selected(void* context, uint32_t index);
+void settings_item_selected(void *context, uint32_t index);
 
 /**
  * @brief Navigation callback for exiting the application
  * @param context The context - unused
  * @return next view id (VIEW_NONE to exit the app)
  */
-uint32_t callback_exit_app(void* context);
+uint32_t callback_exit_app(void *context);
+uint32_t callback_to_submenu_predict(void *context);
+uint32_t callback_to_submenu_library(void *context);
 
-#endif // FLIP_LIBRARY_CALLBACK_H
+#endif // FLIP_LIBRARY_CALLBACK_H

+ 198 - 139
flip_library/easy_flipper/easy_flipper.c

@@ -5,9 +5,11 @@
  * @param context The context - unused
  * @return next view id (VIEW_NONE to exit the app)
  */
-uint32_t easy_flipper_callback_exit_app(void* context) {
+uint32_t easy_flipper_callback_exit_app(void *context)
+{
     // Exit the application
-    if(!context) {
+    if (!context)
+    {
         FURI_LOG_E(EASY_TAG, "Context is NULL");
         return VIEW_NONE;
     }
@@ -21,13 +23,16 @@ uint32_t easy_flipper_callback_exit_app(void* context) {
  * @param buffer_size The size of the buffer
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_buffer(char** buffer, uint32_t buffer_size) {
-    if(!buffer) {
+bool easy_flipper_set_buffer(char **buffer, uint32_t buffer_size)
+{
+    if (!buffer)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_buffer");
         return false;
     }
-    *buffer = (char*)malloc(buffer_size);
-    if(!*buffer) {
+    *buffer = (char *)malloc(buffer_size);
+    if (!*buffer)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate buffer");
         return false;
     }
@@ -46,32 +51,39 @@ bool easy_flipper_set_buffer(char** buffer, uint32_t buffer_size) {
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_view(
-    View** view,
+    View **view,
     int32_t view_id,
-    void draw_callback(Canvas*, void*),
-    bool input_callback(InputEvent*, void*),
-    uint32_t (*previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!view || !view_dispatcher) {
+    void draw_callback(Canvas *, void *),
+    bool input_callback(InputEvent *, void *),
+    uint32_t (*previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!view || !view_dispatcher)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_view");
         return false;
     }
     *view = view_alloc();
-    if(!*view) {
+    if (!*view)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate View");
         return false;
     }
-    if(draw_callback) {
+    if (draw_callback)
+    {
         view_set_draw_callback(*view, draw_callback);
     }
-    if(input_callback) {
+    if (input_callback)
+    {
         view_set_input_callback(*view, input_callback);
     }
-    if(context) {
+    if (context)
+    {
         view_set_context(*view, context);
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(*view, previous_callback);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, *view);
@@ -85,18 +97,22 @@ bool easy_flipper_set_view(
  * @param context The context to pass to the event callback
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_view_dispatcher(ViewDispatcher** view_dispatcher, Gui* gui, void* context) {
-    if(!view_dispatcher) {
+bool easy_flipper_set_view_dispatcher(ViewDispatcher **view_dispatcher, Gui *gui, void *context)
+{
+    if (!view_dispatcher)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_view_dispatcher");
         return false;
     }
     *view_dispatcher = view_dispatcher_alloc();
-    if(!*view_dispatcher) {
+    if (!*view_dispatcher)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate ViewDispatcher");
         return false;
     }
     view_dispatcher_attach_to_gui(*view_dispatcher, gui, ViewDispatcherTypeFullscreen);
-    if(context) {
+    if (context)
+    {
         view_dispatcher_set_event_callback_context(*view_dispatcher, context);
     }
     return true;
@@ -113,24 +129,29 @@ bool easy_flipper_set_view_dispatcher(ViewDispatcher** view_dispatcher, Gui* gui
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_submenu(
-    Submenu** submenu,
+    Submenu **submenu,
     int32_t view_id,
-    char* title,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher) {
-    if(!submenu) {
+    char *title,
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher)
+{
+    if (!submenu)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_submenu");
         return false;
     }
     *submenu = submenu_alloc();
-    if(!*submenu) {
+    if (!*submenu)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate Submenu");
         return false;
     }
-    if(title) {
+    if (title)
+    {
         submenu_set_header(*submenu, title);
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(submenu_get_view(*submenu), previous_callback);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, submenu_get_view(*submenu));
@@ -147,20 +168,24 @@ bool easy_flipper_set_submenu(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_menu(
-    Menu** menu,
+    Menu **menu,
     int32_t view_id,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher) {
-    if(!menu) {
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher)
+{
+    if (!menu)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_menu");
         return false;
     }
     *menu = menu_alloc();
-    if(!*menu) {
+    if (!*menu)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate Menu");
         return false;
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(menu_get_view(*menu), previous_callback);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, menu_get_view(*menu));
@@ -177,24 +202,29 @@ bool easy_flipper_set_menu(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_widget(
-    Widget** widget,
+    Widget **widget,
     int32_t view_id,
-    char* text,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher) {
-    if(!widget) {
+    char *text,
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher)
+{
+    if (!widget)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_widget");
         return false;
     }
     *widget = widget_alloc();
-    if(!*widget) {
+    if (!*widget)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate Widget");
         return false;
     }
-    if(text) {
+    if (text)
+    {
         widget_add_text_scroll_element(*widget, 0, 0, 128, 64, text);
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(widget_get_view(*widget), previous_callback);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, widget_get_view(*widget));
@@ -213,30 +243,33 @@ bool easy_flipper_set_widget(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_variable_item_list(
-    VariableItemList** variable_item_list,
+    VariableItemList **variable_item_list,
     int32_t view_id,
-    void (*enter_callback)(void*, uint32_t),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!variable_item_list) {
+    void (*enter_callback)(void *, uint32_t),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!variable_item_list)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_variable_item_list");
         return false;
     }
     *variable_item_list = variable_item_list_alloc();
-    if(!*variable_item_list) {
+    if (!*variable_item_list)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate VariableItemList");
         return false;
     }
-    if(enter_callback) {
+    if (enter_callback)
+    {
         variable_item_list_set_enter_callback(*variable_item_list, enter_callback, context);
     }
-    if(previous_callback) {
-        view_set_previous_callback(
-            variable_item_list_get_view(*variable_item_list), previous_callback);
+    if (previous_callback)
+    {
+        view_set_previous_callback(variable_item_list_get_view(*variable_item_list), previous_callback);
     }
-    view_dispatcher_add_view(
-        *view_dispatcher, view_id, variable_item_list_get_view(*variable_item_list));
+    view_dispatcher_add_view(*view_dispatcher, view_id, variable_item_list_get_view(*variable_item_list));
     return true;
 }
 
@@ -249,38 +282,38 @@ bool easy_flipper_set_variable_item_list(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_text_input(
-    TextInput** text_input,
+    TextInput **text_input,
     int32_t view_id,
-    char* header_text,
-    char* text_input_temp_buffer,
+    char *header_text,
+    char *text_input_temp_buffer,
     uint32_t text_input_buffer_size,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!text_input) {
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!text_input)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_text_input");
         return false;
     }
     *text_input = text_input_alloc();
-    if(!*text_input) {
+    if (!*text_input)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate TextInput");
         return false;
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(text_input_get_view(*text_input), previous_callback);
     }
-    if(header_text) {
+    if (header_text)
+    {
         text_input_set_header_text(*text_input, header_text);
     }
-    if(text_input_temp_buffer && text_input_buffer_size && result_callback) {
-        text_input_set_result_callback(
-            *text_input,
-            result_callback,
-            context,
-            text_input_temp_buffer,
-            text_input_buffer_size,
-            false);
+    if (text_input_temp_buffer && text_input_buffer_size && result_callback)
+    {
+        text_input_set_result_callback(*text_input, result_callback, context, text_input_temp_buffer, text_input_buffer_size, false);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, text_input_get_view(*text_input));
     return true;
@@ -295,38 +328,38 @@ bool easy_flipper_set_text_input(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_uart_text_input(
-    TextInput** uart_text_input,
+    TextInput **uart_text_input,
     int32_t view_id,
-    char* header_text,
-    char* uart_text_input_temp_buffer,
+    char *header_text,
+    char *uart_text_input_temp_buffer,
     uint32_t uart_text_input_buffer_size,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!uart_text_input) {
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!uart_text_input)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_uart_text_input");
         return false;
     }
     *uart_text_input = text_input_alloc();
-    if(!*uart_text_input) {
+    if (!*uart_text_input)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate UART_TextInput");
         return false;
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(text_input_get_view(*uart_text_input), previous_callback);
     }
-    if(header_text) {
+    if (header_text)
+    {
         text_input_set_header_text(*uart_text_input, header_text);
     }
-    if(uart_text_input_temp_buffer && uart_text_input_buffer_size && result_callback) {
-        text_input_set_result_callback(
-            *uart_text_input,
-            result_callback,
-            context,
-            uart_text_input_temp_buffer,
-            uart_text_input_buffer_size,
-            false);
+    if (uart_text_input_temp_buffer && uart_text_input_buffer_size && result_callback)
+    {
+        text_input_set_result_callback(*uart_text_input, result_callback, context, uart_text_input_temp_buffer, uart_text_input_buffer_size, false);
     }
     text_input_show_illegal_symbols(*uart_text_input, true);
     view_dispatcher_add_view(*view_dispatcher, view_id, text_input_get_view(*uart_text_input));
@@ -353,52 +386,63 @@ bool easy_flipper_set_uart_text_input(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_dialog_ex(
-    DialogEx** dialog_ex,
+    DialogEx **dialog_ex,
     int32_t view_id,
-    char* header,
+    char *header,
     uint16_t header_x,
     uint16_t header_y,
-    char* text,
+    char *text,
     uint16_t text_x,
     uint16_t text_y,
-    char* left_button_text,
-    char* right_button_text,
-    char* center_button_text,
-    void (*result_callback)(DialogExResult, void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!dialog_ex) {
+    char *left_button_text,
+    char *right_button_text,
+    char *center_button_text,
+    void (*result_callback)(DialogExResult, void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!dialog_ex)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_dialog_ex");
         return false;
     }
     *dialog_ex = dialog_ex_alloc();
-    if(!*dialog_ex) {
+    if (!*dialog_ex)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate DialogEx");
         return false;
     }
-    if(header) {
+    if (header)
+    {
         dialog_ex_set_header(*dialog_ex, header, header_x, header_y, AlignLeft, AlignTop);
     }
-    if(text) {
+    if (text)
+    {
         dialog_ex_set_text(*dialog_ex, text, text_x, text_y, AlignLeft, AlignTop);
     }
-    if(left_button_text) {
+    if (left_button_text)
+    {
         dialog_ex_set_left_button_text(*dialog_ex, left_button_text);
     }
-    if(right_button_text) {
+    if (right_button_text)
+    {
         dialog_ex_set_right_button_text(*dialog_ex, right_button_text);
     }
-    if(center_button_text) {
+    if (center_button_text)
+    {
         dialog_ex_set_center_button_text(*dialog_ex, center_button_text);
     }
-    if(result_callback) {
+    if (result_callback)
+    {
         dialog_ex_set_result_callback(*dialog_ex, result_callback);
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(dialog_ex_get_view(*dialog_ex), previous_callback);
     }
-    if(context) {
+    if (context)
+    {
         dialog_ex_set_context(*dialog_ex, context);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, dialog_ex_get_view(*dialog_ex));
@@ -422,40 +466,48 @@ bool easy_flipper_set_dialog_ex(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_popup(
-    Popup** popup,
+    Popup **popup,
     int32_t view_id,
-    char* header,
+    char *header,
     uint16_t header_x,
     uint16_t header_y,
-    char* text,
+    char *text,
     uint16_t text_x,
     uint16_t text_y,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context) {
-    if(!popup) {
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context)
+{
+    if (!popup)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_popup");
         return false;
     }
     *popup = popup_alloc();
-    if(!*popup) {
+    if (!*popup)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate Popup");
         return false;
     }
-    if(header) {
+    if (header)
+    {
         popup_set_header(*popup, header, header_x, header_y, AlignLeft, AlignTop);
     }
-    if(text) {
+    if (text)
+    {
         popup_set_text(*popup, text, text_x, text_y, AlignLeft, AlignTop);
     }
-    if(result_callback) {
+    if (result_callback)
+    {
         popup_set_callback(*popup, result_callback);
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(popup_get_view(*popup), previous_callback);
     }
-    if(context) {
+    if (context)
+    {
         popup_set_context(*popup, context);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, popup_get_view(*popup));
@@ -471,20 +523,24 @@ bool easy_flipper_set_popup(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_loading(
-    Loading** loading,
+    Loading **loading,
     int32_t view_id,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher) {
-    if(!loading) {
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher)
+{
+    if (!loading)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_loading");
         return false;
     }
     *loading = loading_alloc();
-    if(!*loading) {
+    if (!*loading)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate Loading");
         return false;
     }
-    if(previous_callback) {
+    if (previous_callback)
+    {
         view_set_previous_callback(loading_get_view(*loading), previous_callback);
     }
     view_dispatcher_add_view(*view_dispatcher, view_id, loading_get_view(*loading));
@@ -497,16 +553,19 @@ bool easy_flipper_set_loading(
  * @param buffer The buffer to copy the string to
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_char_to_furi_string(FuriString** furi_string, char* buffer) {
-    if(!furi_string) {
+bool easy_flipper_set_char_to_furi_string(FuriString **furi_string, char *buffer)
+{
+    if (!furi_string)
+    {
         FURI_LOG_E(EASY_TAG, "Invalid arguments provided to set_buffer_to_furi_string");
         return false;
     }
     *furi_string = furi_string_alloc();
-    if(!furi_string) {
+    if (!furi_string)
+    {
         FURI_LOG_E(EASY_TAG, "Failed to allocate FuriString");
         return false;
     }
     furi_string_set_str(*furi_string, buffer);
     return true;
-}
+}

+ 61 - 61
flip_library/easy_flipper/easy_flipper.h

@@ -28,14 +28,14 @@
  * @param context The context - unused
  * @return next view id (VIEW_NONE to exit the app)
  */
-uint32_t easy_flipper_callback_exit_app(void* context);
+uint32_t easy_flipper_callback_exit_app(void *context);
 /**
  * @brief Initialize a buffer
  * @param buffer The buffer to initialize
  * @param buffer_size The size of the buffer
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_buffer(char** buffer, uint32_t buffer_size);
+bool easy_flipper_set_buffer(char **buffer, uint32_t buffer_size);
 /**
  * @brief Initialize a View object
  * @param view The View object to initialize
@@ -47,13 +47,13 @@ bool easy_flipper_set_buffer(char** buffer, uint32_t buffer_size);
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_view(
-    View** view,
+    View **view,
     int32_t view_id,
-    void draw_callback(Canvas*, void*),
-    bool input_callback(InputEvent*, void*),
-    uint32_t (*previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    void draw_callback(Canvas *, void *),
+    bool input_callback(InputEvent *, void *),
+    uint32_t (*previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a ViewDispatcher object
@@ -62,7 +62,7 @@ bool easy_flipper_set_view(
  * @param context The context to pass to the event callback
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_view_dispatcher(ViewDispatcher** view_dispatcher, Gui* gui, void* context);
+bool easy_flipper_set_view_dispatcher(ViewDispatcher **view_dispatcher, Gui *gui, void *context);
 
 /**
  * @brief Initialize a Submenu object
@@ -75,11 +75,11 @@ bool easy_flipper_set_view_dispatcher(ViewDispatcher** view_dispatcher, Gui* gui
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_submenu(
-    Submenu** submenu,
+    Submenu **submenu,
     int32_t view_id,
-    char* title,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher);
+    char *title,
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher);
 
 /**
  * @brief Initialize a Menu object
@@ -92,10 +92,10 @@ bool easy_flipper_set_submenu(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_menu(
-    Menu** menu,
+    Menu **menu,
     int32_t view_id,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher);
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher);
 
 /**
  * @brief Initialize a Widget object
@@ -107,11 +107,11 @@ bool easy_flipper_set_menu(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_widget(
-    Widget** widget,
+    Widget **widget,
     int32_t view_id,
-    char* text,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher);
+    char *text,
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher);
 
 /**
  * @brief Initialize a VariableItemList object
@@ -125,12 +125,12 @@ bool easy_flipper_set_widget(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_variable_item_list(
-    VariableItemList** variable_item_list,
+    VariableItemList **variable_item_list,
     int32_t view_id,
-    void (*enter_callback)(void*, uint32_t),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    void (*enter_callback)(void *, uint32_t),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a TextInput object
@@ -141,15 +141,15 @@ bool easy_flipper_set_variable_item_list(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_text_input(
-    TextInput** text_input,
+    TextInput **text_input,
     int32_t view_id,
-    char* header_text,
-    char* text_input_temp_buffer,
+    char *header_text,
+    char *text_input_temp_buffer,
     uint32_t text_input_buffer_size,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a TextInput object with extra symbols
@@ -160,15 +160,15 @@ bool easy_flipper_set_text_input(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_uart_text_input(
-    TextInput** uart_text_input,
+    TextInput **uart_text_input,
     int32_t view_id,
-    char* header_text,
-    char* uart_text_input_temp_buffer,
+    char *header_text,
+    char *uart_text_input_temp_buffer,
     uint32_t uart_text_input_buffer_size,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a DialogEx object
@@ -190,21 +190,21 @@ bool easy_flipper_set_uart_text_input(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_dialog_ex(
-    DialogEx** dialog_ex,
+    DialogEx **dialog_ex,
     int32_t view_id,
-    char* header,
+    char *header,
     uint16_t header_x,
     uint16_t header_y,
-    char* text,
+    char *text,
     uint16_t text_x,
     uint16_t text_y,
-    char* left_button_text,
-    char* right_button_text,
-    char* center_button_text,
-    void (*result_callback)(DialogExResult, void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    char *left_button_text,
+    char *right_button_text,
+    char *center_button_text,
+    void (*result_callback)(DialogExResult, void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a Popup object
@@ -223,18 +223,18 @@ bool easy_flipper_set_dialog_ex(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_popup(
-    Popup** popup,
+    Popup **popup,
     int32_t view_id,
-    char* header,
+    char *header,
     uint16_t header_x,
     uint16_t header_y,
-    char* text,
+    char *text,
     uint16_t text_x,
     uint16_t text_y,
-    void (*result_callback)(void*),
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher,
-    void* context);
+    void (*result_callback)(void *),
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher,
+    void *context);
 
 /**
  * @brief Initialize a Loading object
@@ -245,10 +245,10 @@ bool easy_flipper_set_popup(
  * @return true if successful, false otherwise
  */
 bool easy_flipper_set_loading(
-    Loading** loading,
+    Loading **loading,
     int32_t view_id,
-    uint32_t(previous_callback)(void*),
-    ViewDispatcher** view_dispatcher);
+    uint32_t(previous_callback)(void *),
+    ViewDispatcher **view_dispatcher);
 
 /**
  * @brief Set a char butter to a FuriString
@@ -256,6 +256,6 @@ bool easy_flipper_set_loading(
  * @param buffer The buffer to copy the string to
  * @return true if successful, false otherwise
  */
-bool easy_flipper_set_char_to_furi_string(FuriString** furi_string, char* buffer);
+bool easy_flipper_set_char_to_furi_string(FuriString **furi_string, char *buffer);
 
-#endif
+#endif

+ 39 - 16
flip_library/flip_library.c

@@ -1,59 +1,80 @@
 #include "flip_library.h"
 
-FlipLibraryApp* app_instance = NULL;
+FlipLibraryApp *app_instance = NULL;
 
-void flip_library_loader_free_model(View* view);
+void flip_library_loader_free_model(View *view);
 
 // Function to free the resources used by FlipLibraryApp
-void flip_library_app_free(FlipLibraryApp* app) {
-    if(!app) {
+void flip_library_app_free(FlipLibraryApp *app)
+{
+    if (!app)
+    {
         FURI_LOG_E(TAG, "FlipLibraryApp is NULL");
         return;
     }
 
     // Free View(s)
-    if(app->view_loader) {
+    if (app->view_loader)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewLoader);
         flip_library_loader_free_model(app->view_loader);
         view_free(app->view_loader);
     }
 
     // Free Submenu(s)
-    if(app->submenu_main) {
+    if (app->submenu_main)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewSubmenuMain);
         submenu_free(app->submenu_main);
     }
-    if(app->submenu_random_facts) {
+    if (app->submenu_library)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewSubmenuLibrary);
+        submenu_free(app->submenu_library);
+    }
+    if (app->submenu_random_facts)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewRandomFacts);
         submenu_free(app->submenu_random_facts);
     }
+    if (app->submenu_predict)
+    {
+        view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewPredict);
+        submenu_free(app->submenu_predict);
+    }
 
     // Free Widget(s)
-    if(app->widget_about) {
+    if (app->widget_about)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewAbout);
         widget_free(app->widget_about);
     }
-    if(app->widget_result) {
+    if (app->widget_result)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewWidgetResult);
         widget_free(app->widget_result);
     }
 
     // Free Variable Item List(s)
-    if(app->variable_item_list_wifi) {
+    if (app->variable_item_list_wifi)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewSettings);
         variable_item_list_free(app->variable_item_list_wifi);
     }
 
     // Free Text Input(s)
-    if(app->uart_text_input_ssid) {
+    if (app->uart_text_input_ssid)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewTextInputSSID);
         text_input_free(app->uart_text_input_ssid);
     }
-    if(app->uart_text_input_password) {
+    if (app->uart_text_input_password)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewTextInputPassword);
         text_input_free(app->uart_text_input_password);
     }
-    if(app->uart_text_input_query) {
+    if (app->uart_text_input_query)
+    {
         view_dispatcher_remove_view(app->view_dispatcher, FlipLibraryViewTextInputQuery);
         text_input_free(app->uart_text_input_query);
     }
@@ -62,18 +83,20 @@ void flip_library_app_free(FlipLibraryApp* app) {
     flipper_http_deinit();
 
     // free the view dispatcher
-    if(app->view_dispatcher) {
+    if (app->view_dispatcher)
+    {
         view_dispatcher_free(app->view_dispatcher);
     }
 
     // close the gui
     furi_record_close(RECORD_GUI);
 
-    if(app_instance) {
+    if (app_instance)
+    {
         // free the app instance
         free(app_instance);
         app_instance = NULL;
     }
     // free the app
     free(app);
-}
+}

+ 64 - 38
flip_library/flip_library.h

@@ -16,62 +16,88 @@
 #define TAG "FlipLibrary"
 
 // Define the submenu items for our FlipLibrary application
-typedef enum {
+typedef enum
+{
     FlipLibrarySubmenuIndexRandomFacts, // Click to run the random facts
-    FlipLibrarySubmenuIndexDictionary, // click to view the dictionary variable item list
-    FlipLibrarySubmenuIndexAbout, // Click to view the about screen
-    FlipLibrarySubmenuIndexSettings, // Click to view the WiFi settings
+    FlipLibrarySubmenuIndexDictionary,  // click to view the dictionary variable item list
+    FlipLibrarySubmenuIndexAbout,       // Click to view the about screen
+    FlipLibrarySubmenuIndexSettings,    // Click to view the WiFi settings
+    FlipLibrarySubmenuIndexLibrary,     // Click to view the library
     //
-    FlipLibrarySubmenuIndexRandomFactsCats, // Click to view the random facts (cats)
-    FlipLibrarySubmenuIndexRandomFactsDogs, // Click to view the random facts (dogs)
+    FlipLibrarySubmenuIndexRandomFactsCats,   // Click to view the random facts (cats)
+    FlipLibrarySubmenuIndexRandomFactsDogs,   // Click to view the random facts (dogs)
     FlipLibrarySubmenuIndexRandomFactsQuotes, // Click to view the random facts (quotes)
-    FlipLibrarySubmenuIndexRandomFactsAll, // Click to view the random facts (all)
-    FlipLibrarySubmenuIndexRandomFactsWiki, // Click to view the random facts (wiki)
+    FlipLibrarySubmenuIndexRandomFactsAll,    // Click to view the random facts (all)
+    FlipLibrarySubmenuIndexRandomAdvice,      // Click to view the random (advice)
+    FlipLibrarySubmenuIndexRandomTrivia,      // Click to view the random trivia
+    FlipLibrarySubmenuIndexRandomTechPhrase,  // Click to view the random tech phrase
+    FlipLibrarySubmenuIndexRandomUUID,        // Click to view the random UUID
+    FlipLibrarySubmenuIndexRandomAddress,     // Click to view the random address
+    FlipLibrarySubmenuIndexRandomCreditCard,  // Click to view the random credit card
+    FlipLibrarySubmenuIndexRandomUserInfo,    // Click to view the random user info
+    FlipLibrarySubmenuIndexWiki,              // Click to view the Wikipedia search
+    //
+    FlipLibrarySubmenuIndexGPS,         // Click to view the GPS
+    FlipLibrarySubmenuIndexWeather,     // Click to view the weather
+    FlipLibrarySubmenuIndexElevation,   // Click to view the elevation
+    FlipLibrarySubmenuIndexAssetPrice,  // Click to view the asset price
+    FlipLibrarySubmenuIndexNextHoliday, // Click to view the next holiday
+    //
+    FlipLibrarySubmenuIndexPredict,          // Click to view the predict submenu
+    FlipLibrarySubmenuIndexPredictGender,    // Click to view the predict gender view,
+    FlipLibrarySubmenuIndexPredictAge,       // Click to view the predict age
+    FlipLibrarySubmenuIndexPredictEthnicity, // Click to view the predict
 } FlipLibrarySubmenuIndex;
 
 // Define a single view for our FlipLibrary application
-typedef enum {
-    FlipLibraryViewRandomFacts = 7, // The random facts main screen
-    FlipLibraryViewLoader, // The loader screen retrieves data from the internet
-    FlipLibraryViewSubmenuMain, // The submenu screen
-    FlipLibraryViewAbout, // The about screen
-    FlipLibraryViewSettings, // The settings screen
-    FlipLibraryViewTextInputSSID, // The text input screen (SSID)
+typedef enum
+{
+    FlipLibraryViewRandomFacts,       // The random facts main screen
+    FlipLibraryViewLoader,            // The loader screen retrieves data from the internet
+    FlipLibraryViewSubmenuMain,       // The submenu screen
+    FlipLibraryViewAbout,             // The about screen
+    FlipLibraryViewSettings,          // The settings screen
+    FlipLibraryViewTextInputSSID,     // The text input screen (SSID)
     FlipLibraryViewTextInputPassword, // The text input screen (password)
-    FlipLibraryViewTextInputQuery, // Query the user for information
-    FlipLibraryViewWidgetResult, // The text box that displays the random fact
+    FlipLibraryViewTextInputQuery,    // Query the user for information
+    FlipLibraryViewWidgetResult,      // The text box that displays the result
+    FlipLibraryViewPredict,           // The predict screen
+    FlipLibraryViewSubmenuLibrary,    // The library submenu
 } FlipLibraryView;
 
 // Each screen will have its own view
-typedef struct {
-    ViewDispatcher* view_dispatcher; // Switches between our views
-    View* view_loader; // The screen that loads data from internet
-    Submenu* submenu_main; // The submenu for the main screen
-    Submenu* submenu_random_facts; // The submenu for the random facts screen
-    Widget* widget_about; // The widget for the about screen
-    VariableItemList* variable_item_list_wifi; // The variable item list (WiFi settings)
-    VariableItem* variable_item_ssid; // The variable item (SSID)
-    VariableItem* variable_item_password; // The variable item (password)
-    TextInput* uart_text_input_ssid; // The text input for the SSID
-    TextInput* uart_text_input_password; // The text input for the password
-    TextInput* uart_text_input_query; // The text input for querying information
+typedef struct
+{
+    ViewDispatcher *view_dispatcher;           // Switches between our views
+    View *view_loader;                         // The screen that loads data from internet
+    Submenu *submenu_main;                     // The submenu for the main screen
+    Submenu *submenu_library;                  // The submenu for the library screen
+    Submenu *submenu_random_facts;             // The submenu for the random facts screen
+    Submenu *submenu_predict;                  // The submenu for the predict screen
+    Widget *widget_about;                      // The widget for the about screen
+    VariableItemList *variable_item_list_wifi; // The variable item list (WiFi settings)
+    VariableItem *variable_item_ssid;          // The variable item (SSID)
+    VariableItem *variable_item_password;      // The variable item (password)
+    TextInput *uart_text_input_ssid;      // The text input for the SSID
+    TextInput *uart_text_input_password;  // The text input for the password
+    TextInput *uart_text_input_query;     // The text input for querying information
     //
-    Widget* widget_result; // The text box that displays the result
+    Widget *widget_result; // The text box that displays the result
 
-    char* uart_text_input_buffer_ssid; // Buffer for the text input (SSID)
-    char* uart_text_input_temp_buffer_ssid; // Temporary buffer for the text input (SSID)
+    char *uart_text_input_buffer_ssid;         // Buffer for the text input (SSID)
+    char *uart_text_input_temp_buffer_ssid;    // Temporary buffer for the text input (SSID)
     uint32_t uart_text_input_buffer_size_ssid; // Size of the text input buffer (SSID)
 
-    char* uart_text_input_buffer_password; // Buffer for the text input (password)
-    char* uart_text_input_temp_buffer_password; // Temporary buffer for the text input (password)
+    char *uart_text_input_buffer_password;         // Buffer for the text input (password)
+    char *uart_text_input_temp_buffer_password;    // Temporary buffer for the text input (password)
     uint32_t uart_text_input_buffer_size_password; // Size of the text input buffer (password)
 
-    char* uart_text_input_buffer_query; // Buffer for the text input (query)
-    char* uart_text_input_temp_buffer_query; // Temporary buffer for the text input (query)
+    char *uart_text_input_buffer_query;         // Buffer for the text input (query)
+    char *uart_text_input_temp_buffer_query;    // Temporary buffer for the text input (query)
     uint32_t uart_text_input_buffer_size_query; // Size of the text input buffer (query)
 } FlipLibraryApp;
 
 // Function to free the resources used by FlipLibraryApp
-void flip_library_app_free(FlipLibraryApp* app);
-extern FlipLibraryApp* app_instance;
+void flip_library_app_free(FlipLibraryApp *app);
+extern FlipLibraryApp *app_instance;
 #endif // FLIP_LIBRARY_E_H

+ 32 - 20
flip_library/flip_storage/flip_library_storage.c

@@ -1,18 +1,21 @@
 #include <flip_storage/flip_library_storage.h>
 
-void save_settings(const char* ssid, const char* password) {
+void save_settings(
+    const char *ssid,
+    const char *password)
+{
     // Create the directory for saving settings
     char directory_path[256];
-    snprintf(
-        directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_library");
+    snprintf(directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/flip_library");
 
     // Create the directory
-    Storage* storage = furi_record_open(RECORD_STORAGE);
+    Storage *storage = furi_record_open(RECORD_STORAGE);
     storage_common_mkdir(storage, directory_path);
 
     // Open the settings file
-    File* file = storage_file_alloc(storage);
-    if(!storage_file_open(file, SETTINGS_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
+    File *file = storage_file_alloc(storage);
+    if (!storage_file_open(file, SETTINGS_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS))
+    {
         FURI_LOG_E(TAG, "Failed to open settings file for writing: %s", SETTINGS_PATH);
         storage_file_free(file);
         furi_record_close(RECORD_STORAGE);
@@ -21,15 +24,17 @@ void save_settings(const char* ssid, const char* password) {
 
     // Save the ssid length and data
     size_t ssid_length = strlen(ssid) + 1; // Include null terminator
-    if(storage_file_write(file, &ssid_length, sizeof(size_t)) != sizeof(size_t) ||
-       storage_file_write(file, ssid, ssid_length) != ssid_length) {
+    if (storage_file_write(file, &ssid_length, sizeof(size_t)) != sizeof(size_t) ||
+        storage_file_write(file, ssid, ssid_length) != ssid_length)
+    {
         FURI_LOG_E(TAG, "Failed to write SSID");
     }
 
     // Save the password length and data
     size_t password_length = strlen(password) + 1; // Include null terminator
-    if(storage_file_write(file, &password_length, sizeof(size_t)) != sizeof(size_t) ||
-       storage_file_write(file, password, password_length) != password_length) {
+    if (storage_file_write(file, &password_length, sizeof(size_t)) != sizeof(size_t) ||
+        storage_file_write(file, password, password_length) != password_length)
+    {
         FURI_LOG_E(TAG, "Failed to write password");
     }
 
@@ -38,11 +43,17 @@ void save_settings(const char* ssid, const char* password) {
     furi_record_close(RECORD_STORAGE);
 }
 
-bool load_settings(char* ssid, size_t ssid_size, char* password, size_t password_size) {
-    Storage* storage = furi_record_open(RECORD_STORAGE);
-    File* file = storage_file_alloc(storage);
+bool load_settings(
+    char *ssid,
+    size_t ssid_size,
+    char *password,
+    size_t password_size)
+{
+    Storage *storage = furi_record_open(RECORD_STORAGE);
+    File *file = storage_file_alloc(storage);
 
-    if(!storage_file_open(file, SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) {
+    if (!storage_file_open(file, SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING))
+    {
         FURI_LOG_E(TAG, "Failed to open settings file for reading: %s", SETTINGS_PATH);
         storage_file_free(file);
         furi_record_close(RECORD_STORAGE);
@@ -51,8 +62,9 @@ bool load_settings(char* ssid, size_t ssid_size, char* password, size_t password
 
     // Load the ssid
     size_t ssid_length;
-    if(storage_file_read(file, &ssid_length, sizeof(size_t)) != sizeof(size_t) ||
-       ssid_length > ssid_size || storage_file_read(file, ssid, ssid_length) != ssid_length) {
+    if (storage_file_read(file, &ssid_length, sizeof(size_t)) != sizeof(size_t) || ssid_length > ssid_size ||
+        storage_file_read(file, ssid, ssid_length) != ssid_length)
+    {
         FURI_LOG_E(TAG, "Failed to read SSID");
         storage_file_close(file);
         storage_file_free(file);
@@ -63,9 +75,9 @@ bool load_settings(char* ssid, size_t ssid_size, char* password, size_t password
 
     // Load the password
     size_t password_length;
-    if(storage_file_read(file, &password_length, sizeof(size_t)) != sizeof(size_t) ||
-       password_length > password_size ||
-       storage_file_read(file, password, password_length) != password_length) {
+    if (storage_file_read(file, &password_length, sizeof(size_t)) != sizeof(size_t) || password_length > password_size ||
+        storage_file_read(file, password, password_length) != password_length)
+    {
         FURI_LOG_E(TAG, "Failed to read password");
         storage_file_close(file);
         storage_file_free(file);
@@ -79,4 +91,4 @@ bool load_settings(char* ssid, size_t ssid_size, char* password, size_t password
     furi_record_close(RECORD_STORAGE);
 
     return true;
-}
+}

+ 3 - 3
flip_library/flip_storage/flip_library_storage.h

@@ -6,8 +6,8 @@
 #include <flip_library.h>
 #define SETTINGS_PATH STORAGE_EXT_PATH_PREFIX "/apps_data/flip_library/settings.bin"
 
-void save_settings(const char* ssid, const char* password);
+void save_settings(const char *ssid, const char *password);
 
-bool load_settings(char* ssid, size_t ssid_size, char* password, size_t password_size);
+bool load_settings(char *ssid, size_t ssid_size, char *password, size_t password_size);
 
-#endif // FLIP_LIBRARY_STORAGE_H
+#endif // FLIP_LIBRARY_STORAGE_H

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 294 - 166
flip_library/flipper_http/flipper_http.c


+ 62 - 59
flip_library/flipper_http/flipper_http.h

@@ -11,69 +11,72 @@
 
 // STORAGE_EXT_PATH_PREFIX is defined in the Furi SDK as /ext
 
-#define HTTP_TAG               "FlipLibrary" // change this to your app name
-#define http_tag               "flip_library" // change this to your app id
-#define UART_CH                (momentum_settings.uart_esp_channel) // UART channel
+#define HTTP_TAG "FlipLibrary"            // change this to your app name
+#define http_tag "flip_library"           // change this to your app id
+#define UART_CH (momentum_settings.uart_esp_channel)    // UART channel
 #define TIMEOUT_DURATION_TICKS (5 * 1000) // 5 seconds
-#define BAUDRATE               (115200) // UART baudrate
-#define RX_BUF_SIZE            1024 // UART RX buffer size
-#define RX_LINE_BUFFER_SIZE    4096 // UART RX line buffer size (increase for large responses)
-#define MAX_FILE_SHOW          4096 // Maximum data from file to show
-#define FILE_BUFFER_SIZE       512 // File buffer size
+#define BAUDRATE (115200)                 // UART baudrate
+#define RX_BUF_SIZE 1024                  // UART RX buffer size
+#define RX_LINE_BUFFER_SIZE 4224          // UART RX line buffer size (increase for large responses)
+#define MAX_FILE_SHOW 4224                // Maximum data from file to show
+#define FILE_BUFFER_SIZE 512              // File buffer size
 
 // Forward declaration for callback
-typedef void (*FlipperHTTP_Callback)(const char* line, void* context);
+typedef void (*FlipperHTTP_Callback)(const char *line, void *context);
 
 // State variable to track the UART state
-typedef enum {
-    INACTIVE, // Inactive state
-    IDLE, // Default state
+typedef enum
+{
+    INACTIVE,  // Inactive state
+    IDLE,      // Default state
     RECEIVING, // Receiving data
-    SENDING, // Sending data
-    ISSUE, // Issue with connection
+    SENDING,   // Sending data
+    ISSUE,     // Issue with connection
 } SerialState;
 
 // Event Flags for UART Worker Thread
-typedef enum {
+typedef enum
+{
     WorkerEvtStop = (1 << 0),
     WorkerEvtRxDone = (1 << 1),
 } WorkerEvtFlags;
 
 // FlipperHTTP Structure
-typedef struct {
-    FuriStreamBuffer* flipper_http_stream; // Stream buffer for UART communication
-    FuriHalSerialHandle* serial_handle; // Serial handle for UART communication
-    FuriThread* rx_thread; // Worker thread for UART
-    FuriThreadId rx_thread_id; // Worker thread ID
+typedef struct
+{
+    FuriStreamBuffer *flipper_http_stream;  // Stream buffer for UART communication
+    FuriHalSerialHandle *serial_handle;     // Serial handle for UART communication
+    FuriThread *rx_thread;                  // Worker thread for UART
+    FuriThreadId rx_thread_id;              // Worker thread ID
     FlipperHTTP_Callback handle_rx_line_cb; // Callback for received lines
-    void* callback_context; // Context for the callback
-    SerialState state; // State of the UART
+    void *callback_context;                 // Context for the callback
+    SerialState state;                      // State of the UART
 
     // variable to store the last received data from the UART
-    char* last_response;
+    char *last_response;
     char file_path[256]; // Path to save the received data
 
     // Timer-related members
-    FuriTimer* get_timeout_timer; // Timer for HTTP request timeout
+    FuriTimer *get_timeout_timer; // Timer for HTTP request timeout
 
     bool started_receiving_get; // Indicates if a GET request has started
-    bool just_started_get; // Indicates if GET data reception has just started
+    bool just_started_get;      // Indicates if GET data reception has just started
 
     bool started_receiving_post; // Indicates if a POST request has started
-    bool just_started_post; // Indicates if POST data reception has just started
+    bool just_started_post;      // Indicates if POST data reception has just started
 
     bool started_receiving_put; // Indicates if a PUT request has started
-    bool just_started_put; // Indicates if PUT data reception has just started
+    bool just_started_put;      // Indicates if PUT data reception has just started
 
     bool started_receiving_delete; // Indicates if a DELETE request has started
-    bool just_started_delete; // Indicates if DELETE data reception has just started
+    bool just_started_delete;      // Indicates if DELETE data reception has just started
 
     // Buffer to hold the raw bytes received from the UART
-    uint8_t* received_bytes;
+    uint8_t *received_bytes;
     size_t received_bytes_len; // Length of the received bytes
-    bool is_bytes_request; // Flag to indicate if the request is for bytes
-    bool save_bytes; // Flag to save the received data to a file
-    bool save_received_data; // Flag to save the received data to a file
+    bool is_bytes_request;     // Flag to indicate if the request is for bytes
+    bool save_bytes;           // Flag to save the received data to a file
+    bool save_received_data;   // Flag to save the received data to a file
 
     bool just_started_bytes; // Indicates if bytes data reception has just started
 } FlipperHTTP;
@@ -88,12 +91,12 @@ extern uint8_t file_buffer[FILE_BUFFER_SIZE];
 // Function to append received data to file
 // make sure to initialize the file path before calling this function
 bool flipper_http_append_to_file(
-    const void* data,
+    const void *data,
     size_t data_size,
     bool start_new_file,
-    char* file_path);
+    char *file_path);
 
-FuriString* flipper_http_load_from_file(char* file_path);
+FuriString *flipper_http_load_from_file(char *file_path);
 
 // UART worker thread
 /**
@@ -103,7 +106,7 @@ FuriString* flipper_http_load_from_file(char* file_path);
  * @note       This function will handle received data asynchronously via the callback.
  */
 // UART worker thread
-int32_t flipper_http_worker(void* context);
+int32_t flipper_http_worker(void *context);
 
 // Timer callback function
 /**
@@ -112,7 +115,7 @@ int32_t flipper_http_worker(void* context);
  * @param      context   The context to pass to the callback.
  * @note       This function will be called when the GET request times out.
  */
-void get_timeout_timer_callback(void* context);
+void get_timeout_timer_callback(void *context);
 
 // UART RX Handler Callback (Interrupt Context)
 /**
@@ -124,9 +127,9 @@ void get_timeout_timer_callback(void* context);
  * @note       This function will handle received data asynchronously via the callback.
  */
 void _flipper_http_rx_callback(
-    FuriHalSerialHandle* handle,
+    FuriHalSerialHandle *handle,
     FuriHalSerialRxEvent event,
-    void* context);
+    void *context);
 
 // UART initialization function
 /**
@@ -136,7 +139,7 @@ void _flipper_http_rx_callback(
  * @param      context   The context to pass to the callback.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_init(FlipperHTTP_Callback callback, void* context);
+bool flipper_http_init(FlipperHTTP_Callback callback, void *context);
 
 // Deinitialize UART
 /**
@@ -153,7 +156,7 @@ void flipper_http_deinit();
  * @param      data  The data to send over UART.
  * @note       The data will be sent over UART with a newline character appended.
  */
-bool flipper_http_send_data(const char* data);
+bool flipper_http_send_data(const char *data);
 
 // Function to send a PING request
 /**
@@ -197,7 +200,7 @@ bool flipper_http_led_off();
  * @param      json_data The JSON data to parse.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_parse_json(const char* key, const char* json_data);
+bool flipper_http_parse_json(const char *key, const char *json_data);
 
 // Function to parse JSON array data
 /**
@@ -208,7 +211,7 @@ bool flipper_http_parse_json(const char* key, const char* json_data);
  * @param      json_data The JSON array data to parse.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_parse_json_array(const char* key, int index, const char* json_data);
+bool flipper_http_parse_json_array(const char *key, int index, const char *json_data);
 
 // Function to scan for WiFi networks
 /**
@@ -224,7 +227,7 @@ bool flipper_http_scan_wifi();
  * @return     true if the request was successful, false otherwise.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_save_wifi(const char* ssid, const char* password);
+bool flipper_http_save_wifi(const char *ssid, const char *password);
 
 // Function to get IP address of WiFi Devboard
 /**
@@ -265,7 +268,7 @@ bool flipper_http_connect_wifi();
  * @param      url  The URL to send the GET request to.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_get_request(const char* url);
+bool flipper_http_get_request(const char *url);
 
 // Function to send a GET request with headers
 /**
@@ -275,7 +278,7 @@ bool flipper_http_get_request(const char* url);
  * @param      headers  The headers to send with the GET request.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_get_request_with_headers(const char* url, const char* headers);
+bool flipper_http_get_request_with_headers(const char *url, const char *headers);
 
 // Function to send a GET request with headers and return bytes
 /**
@@ -285,7 +288,7 @@ bool flipper_http_get_request_with_headers(const char* url, const char* headers)
  * @param      headers  The headers to send with the GET request.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_get_request_bytes(const char* url, const char* headers);
+bool flipper_http_get_request_bytes(const char *url, const char *headers);
 
 // Function to send a POST request with headers
 /**
@@ -297,9 +300,9 @@ bool flipper_http_get_request_bytes(const char* url, const char* headers);
  * @note       The received data will be handled asynchronously via the callback.
  */
 bool flipper_http_post_request_with_headers(
-    const char* url,
-    const char* headers,
-    const char* payload);
+    const char *url,
+    const char *headers,
+    const char *payload);
 
 // Function to send a POST request with headers and return bytes
 /**
@@ -310,7 +313,7 @@ bool flipper_http_post_request_with_headers(
  * @param      payload  The data to send with the POST request.
  * @note       The received data will be handled asynchronously via the callback.
  */
-bool flipper_http_post_request_bytes(const char* url, const char* headers, const char* payload);
+bool flipper_http_post_request_bytes(const char *url, const char *headers, const char *payload);
 
 // Function to send a PUT request with headers
 /**
@@ -322,9 +325,9 @@ bool flipper_http_post_request_bytes(const char* url, const char* headers, const
  * @note       The received data will be handled asynchronously via the callback.
  */
 bool flipper_http_put_request_with_headers(
-    const char* url,
-    const char* headers,
-    const char* payload);
+    const char *url,
+    const char *headers,
+    const char *payload);
 
 // Function to send a DELETE request with headers
 /**
@@ -336,9 +339,9 @@ bool flipper_http_put_request_with_headers(
  * @note       The received data will be handled asynchronously via the callback.
  */
 bool flipper_http_delete_request_with_headers(
-    const char* url,
-    const char* headers,
-    const char* payload);
+    const char *url,
+    const char *headers,
+    const char *payload);
 
 // Function to handle received data asynchronously
 /**
@@ -348,10 +351,10 @@ bool flipper_http_delete_request_with_headers(
  * @param      context  The context passed to the callback.
  * @note       The received data will be handled asynchronously via the callback and handles the state of the UART.
  */
-void flipper_http_rx_callback(const char* line, void* context);
+void flipper_http_rx_callback(const char *line, void *context);
 
 // Function to trim leading and trailing spaces and newlines from a constant string
-char* trim(const char* str);
+char *trim(const char *str);
 /**
  * @brief Process requests and parse JSON data asynchronously
  * @param http_request The function to send the request

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