[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_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_name(state.thread, flipper_app->name); | ||||||
|     furi_thread_set_stack_size(state.thread, flipper_app->stack_size); |     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_set_callback(state.thread, flipper_app->app); | ||||||
|     furi_thread_start(state.thread); |     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_folder = "ibutton"; | ||||||
| const char* iButtonApp::app_extension = ".ibtn"; | const char* iButtonApp::app_extension = ".ibtn"; | ||||||
| 
 | 
 | ||||||
| void iButtonApp::run(void) { | void iButtonApp::run(void* args) { | ||||||
|     iButtonEvent event; |     iButtonEvent event; | ||||||
|     bool consumed; |     bool consumed; | ||||||
|     bool exit = false; |     bool exit = false; | ||||||
| 
 | 
 | ||||||
|  |     if(args && load_key((const char*)args)) { | ||||||
|  |         current_scene = Scene::SceneEmulate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     scenes[current_scene]->on_enter(this); |     scenes[current_scene]->on_enter(this); | ||||||
| 
 | 
 | ||||||
|     while(!exit) { |     while(!exit) { | ||||||
| @ -44,6 +48,7 @@ iButtonApp::~iButtonApp() { | |||||||
|         delete it->second; |         delete it->second; | ||||||
|         scenes.erase(it); |         scenes.erase(it); | ||||||
|     } |     } | ||||||
|  |     delete key_worker; | ||||||
| 
 | 
 | ||||||
|     api_hal_power_insomnia_exit(); |     api_hal_power_insomnia_exit(); | ||||||
| } | } | ||||||
| @ -308,34 +313,12 @@ bool iButtonApp::save_key(const char* key_name) { | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool iButtonApp::load_key() { | bool iButtonApp::load_key_data(string_t key_path) { | ||||||
|     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; |  | ||||||
|     File key_file; |     File key_file; | ||||||
|     uint16_t read_count; |     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
 |     // Open key file
 | ||||||
|         get_fs_api()->file.open( |     get_fs_api()->file.open(&key_file, string_get_cstr(key_path), FSAM_READ, FSOM_OPEN_EXISTING); | ||||||
|             &key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING); |  | ||||||
|         string_clear(key_str); |  | ||||||
| 
 |  | ||||||
|     if(key_file.error_id != FSE_OK) { |     if(key_file.error_id != FSE_OK) { | ||||||
|         show_file_error_message("Cannot open\nkey file"); |         show_file_error_message("Cannot open\nkey file"); | ||||||
|         get_fs_api()->file.close(&key_file); |         get_fs_api()->file.close(&key_file); | ||||||
| @ -393,11 +376,60 @@ bool iButtonApp::load_key() { | |||||||
| 
 | 
 | ||||||
|     get_fs_api()->file.close(&key_file); |     get_fs_api()->file.close(&key_file); | ||||||
| 
 | 
 | ||||||
|         get_key()->set_name(get_file_name()); |  | ||||||
|     get_key()->set_type(key_type); |     get_key()->set_type(key_type); | ||||||
|     get_key()->set_data(key_data, IBUTTON_KEY_DATA_SIZE); |     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); |     get_sd_ex_api()->check_error(get_sd_ex_api()->context); | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ | |||||||
| 
 | 
 | ||||||
| class iButtonApp { | class iButtonApp { | ||||||
| public: | public: | ||||||
|     void run(void); |     void run(void* args); | ||||||
| 
 | 
 | ||||||
|     iButtonApp(); |     iButtonApp(); | ||||||
|     ~iButtonApp(); |     ~iButtonApp(); | ||||||
| @ -100,6 +100,7 @@ public: | |||||||
| 
 | 
 | ||||||
|     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 delete_key(); |     bool delete_key(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| @ -146,4 +147,5 @@ private: | |||||||
|     static const char* app_extension; |     static const char* app_extension; | ||||||
| 
 | 
 | ||||||
|     void show_file_error_message(const char* error_text); |     void show_file_error_message(const char* error_text); | ||||||
|  |     bool load_key_data(string_t key_path); | ||||||
| }; | }; | ||||||
| @ -3,7 +3,7 @@ | |||||||
| // app enter function
 | // app enter function
 | ||||||
| extern "C" int32_t app_ibutton(void* p) { | extern "C" int32_t app_ibutton(void* p) { | ||||||
|     iButtonApp* app = new iButtonApp(); |     iButtonApp* app = new iButtonApp(); | ||||||
|     app->run(); |     app->run(p); | ||||||
|     delete app; |     delete app; | ||||||
| 
 | 
 | ||||||
|     return 255; |     return 255; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich