Skip to content

Commit 67a9753

Browse files
Astrrragornekich
andauthored
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>
1 parent 9ffcc52 commit 67a9753

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

applications/nfc/scenes/nfc_scene_config.h

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ ADD_SCENE(nfc, mf_desfire_menu, MfDesfireMenu)
2525
ADD_SCENE(nfc, mf_desfire_data, MfDesfireData)
2626
ADD_SCENE(nfc, mf_desfire_app, MfDesfireApp)
2727
ADD_SCENE(nfc, mf_classic_read_success, MfClassicReadSuccess)
28+
ADD_SCENE(nfc, mf_classic_info, MfClassicInfo)
2829
ADD_SCENE(nfc, mf_classic_menu, MfClassicMenu)
2930
ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate)
3031
ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include "../nfc_i.h"
2+
3+
void nfc_scene_mf_classic_info_widget_callback(GuiButtonType result, InputType type, void* context) {
4+
furi_assert(context);
5+
Nfc* nfc = context;
6+
7+
if(type == InputTypeShort) {
8+
view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
9+
}
10+
}
11+
12+
void nfc_scene_mf_classic_info_on_enter(void* context) {
13+
Nfc* nfc = context;
14+
NfcDeviceData* dev_data = &nfc->dev->dev_data;
15+
MfClassicData* mf_data = &dev_data->mf_classic_data;
16+
string_t str_tmp;
17+
string_init(str_tmp);
18+
19+
// Setup view
20+
Widget* widget = nfc->widget;
21+
22+
widget_add_string_element(
23+
widget, 0, 0, AlignLeft, AlignTop, FontSecondary, mf_classic_get_type_str(mf_data->type));
24+
widget_add_string_element(
25+
widget, 0, 11, AlignLeft, AlignTop, FontSecondary, "ISO 14443-3 (Type A)");
26+
string_printf(str_tmp, "UID:");
27+
for(size_t i = 0; i < dev_data->nfc_data.uid_len; i++) {
28+
string_cat_printf(str_tmp, " %02X", dev_data->nfc_data.uid[i]);
29+
}
30+
widget_add_string_element(
31+
widget, 0, 22, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp));
32+
string_printf(
33+
str_tmp,
34+
"ATQA: %02X %02X SAK: %02X",
35+
dev_data->nfc_data.atqa[0],
36+
dev_data->nfc_data.atqa[1],
37+
dev_data->nfc_data.sak);
38+
widget_add_string_element(
39+
widget, 0, 33, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp));
40+
uint8_t sectors_total = mf_classic_get_total_sectors_num(mf_data->type);
41+
uint8_t keys_total = sectors_total * 2;
42+
uint8_t keys_found = 0;
43+
uint8_t sectors_read = 0;
44+
mf_classic_get_read_sectors_and_keys(mf_data, &sectors_read, &keys_found);
45+
string_printf(str_tmp, "Keys Found: %d/%d", keys_found, keys_total);
46+
widget_add_string_element(
47+
widget, 0, 44, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp));
48+
string_printf(str_tmp, "Sectors Read: %d/%d", sectors_read, sectors_total);
49+
widget_add_string_element(
50+
widget, 0, 55, AlignLeft, AlignTop, FontSecondary, string_get_cstr(str_tmp));
51+
52+
string_clear(str_tmp);
53+
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget);
54+
}
55+
56+
bool nfc_scene_mf_classic_info_on_event(void* context, SceneManagerEvent event) {
57+
Nfc* nfc = context;
58+
bool consumed = false;
59+
60+
if(event.type == SceneManagerEventTypeBack) {
61+
consumed = scene_manager_previous_scene(nfc->scene_manager);
62+
}
63+
64+
return consumed;
65+
}
66+
67+
void nfc_scene_mf_classic_info_on_exit(void* context) {
68+
Nfc* nfc = context;
69+
70+
// Clear view
71+
widget_reset(nfc->widget);
72+
}

applications/nfc/scenes/nfc_scene_mf_classic_menu.c

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
enum SubmenuIndex {
44
SubmenuIndexSave,
55
SubmenuIndexEmulate,
6+
SubmenuIndexInfo,
67
};
78

89
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) {
1920
submenu, "Save", SubmenuIndexSave, nfc_scene_mf_classic_menu_submenu_callback, nfc);
2021
submenu_add_item(
2122
submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_mf_classic_menu_submenu_callback, nfc);
23+
submenu_add_item(
24+
submenu, "Info", SubmenuIndexInfo, nfc_scene_mf_classic_menu_submenu_callback, nfc);
25+
2226
submenu_set_selected_item(
2327
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfClassicMenu));
2428

@@ -43,6 +47,11 @@ bool nfc_scene_mf_classic_menu_on_event(void* context, SceneManagerEvent event)
4347
nfc->scene_manager, NfcSceneMfClassicMenu, SubmenuIndexEmulate);
4448
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate);
4549
consumed = true;
50+
} else if(event.event == SubmenuIndexInfo) {
51+
scene_manager_set_scene_state(
52+
nfc->scene_manager, NfcSceneMfClassicMenu, SubmenuIndexInfo);
53+
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicInfo);
54+
consumed = true;
4655
}
4756
} else if(event.type == SceneManagerEventTypeBack) {
4857
consumed = scene_manager_previous_scene(nfc->scene_manager);

0 commit comments

Comments
 (0)