Save picopass as picopass or, for 26bit, as lfrfid (#1380)
This commit is contained in:
		
							
								
								
									
										65
									
								
								applications/picopass/scenes/picopass_scene_card_menu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								applications/picopass/scenes/picopass_scene_card_menu.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| #include "../picopass_i.h" | ||||
|  | ||||
| enum SubmenuIndex { | ||||
|     SubmenuIndexSave, | ||||
|     SubmenuIndexSaveAsLF, | ||||
| }; | ||||
|  | ||||
| void picopass_scene_card_menu_submenu_callback(void* context, uint32_t index) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     view_dispatcher_send_custom_event(picopass->view_dispatcher, index); | ||||
| } | ||||
|  | ||||
| void picopass_scene_card_menu_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     Submenu* submenu = picopass->submenu; | ||||
|  | ||||
|     submenu_add_item( | ||||
|         submenu, "Save", SubmenuIndexSave, picopass_scene_card_menu_submenu_callback, picopass); | ||||
|     if(picopass->dev->dev_data.pacs.record.valid) { | ||||
|         submenu_add_item( | ||||
|             submenu, | ||||
|             "Save as LF", | ||||
|             SubmenuIndexSaveAsLF, | ||||
|             picopass_scene_card_menu_submenu_callback, | ||||
|             picopass); | ||||
|     } | ||||
|     submenu_set_selected_item( | ||||
|         picopass->submenu, | ||||
|         scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneCardMenu)); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewMenu); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == SubmenuIndexSave) { | ||||
|             scene_manager_set_scene_state( | ||||
|                 picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSave); | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName); | ||||
|             picopass->dev->format = PicopassDeviceSaveFormatHF; | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuIndexSaveAsLF) { | ||||
|             scene_manager_set_scene_state( | ||||
|                 picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSaveAsLF); | ||||
|             picopass->dev->format = PicopassDeviceSaveFormatLF; | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } else if(event.type == SceneManagerEventTypeBack) { | ||||
|         consumed = scene_manager_search_and_switch_to_previous_scene( | ||||
|             picopass->scene_manager, PicopassSceneStart); | ||||
|     } | ||||
|  | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_card_menu_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     submenu_reset(picopass->submenu); | ||||
| } | ||||
| @@ -1,3 +1,7 @@ | ||||
| ADD_SCENE(picopass, start, Start) | ||||
| ADD_SCENE(picopass, read_card, ReadCard) | ||||
| ADD_SCENE(picopass, read_card_success, ReadCardSuccess) | ||||
| ADD_SCENE(picopass, card_menu, CardMenu) | ||||
| ADD_SCENE(picopass, save_name, SaveName) | ||||
| ADD_SCENE(picopass, save_success, SaveSuccess) | ||||
| ADD_SCENE(picopass, saved_menu, SavedMenu) | ||||
|   | ||||
| @@ -45,6 +45,14 @@ void picopass_scene_read_card_success_on_enter(void* context) { | ||||
|         "Retry", | ||||
|         picopass_scene_read_card_success_widget_callback, | ||||
|         picopass); | ||||
|  | ||||
|     widget_add_button_element( | ||||
|         widget, | ||||
|         GuiButtonTypeRight, | ||||
|         "More", | ||||
|         picopass_scene_read_card_success_widget_callback, | ||||
|         picopass); | ||||
|  | ||||
|     if(pacs->record.valid) { | ||||
|         widget_add_string_element( | ||||
|             widget, 64, 12, AlignCenter, AlignCenter, FontPrimary, string_get_cstr(wiegand_str)); | ||||
| @@ -65,6 +73,11 @@ bool picopass_scene_read_card_success_on_event(void* context, SceneManagerEvent | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == GuiButtonTypeLeft) { | ||||
|             consumed = scene_manager_previous_scene(picopass->scene_manager); | ||||
|         } else if(event.event == GuiButtonTypeRight) { | ||||
|             // Clear device name | ||||
|             picopass_device_set_name(picopass->dev, ""); | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneCardMenu); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
|   | ||||
							
								
								
									
										84
									
								
								applications/picopass/scenes/picopass_scene_save_name.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								applications/picopass/scenes/picopass_scene_save_name.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| #include "../picopass_i.h" | ||||
| #include "m-string.h" | ||||
| #include <lib/toolbox/random_name.h> | ||||
| #include <gui/modules/validators.h> | ||||
| #include <toolbox/path.h> | ||||
|  | ||||
| void picopass_scene_save_name_text_input_callback(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     view_dispatcher_send_custom_event(picopass->view_dispatcher, PicopassCustomEventTextInputDone); | ||||
| } | ||||
|  | ||||
| void picopass_scene_save_name_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Setup view | ||||
|     TextInput* text_input = picopass->text_input; | ||||
|     bool dev_name_empty = false; | ||||
|     if(!strcmp(picopass->dev->dev_name, "")) { | ||||
|         set_random_name(picopass->text_store, sizeof(picopass->text_store)); | ||||
|         dev_name_empty = true; | ||||
|     } else { | ||||
|         picopass_text_store_set(picopass, picopass->dev->dev_name); | ||||
|     } | ||||
|     text_input_set_header_text(text_input, "Name the card"); | ||||
|     text_input_set_result_callback( | ||||
|         text_input, | ||||
|         picopass_scene_save_name_text_input_callback, | ||||
|         picopass, | ||||
|         picopass->text_store, | ||||
|         PICOPASS_DEV_NAME_MAX_LEN, | ||||
|         dev_name_empty); | ||||
|  | ||||
|     string_t folder_path; | ||||
|     string_init(folder_path); | ||||
|  | ||||
|     if(string_end_with_str_p(picopass->dev->load_path, PICOPASS_APP_EXTENSION)) { | ||||
|         path_extract_dirname(string_get_cstr(picopass->dev->load_path), folder_path); | ||||
|     } else { | ||||
|         string_set_str(folder_path, PICOPASS_APP_FOLDER); | ||||
|     } | ||||
|  | ||||
|     ValidatorIsFile* validator_is_file = validator_is_file_alloc_init( | ||||
|         string_get_cstr(folder_path), PICOPASS_APP_EXTENSION, picopass->dev->dev_name); | ||||
|     text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewTextInput); | ||||
|  | ||||
|     string_clear(folder_path); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_save_name_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == PicopassCustomEventTextInputDone) { | ||||
|             if(strcmp(picopass->dev->dev_name, "")) { | ||||
|                 // picopass_device_delete(picopass->dev, true); | ||||
|             } | ||||
|             strlcpy( | ||||
|                 picopass->dev->dev_name, picopass->text_store, strlen(picopass->text_store) + 1); | ||||
|             if(picopass_device_save(picopass->dev, picopass->text_store)) { | ||||
|                 scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveSuccess); | ||||
|                 consumed = true; | ||||
|             } else { | ||||
|                 consumed = scene_manager_search_and_switch_to_previous_scene( | ||||
|                     picopass->scene_manager, PicopassSceneStart); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_save_name_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Clear view | ||||
|     void* validator_context = text_input_get_validator_callback_context(picopass->text_input); | ||||
|     text_input_set_validator(picopass->text_input, NULL, NULL); | ||||
|     validator_is_file_free(validator_context); | ||||
|  | ||||
|     text_input_reset(picopass->text_input); | ||||
| } | ||||
							
								
								
									
										47
									
								
								applications/picopass/scenes/picopass_scene_save_success.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								applications/picopass/scenes/picopass_scene_save_success.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| #include "../picopass_i.h" | ||||
| #include <dolphin/dolphin.h> | ||||
|  | ||||
| void picopass_scene_save_success_popup_callback(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     view_dispatcher_send_custom_event(picopass->view_dispatcher, PicopassCustomEventViewExit); | ||||
| } | ||||
|  | ||||
| void picopass_scene_save_success_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     DOLPHIN_DEED(DolphinDeedNfcSave); | ||||
|  | ||||
|     // Setup view | ||||
|     Popup* popup = picopass->popup; | ||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); | ||||
|     popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); | ||||
|     popup_set_timeout(popup, 1500); | ||||
|     popup_set_context(popup, picopass); | ||||
|     popup_set_callback(popup, picopass_scene_save_success_popup_callback); | ||||
|     popup_enable_timeout(popup); | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_save_success_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == PicopassCustomEventViewExit) { | ||||
|             if(scene_manager_has_previous_scene(picopass->scene_manager, PicopassSceneCardMenu)) { | ||||
|                 consumed = scene_manager_search_and_switch_to_previous_scene( | ||||
|                     picopass->scene_manager, PicopassSceneCardMenu); | ||||
|             } else { | ||||
|                 consumed = scene_manager_search_and_switch_to_previous_scene( | ||||
|                     picopass->scene_manager, PicopassSceneStart); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_save_success_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Clear view | ||||
|     popup_reset(picopass->popup); | ||||
| } | ||||
							
								
								
									
										35
									
								
								applications/picopass/scenes/picopass_scene_saved_menu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								applications/picopass/scenes/picopass_scene_saved_menu.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| #include "../picopass_i.h" | ||||
|  | ||||
| void picopass_scene_saved_menu_submenu_callback(void* context, uint32_t index) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     view_dispatcher_send_custom_event(picopass->view_dispatcher, index); | ||||
| } | ||||
|  | ||||
| void picopass_scene_saved_menu_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     submenu_set_selected_item( | ||||
|         picopass->submenu, | ||||
|         scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneSavedMenu)); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewMenu); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         scene_manager_set_scene_state( | ||||
|             picopass->scene_manager, PicopassSceneSavedMenu, event.event); | ||||
|     } | ||||
|  | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_saved_menu_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     submenu_reset(picopass->submenu); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user