Skip to content

Commit c40e881

Browse files
authored
[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
1 parent b6e52e9 commit c40e881

File tree

11 files changed

+98
-33
lines changed

11 files changed

+98
-33
lines changed

applications/nfc/scenes/nfc_scene_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ ADD_SCENE(nfc, emulate_apdu_sequence, EmulateApduSequence)
3030
ADD_SCENE(nfc, device_info, DeviceInfo)
3131
ADD_SCENE(nfc, delete, Delete)
3232
ADD_SCENE(nfc, delete_success, DeleteSuccess)
33+
ADD_SCENE(nfc, restore_original_confirm, RestoreOriginalConfirm)
3334
ADD_SCENE(nfc, restore_original, RestoreOriginal)
3435
ADD_SCENE(nfc, debug, Debug)
3536
ADD_SCENE(nfc, field, Field)

applications/nfc/scenes/nfc_scene_mf_desfire_read_success.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,12 @@ void nfc_scene_mf_desfire_read_success_on_enter(void* context) {
3434
}
3535
}
3636

37+
// TODO rework info view
3738
nfc_text_store_set(
3839
nfc,
39-
"UID: %02X %02X %02X %02X %02X %02X %02X\n" NFC_SCENE_READ_SUCCESS_SHIFT
40-
"%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
41-
"%d application%s, %d file%s",
42-
data->version.uid[0],
43-
data->version.uid[1],
44-
data->version.uid[2],
45-
data->version.uid[3],
46-
data->version.uid[4],
47-
data->version.uid[5],
48-
data->version.uid[6],
40+
NFC_SCENE_READ_SUCCESS_SHIFT "Mifare DESFire\n" NFC_SCENE_READ_SUCCESS_SHIFT
41+
"%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
42+
"%d application%s, %d file%s",
4943
1 << (data->version.sw_storage >> 1),
5044
(data->version.sw_storage & 1) ? "+" : "",
5145
data->free_memory ? data->free_memory->bytes : 0,

applications/nfc/scenes/nfc_scene_read.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ void nfc_scene_read_set_state(Nfc* nfc, NfcSceneReadState state) {
2323
uint32_t curr_state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneRead);
2424
if(curr_state != state) {
2525
if(state == NfcSceneReadStateDetecting) {
26-
popup_set_header(nfc->popup, "Detecting\nNFC card", 90, 24, AlignCenter, AlignTop);
27-
popup_set_icon(nfc->popup, 5, 7, &I_NFC_manual);
26+
popup_reset(nfc->popup);
27+
popup_set_text(
28+
nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop);
29+
popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual);
2830
} else if(state == NfcSceneReadStateReading) {
31+
popup_reset(nfc->popup);
2932
popup_set_header(
3033
nfc->popup, "Reading card\nDon't move...", 85, 24, AlignCenter, AlignTop);
31-
popup_set_icon(nfc->popup, 19, 23, &A_Loading_24);
34+
popup_set_icon(nfc->popup, 12, 23, &A_Loading_24);
3235
}
3336
scene_manager_set_scene_state(nfc->scene_manager, NfcSceneRead, state);
3437
}

applications/nfc/scenes/nfc_scene_restore_original.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ bool nfc_scene_restore_original_on_event(void* context, SceneManagerEvent event)
2525

2626
if(event.type == SceneManagerEventTypeCustom) {
2727
if(event.event == NfcCustomEventViewExit) {
28-
consumed = scene_manager_previous_scene(nfc->scene_manager);
28+
if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
29+
consumed = scene_manager_search_and_switch_to_previous_scene(
30+
nfc->scene_manager, NfcSceneSavedMenu);
31+
} else {
32+
consumed = scene_manager_search_and_switch_to_previous_scene(
33+
nfc->scene_manager, NfcSceneStart);
34+
}
2935
}
3036
}
3137
return consumed;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include "../nfc_i.h"
2+
3+
void nfc_scene_restore_original_confirm_dialog_callback(DialogExResult result, void* context) {
4+
Nfc* nfc = context;
5+
6+
view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
7+
}
8+
9+
void nfc_scene_restore_original_confirm_on_enter(void* context) {
10+
Nfc* nfc = context;
11+
DialogEx* dialog_ex = nfc->dialog_ex;
12+
13+
dialog_ex_set_header(dialog_ex, "Restore card data?", 64, 0, AlignCenter, AlignTop);
14+
dialog_ex_set_icon(dialog_ex, 5, 15, &I_Restoring);
15+
dialog_ex_set_text(
16+
dialog_ex, "It will be returned\nto its original state.", 47, 21, AlignLeft, AlignTop);
17+
dialog_ex_set_left_button_text(dialog_ex, "Cancel");
18+
dialog_ex_set_right_button_text(dialog_ex, "Restore");
19+
dialog_ex_set_context(dialog_ex, nfc);
20+
dialog_ex_set_result_callback(dialog_ex, nfc_scene_restore_original_confirm_dialog_callback);
21+
22+
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
23+
}
24+
25+
bool nfc_scene_restore_original_confirm_on_event(void* context, SceneManagerEvent event) {
26+
Nfc* nfc = context;
27+
bool consumed = false;
28+
29+
if(event.type == SceneManagerEventTypeCustom) {
30+
if(event.event == DialogExResultRight) {
31+
if(!nfc_device_restore(nfc->dev, true)) {
32+
scene_manager_search_and_switch_to_previous_scene(
33+
nfc->scene_manager, NfcSceneStart);
34+
} else {
35+
scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginal);
36+
}
37+
consumed = true;
38+
} else if(event.event == DialogExResultLeft) {
39+
consumed = scene_manager_previous_scene(nfc->scene_manager);
40+
}
41+
} else if(event.type == SceneManagerEventTypeBack) {
42+
consumed = true;
43+
}
44+
45+
return consumed;
46+
}
47+
48+
void nfc_scene_restore_original_confirm_on_exit(void* context) {
49+
Nfc* nfc = context;
50+
51+
// Clean view
52+
dialog_ex_reset(nfc->dialog_ex);
53+
}

applications/nfc/scenes/nfc_scene_save_success.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) {
2727

2828
if(event.type == SceneManagerEventTypeCustom) {
2929
if(event.event == NfcCustomEventViewExit) {
30-
if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfDesfireMenu)) {
30+
if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
3131
consumed = scene_manager_search_and_switch_to_previous_scene(
32-
nfc->scene_manager, NfcSceneMfDesfireMenu);
32+
nfc->scene_manager, NfcSceneSavedMenu);
3333
} else {
34-
consumed = scene_manager_search_and_switch_to_previous_scene(
35-
nfc->scene_manager, NfcSceneStart);
34+
consumed = scene_manager_search_and_switch_to_another_scene(
35+
nfc->scene_manager, NfcSceneFileSelect);
3636
}
3737
}
3838
}

applications/nfc/scenes/nfc_scene_saved_menu.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
enum SubmenuIndex {
44
SubmenuIndexEmulate,
5-
SubmenuIndexEdit,
5+
SubmenuIndexRename,
66
SubmenuIndexDelete,
77
SubmenuIndexInfo,
88
SubmenuIndexRestoreOriginal,
@@ -33,22 +33,22 @@ void nfc_scene_saved_menu_on_enter(void* context) {
3333
submenu_add_item(
3434
submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_saved_menu_submenu_callback, nfc);
3535
}
36-
submenu_add_item(
37-
submenu, "Edit UID and Name", SubmenuIndexEdit, nfc_scene_saved_menu_submenu_callback, nfc);
38-
submenu_add_item(
39-
submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
4036
submenu_add_item(
4137
submenu, "Info", SubmenuIndexInfo, nfc_scene_saved_menu_submenu_callback, nfc);
4238
submenu_set_selected_item(
4339
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneSavedMenu));
4440
if(nfc->dev->shadow_file_exist) {
4541
submenu_add_item(
4642
submenu,
47-
"Restore original",
43+
"Restore to original",
4844
SubmenuIndexRestoreOriginal,
4945
nfc_scene_saved_menu_submenu_callback,
5046
nfc);
5147
}
48+
submenu_add_item(
49+
submenu, "Rename", SubmenuIndexRename, nfc_scene_saved_menu_submenu_callback, nfc);
50+
submenu_add_item(
51+
submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
5252

5353
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu);
5454
}
@@ -68,8 +68,8 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
6868
scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
6969
}
7070
consumed = true;
71-
} else if(event.event == SubmenuIndexEdit) {
72-
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
71+
} else if(event.event == SubmenuIndexRename) {
72+
scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
7373
consumed = true;
7474
} else if(event.event == SubmenuIndexDelete) {
7575
scene_manager_next_scene(nfc->scene_manager, NfcSceneDelete);
@@ -78,12 +78,7 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
7878
scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
7979
consumed = true;
8080
} else if(event.event == SubmenuIndexRestoreOriginal) {
81-
if(!nfc_device_restore(nfc->dev, true)) {
82-
scene_manager_search_and_switch_to_previous_scene(
83-
nfc->scene_manager, NfcSceneStart);
84-
} else {
85-
scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginal);
86-
}
81+
scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginalConfirm);
8782
consumed = true;
8883
}
8984
}

assets/icons/NFC/NFC_manual.png

19 Bytes
Loading

assets/icons/NFC/Restoring.png

3.71 KB
Loading

furi/core/common_defines.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ extern "C" {
9292
#define FURI_BIT_SET(x, n) ((x) |= (1 << (n)))
9393
#endif
9494

95+
#ifndef FURI_BIT_CLEAR
96+
#define FURI_BIT_CLEAR(x, n) ((x) &= ~(1 << (n)))
97+
#endif
98+
9599
#ifndef FURI_IS_IRQ_MASKED
96100
#define FURI_IS_IRQ_MASKED() (__get_PRIMASK() != 0U)
97101
#endif

0 commit comments

Comments
 (0)