Nfc: add field testing (#1027)
* Nfc: add field cli command * Nfc: add field test in debug menu * Nfc: warning message for field tests * Format sources
This commit is contained in:
		
							parent
							
								
									76b737f411
								
							
						
					
					
						commit
						28888b0a22
					
				| @ -11,6 +11,9 @@ static void nfc_cli_print_usage() { | ||||
|     printf("Cmd list:\r\n"); | ||||
|     printf("\tdetect\t - detect nfc device\r\n"); | ||||
|     printf("\temulate\t - emulate predefined nfca card\r\n"); | ||||
|     if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { | ||||
|         printf("\tfield\t - turn field on\r\n"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void nfc_cli_detect(Cli* cli, string_t args) { | ||||
| @ -76,6 +79,27 @@ void nfc_cli_emulate(Cli* cli, string_t args) { | ||||
|     furi_hal_nfc_deactivate(); | ||||
| } | ||||
| 
 | ||||
| void nfc_cli_field(Cli* cli, string_t args) { | ||||
|     // Check if nfc worker is not busy
 | ||||
|     if(furi_hal_nfc_is_busy()) { | ||||
|         printf("Nfc is busy\r\n"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     furi_hal_nfc_exit_sleep(); | ||||
|     furi_hal_nfc_field_on(); | ||||
| 
 | ||||
|     printf("Field is on. Don't leave device in this mode for too long.\r\n"); | ||||
|     printf("Press Ctrl+C to abort\r\n"); | ||||
| 
 | ||||
|     while(!cli_cmd_interrupt_received(cli)) { | ||||
|         osDelay(50); | ||||
|     } | ||||
| 
 | ||||
|     furi_hal_nfc_field_off(); | ||||
|     furi_hal_nfc_deactivate(); | ||||
| } | ||||
| 
 | ||||
| static void nfc_cli(Cli* cli, string_t args, void* context) { | ||||
|     string_t cmd; | ||||
|     string_init(cmd); | ||||
| @ -94,6 +118,13 @@ static void nfc_cli(Cli* cli, string_t args, void* context) { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { | ||||
|             if(string_cmp_str(cmd, "field") == 0) { | ||||
|                 nfc_cli_field(cli, args); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         nfc_cli_print_usage(); | ||||
|     } while(false); | ||||
| 
 | ||||
|  | ||||
| @ -27,3 +27,5 @@ ADD_SCENE(nfc, read_emv_data, ReadEmvData) | ||||
| ADD_SCENE(nfc, read_emv_data_success, ReadEmvDataSuccess) | ||||
| ADD_SCENE(nfc, emulate_apdu_sequence, EmulateApduSequence) | ||||
| ADD_SCENE(nfc, restore_original, RestoreOriginal) | ||||
| ADD_SCENE(nfc, debug, Debug) | ||||
| ADD_SCENE(nfc, field, Field) | ||||
|  | ||||
							
								
								
									
										54
									
								
								applications/nfc/scenes/nfc_scene_debug.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								applications/nfc/scenes/nfc_scene_debug.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| #include "../nfc_i.h" | ||||
| 
 | ||||
| enum SubmenuDebugIndex { | ||||
|     SubmenuDebugIndexField, | ||||
|     SubmenuDebugIndexApdu, | ||||
| }; | ||||
| 
 | ||||
| void nfc_scene_debug_submenu_callback(void* context, uint32_t index) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
| 
 | ||||
|     view_dispatcher_send_custom_event(nfc->view_dispatcher, index); | ||||
| } | ||||
| 
 | ||||
| void nfc_scene_debug_on_enter(void* context) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
|     Submenu* submenu = nfc->submenu; | ||||
| 
 | ||||
|     submenu_add_item( | ||||
|         submenu, "Field", SubmenuDebugIndexField, nfc_scene_debug_submenu_callback, nfc); | ||||
|     submenu_add_item( | ||||
|         submenu, "Apdu", SubmenuDebugIndexApdu, nfc_scene_debug_submenu_callback, nfc); | ||||
| 
 | ||||
|     submenu_set_selected_item( | ||||
|         submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneDebug)); | ||||
| 
 | ||||
|     nfc_device_clear(nfc->dev); | ||||
|     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); | ||||
| } | ||||
| 
 | ||||
| bool nfc_scene_debug_on_event(void* context, SceneManagerEvent event) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
|     bool consumed = false; | ||||
| 
 | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         if(event.event == SubmenuDebugIndexField) { | ||||
|             scene_manager_set_scene_state( | ||||
|                 nfc->scene_manager, NfcSceneDebug, SubmenuDebugIndexField); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneField); | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuDebugIndexApdu) { | ||||
|             scene_manager_set_scene_state( | ||||
|                 nfc->scene_manager, NfcSceneDebug, SubmenuDebugIndexApdu); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateApduSequence); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
| 
 | ||||
| void nfc_scene_debug_on_exit(void* context) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
| 
 | ||||
|     submenu_reset(nfc->submenu); | ||||
| } | ||||
| @ -32,7 +32,5 @@ void nfc_scene_emulate_apdu_sequence_on_exit(void* context) { | ||||
| 
 | ||||
|     // Clear view
 | ||||
|     Popup* popup = nfc->popup; | ||||
|     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); | ||||
|     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); | ||||
|     popup_set_icon(popup, 0, 0, NULL); | ||||
|     popup_reset(popup); | ||||
| } | ||||
|  | ||||
							
								
								
									
										34
									
								
								applications/nfc/scenes/nfc_scene_field.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								applications/nfc/scenes/nfc_scene_field.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| #include "../nfc_i.h" | ||||
| 
 | ||||
| void nfc_scene_field_on_enter(void* context) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
| 
 | ||||
|     furi_hal_nfc_field_on(); | ||||
| 
 | ||||
|     Popup* popup = nfc->popup; | ||||
|     popup_set_header( | ||||
|         popup, | ||||
|         "Field is on\nDon't leave device\nin this mode for too long.", | ||||
|         64, | ||||
|         11, | ||||
|         AlignCenter, | ||||
|         AlignTop); | ||||
|     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); | ||||
| 
 | ||||
|     notification_internal_message(nfc->notifications, &sequence_set_blue_255); | ||||
| } | ||||
| 
 | ||||
| bool nfc_scene_field_on_event(void* context, SceneManagerEvent event) { | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void nfc_scene_field_on_exit(void* context) { | ||||
|     Nfc* nfc = (Nfc*)context; | ||||
| 
 | ||||
|     notification_internal_message(nfc->notifications, &sequence_reset_blue); | ||||
| 
 | ||||
|     Popup* popup = nfc->popup; | ||||
|     popup_reset(popup); | ||||
| 
 | ||||
|     furi_hal_nfc_field_off(); | ||||
| } | ||||
| @ -68,7 +68,7 @@ bool nfc_scene_start_on_event(void* context, SceneManagerEvent event) { | ||||
|             consumed = true; | ||||
|         } else if(event.event == SubmenuIndexDebug) { | ||||
|             scene_manager_set_scene_state(nfc->scene_manager, NfcSceneStart, SubmenuIndexDebug); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateApduSequence); | ||||
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneDebug); | ||||
|             consumed = true; | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく