فهرست منبع

[FL-1542], [FL-1603] Generate random name (#602)

* Lib: add random name library
* Text_input: add default text clearing
* All: rework all applications with new text_input API
* Nfc: fix removing dev file on save_name scene enter
* Lib: move all free radicals to toolbox and update API usage.

Co-authored-by: あく <alleteam@gmail.com>
gornekich 4 سال پیش
والد
کامیت
ebd158a823
39فایلهای تغییر یافته به همراه142 افزوده شده و 132 حذف شده
  1. 2 1
      applications/archive/archive.c
  2. 0 1
      applications/cli/cli.c
  3. 0 1
      applications/dolphin/dolphin_views.c
  4. 2 1
      applications/gui-test/gui-test.c
  5. 18 5
      applications/gui/modules/text_input.c
  6. 3 1
      applications/gui/modules/text_input.h
  7. 1 36
      applications/ibutton/ibutton-app.cpp
  8. 0 2
      applications/ibutton/ibutton-app.h
  9. 1 1
      applications/ibutton/ibutton-cli.cpp
  10. 6 4
      applications/ibutton/scene/ibutton-scene-save-name.cpp
  11. 2 1
      applications/irda/scene/irda-app-scene-edit-rename.cpp
  12. 2 1
      applications/irda/scene/irda-app-scene-learn-enter-name.cpp
  13. 0 35
      applications/lfrfid/helpers/rfid-name-generator.cpp
  14. 0 4
      applications/lfrfid/helpers/rfid-name-generator.h
  15. 1 4
      applications/lfrfid/lfrfid-app.cpp
  16. 1 1
      applications/lfrfid/lfrfid-cli.cpp
  17. 9 4
      applications/lfrfid/scene/lfrfid-app-scene-save-name.cpp
  18. 2 2
      applications/nfc/nfc_device.c
  19. 13 4
      applications/nfc/scenes/nfc_scene_save_name.c
  20. 1 1
      applications/storage/storage-cli.c
  21. 1 1
      bootloader/targets/f6/target.c
  22. 4 5
      bootloader/targets/f6/target.mk
  23. 0 1
      core/flipper.c
  24. 1 1
      firmware/targets/api-hal-include/api-hal-version.h
  25. 1 1
      lib/app-scened-template/file-worker-cpp.cpp
  26. 1 1
      lib/app-scened-template/file-worker.c
  27. 4 3
      lib/app-scened-template/view-modules/text-input-vm.cpp
  28. 3 1
      lib/app-scened-template/view-modules/text-input-vm.h
  29. 3 8
      lib/lib.mk
  30. 0 0
      lib/toolbox/args.c
  31. 0 0
      lib/toolbox/args.h
  32. 0 0
      lib/toolbox/hex.c
  33. 0 0
      lib/toolbox/hex.h
  34. 0 0
      lib/toolbox/path.c
  35. 0 0
      lib/toolbox/path.h
  36. 43 0
      lib/toolbox/random_name.c
  37. 17 0
      lib/toolbox/random_name.h
  38. 0 0
      lib/toolbox/version.c
  39. 0 0
      lib/toolbox/version.h

+ 2 - 1
applications/archive/archive.c

@@ -297,7 +297,8 @@ static void archive_enter_text_input(ArchiveApp* archive) {
         archive_text_input_callback,
         archive,
         archive->browser.text_input_buffer,
-        MAX_NAME_LEN);
+        MAX_NAME_LEN,
+        false);
 
     view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewTextInput);
 }

+ 0 - 1
applications/cli/cli.c

@@ -1,7 +1,6 @@
 #include "cli_i.h"
 #include "cli_commands.h"
 
-#include <version.h>
 #include <api-hal-version.h>
 #include <loader/loader.h>
 

+ 0 - 1
applications/dolphin/dolphin_views.c

@@ -3,7 +3,6 @@
 #include <gui/gui.h>
 #include <gui/elements.h>
 #include <api-hal.h>
-#include <version.h>
 #include <api-hal-version.h>
 
 static char* Lockmenu_Items[3] = {"Lock", "Set PIN", "DUMB mode"};

+ 2 - 1
applications/gui-test/gui-test.c

@@ -192,7 +192,8 @@ int32_t gui_test(void* param) {
         text_input_callback,
         gui_tester,
         text_input_text,
-        text_input_text_len);
+        text_input_text_len,
+        false);
     text_input_set_header_text(gui_tester->text_input, "Name the key");
 
     const uint8_t byte_input_bytes_len = 16;

+ 18 - 5
applications/gui/modules/text_input.c

@@ -16,6 +16,7 @@ typedef struct {
     const char* header;
     char* text_buffer;
     size_t text_buffer_size;
+    bool clear_default_text;
 
     TextInputCallback callback;
     void* callback_context;
@@ -128,7 +129,7 @@ static const char char_to_uppercase(const char letter) {
 }
 
 static void text_input_backspace_cb(TextInputModel* model) {
-    uint8_t text_length = strlen(model->text_buffer);
+    uint8_t text_length = model->clear_default_text ? 1 : strlen(model->text_buffer);
     if(text_length > 0) {
         model->text_buffer[text_length - 1] = 0;
     }
@@ -158,11 +159,16 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) {
         text++;
     }
 
+    if(model->clear_default_text) {
+        elements_slightly_rounded_box(
+            canvas, start_pos - 1, 14, canvas_string_width(canvas, text) + 2, 10);
+        canvas_set_color(canvas, ColorWhite);
+    } else {
+        canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 22, "|");
+        canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 22, "|");
+    }
     canvas_draw_str(canvas, start_pos, 22, text);
 
-    canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 22, "|");
-    canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 22, "|");
-
     canvas_set_font(canvas, FontKeyboard);
 
     for(uint8_t row = 0; row <= keyboard_row_count; row++) {
@@ -295,12 +301,16 @@ static void text_input_handle_ok(TextInput* text_input) {
             } else if(selected == BACKSPACE_KEY) {
                 text_input_backspace_cb(model);
             } else if(text_length < (model->text_buffer_size - 1)) {
+                if(model->clear_default_text) {
+                    text_length = 0;
+                }
                 if(text_length == 0 && char_is_lowercase(selected)) {
                     selected = char_to_uppercase(selected);
                 }
                 model->text_buffer[text_length] = selected;
                 model->text_buffer[text_length + 1] = 0;
             }
+            model->clear_default_text = false;
             return true;
         });
 }
@@ -365,6 +375,7 @@ TextInput* text_input_alloc() {
             model->header = "";
             model->selected_row = 0;
             model->selected_column = 0;
+            model->clear_default_text = false;
             return true;
         });
 
@@ -387,13 +398,15 @@ void text_input_set_result_callback(
     TextInputCallback callback,
     void* callback_context,
     char* text_buffer,
-    size_t text_buffer_size) {
+    size_t text_buffer_size,
+    bool clear_default_text) {
     with_view_model(
         text_input->view, (TextInputModel * model) {
             model->callback = callback;
             model->callback_context = callback_context;
             model->text_buffer = text_buffer;
             model->text_buffer_size = text_buffer_size;
+            model->clear_default_text = clear_default_text;
             return true;
         });
 }

+ 3 - 1
applications/gui/modules/text_input.h

@@ -39,13 +39,15 @@ View* text_input_get_view(TextInput* text_input);
  * @param callback_context - callback context
  * @param text_buffer - pointer to YOUR text buffer, that we going to modify
  * @param text_buffer_size - YOUR text buffer size in bytes. Max string length will be text_buffer_size - 1.
+ * @param clear_default_text - clear text from text_buffer on first OK event
  */
 void text_input_set_result_callback(
     TextInput* text_input,
     TextInputCallback callback,
     void* callback_context,
     char* text_buffer,
-    size_t text_buffer_size);
+    size_t text_buffer_size,
+    bool clear_default_text);
 
 /** 
  * @brief Set text input header text

+ 1 - 36
applications/ibutton/ibutton-app.cpp

@@ -3,7 +3,7 @@
 #include <callback-connector.h>
 #include <m-string.h>
 #include <file-worker-cpp.h>
-#include <path.h>
+#include <lib/toolbox/path.h>
 
 const char* iButtonApp::app_folder = "/any/ibutton";
 const char* iButtonApp::app_extension = ".ibtn";
@@ -40,9 +40,6 @@ iButtonApp::iButtonApp()
     : notification{"notification"} {
     api_hal_power_insomnia_enter();
     key_worker = new KeyWorker(&ibutton_gpio);
-
-    // we need random
-    srand(DWT->CYCCNT);
 }
 
 iButtonApp::~iButtonApp() {
@@ -186,38 +183,6 @@ uint8_t iButtonApp::get_text_store_size() {
     return text_store_size;
 }
 
-void iButtonApp::generate_random_name(char* name, uint8_t max_name_size) {
-    const uint8_t prefix_size = 9;
-    const char* prefix[prefix_size] = {
-        "ancient",
-        "hollow",
-        "strange",
-        "disappeared",
-        "unknown",
-        "unthinkable",
-        "unnamable",
-        "nameless",
-        "my",
-    };
-
-    const uint8_t suffix_size = 8;
-    const char* suffix[suffix_size] = {
-        "door",
-        "entrance",
-        "doorway",
-        "entry",
-        "portal",
-        "entree",
-        "opening",
-        "crack",
-    };
-
-    sniprintf(
-        name, max_name_size, "%s_%s", prefix[rand() % prefix_size], suffix[rand() % suffix_size]);
-    // to upper
-    name[0] = name[0] - 0x20;
-}
-
 // file managment
 bool iButtonApp::save_key(const char* key_name) {
     // Create ibutton directory if necessary

+ 0 - 2
applications/ibutton/ibutton-app.h

@@ -90,8 +90,6 @@ public:
     char* get_file_name();
     uint8_t get_file_name_size();
 
-    void generate_random_name(char* name, uint8_t max_name_size);
-
     bool save_key(const char* key_name);
     bool load_key();
     bool load_key(const char* key_name);

+ 1 - 1
applications/ibutton/ibutton-cli.cpp

@@ -2,7 +2,7 @@
 #include <api-hal.h>
 #include <stdarg.h>
 #include <cli/cli.h>
-#include <args.h>
+#include <lib/toolbox/args.h>
 
 #include "helpers/key-info.h"
 #include "helpers/key-worker.h"

+ 6 - 4
applications/ibutton/scene/ibutton-scene-save-name.cpp

@@ -4,6 +4,7 @@
 #include "../ibutton-event.h"
 #include "../ibutton-key.h"
 #include <callback-connector.h>
+#include <lib/toolbox/random_name.h>
 
 void iButtonSceneSaveName::on_enter(iButtonApp* app) {
     iButtonAppViewManager* view_manager = app->get_view_manager();
@@ -12,16 +13,17 @@ void iButtonSceneSaveName::on_enter(iButtonApp* app) {
 
     iButtonKey* key = app->get_key();
     const char* key_name = key->get_name();
+    bool key_name_empty = !strcmp(key_name, "");
 
-    if(strcmp(key_name, "") == 0) {
-        app->generate_random_name(app->get_text_store(), app->get_text_store_size());
+    if(key_name_empty) {
+        set_random_name(app->get_text_store(), app->get_text_store_size());
     } else {
         app->set_text_store("%s", key_name);
     }
 
     text_input_set_header_text(text_input, "Name the key");
     text_input_set_result_callback(
-        text_input, callback, app, app->get_text_store(), IBUTTON_KEY_NAME_SIZE);
+        text_input, callback, app, app->get_text_store(), IBUTTON_KEY_NAME_SIZE, key_name_empty);
 
     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewTextInput);
 }
@@ -47,7 +49,7 @@ bool iButtonSceneSaveName::on_event(iButtonApp* app, iButtonEvent* event) {
 void iButtonSceneSaveName::on_exit(iButtonApp* app) {
     TextInput* text_input = app->get_view_manager()->get_text_input();
     text_input_set_header_text(text_input, "");
-    text_input_set_result_callback(text_input, NULL, NULL, NULL, 0);
+    text_input_set_result_callback(text_input, NULL, NULL, NULL, 0, false);
 }
 
 void iButtonSceneSaveName::text_input_callback(void* context) {

+ 2 - 1
applications/irda/scene/irda-app-scene-edit-rename.cpp

@@ -20,7 +20,8 @@ void IrdaAppSceneEditRename::on_enter(IrdaApp* app) {
         IrdaApp::text_input_callback,
         app,
         app->get_text_store(0),
-        app->get_text_store_size());
+        app->get_text_store_size(),
+        false);
 
     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput);
 }

+ 2 - 1
applications/irda/scene/irda-app-scene-learn-enter-name.cpp

@@ -26,7 +26,8 @@ void IrdaAppSceneLearnEnterName::on_enter(IrdaApp* app) {
         IrdaApp::text_input_callback,
         app,
         app->get_text_store(0),
-        app->get_text_store_size());
+        app->get_text_store_size(),
+        false);
 
     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput);
 }

+ 0 - 35
applications/lfrfid/helpers/rfid-name-generator.cpp

@@ -1,35 +0,0 @@
-#include "rfid-name-generator.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-void rfid_generate_random_name(char* name, uint8_t max_name_size) {
-    const uint8_t prefix_size = 9;
-    const char* prefix[prefix_size] = {
-        "good",
-        "nice",
-        "best",
-        "some",
-        "strange",
-        "working",
-        "that",
-        "forgettable",
-        "easy",
-    };
-
-    const uint8_t suffix_size = 7;
-    const char* suffix[suffix_size] = {
-        "pass",
-        "card",
-        "key",
-        "fob",
-        "permit",
-        "pass",
-        "one",
-    };
-
-    sniprintf(
-        name, max_name_size, "%s_%s", prefix[rand() % prefix_size], suffix[rand() % suffix_size]);
-
-    // to upper
-    name[0] = name[0] - ('a' - 'A');
-}

+ 0 - 4
applications/lfrfid/helpers/rfid-name-generator.h

@@ -1,4 +0,0 @@
-#pragma once
-#include "stdint.h"
-
-void rfid_generate_random_name(char* name, uint8_t max_name_size);

+ 1 - 4
applications/lfrfid/lfrfid-app.cpp

@@ -17,7 +17,7 @@
 #include "scene/lfrfid-app-scene-delete-success.h"
 
 #include <file-worker-cpp.h>
-#include <path.h>
+#include <lib/toolbox/path.h>
 
 const char* LfRfidApp::app_folder = "/any/lfrfid";
 const char* LfRfidApp::app_extension = ".rfid";
@@ -27,9 +27,6 @@ LfRfidApp::LfRfidApp()
     , notification{"notification"}
     , text_store(40) {
     api_hal_power_insomnia_enter();
-
-    // we need random
-    srand(DWT->CYCCNT);
 }
 
 LfRfidApp::~LfRfidApp() {

+ 1 - 1
applications/lfrfid/lfrfid-cli.cpp

@@ -2,7 +2,7 @@
 #include <api-hal.h>
 #include <stdarg.h>
 #include <cli/cli.h>
-#include <args.h>
+#include <lib/toolbox/args.h>
 
 #include "helpers/rfid-reader.h"
 #include "helpers/rfid-timer-emulator.h"

+ 9 - 4
applications/lfrfid/scene/lfrfid-app-scene-save-name.cpp

@@ -1,11 +1,12 @@
 #include "lfrfid-app-scene-save-name.h"
-#include "../helpers/rfid-name-generator.h"
+#include <lib/toolbox/random_name.h>
 
 void LfRfidAppSceneSaveName::on_enter(LfRfidApp* app, bool need_restore) {
     const char* key_name = app->worker.key.get_name();
 
-    if(strcmp(key_name, "") == 0) {
-        rfid_generate_random_name(app->text_store.text, app->text_store.text_size);
+    bool key_name_empty = !strcmp(key_name, "");
+    if(key_name_empty) {
+        set_random_name(app->text_store.text, app->text_store.text_size);
     } else {
         app->text_store.set("%s", key_name);
     }
@@ -14,7 +15,11 @@ void LfRfidAppSceneSaveName::on_enter(LfRfidApp* app, bool need_restore) {
     text_input->set_header_text("Name the card");
 
     text_input->set_result_callback(
-        save_callback, app, app->text_store.text, app->worker.key.get_name_length());
+        save_callback,
+        app,
+        app->text_store.text,
+        app->worker.key.get_name_length(),
+        key_name_empty);
 
     app->view_controller.switch_to<TextInputVM>();
 }

+ 2 - 2
applications/nfc/nfc_device.c

@@ -1,8 +1,8 @@
 #include "nfc_device_i.h"
 
 #include <file-worker.h>
-#include <path.h>
-#include <hex.h>
+#include <lib/toolbox/path.h>
+#include <lib/toolbox/hex.h>
 
 #define NFC_DEVICE_MAX_DATA_LEN 14
 

+ 13 - 4
applications/nfc/scenes/nfc_scene_save_name.c

@@ -1,4 +1,5 @@
 #include "../nfc_i.h"
+#include <lib/toolbox/random_name.h>
 
 #define SCENE_SAVE_NAME_CUSTOM_EVENT (0UL)
 
@@ -13,17 +14,21 @@ const void nfc_scene_save_name_on_enter(void* context) {
 
     // Setup view
     TextInput* text_input = nfc->text_input;
-    if(nfc->dev.dev_name) {
-        nfc_device_delete(&nfc->dev);
+    bool dev_name_empty = false;
+    if(!strcmp(nfc->dev.dev_name, "")) {
+        set_random_name(nfc->text_store, sizeof(nfc->text_store));
+        dev_name_empty = true;
+    } else {
+        nfc_text_store_set(nfc, nfc->dev.dev_name);
     }
-    nfc_text_store_set(nfc, nfc->dev.dev_name);
     text_input_set_header_text(text_input, "Name the card");
     text_input_set_result_callback(
         text_input,
         nfc_scene_save_name_text_input_callback,
         nfc,
         nfc->text_store,
-        sizeof(nfc->text_store));
+        NFC_DEV_NAME_MAX_LEN,
+        dev_name_empty);
     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextInput);
 }
 
@@ -32,6 +37,9 @@ const bool nfc_scene_save_name_on_event(void* context, SceneManagerEvent event)
 
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == SCENE_SAVE_NAME_CUSTOM_EVENT) {
+            if(nfc->dev.dev_name) {
+                nfc_device_delete(&nfc->dev);
+            }
             memcpy(&nfc->dev.dev_name, nfc->text_store, strlen(nfc->text_store));
             if(nfc_device_save(&nfc->dev, nfc->text_store)) {
                 scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess);
@@ -49,4 +57,5 @@ const void nfc_scene_save_name_on_exit(void* context) {
 
     // Clear view
     text_input_set_header_text(nfc->text_input, NULL);
+    text_input_set_result_callback(nfc->text_input, NULL, NULL, NULL, 0, false);
 }

+ 1 - 1
applications/storage/storage-cli.c

@@ -1,6 +1,6 @@
 #include <furi.h>
 #include <cli/cli.h>
-#include <args.h>
+#include <lib/toolbox/args.h>
 #include <storage/storage.h>
 #include <storage/storage-sd-api.h>
 #include <api-hal-version.h>

+ 1 - 1
bootloader/targets/f6/target.c

@@ -9,7 +9,7 @@
 #include <stm32wbxx_ll_gpio.h>
 #include <stm32wbxx_hal_flash.h>
 
-#include <version.h>
+#include <lib/toolbox/version.h>
 #include <api-hal.h>
 
 // Boot request enum

+ 4 - 5
bootloader/targets/f6/target.mk

@@ -12,7 +12,7 @@ MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
 CFLAGS			+= $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32WB55xx -Wall -fdata-sections -ffunction-sections
 LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs 
 
-CUBE_DIR		= ../lib/STM32CubeWB
+CUBE_DIR		= $(PROJECT_ROOT)/lib/STM32CubeWB
 
 # ST HAL
 CFLAGS			+=  -DUSE_FULL_LL_DRIVER
@@ -29,7 +29,7 @@ CFLAGS			+= -I$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Inc
 LDFLAGS			+= -T$(TARGET_DIR)/stm32wb55xx_flash_cm4.ld
 
 # Drivers
-DRIVERS_DIR		= ../lib/drivers
+DRIVERS_DIR		= $(PROJECT_ROOT)//lib/drivers
 CFLAGS			+= -I$(DRIVERS_DIR)
 C_SOURCES		+= $(DRIVERS_DIR)/lp5562.c
 
@@ -38,11 +38,10 @@ CFLAGS			+= -I$(TARGET_DIR)/api-hal
 C_SOURCES		+= $(wildcard $(TARGET_DIR)/api-hal/*.c)
 
 # Version generation
-CFLAGS			+= -I../lib/version
-C_SOURCES		+= ../lib/version/version.c
+C_SOURCES		+= $(PROJECT_ROOT)/lib/toolbox/version.c
 
 ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s)
 C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c)
 CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp)
 
-SVD_FILE = ../debug/STM32WB55_CM4.svd
+SVD_FILE		= $(PROJECT_ROOT)/debug/STM32WB55_CM4.svd

+ 0 - 1
core/flipper.c

@@ -1,7 +1,6 @@
 #include "flipper.h"
 #include <applications.h>
 #include <furi.h>
-#include <version.h>
 #include <api-hal-version.h>
 
 static void flipper_print_version(const char* target, const Version* version) {

+ 1 - 1
firmware/targets/api-hal-include/api-hal-version.h

@@ -3,7 +3,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <string.h>
-#include <version.h>
+#include <lib/toolbox/version.h>
 
 #ifdef __cplusplus
 extern "C" {

+ 1 - 1
lib/app-scened-template/file-worker-cpp.cpp

@@ -1,5 +1,5 @@
 #include "file-worker-cpp.h"
-#include <hex.h>
+#include <lib/toolbox/hex.h>
 
 FileWorkerCpp::FileWorkerCpp(bool _silent) {
     file_worker = file_worker_alloc(_silent);

+ 1 - 1
lib/app-scened-template/file-worker.c

@@ -1,6 +1,6 @@
 #include "file-worker.h"
 #include "m-string.h"
-#include <hex.h>
+#include <lib/toolbox/hex.h>
 #include <dialogs/dialogs.h>
 #include <furi.h>
 

+ 4 - 3
lib/app-scened-template/view-modules/text-input-vm.cpp

@@ -13,7 +13,7 @@ View* TextInputVM::get_view() {
 }
 
 void TextInputVM::clean() {
-    set_result_callback(NULL, NULL, NULL, 0);
+    set_result_callback(NULL, NULL, NULL, 0, false);
     set_header_text("");
 }
 
@@ -21,8 +21,9 @@ void TextInputVM::set_result_callback(
     TextInputCallback callback,
     void* callback_context,
     char* text,
-    uint8_t max_text_length) {
-    text_input_set_result_callback(text_input, callback, callback_context, text, max_text_length);
+    uint8_t max_text_length,
+    bool clear_default_text) {
+    text_input_set_result_callback(text_input, callback, callback_context, text, max_text_length, clear_default_text);
 }
 
 void TextInputVM::set_header_text(const char* text) {

+ 3 - 1
lib/app-scened-template/view-modules/text-input-vm.h

@@ -16,12 +16,14 @@ public:
      * @param callback_context - callback context
      * @param text - text buffer to use
      * @param max_text_length - text buffer length
+     * @param clear_default_text - clears given buffer on OK event
      */
     void set_result_callback(
         TextInputCallback callback,
         void* callback_context,
         char* text,
-        uint8_t max_text_length);
+        uint8_t max_text_length,
+        bool clear_default_text);
 
     /** 
      * @brief Set text input header text

+ 3 - 8
lib/lib.mk

@@ -85,10 +85,6 @@ CFLAGS			+= -I$(LIB_DIR)/common-api
 CFLAGS			+= -I$(LIB_DIR)/drivers
 C_SOURCES		+= $(wildcard $(LIB_DIR)/drivers/*.c)
 
-#version
-CFLAGS			+= -I$(LIB_DIR)/version
-C_SOURCES		+= $(LIB_DIR)/version/version.c
-
 #file reader
 CFLAGS			+= -I$(LIB_DIR)/file_reader
 CPP_SOURCES		+= $(wildcard $(LIB_DIR)/file_reader/*.cpp)
@@ -100,10 +96,6 @@ C_SOURCES		+= $(wildcard $(LIB_DIR)/irda/encoder_decoder/*.c)
 C_SOURCES		+= $(wildcard $(LIB_DIR)/irda/encoder_decoder/*/*.c)
 C_SOURCES		+= $(wildcard $(LIB_DIR)/irda/worker/*.c)
 
-#args lib
-CFLAGS			+= -I$(LIB_DIR)/args
-C_SOURCES		+= $(wildcard $(LIB_DIR)/args/*.c)
-
 # SubGhz
 C_SOURCES		+= $(wildcard $(LIB_DIR)/subghz/*.c)
 C_SOURCES		+= $(wildcard $(LIB_DIR)/subghz/*/*.c)
@@ -113,3 +105,6 @@ CFLAGS			+= -I$(LIB_DIR)/app-scened-template
 C_SOURCES		+= $(wildcard $(LIB_DIR)/app-scened-template/*.c)
 CPP_SOURCES		+= $(wildcard $(LIB_DIR)/app-scened-template/*.cpp)
 CPP_SOURCES		+= $(wildcard $(LIB_DIR)/app-scened-template/*/*.cpp)
+
+# Toolbox
+C_SOURCES		+= $(wildcard $(LIB_DIR)/toolbox/*.c)

+ 0 - 0
lib/args/args.c → lib/toolbox/args.c


+ 0 - 0
lib/args/args.h → lib/toolbox/args.h


+ 0 - 0
lib/args/hex.c → lib/toolbox/hex.c


+ 0 - 0
lib/args/hex.h → lib/toolbox/hex.h


+ 0 - 0
lib/args/path.c → lib/toolbox/path.c


+ 0 - 0
lib/args/path.h → lib/toolbox/path.h


+ 43 - 0
lib/toolbox/random_name.c

@@ -0,0 +1,43 @@
+#include "random_name.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <furi.h>
+
+void set_random_name(char* name, uint8_t max_name_size) {
+    static bool rand_generator_inited = false;
+
+    if(!rand_generator_inited) {
+        srand(DWT->CYCCNT);
+        rand_generator_inited = true;
+    }
+    const char* prefix[] = {
+        "ancient",
+        "hollow",
+        "strange",
+        "disappeared",
+        "unknown",
+        "unthinkable",
+        "unnamable",
+        "nameless",
+        "my",
+    };
+
+    const char* suffix[] = {
+        "door",
+        "entrance",
+        "doorway",
+        "entry",
+        "portal",
+        "entree",
+        "opening",
+        "crack",
+    };
+    uint8_t prefix_i = rand() % SIZEOF_ARRAY(prefix);
+    uint8_t suffix_i = rand() % SIZEOF_ARRAY(suffix);
+
+    sniprintf(
+        name, max_name_size, "%s_%s", prefix[prefix_i], suffix[suffix_i]);
+    // Set first symbol to upper case
+    name[0] = name[0] - 0x20;
+}

+ 17 - 0
lib/toolbox/random_name.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Generates random name
+ * @param name buffer to write random name
+ * @param max_name_size length of given buffer
+ */
+void set_random_name(char* name, uint8_t max_name_size);
+
+#ifdef __cplusplus
+}
+#endif

+ 0 - 0
lib/version/version.c → lib/toolbox/version.c


+ 0 - 0
lib/version/version.h → lib/toolbox/version.h