Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgornekich <n.gorbadey@gmail.com>2022-07-28 15:34:28 +0300
committerGitHub <noreply@github.com>2022-07-28 15:34:28 +0300
commitc40e8811d68e9f4b8f603ae5d5826b814521014d (patch)
tree65146d9465342e925c3b6804197b2e01cc626639
parentb6e52e979d07dbd17de80614df6fa224fcb9af33 (diff)
[FL-2701], [FL-2702], [FL-2699] NFC fixes (#1478)
* nfc: change read scene views * nfc: rework return after save success * nfc: add fallback to read UID of unrecognized iso14443-3 * nfc: show mifare desfire on read success * nfc: add restore original confirm scene * nfc: fix icon name * nfc: clear 6 bit in SAK to emulate 14443-4 uids * nfc: don't change original sak
-rwxr-xr-xapplications/nfc/scenes/nfc_scene_config.h1
-rw-r--r--applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c14
-rw-r--r--applications/nfc/scenes/nfc_scene_read.c9
-rw-r--r--applications/nfc/scenes/nfc_scene_restore_original.c8
-rw-r--r--applications/nfc/scenes/nfc_scene_restore_original_confirm.c53
-rw-r--r--applications/nfc/scenes/nfc_scene_save_success.c8
-rw-r--r--applications/nfc/scenes/nfc_scene_saved_menu.c23
-rw-r--r--assets/icons/NFC/NFC_manual.pngbin3785 -> 3804 bytes
-rw-r--r--assets/icons/NFC/Restoring.pngbin0 -> 3794 bytes
-rw-r--r--furi/core/common_defines.h4
-rw-r--r--lib/nfc/nfc_worker.c11
11 files changed, 98 insertions, 33 deletions
diff --git a/applications/nfc/scenes/nfc_scene_config.h b/applications/nfc/scenes/nfc_scene_config.h
index 6e2369fd..de8de6b4 100755
--- a/applications/nfc/scenes/nfc_scene_config.h
+++ b/applications/nfc/scenes/nfc_scene_config.h
@@ -30,6 +30,7 @@ ADD_SCENE(nfc, emulate_apdu_sequence, EmulateApduSequence)
ADD_SCENE(nfc, device_info, DeviceInfo)
ADD_SCENE(nfc, delete, Delete)
ADD_SCENE(nfc, delete_success, DeleteSuccess)
+ADD_SCENE(nfc, restore_original_confirm, RestoreOriginalConfirm)
ADD_SCENE(nfc, restore_original, RestoreOriginal)
ADD_SCENE(nfc, debug, Debug)
ADD_SCENE(nfc, field, Field)
diff --git a/applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c b/applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c
index 673b316b..a04f4e55 100644
--- a/applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c
+++ b/applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c
@@ -34,18 +34,12 @@ void nfc_scene_mf_desfire_read_success_on_enter(void* context) {
}
}
+ // TODO rework info view
nfc_text_store_set(
nfc,
- "UID: %02X %02X %02X %02X %02X %02X %02X\n" NFC_SCENE_READ_SUCCESS_SHIFT
- "%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
- "%d application%s, %d file%s",
- data->version.uid[0],
- data->version.uid[1],
- data->version.uid[2],
- data->version.uid[3],
- data->version.uid[4],
- data->version.uid[5],
- data->version.uid[6],
+ NFC_SCENE_READ_SUCCESS_SHIFT "Mifare DESFire\n" NFC_SCENE_READ_SUCCESS_SHIFT
+ "%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
+ "%d application%s, %d file%s",
1 << (data->version.sw_storage >> 1),
(data->version.sw_storage & 1) ? "+" : "",
data->free_memory ? data->free_memory->bytes : 0,
diff --git a/applications/nfc/scenes/nfc_scene_read.c b/applications/nfc/scenes/nfc_scene_read.c
index 9e1c0109..491b419e 100644
--- a/applications/nfc/scenes/nfc_scene_read.c
+++ b/applications/nfc/scenes/nfc_scene_read.c
@@ -23,12 +23,15 @@ void nfc_scene_read_set_state(Nfc* nfc, NfcSceneReadState state) {
uint32_t curr_state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneRead);
if(curr_state != state) {
if(state == NfcSceneReadStateDetecting) {
- popup_set_header(nfc->popup, "Detecting\nNFC card", 90, 24, AlignCenter, AlignTop);
- popup_set_icon(nfc->popup, 5, 7, &I_NFC_manual);
+ popup_reset(nfc->popup);
+ popup_set_text(
+ nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop);
+ popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual);
} else if(state == NfcSceneReadStateReading) {
+ popup_reset(nfc->popup);
popup_set_header(
nfc->popup, "Reading card\nDon't move...", 85, 24, AlignCenter, AlignTop);
- popup_set_icon(nfc->popup, 19, 23, &A_Loading_24);
+ popup_set_icon(nfc->popup, 12, 23, &A_Loading_24);
}
scene_manager_set_scene_state(nfc->scene_manager, NfcSceneRead, state);
}
diff --git a/applications/nfc/scenes/nfc_scene_restore_original.c b/applications/nfc/scenes/nfc_scene_restore_original.c
index 40b59b9e..3ecf5c04 100644
--- a/applications/nfc/scenes/nfc_scene_restore_original.c
+++ b/applications/nfc/scenes/nfc_scene_restore_original.c
@@ -25,7 +25,13 @@ bool nfc_scene_restore_original_on_event(void* context, SceneManagerEvent event)
if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventViewExit) {
- consumed = scene_manager_previous_scene(nfc->scene_manager);
+ if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
+ consumed = scene_manager_search_and_switch_to_previous_scene(
+ nfc->scene_manager, NfcSceneSavedMenu);
+ } else {
+ consumed = scene_manager_search_and_switch_to_previous_scene(
+ nfc->scene_manager, NfcSceneStart);
+ }
}
}
return consumed;
diff --git a/applications/nfc/scenes/nfc_scene_restore_original_confirm.c b/applications/nfc/scenes/nfc_scene_restore_original_confirm.c
new file mode 100644
index 00000000..70d161dd
--- /dev/null
+++ b/applications/nfc/scenes/nfc_scene_restore_original_confirm.c
@@ -0,0 +1,53 @@
+#include "../nfc_i.h"
+
+void nfc_scene_restore_original_confirm_dialog_callback(DialogExResult result, void* context) {
+ Nfc* nfc = context;
+
+ view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
+}
+
+void nfc_scene_restore_original_confirm_on_enter(void* context) {
+ Nfc* nfc = context;
+ DialogEx* dialog_ex = nfc->dialog_ex;
+
+ dialog_ex_set_header(dialog_ex, "Restore card data?", 64, 0, AlignCenter, AlignTop);
+ dialog_ex_set_icon(dialog_ex, 5, 15, &I_Restoring);
+ dialog_ex_set_text(
+ dialog_ex, "It will be returned\nto its original state.", 47, 21, AlignLeft, AlignTop);
+ dialog_ex_set_left_button_text(dialog_ex, "Cancel");
+ dialog_ex_set_right_button_text(dialog_ex, "Restore");
+ dialog_ex_set_context(dialog_ex, nfc);
+ dialog_ex_set_result_callback(dialog_ex, nfc_scene_restore_original_confirm_dialog_callback);
+
+ view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
+}
+
+bool nfc_scene_restore_original_confirm_on_event(void* context, SceneManagerEvent event) {
+ Nfc* nfc = context;
+ bool consumed = false;
+
+ if(event.type == SceneManagerEventTypeCustom) {
+ if(event.event == DialogExResultRight) {
+ if(!nfc_device_restore(nfc->dev, true)) {
+ scene_manager_search_and_switch_to_previous_scene(
+ nfc->scene_manager, NfcSceneStart);
+ } else {
+ scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginal);
+ }
+ consumed = true;
+ } else if(event.event == DialogExResultLeft) {
+ consumed = scene_manager_previous_scene(nfc->scene_manager);
+ }
+ } else if(event.type == SceneManagerEventTypeBack) {
+ consumed = true;
+ }
+
+ return consumed;
+}
+
+void nfc_scene_restore_original_confirm_on_exit(void* context) {
+ Nfc* nfc = context;
+
+ // Clean view
+ dialog_ex_reset(nfc->dialog_ex);
+}
diff --git a/applications/nfc/scenes/nfc_scene_save_success.c b/applications/nfc/scenes/nfc_scene_save_success.c
index 355f4a80..a3b17451 100644
--- a/applications/nfc/scenes/nfc_scene_save_success.c
+++ b/applications/nfc/scenes/nfc_scene_save_success.c
@@ -27,12 +27,12 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventViewExit) {
- if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfDesfireMenu)) {
+ if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
consumed = scene_manager_search_and_switch_to_previous_scene(
- nfc->scene_manager, NfcSceneMfDesfireMenu);
+ nfc->scene_manager, NfcSceneSavedMenu);
} else {
- consumed = scene_manager_search_and_switch_to_previous_scene(
- nfc->scene_manager, NfcSceneStart);
+ consumed = scene_manager_search_and_switch_to_another_scene(
+ nfc->scene_manager, NfcSceneFileSelect);
}
}
}
diff --git a/applications/nfc/scenes/nfc_scene_saved_menu.c b/applications/nfc/scenes/nfc_scene_saved_menu.c
index 269864ca..7c390f0b 100644
--- a/applications/nfc/scenes/nfc_scene_saved_menu.c
+++ b/applications/nfc/scenes/nfc_scene_saved_menu.c
@@ -2,7 +2,7 @@
enum SubmenuIndex {
SubmenuIndexEmulate,
- SubmenuIndexEdit,
+ SubmenuIndexRename,
SubmenuIndexDelete,
SubmenuIndexInfo,
SubmenuIndexRestoreOriginal,
@@ -34,21 +34,21 @@ void nfc_scene_saved_menu_on_enter(void* context) {
submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_saved_menu_submenu_callback, nfc);
}
submenu_add_item(
- submenu, "Edit UID and Name", SubmenuIndexEdit, nfc_scene_saved_menu_submenu_callback, nfc);
- submenu_add_item(
- submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
- submenu_add_item(
submenu, "Info", SubmenuIndexInfo, nfc_scene_saved_menu_submenu_callback, nfc);
submenu_set_selected_item(
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneSavedMenu));
if(nfc->dev->shadow_file_exist) {
submenu_add_item(
submenu,
- "Restore original",
+ "Restore to original",
SubmenuIndexRestoreOriginal,
nfc_scene_saved_menu_submenu_callback,
nfc);
}
+ submenu_add_item(
+ submenu, "Rename", SubmenuIndexRename, nfc_scene_saved_menu_submenu_callback, nfc);
+ submenu_add_item(
+ submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu);
}
@@ -68,8 +68,8 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
}
consumed = true;
- } else if(event.event == SubmenuIndexEdit) {
- scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
+ } else if(event.event == SubmenuIndexRename) {
+ scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
consumed = true;
} else if(event.event == SubmenuIndexDelete) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneDelete);
@@ -78,12 +78,7 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
consumed = true;
} else if(event.event == SubmenuIndexRestoreOriginal) {
- if(!nfc_device_restore(nfc->dev, true)) {
- scene_manager_search_and_switch_to_previous_scene(
- nfc->scene_manager, NfcSceneStart);
- } else {
- scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginal);
- }
+ scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginalConfirm);
consumed = true;
}
}
diff --git a/assets/icons/NFC/NFC_manual.png b/assets/icons/NFC/NFC_manual.png
index d142f0fc..787c0bcf 100644
--- a/assets/icons/NFC/NFC_manual.png
+++ b/assets/icons/NFC/NFC_manual.png
Binary files differ
diff --git a/assets/icons/NFC/Restoring.png b/assets/icons/NFC/Restoring.png
new file mode 100644
index 00000000..9e058869
--- /dev/null
+++ b/assets/icons/NFC/Restoring.png
Binary files differ
diff --git a/furi/core/common_defines.h b/furi/core/common_defines.h
index e95e45f7..c211ad7e 100644
--- a/furi/core/common_defines.h
+++ b/furi/core/common_defines.h
@@ -92,6 +92,10 @@ extern "C" {
#define FURI_BIT_SET(x, n) ((x) |= (1 << (n)))
#endif
+#ifndef FURI_BIT_CLEAR
+#define FURI_BIT_CLEAR(x, n) ((x) &= ~(1 << (n)))
+#endif
+
#ifndef FURI_IS_IRQ_MASKED
#define FURI_IS_IRQ_MASKED() (__get_PRIMASK() != 0U)
#endif
diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c
index 4a3176ff..3a45c363 100644
--- a/lib/nfc/nfc_worker.c
+++ b/lib/nfc/nfc_worker.c
@@ -245,6 +245,9 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
}
card_read = true;
+ } else {
+ nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
+ card_read = true;
}
return card_read;
@@ -321,8 +324,14 @@ void nfc_worker_emulate_uid(NfcWorker* nfc_worker) {
FuriHalNfcDevData* data = &nfc_worker->dev_data->nfc_data;
NfcReaderRequestData* reader_data = &nfc_worker->dev_data->reader_data;
+ // TODO add support for RATS
+ // Now remove bit 6 in SAK to support ISO-14443A-3 emulation
+ // Need to save ATS to support ISO-14443A-4 emulation
+ uint8_t sak = data->sak;
+ FURI_BIT_CLEAR(sak, 5);
+
while(nfc_worker->state == NfcWorkerStateUidEmulate) {
- if(furi_hal_nfc_listen(data->uid, data->uid_len, data->atqa, data->sak, true, 100)) {
+ if(furi_hal_nfc_listen(data->uid, data->uid_len, data->atqa, sak, true, 100)) {
if(furi_hal_nfc_tx_rx(&tx_rx, 100)) {
reader_data->size = tx_rx.rx_bits / 8;
if(reader_data->size > 0) {