Picopass load/info/delete (#1562)
* increase stack size * rfalPicoPassPollerWriteBlock * UI for loading picopass * Move picopass parsing and add delete, delete success Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		| @@ -5,3 +5,7 @@ ADD_SCENE(picopass, card_menu, CardMenu) | ||||
| ADD_SCENE(picopass, save_name, SaveName) | ||||
| ADD_SCENE(picopass, save_success, SaveSuccess) | ||||
| ADD_SCENE(picopass, saved_menu, SavedMenu) | ||||
| ADD_SCENE(picopass, file_select, FileSelect) | ||||
| ADD_SCENE(picopass, device_info, DeviceInfo) | ||||
| ADD_SCENE(picopass, delete, Delete) | ||||
| ADD_SCENE(picopass, delete_success, DeleteSuccess) | ||||
|   | ||||
							
								
								
									
										58
									
								
								applications/picopass/scenes/picopass_scene_delete.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								applications/picopass/scenes/picopass_scene_delete.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| #include "../picopass_i.h" | ||||
|  | ||||
| void picopass_scene_delete_widget_callback(GuiButtonType result, InputType type, void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     if(type == InputTypeShort) { | ||||
|         view_dispatcher_send_custom_event(picopass->view_dispatcher, result); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void picopass_scene_delete_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Setup Custom Widget view | ||||
|     char temp_str[64]; | ||||
|     snprintf(temp_str, sizeof(temp_str), "\e#Delete %s?\e#", picopass->dev->dev_name); | ||||
|     widget_add_text_box_element( | ||||
|         picopass->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, temp_str, false); | ||||
|     widget_add_button_element( | ||||
|         picopass->widget, | ||||
|         GuiButtonTypeLeft, | ||||
|         "Back", | ||||
|         picopass_scene_delete_widget_callback, | ||||
|         picopass); | ||||
|     widget_add_button_element( | ||||
|         picopass->widget, | ||||
|         GuiButtonTypeRight, | ||||
|         "Delete", | ||||
|         picopass_scene_delete_widget_callback, | ||||
|         picopass); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_delete_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == GuiButtonTypeLeft) { | ||||
|             return scene_manager_previous_scene(picopass->scene_manager); | ||||
|         } else if(event.event == GuiButtonTypeRight) { | ||||
|             if(picopass_device_delete(picopass->dev, true)) { | ||||
|                 scene_manager_next_scene(picopass->scene_manager, PicopassSceneDeleteSuccess); | ||||
|             } else { | ||||
|                 scene_manager_search_and_switch_to_previous_scene( | ||||
|                     picopass->scene_manager, PicopassSceneStart); | ||||
|             } | ||||
|             consumed = true; | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_delete_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     widget_reset(picopass->widget); | ||||
| } | ||||
							
								
								
									
										40
									
								
								applications/picopass/scenes/picopass_scene_delete_success.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								applications/picopass/scenes/picopass_scene_delete_success.c
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #include "../picopass_i.h" | ||||
|  | ||||
| void picopass_scene_delete_success_popup_callback(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     view_dispatcher_send_custom_event(picopass->view_dispatcher, PicopassCustomEventViewExit); | ||||
| } | ||||
|  | ||||
| void picopass_scene_delete_success_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Setup view | ||||
|     Popup* popup = picopass->popup; | ||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); | ||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); | ||||
|     popup_set_timeout(popup, 1500); | ||||
|     popup_set_context(popup, picopass); | ||||
|     popup_set_callback(popup, picopass_scene_delete_success_popup_callback); | ||||
|     popup_enable_timeout(popup); | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_delete_success_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == PicopassCustomEventViewExit) { | ||||
|             consumed = scene_manager_search_and_switch_to_previous_scene( | ||||
|                 picopass->scene_manager, PicopassSceneStart); | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_delete_success_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Clear view | ||||
|     popup_reset(picopass->popup); | ||||
| } | ||||
							
								
								
									
										82
									
								
								applications/picopass/scenes/picopass_scene_device_info.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								applications/picopass/scenes/picopass_scene_device_info.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| #include "../picopass_i.h" | ||||
| #include <dolphin/dolphin.h> | ||||
|  | ||||
| void picopass_scene_device_info_widget_callback( | ||||
|     GuiButtonType result, | ||||
|     InputType type, | ||||
|     void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     if(type == InputTypeShort) { | ||||
|         view_dispatcher_send_custom_event(picopass->view_dispatcher, result); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void picopass_scene_device_info_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     string_t credential_str; | ||||
|     string_t wiegand_str; | ||||
|     string_init(credential_str); | ||||
|     string_init(wiegand_str); | ||||
|  | ||||
|     DOLPHIN_DEED(DolphinDeedNfcReadSuccess); | ||||
|  | ||||
|     // Setup view | ||||
|     PicopassPacs* pacs = &picopass->dev->dev_data.pacs; | ||||
|     Widget* widget = picopass->widget; | ||||
|  | ||||
|     size_t bytesLength = 1 + pacs->record.bitLength / 8; | ||||
|     string_set_str(credential_str, ""); | ||||
|     for(uint8_t i = PICOPASS_BLOCK_LEN - bytesLength; i < PICOPASS_BLOCK_LEN; i++) { | ||||
|         string_cat_printf(credential_str, " %02X", pacs->credential[i]); | ||||
|     } | ||||
|  | ||||
|     if(pacs->record.valid) { | ||||
|         string_cat_printf( | ||||
|             wiegand_str, "FC: %u CN: %u", pacs->record.FacilityCode, pacs->record.CardNumber); | ||||
|     } else { | ||||
|         string_cat_printf(wiegand_str, "%d bits", pacs->record.bitLength); | ||||
|     } | ||||
|  | ||||
|     widget_add_string_element( | ||||
|         widget, 64, 12, AlignCenter, AlignCenter, FontPrimary, string_get_cstr(wiegand_str)); | ||||
|     widget_add_string_element( | ||||
|         widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, string_get_cstr(credential_str)); | ||||
|  | ||||
|     string_clear(credential_str); | ||||
|     string_clear(wiegand_str); | ||||
|  | ||||
|     widget_add_button_element( | ||||
|         picopass->widget, | ||||
|         GuiButtonTypeLeft, | ||||
|         "Back", | ||||
|         picopass_scene_device_info_widget_callback, | ||||
|         picopass); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_device_info_on_event(void* context, SceneManagerEvent event) { | ||||
|     Picopass* picopass = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == GuiButtonTypeLeft) { | ||||
|             consumed = scene_manager_previous_scene(picopass->scene_manager); | ||||
|         } else if(event.event == PicopassCustomEventViewExit) { | ||||
|             view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } else if(event.type == SceneManagerEventTypeBack) { | ||||
|         view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); | ||||
|         consumed = true; | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void picopass_scene_device_info_on_exit(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
|     // Clear views | ||||
|     widget_reset(picopass->widget); | ||||
| } | ||||
							
								
								
									
										25
									
								
								applications/picopass/scenes/picopass_scene_file_select.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								applications/picopass/scenes/picopass_scene_file_select.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #include "../picopass_i.h" | ||||
| #include "picopass/picopass_device.h" | ||||
|  | ||||
| void picopass_scene_file_select_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     // Process file_select return | ||||
|     picopass_device_set_loading_callback(picopass->dev, picopass_show_loading_popup, picopass); | ||||
|     if(picopass_file_select(picopass->dev)) { | ||||
|         scene_manager_next_scene(picopass->scene_manager, PicopassSceneSavedMenu); | ||||
|     } else { | ||||
|         scene_manager_search_and_switch_to_previous_scene( | ||||
|             picopass->scene_manager, PicopassSceneStart); | ||||
|     } | ||||
|     picopass_device_set_loading_callback(picopass->dev, NULL, picopass); | ||||
| } | ||||
|  | ||||
| bool picopass_scene_file_select_on_event(void* context, SceneManagerEvent event) { | ||||
|     UNUSED(context); | ||||
|     UNUSED(event); | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void picopass_scene_file_select_on_exit(void* context) { | ||||
|     UNUSED(context); | ||||
| } | ||||
| @@ -1,5 +1,11 @@ | ||||
| #include "../picopass_i.h" | ||||
|  | ||||
| enum SubmenuIndex { | ||||
|     SubmenuIndexDelete, | ||||
|     SubmenuIndexInfo, | ||||
|     SubmenuIndexWrite, | ||||
| }; | ||||
|  | ||||
| void picopass_scene_saved_menu_submenu_callback(void* context, uint32_t index) { | ||||
|     Picopass* picopass = context; | ||||
|  | ||||
| @@ -8,6 +14,16 @@ void picopass_scene_saved_menu_submenu_callback(void* context, uint32_t index) { | ||||
|  | ||||
| void picopass_scene_saved_menu_on_enter(void* context) { | ||||
|     Picopass* picopass = context; | ||||
|     Submenu* submenu = picopass->submenu; | ||||
|  | ||||
|     submenu_add_item( | ||||
|         submenu, | ||||
|         "Delete", | ||||
|         SubmenuIndexDelete, | ||||
|         picopass_scene_saved_menu_submenu_callback, | ||||
|         picopass); | ||||
|     submenu_add_item( | ||||
|         submenu, "Info", SubmenuIndexInfo, picopass_scene_saved_menu_submenu_callback, picopass); | ||||
|  | ||||
|     submenu_set_selected_item( | ||||
|         picopass->submenu, | ||||
| @@ -23,6 +39,14 @@ bool picopass_scene_saved_menu_on_event(void* context, SceneManagerEvent event) | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         scene_manager_set_scene_state( | ||||
|             picopass->scene_manager, PicopassSceneSavedMenu, event.event); | ||||
|  | ||||
|         if(event.event == SubmenuIndexDelete) { | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneDelete); | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuIndexInfo) { | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneDeviceInfo); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return consumed; | ||||
|   | ||||
| @@ -17,6 +17,8 @@ void picopass_scene_start_on_enter(void* context) { | ||||
|     Submenu* submenu = picopass->submenu; | ||||
|     submenu_add_item( | ||||
|         submenu, "Read Card", SubmenuIndexRead, picopass_scene_start_submenu_callback, picopass); | ||||
|     submenu_add_item( | ||||
|         submenu, "Saved", SubmenuIndexSaved, picopass_scene_start_submenu_callback, picopass); | ||||
|  | ||||
|     submenu_set_selected_item( | ||||
|         submenu, scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneStart)); | ||||
| @@ -32,6 +34,9 @@ bool picopass_scene_start_on_event(void* context, SceneManagerEvent event) { | ||||
|         if(event.event == SubmenuIndexRead) { | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCard); | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuIndexSaved) { | ||||
|             scene_manager_next_scene(picopass->scene_manager, PicopassSceneFileSelect); | ||||
|             consumed = true; | ||||
|         } | ||||
|         scene_manager_set_scene_state(picopass->scene_manager, PicopassSceneStart, event.event); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user