[FL-1475] iButton emulate shortcat (#535)
* ibutton: run emulation when launched with argument * app-loader: set NULL context when starting application from menu * ibutton: change p to argc * ibutton: fix load key data from file * ibutton: fix memory leak
This commit is contained in:
		
							parent
							
								
									5b8f147882
								
							
						
					
					
						commit
						8cc0a9a998
					
				| @ -28,6 +28,7 @@ static void app_loader_menu_callback(void* _ctx) { | ||||
|     FURI_LOG_I(APP_LOADER_TAG, "Starting furi application: %s", state.current_app->name); | ||||
|     furi_thread_set_name(state.thread, flipper_app->name); | ||||
|     furi_thread_set_stack_size(state.thread, flipper_app->stack_size); | ||||
|     furi_thread_set_context(state.thread, NULL); | ||||
|     furi_thread_set_callback(state.thread, flipper_app->app); | ||||
|     furi_thread_start(state.thread); | ||||
| } | ||||
|  | ||||
							
								
								
									
										86
									
								
								applications/ibutton/ibutton-app.cpp
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										86
									
								
								applications/ibutton/ibutton-app.cpp
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -6,11 +6,15 @@ | ||||
| const char* iButtonApp::app_folder = "ibutton"; | ||||
| const char* iButtonApp::app_extension = ".ibtn"; | ||||
| 
 | ||||
| void iButtonApp::run(void) { | ||||
| void iButtonApp::run(void* args) { | ||||
|     iButtonEvent event; | ||||
|     bool consumed; | ||||
|     bool exit = false; | ||||
| 
 | ||||
|     if(args && load_key((const char*)args)) { | ||||
|         current_scene = Scene::SceneEmulate; | ||||
|     } | ||||
| 
 | ||||
|     scenes[current_scene]->on_enter(this); | ||||
| 
 | ||||
|     while(!exit) { | ||||
| @ -44,6 +48,7 @@ iButtonApp::~iButtonApp() { | ||||
|         delete it->second; | ||||
|         scenes.erase(it); | ||||
|     } | ||||
|     delete key_worker; | ||||
| 
 | ||||
|     api_hal_power_insomnia_exit(); | ||||
| } | ||||
| @ -308,34 +313,12 @@ bool iButtonApp::save_key(const char* key_name) { | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| bool iButtonApp::load_key() { | ||||
|     bool result = false; | ||||
| 
 | ||||
|     // Input events and views are managed by file_select
 | ||||
|     bool res = get_sd_ex_api()->file_select( | ||||
|         get_sd_ex_api()->context, | ||||
|         app_folder, | ||||
|         app_extension, | ||||
|         get_file_name(), | ||||
|         get_file_name_size(), | ||||
|         get_key()->get_name()); | ||||
| 
 | ||||
|     if(res) { | ||||
|         string_t key_str; | ||||
| bool iButtonApp::load_key_data(string_t key_path) { | ||||
|     File key_file; | ||||
|     uint16_t read_count; | ||||
| 
 | ||||
|         // Get key file path
 | ||||
|         string_init_set_str(key_str, app_folder); | ||||
|         string_cat_str(key_str, "/"); | ||||
|         string_cat_str(key_str, get_file_name()); | ||||
|         string_cat_str(key_str, app_extension); | ||||
| 
 | ||||
|     // Open key file
 | ||||
|         get_fs_api()->file.open( | ||||
|             &key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING); | ||||
|         string_clear(key_str); | ||||
| 
 | ||||
|     get_fs_api()->file.open(&key_file, string_get_cstr(key_path), FSAM_READ, FSOM_OPEN_EXISTING); | ||||
|     if(key_file.error_id != FSE_OK) { | ||||
|         show_file_error_message("Cannot open\nkey file"); | ||||
|         get_fs_api()->file.close(&key_file); | ||||
| @ -393,11 +376,60 @@ bool iButtonApp::load_key() { | ||||
| 
 | ||||
|     get_fs_api()->file.close(&key_file); | ||||
| 
 | ||||
|         get_key()->set_name(get_file_name()); | ||||
|     get_key()->set_type(key_type); | ||||
|     get_key()->set_data(key_data, IBUTTON_KEY_DATA_SIZE); | ||||
| 
 | ||||
|         result = true; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool iButtonApp::load_key(const char* key_name) { | ||||
|     bool result = false; | ||||
|     string_t key_path; | ||||
| 
 | ||||
|     string_init_set_str(key_path, key_name); | ||||
|     if(!string_start_with_str_p(key_path, app_folder) || | ||||
|        !string_end_with_str_p(key_path, app_extension)) { | ||||
|         string_clear(key_path); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     result = load_key_data(key_path); | ||||
|     if(result) { | ||||
|         uint8_t folder_end = strlen(app_folder) + 1; | ||||
|         uint8_t extension_start = string_size(key_path) - strlen(app_extension); | ||||
|         string_mid(key_path, folder_end, extension_start - folder_end); | ||||
|         get_key()->set_name(string_get_cstr(key_path)); | ||||
|     } | ||||
|     string_clear(key_path); | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| bool iButtonApp::load_key() { | ||||
|     bool result = false; | ||||
| 
 | ||||
|     // Input events and views are managed by file_select
 | ||||
|     bool res = get_sd_ex_api()->file_select( | ||||
|         get_sd_ex_api()->context, | ||||
|         app_folder, | ||||
|         app_extension, | ||||
|         get_file_name(), | ||||
|         get_file_name_size(), | ||||
|         get_key()->get_name()); | ||||
| 
 | ||||
|     if(res) { | ||||
|         string_t key_str; | ||||
| 
 | ||||
|         // Get key file path
 | ||||
|         string_init_set_str(key_str, app_folder); | ||||
|         string_cat_str(key_str, "/"); | ||||
|         string_cat_str(key_str, get_file_name()); | ||||
|         string_cat_str(key_str, app_extension); | ||||
| 
 | ||||
|         result = load_key_data(key_str); | ||||
|         if(result) { | ||||
|             get_key()->set_name(get_file_name()); | ||||
|         } | ||||
|         string_clear(key_str); | ||||
|     } | ||||
| 
 | ||||
|     get_sd_ex_api()->check_error(get_sd_ex_api()->context); | ||||
|  | ||||
| @ -39,7 +39,7 @@ | ||||
| 
 | ||||
| class iButtonApp { | ||||
| public: | ||||
|     void run(void); | ||||
|     void run(void* args); | ||||
| 
 | ||||
|     iButtonApp(); | ||||
|     ~iButtonApp(); | ||||
| @ -100,6 +100,7 @@ public: | ||||
| 
 | ||||
|     bool save_key(const char* key_name); | ||||
|     bool load_key(); | ||||
|     bool load_key(const char* key_name); | ||||
|     bool delete_key(); | ||||
| 
 | ||||
| private: | ||||
| @ -146,4 +147,5 @@ private: | ||||
|     static const char* app_extension; | ||||
| 
 | ||||
|     void show_file_error_message(const char* error_text); | ||||
|     bool load_key_data(string_t key_path); | ||||
| }; | ||||
| @ -3,7 +3,7 @@ | ||||
| // app enter function
 | ||||
| extern "C" int32_t app_ibutton(void* p) { | ||||
|     iButtonApp* app = new iButtonApp(); | ||||
|     app->run(); | ||||
|     app->run(p); | ||||
|     delete app; | ||||
| 
 | ||||
|     return 255; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich