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_data, MfDesfireData) | ||||||
| ADD_SCENE(nfc, mf_desfire_app, MfDesfireApp) | ADD_SCENE(nfc, mf_desfire_app, MfDesfireApp) | ||||||
| ADD_SCENE(nfc, mf_classic_read_success, MfClassicReadSuccess) | 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_menu, MfClassicMenu) | ||||||
| ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) | ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) | ||||||
| ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys) | 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 { | enum SubmenuIndex { | ||||||
|     SubmenuIndexSave, |     SubmenuIndexSave, | ||||||
|     SubmenuIndexEmulate, |     SubmenuIndexEmulate, | ||||||
|  |     SubmenuIndexInfo, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void nfc_scene_mf_classic_menu_submenu_callback(void* context, uint32_t index) { | 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, "Save", SubmenuIndexSave, nfc_scene_mf_classic_menu_submenu_callback, nfc); | ||||||
|     submenu_add_item( |     submenu_add_item( | ||||||
|         submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_mf_classic_menu_submenu_callback, nfc); |         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( |     submenu_set_selected_item( | ||||||
|         nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfClassicMenu)); |         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); |                 nfc->scene_manager, NfcSceneMfClassicMenu, SubmenuIndexEmulate); | ||||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); |             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); | ||||||
|             consumed = true; |             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) { |     } else if(event.type == SceneManagerEventTypeBack) { | ||||||
|         consumed = scene_manager_previous_scene(nfc->scene_manager); |         consumed = scene_manager_previous_scene(nfc->scene_manager); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Astra
						Astra