Add a Mifare Classic info screen to parser output (#1504)
* Add the info screen * Oops, don't dupe the points! * Show ATQA and SAK, remove the back label * And the dolphin doesn't need to be imported anymore * Correct UX to the approved one Co-authored-by: gornekich <n.gorbadey@gmail.com>
This commit is contained in:
		
							parent
							
								
									9ffcc52ada
								
							
						
					
					
						commit
						67a9753f78
					
				| @ -25,6 +25,7 @@ ADD_SCENE(nfc, mf_desfire_menu, MfDesfireMenu) | ||||
| ADD_SCENE(nfc, mf_desfire_data, MfDesfireData) | ||||
| ADD_SCENE(nfc, mf_desfire_app, MfDesfireApp) | ||||
| ADD_SCENE(nfc, mf_classic_read_success, MfClassicReadSuccess) | ||||
| ADD_SCENE(nfc, mf_classic_info, MfClassicInfo) | ||||
| ADD_SCENE(nfc, mf_classic_menu, MfClassicMenu) | ||||
| ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) | ||||
| ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys) | ||||
|  | ||||
							
								
								
									
										72
									
								
								applications/nfc/scenes/nfc_scene_mf_classic_info.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								applications/nfc/scenes/nfc_scene_mf_classic_info.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| #include "../nfc_i.h" | ||||
| 
 | ||||
| void nfc_scene_mf_classic_info_widget_callback(GuiButtonType result, InputType type, void* context) { | ||||
|     furi_assert(context); | ||||
|     Nfc* nfc = context; | ||||
| 
 | ||||
|     if(type == InputTypeShort) { | ||||
|         view_dispatcher_send_custom_event(nfc->view_dispatcher, result); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void nfc_scene_mf_classic_info_on_enter(void* context) { | ||||
|     Nfc* nfc = context; | ||||
|     NfcDeviceData* dev_data = &nfc->dev->dev_data; | ||||
|     MfClassicData* mf_data = &dev_data->mf_classic_data; | ||||
|     string_t str_tmp; | ||||
|     string_init(str_tmp); | ||||
| 
 | ||||
|     // Setup view
 | ||||
|     Widget* widget = nfc->widget; | ||||
| 
 | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 0, AlignLeft, AlignTop, FontSecondary, mf_classic_get_type_str(mf_data->type)); | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 11, AlignLeft, AlignTop, FontSecondary, "ISO 14443-3 (Type A)"); | ||||
|     string_printf(str_tmp, "UID:"); | ||||
|     for(size_t i = 0; i < dev_data->nfc_data.uid_len; i++) { | ||||
|         string_cat_printf(str_tmp, " %02X", dev_data->nfc_data.uid[i]); | ||||
|     } | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 22, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp)); | ||||
|     string_printf( | ||||
|         str_tmp, | ||||
|         "ATQA: %02X %02X   SAK: %02X", | ||||
|         dev_data->nfc_data.atqa[0], | ||||
|         dev_data->nfc_data.atqa[1], | ||||
|         dev_data->nfc_data.sak); | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 33, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp)); | ||||
|     uint8_t sectors_total = mf_classic_get_total_sectors_num(mf_data->type); | ||||
|     uint8_t keys_total = sectors_total * 2; | ||||
|     uint8_t keys_found = 0; | ||||
|     uint8_t sectors_read = 0; | ||||
|     mf_classic_get_read_sectors_and_keys(mf_data, §ors_read, &keys_found); | ||||
|     string_printf(str_tmp, "Keys Found: %d/%d", keys_found, keys_total); | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 44, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp)); | ||||
|     string_printf(str_tmp, "Sectors Read: %d/%d", sectors_read, sectors_total); | ||||
|     widget_add_string_element( | ||||
|         widget, 0, 55, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp)); | ||||
| 
 | ||||
|     string_clear(str_tmp); | ||||
|     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); | ||||
| } | ||||
| 
 | ||||
| bool nfc_scene_mf_classic_info_on_event(void* context, SceneManagerEvent event) { | ||||
|     Nfc* nfc = context; | ||||
|     bool consumed = false; | ||||
| 
 | ||||
|     if(event.type == SceneManagerEventTypeBack) { | ||||
|         consumed = scene_manager_previous_scene(nfc->scene_manager); | ||||
|     } | ||||
| 
 | ||||
|     return consumed; | ||||
| } | ||||
| 
 | ||||
| void nfc_scene_mf_classic_info_on_exit(void* context) { | ||||
|     Nfc* nfc = context; | ||||
| 
 | ||||
|     // Clear view
 | ||||
|     widget_reset(nfc->widget); | ||||
| } | ||||
| @ -3,6 +3,7 @@ | ||||
| enum SubmenuIndex { | ||||
|     SubmenuIndexSave, | ||||
|     SubmenuIndexEmulate, | ||||
|     SubmenuIndexInfo, | ||||
| }; | ||||
| 
 | ||||
| void nfc_scene_mf_classic_menu_submenu_callback(void* context, uint32_t index) { | ||||
| @ -19,6 +20,9 @@ void nfc_scene_mf_classic_menu_on_enter(void* context) { | ||||
|         submenu, "Save", SubmenuIndexSave, nfc_scene_mf_classic_menu_submenu_callback, nfc); | ||||
|     submenu_add_item( | ||||
|         submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_mf_classic_menu_submenu_callback, nfc); | ||||
|     submenu_add_item( | ||||
|         submenu, "Info", SubmenuIndexInfo, nfc_scene_mf_classic_menu_submenu_callback, nfc); | ||||
| 
 | ||||
|     submenu_set_selected_item( | ||||
|         nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfClassicMenu)); | ||||
| 
 | ||||
| @ -43,6 +47,11 @@ bool nfc_scene_mf_classic_menu_on_event(void* context, SceneManagerEvent event) | ||||
|                 nfc->scene_manager, NfcSceneMfClassicMenu, SubmenuIndexEmulate); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuIndexInfo) { | ||||
|             scene_manager_set_scene_state( | ||||
|                 nfc->scene_manager, NfcSceneMfClassicMenu, SubmenuIndexInfo); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicInfo); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } else if(event.type == SceneManagerEventTypeBack) { | ||||
|         consumed = scene_manager_previous_scene(nfc->scene_manager); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Astra
						Astra