[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>
This commit is contained in:
		
							parent
							
								
									0c7a8edf51
								
							
						
					
					
						commit
						ebd158a823
					
				| @ -297,7 +297,8 @@ static void archive_enter_text_input(ArchiveApp* archive) { | |||||||
|         archive_text_input_callback, |         archive_text_input_callback, | ||||||
|         archive, |         archive, | ||||||
|         archive->browser.text_input_buffer, |         archive->browser.text_input_buffer, | ||||||
|         MAX_NAME_LEN); |         MAX_NAME_LEN, | ||||||
|  |         false); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewTextInput); |     view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewTextInput); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| #include "cli_i.h" | #include "cli_i.h" | ||||||
| #include "cli_commands.h" | #include "cli_commands.h" | ||||||
| 
 | 
 | ||||||
| #include <version.h> |  | ||||||
| #include <api-hal-version.h> | #include <api-hal-version.h> | ||||||
| #include <loader/loader.h> | #include <loader/loader.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,7 +3,6 @@ | |||||||
| #include <gui/gui.h> | #include <gui/gui.h> | ||||||
| #include <gui/elements.h> | #include <gui/elements.h> | ||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| #include <version.h> |  | ||||||
| #include <api-hal-version.h> | #include <api-hal-version.h> | ||||||
| 
 | 
 | ||||||
| static char* Lockmenu_Items[3] = {"Lock", "Set PIN", "DUMB mode"}; | static char* Lockmenu_Items[3] = {"Lock", "Set PIN", "DUMB mode"}; | ||||||
|  | |||||||
| @ -192,7 +192,8 @@ int32_t gui_test(void* param) { | |||||||
|         text_input_callback, |         text_input_callback, | ||||||
|         gui_tester, |         gui_tester, | ||||||
|         text_input_text, |         text_input_text, | ||||||
|         text_input_text_len); |         text_input_text_len, | ||||||
|  |         false); | ||||||
|     text_input_set_header_text(gui_tester->text_input, "Name the key"); |     text_input_set_header_text(gui_tester->text_input, "Name the key"); | ||||||
| 
 | 
 | ||||||
|     const uint8_t byte_input_bytes_len = 16; |     const uint8_t byte_input_bytes_len = 16; | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								applications/gui/modules/text_input.c
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										23
									
								
								applications/gui/modules/text_input.c
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -16,6 +16,7 @@ typedef struct { | |||||||
|     const char* header; |     const char* header; | ||||||
|     char* text_buffer; |     char* text_buffer; | ||||||
|     size_t text_buffer_size; |     size_t text_buffer_size; | ||||||
|  |     bool clear_default_text; | ||||||
| 
 | 
 | ||||||
|     TextInputCallback callback; |     TextInputCallback callback; | ||||||
|     void* callback_context; |     void* callback_context; | ||||||
| @ -128,7 +129,7 @@ static const char char_to_uppercase(const char letter) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void text_input_backspace_cb(TextInputModel* model) { | 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) { |     if(text_length > 0) { | ||||||
|         model->text_buffer[text_length - 1] = 0; |         model->text_buffer[text_length - 1] = 0; | ||||||
|     } |     } | ||||||
| @ -158,11 +159,16 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { | |||||||
|         text++; |         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, 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); |     canvas_set_font(canvas, FontKeyboard); | ||||||
| 
 | 
 | ||||||
|     for(uint8_t row = 0; row <= keyboard_row_count; row++) { |     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) { |             } else if(selected == BACKSPACE_KEY) { | ||||||
|                 text_input_backspace_cb(model); |                 text_input_backspace_cb(model); | ||||||
|             } else if(text_length < (model->text_buffer_size - 1)) { |             } 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)) { |                 if(text_length == 0 && char_is_lowercase(selected)) { | ||||||
|                     selected = char_to_uppercase(selected); |                     selected = char_to_uppercase(selected); | ||||||
|                 } |                 } | ||||||
|                 model->text_buffer[text_length] = selected; |                 model->text_buffer[text_length] = selected; | ||||||
|                 model->text_buffer[text_length + 1] = 0; |                 model->text_buffer[text_length + 1] = 0; | ||||||
|             } |             } | ||||||
|  |             model->clear_default_text = false; | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| } | } | ||||||
| @ -365,6 +375,7 @@ TextInput* text_input_alloc() { | |||||||
|             model->header = ""; |             model->header = ""; | ||||||
|             model->selected_row = 0; |             model->selected_row = 0; | ||||||
|             model->selected_column = 0; |             model->selected_column = 0; | ||||||
|  |             model->clear_default_text = false; | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
| @ -387,13 +398,15 @@ void text_input_set_result_callback( | |||||||
|     TextInputCallback callback, |     TextInputCallback callback, | ||||||
|     void* callback_context, |     void* callback_context, | ||||||
|     char* text_buffer, |     char* text_buffer, | ||||||
|     size_t text_buffer_size) { |     size_t text_buffer_size, | ||||||
|  |     bool clear_default_text) { | ||||||
|     with_view_model( |     with_view_model( | ||||||
|         text_input->view, (TextInputModel * model) { |         text_input->view, (TextInputModel * model) { | ||||||
|             model->callback = callback; |             model->callback = callback; | ||||||
|             model->callback_context = callback_context; |             model->callback_context = callback_context; | ||||||
|             model->text_buffer = text_buffer; |             model->text_buffer = text_buffer; | ||||||
|             model->text_buffer_size = text_buffer_size; |             model->text_buffer_size = text_buffer_size; | ||||||
|  |             model->clear_default_text = clear_default_text; | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| } | } | ||||||
|  | |||||||
| @ -39,13 +39,15 @@ View* text_input_get_view(TextInput* text_input); | |||||||
|  * @param callback_context - callback context |  * @param callback_context - callback context | ||||||
|  * @param text_buffer - pointer to YOUR text buffer, that we going to modify |  * @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 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( | void text_input_set_result_callback( | ||||||
|     TextInput* text_input, |     TextInput* text_input, | ||||||
|     TextInputCallback callback, |     TextInputCallback callback, | ||||||
|     void* callback_context, |     void* callback_context, | ||||||
|     char* text_buffer, |     char* text_buffer, | ||||||
|     size_t text_buffer_size); |     size_t text_buffer_size, | ||||||
|  |     bool clear_default_text); | ||||||
| 
 | 
 | ||||||
| /** 
 | /** 
 | ||||||
|  * @brief Set text input header text |  * @brief Set text input header text | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
| #include <m-string.h> | #include <m-string.h> | ||||||
| #include <file-worker-cpp.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_folder = "/any/ibutton"; | ||||||
| const char* iButtonApp::app_extension = ".ibtn"; | const char* iButtonApp::app_extension = ".ibtn"; | ||||||
| @ -40,9 +40,6 @@ iButtonApp::iButtonApp() | |||||||
|     : notification{"notification"} { |     : notification{"notification"} { | ||||||
|     api_hal_power_insomnia_enter(); |     api_hal_power_insomnia_enter(); | ||||||
|     key_worker = new KeyWorker(&ibutton_gpio); |     key_worker = new KeyWorker(&ibutton_gpio); | ||||||
| 
 |  | ||||||
|     // we need random
 |  | ||||||
|     srand(DWT->CYCCNT); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| iButtonApp::~iButtonApp() { | iButtonApp::~iButtonApp() { | ||||||
| @ -186,38 +183,6 @@ uint8_t iButtonApp::get_text_store_size() { | |||||||
|     return 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
 | // file managment
 | ||||||
| bool iButtonApp::save_key(const char* key_name) { | bool iButtonApp::save_key(const char* key_name) { | ||||||
|     // Create ibutton directory if necessary
 |     // Create ibutton directory if necessary
 | ||||||
|  | |||||||
| @ -90,8 +90,6 @@ public: | |||||||
|     char* get_file_name(); |     char* get_file_name(); | ||||||
|     uint8_t get_file_name_size(); |     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 save_key(const char* key_name); | ||||||
|     bool load_key(); |     bool load_key(); | ||||||
|     bool load_key(const char* key_name); |     bool load_key(const char* key_name); | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <cli/cli.h> | #include <cli/cli.h> | ||||||
| #include <args.h> | #include <lib/toolbox/args.h> | ||||||
| 
 | 
 | ||||||
| #include "helpers/key-info.h" | #include "helpers/key-info.h" | ||||||
| #include "helpers/key-worker.h" | #include "helpers/key-worker.h" | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ | |||||||
| #include "../ibutton-event.h" | #include "../ibutton-event.h" | ||||||
| #include "../ibutton-key.h" | #include "../ibutton-key.h" | ||||||
| #include <callback-connector.h> | #include <callback-connector.h> | ||||||
|  | #include <lib/toolbox/random_name.h> | ||||||
| 
 | 
 | ||||||
| void iButtonSceneSaveName::on_enter(iButtonApp* app) { | void iButtonSceneSaveName::on_enter(iButtonApp* app) { | ||||||
|     iButtonAppViewManager* view_manager = app->get_view_manager(); |     iButtonAppViewManager* view_manager = app->get_view_manager(); | ||||||
| @ -12,16 +13,17 @@ void iButtonSceneSaveName::on_enter(iButtonApp* app) { | |||||||
| 
 | 
 | ||||||
|     iButtonKey* key = app->get_key(); |     iButtonKey* key = app->get_key(); | ||||||
|     const char* key_name = key->get_name(); |     const char* key_name = key->get_name(); | ||||||
|  |     bool key_name_empty = !strcmp(key_name, ""); | ||||||
| 
 | 
 | ||||||
|     if(strcmp(key_name, "") == 0) { |     if(key_name_empty) { | ||||||
|         app->generate_random_name(app->get_text_store(), app->get_text_store_size()); |         set_random_name(app->get_text_store(), app->get_text_store_size()); | ||||||
|     } else { |     } else { | ||||||
|         app->set_text_store("%s", key_name); |         app->set_text_store("%s", key_name); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     text_input_set_header_text(text_input, "Name the key"); |     text_input_set_header_text(text_input, "Name the key"); | ||||||
|     text_input_set_result_callback( |     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); |     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) { | void iButtonSceneSaveName::on_exit(iButtonApp* app) { | ||||||
|     TextInput* text_input = app->get_view_manager()->get_text_input(); |     TextInput* text_input = app->get_view_manager()->get_text_input(); | ||||||
|     text_input_set_header_text(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) { | void iButtonSceneSaveName::text_input_callback(void* context) { | ||||||
|  | |||||||
| @ -20,7 +20,8 @@ void IrdaAppSceneEditRename::on_enter(IrdaApp* app) { | |||||||
|         IrdaApp::text_input_callback, |         IrdaApp::text_input_callback, | ||||||
|         app, |         app, | ||||||
|         app->get_text_store(0), |         app->get_text_store(0), | ||||||
|         app->get_text_store_size()); |         app->get_text_store_size(), | ||||||
|  |         false); | ||||||
| 
 | 
 | ||||||
|     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput); |     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput); | ||||||
| } | } | ||||||
|  | |||||||
| @ -26,7 +26,8 @@ void IrdaAppSceneLearnEnterName::on_enter(IrdaApp* app) { | |||||||
|         IrdaApp::text_input_callback, |         IrdaApp::text_input_callback, | ||||||
|         app, |         app, | ||||||
|         app->get_text_store(0), |         app->get_text_store(0), | ||||||
|         app->get_text_store_size()); |         app->get_text_store_size(), | ||||||
|  |         false); | ||||||
| 
 | 
 | ||||||
|     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput); |     view_manager->switch_to(IrdaAppViewManager::ViewType::TextInput); | ||||||
| } | } | ||||||
|  | |||||||
| @ -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'); |  | ||||||
| } |  | ||||||
| @ -1,4 +0,0 @@ | |||||||
| #pragma once |  | ||||||
| #include "stdint.h" |  | ||||||
| 
 |  | ||||||
| void rfid_generate_random_name(char* name, uint8_t max_name_size); |  | ||||||
| @ -17,7 +17,7 @@ | |||||||
| #include "scene/lfrfid-app-scene-delete-success.h" | #include "scene/lfrfid-app-scene-delete-success.h" | ||||||
| 
 | 
 | ||||||
| #include <file-worker-cpp.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_folder = "/any/lfrfid"; | ||||||
| const char* LfRfidApp::app_extension = ".rfid"; | const char* LfRfidApp::app_extension = ".rfid"; | ||||||
| @ -27,9 +27,6 @@ LfRfidApp::LfRfidApp() | |||||||
|     , notification{"notification"} |     , notification{"notification"} | ||||||
|     , text_store(40) { |     , text_store(40) { | ||||||
|     api_hal_power_insomnia_enter(); |     api_hal_power_insomnia_enter(); | ||||||
| 
 |  | ||||||
|     // we need random
 |  | ||||||
|     srand(DWT->CYCCNT); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LfRfidApp::~LfRfidApp() { | LfRfidApp::~LfRfidApp() { | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <cli/cli.h> | #include <cli/cli.h> | ||||||
| #include <args.h> | #include <lib/toolbox/args.h> | ||||||
| 
 | 
 | ||||||
| #include "helpers/rfid-reader.h" | #include "helpers/rfid-reader.h" | ||||||
| #include "helpers/rfid-timer-emulator.h" | #include "helpers/rfid-timer-emulator.h" | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								applications/lfrfid/scene/lfrfid-app-scene-save-name.cpp
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										13
									
								
								applications/lfrfid/scene/lfrfid-app-scene-save-name.cpp
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,11 +1,12 @@ | |||||||
| #include "lfrfid-app-scene-save-name.h" | #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) { | void LfRfidAppSceneSaveName::on_enter(LfRfidApp* app, bool need_restore) { | ||||||
|     const char* key_name = app->worker.key.get_name(); |     const char* key_name = app->worker.key.get_name(); | ||||||
| 
 | 
 | ||||||
|     if(strcmp(key_name, "") == 0) { |     bool key_name_empty = !strcmp(key_name, ""); | ||||||
|         rfid_generate_random_name(app->text_store.text, app->text_store.text_size); |     if(key_name_empty) { | ||||||
|  |         set_random_name(app->text_store.text, app->text_store.text_size); | ||||||
|     } else { |     } else { | ||||||
|         app->text_store.set("%s", key_name); |         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_header_text("Name the card"); | ||||||
| 
 | 
 | ||||||
|     text_input->set_result_callback( |     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>(); |     app->view_controller.switch_to<TextInputVM>(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| #include "nfc_device_i.h" | #include "nfc_device_i.h" | ||||||
| 
 | 
 | ||||||
| #include <file-worker.h> | #include <file-worker.h> | ||||||
| #include <path.h> | #include <lib/toolbox/path.h> | ||||||
| #include <hex.h> | #include <lib/toolbox/hex.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_DEVICE_MAX_DATA_LEN 14 | #define NFC_DEVICE_MAX_DATA_LEN 14 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include "../nfc_i.h" | #include "../nfc_i.h" | ||||||
|  | #include <lib/toolbox/random_name.h> | ||||||
| 
 | 
 | ||||||
| #define SCENE_SAVE_NAME_CUSTOM_EVENT (0UL) | #define SCENE_SAVE_NAME_CUSTOM_EVENT (0UL) | ||||||
| 
 | 
 | ||||||
| @ -13,17 +14,21 @@ const void nfc_scene_save_name_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     TextInput* text_input = nfc->text_input; |     TextInput* text_input = nfc->text_input; | ||||||
|     if(nfc->dev.dev_name) { |     bool dev_name_empty = false; | ||||||
|         nfc_device_delete(&nfc->dev); |     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_header_text(text_input, "Name the card"); | ||||||
|     text_input_set_result_callback( |     text_input_set_result_callback( | ||||||
|         text_input, |         text_input, | ||||||
|         nfc_scene_save_name_text_input_callback, |         nfc_scene_save_name_text_input_callback, | ||||||
|         nfc, |         nfc, | ||||||
|         nfc->text_store, |         nfc->text_store, | ||||||
|         sizeof(nfc->text_store)); |         NFC_DEV_NAME_MAX_LEN, | ||||||
|  |         dev_name_empty); | ||||||
|     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextInput); |     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.type == SceneManagerEventTypeCustom) { | ||||||
|         if(event.event == SCENE_SAVE_NAME_CUSTOM_EVENT) { |         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)); |             memcpy(&nfc->dev.dev_name, nfc->text_store, strlen(nfc->text_store)); | ||||||
|             if(nfc_device_save(&nfc->dev, nfc->text_store)) { |             if(nfc_device_save(&nfc->dev, nfc->text_store)) { | ||||||
|                 scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess); |                 scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess); | ||||||
| @ -49,4 +57,5 @@ const void nfc_scene_save_name_on_exit(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Clear view
 |     // Clear view
 | ||||||
|     text_input_set_header_text(nfc->text_input, NULL); |     text_input_set_header_text(nfc->text_input, NULL); | ||||||
|  |     text_input_set_result_callback(nfc->text_input, NULL, NULL, NULL, 0, false); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <cli/cli.h> | #include <cli/cli.h> | ||||||
| #include <args.h> | #include <lib/toolbox/args.h> | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| #include <storage/storage-sd-api.h> | #include <storage/storage-sd-api.h> | ||||||
| #include <api-hal-version.h> | #include <api-hal-version.h> | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ | |||||||
| #include <stm32wbxx_ll_gpio.h> | #include <stm32wbxx_ll_gpio.h> | ||||||
| #include <stm32wbxx_hal_flash.h> | #include <stm32wbxx_hal_flash.h> | ||||||
| 
 | 
 | ||||||
| #include <version.h> | #include <lib/toolbox/version.h> | ||||||
| #include <api-hal.h> | #include <api-hal.h> | ||||||
| 
 | 
 | ||||||
| // Boot request enum
 | // Boot request enum
 | ||||||
|  | |||||||
| @ -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 | CFLAGS			+= $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32WB55xx -Wall -fdata-sections -ffunction-sections | ||||||
| LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs  | LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs  | ||||||
| 
 | 
 | ||||||
| CUBE_DIR		= ../lib/STM32CubeWB | CUBE_DIR		= $(PROJECT_ROOT)/lib/STM32CubeWB | ||||||
| 
 | 
 | ||||||
| # ST HAL
 | # ST HAL
 | ||||||
| CFLAGS			+=  -DUSE_FULL_LL_DRIVER | 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 | LDFLAGS			+= -T$(TARGET_DIR)/stm32wb55xx_flash_cm4.ld | ||||||
| 
 | 
 | ||||||
| # Drivers
 | # Drivers
 | ||||||
| DRIVERS_DIR		= ../lib/drivers | DRIVERS_DIR		= $(PROJECT_ROOT)//lib/drivers | ||||||
| CFLAGS			+= -I$(DRIVERS_DIR) | CFLAGS			+= -I$(DRIVERS_DIR) | ||||||
| C_SOURCES		+= $(DRIVERS_DIR)/lp5562.c | C_SOURCES		+= $(DRIVERS_DIR)/lp5562.c | ||||||
| 
 | 
 | ||||||
| @ -38,11 +38,10 @@ CFLAGS			+= -I$(TARGET_DIR)/api-hal | |||||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/api-hal/*.c) | C_SOURCES		+= $(wildcard $(TARGET_DIR)/api-hal/*.c) | ||||||
| 
 | 
 | ||||||
| # Version generation
 | # Version generation
 | ||||||
| CFLAGS			+= -I../lib/version | C_SOURCES		+= $(PROJECT_ROOT)/lib/toolbox/version.c | ||||||
| C_SOURCES		+= ../lib/version/version.c |  | ||||||
| 
 | 
 | ||||||
| ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ||||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | ||||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | ||||||
| 
 | 
 | ||||||
| SVD_FILE = ../debug/STM32WB55_CM4.svd | SVD_FILE		= $(PROJECT_ROOT)/debug/STM32WB55_CM4.svd | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| #include "flipper.h" | #include "flipper.h" | ||||||
| #include <applications.h> | #include <applications.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <version.h> |  | ||||||
| #include <api-hal-version.h> | #include <api-hal-version.h> | ||||||
| 
 | 
 | ||||||
| static void flipper_print_version(const char* target, const Version* version) { | static void flipper_print_version(const char* target, const Version* version) { | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <version.h> | #include <lib/toolbox/version.h> | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| #include "file-worker-cpp.h" | #include "file-worker-cpp.h" | ||||||
| #include <hex.h> | #include <lib/toolbox/hex.h> | ||||||
| 
 | 
 | ||||||
| FileWorkerCpp::FileWorkerCpp(bool _silent) { | FileWorkerCpp::FileWorkerCpp(bool _silent) { | ||||||
|     file_worker = file_worker_alloc(_silent); |     file_worker = file_worker_alloc(_silent); | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #include "file-worker.h" | #include "file-worker.h" | ||||||
| #include "m-string.h" | #include "m-string.h" | ||||||
| #include <hex.h> | #include <lib/toolbox/hex.h> | ||||||
| #include <dialogs/dialogs.h> | #include <dialogs/dialogs.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ View* TextInputVM::get_view() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void TextInputVM::clean() { | void TextInputVM::clean() { | ||||||
|     set_result_callback(NULL, NULL, NULL, 0); |     set_result_callback(NULL, NULL, NULL, 0, false); | ||||||
|     set_header_text(""); |     set_header_text(""); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -21,8 +21,9 @@ void TextInputVM::set_result_callback( | |||||||
|     TextInputCallback callback, |     TextInputCallback callback, | ||||||
|     void* callback_context, |     void* callback_context, | ||||||
|     char* text, |     char* text, | ||||||
|     uint8_t max_text_length) { |     uint8_t max_text_length, | ||||||
|     text_input_set_result_callback(text_input, callback, callback_context, text, 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) { | void TextInputVM::set_header_text(const char* text) { | ||||||
|  | |||||||
| @ -16,12 +16,14 @@ public: | |||||||
|      * @param callback_context - callback context |      * @param callback_context - callback context | ||||||
|      * @param text - text buffer to use |      * @param text - text buffer to use | ||||||
|      * @param max_text_length - text buffer length |      * @param max_text_length - text buffer length | ||||||
|  |      * @param clear_default_text - clears given buffer on OK event | ||||||
|      */ |      */ | ||||||
|     void set_result_callback( |     void set_result_callback( | ||||||
|         TextInputCallback callback, |         TextInputCallback callback, | ||||||
|         void* callback_context, |         void* callback_context, | ||||||
|         char* text, |         char* text, | ||||||
|         uint8_t max_text_length); |         uint8_t max_text_length, | ||||||
|  |         bool clear_default_text); | ||||||
| 
 | 
 | ||||||
|     /** 
 |     /** 
 | ||||||
|      * @brief Set text input header text |      * @brief Set text input header text | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								lib/lib.mk
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								lib/lib.mk
									
									
									
									
									
								
							| @ -85,10 +85,6 @@ CFLAGS			+= -I$(LIB_DIR)/common-api | |||||||
| CFLAGS			+= -I$(LIB_DIR)/drivers | CFLAGS			+= -I$(LIB_DIR)/drivers | ||||||
| C_SOURCES		+= $(wildcard $(LIB_DIR)/drivers/*.c) | C_SOURCES		+= $(wildcard $(LIB_DIR)/drivers/*.c) | ||||||
| 
 | 
 | ||||||
| #version
 |  | ||||||
| CFLAGS			+= -I$(LIB_DIR)/version |  | ||||||
| C_SOURCES		+= $(LIB_DIR)/version/version.c |  | ||||||
| 
 |  | ||||||
| #file reader
 | #file reader
 | ||||||
| CFLAGS			+= -I$(LIB_DIR)/file_reader | CFLAGS			+= -I$(LIB_DIR)/file_reader | ||||||
| CPP_SOURCES		+= $(wildcard $(LIB_DIR)/file_reader/*.cpp) | 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/encoder_decoder/*/*.c) | ||||||
| C_SOURCES		+= $(wildcard $(LIB_DIR)/irda/worker/*.c) | C_SOURCES		+= $(wildcard $(LIB_DIR)/irda/worker/*.c) | ||||||
| 
 | 
 | ||||||
| #args lib
 |  | ||||||
| CFLAGS			+= -I$(LIB_DIR)/args |  | ||||||
| C_SOURCES		+= $(wildcard $(LIB_DIR)/args/*.c) |  | ||||||
| 
 |  | ||||||
| # SubGhz
 | # SubGhz
 | ||||||
| C_SOURCES		+= $(wildcard $(LIB_DIR)/subghz/*.c) | C_SOURCES		+= $(wildcard $(LIB_DIR)/subghz/*.c) | ||||||
| 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) | 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) | ||||||
| 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) | ||||||
|  | |||||||
							
								
								
									
										43
									
								
								lib/toolbox/random_name.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								lib/toolbox/random_name.c
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								lib/toolbox/random_name.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/toolbox/random_name.h
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich