Skip to content

Commit 8cba3d8

Browse files
committed
V1.0 push
1 parent 9a79bda commit 8cba3d8

10 files changed

+138
-97
lines changed

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
# FlipperZero_NFC_Comparator
1+
# FlipperZero_NFC_Comparator
2+
3+
This is a simple tool to compare a stored NFC card against a physical card using a Flipper Zero device as of the moment it just checks the UID and protocol but i would like to add support for checking more variables to confirm how similar the NFC cards are.

application.fam

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ App(
55
entry_point="nfc_comparator_main",
66
stack_size=4 * 1024,
77
fap_category="NFC",
8-
fap_version="0.1",
8+
fap_version="1.0",
99
fap_icon="assets/Comparator_10px.png",
10-
fap_description="A app to check if a physical NFC card is the same as a saved one",
10+
fap_description="A tool to check if a physical NFC card is the same as a saved one",
1111
fap_author="acegoal07",
1212
fap_weburl="https://github.com/acegoal07/FlipperZero_NFC_Comparator",
1313
fap_icon_assets="assets",

lib/reader_worker/nfc_comparator_reader_worker.c

+46-32
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,22 @@ NfcComparatorReaderWorker* nfc_comparator_reader_worker_alloc() {
1111
4096,
1212
nfc_comparator_reader_worker_task,
1313
nfc_comparator_reader_worker);
14+
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Stopped;
1415
return nfc_comparator_reader_worker;
1516
}
1617

1718
void nfc_comparator_reader_worker_free(void* context) {
1819
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
1920
furi_assert(nfc_comparator_reader_worker);
2021
nfc_free(nfc_comparator_reader_worker->nfc);
21-
nfc_device_free(nfc_comparator_reader_worker->loaded_nfc_card);
2222
nfc_scanner_free(nfc_comparator_reader_worker->nfc_scanner);
2323
furi_thread_free(nfc_comparator_reader_worker->thread);
2424
free(nfc_comparator_reader_worker);
2525
}
2626

2727
void nfc_comparator_reader_worker_scanner_callback(NfcScannerEvent event, void* context) {
2828
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
29+
furi_assert(nfc_comparator_reader_worker);
2930
switch(event.type) {
3031
case NfcScannerEventTypeDetected:
3132
nfc_comparator_reader_worker->protocol = event.data.protocols;
@@ -38,6 +39,7 @@ void nfc_comparator_reader_worker_scanner_callback(NfcScannerEvent event, void*
3839

3940
NfcCommand nfc_comparator_reader_worker_poller_callback(NfcGenericEvent event, void* context) {
4041
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
42+
furi_assert(nfc_comparator_reader_worker);
4143
UNUSED(event);
4244
NfcCommand command = NfcCommandStop;
4345
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Comparing;
@@ -70,78 +72,90 @@ int32_t nfc_comparator_reader_worker_task(void* context) {
7072
while(nfc_comparator_reader_worker->state == NfcComparatorReaderWorkerState_Polling) {
7173
furi_delay_ms(100);
7274
}
75+
7376
nfc_poller_stop(nfc_poller);
7477

75-
NfcDeviceData* nfc_device_data = (NfcDeviceData*)nfc_poller_get_data(nfc_poller);
7678
NfcDevice* data = nfc_device_alloc();
77-
nfc_device_set_data(data, nfc_comparator_reader_worker->protocol[0], nfc_device_data);
78-
79-
if(nfc_device_get_protocol_name(nfc_device_get_protocol(data)) ==
80-
nfc_device_get_protocol_name(
81-
nfc_device_get_protocol(nfc_comparator_reader_worker->loaded_nfc_card))) {
82-
nfc_comparator_reader_worker->compare_checks->protocol = true;
83-
} else {
84-
nfc_comparator_reader_worker->compare_checks->protocol = false;
85-
}
79+
nfc_device_set_data(
80+
data,
81+
nfc_comparator_reader_worker->protocol[0],
82+
(NfcDeviceData*)nfc_poller_get_data(nfc_poller));
83+
84+
nfc_comparator_reader_worker->compare_checks.protocol =
85+
nfc_device_get_protocol_name(nfc_device_get_protocol(data)) ==
86+
nfc_device_get_protocol_name(
87+
nfc_device_get_protocol(nfc_comparator_reader_worker->loaded_nfc_card)) ?
88+
true :
89+
false;
8690

8791
nfc_poller_free(nfc_poller);
8892

8993
size_t poller_uid_len = 0;
90-
const uint8_t* uid = nfc_device_get_uid(data, &poller_uid_len);
94+
const uint8_t* poller_uid = nfc_device_get_uid(data, &poller_uid_len);
9195
FuriString* poller_uid_str = furi_string_alloc();
9296
for(size_t i = 0; i < poller_uid_len; i++) {
93-
char uid_str[3];
94-
snprintf(uid_str, sizeof(uid_str), "%02X", uid[i]);
95-
furi_string_cat(poller_uid_str, uid_str);
97+
furi_string_utf8_push(poller_uid_str, poller_uid[i]);
9698
}
9799

100+
nfc_device_free(data);
101+
98102
size_t loaded_uid_len = 0;
99103
const uint8_t* loaded_uid =
100104
nfc_device_get_uid(nfc_comparator_reader_worker->loaded_nfc_card, &loaded_uid_len);
101105
FuriString* loaded_uid_str = furi_string_alloc();
102106
for(size_t i = 0; i < loaded_uid_len; i++) {
103-
char uid_str[3];
104-
snprintf(uid_str, sizeof(uid_str), "%02X", loaded_uid[i]);
105-
furi_string_cat(loaded_uid_str, uid_str);
107+
furi_string_utf8_push(loaded_uid_str, loaded_uid[i]);
106108
}
107109

108-
if(furi_string_cmpi(poller_uid_str, loaded_uid_str) == 0) {
109-
nfc_comparator_reader_worker->compare_checks->uid = true;
110-
} else {
111-
nfc_comparator_reader_worker->compare_checks->uid = false;
112-
}
110+
nfc_comparator_reader_worker->compare_checks.uid =
111+
furi_string_cmpi(loaded_uid_str, poller_uid_str) == 0 ? true : false;
113112

114113
furi_string_free(poller_uid_str);
115114
furi_string_free(loaded_uid_str);
116115

116+
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Stopped;
117+
117118
return 0;
118119
}
119120

120121
void nfc_comparator_reader_worker_set_compare_nfc_device(void* context, NfcDevice* nfc_device) {
121122
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
123+
furi_assert(nfc_comparator_reader_worker);
122124
nfc_comparator_reader_worker->loaded_nfc_card = nfc_device;
123125
}
124126

125-
bool nfc_comparator_reader_worker_is_done(void* context) {
127+
bool nfc_comparator_reader_worker_is_running(void* context) {
126128
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
127-
return nfc_comparator_reader_worker->state == NfcComparatorReaderWorkerState_Stopped;
129+
return nfc_comparator_reader_worker->state != NfcComparatorReaderWorkerState_Stopped;
128130
}
129131

130-
NfcComparatorReaderWorkerCompareChecks*
131-
nfc_comparator_reader_worker_get_compare_checks(void* context) {
132+
NfcComparatorReaderWorkerState nfc_comparator_reader_worker_get_state(void* context) {
132133
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
133-
return nfc_comparator_reader_worker->compare_checks;
134+
furi_assert(nfc_comparator_reader_worker);
135+
return nfc_comparator_reader_worker->state;
136+
}
137+
138+
void nfc_comparator_reader_worker_stop(void* context) {
139+
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
140+
furi_assert(nfc_comparator_reader_worker);
141+
if(nfc_comparator_reader_worker->state != NfcComparatorReaderWorkerState_Stopped) {
142+
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Stopped;
143+
}
144+
furi_thread_join(nfc_comparator_reader_worker->thread);
134145
}
135146

136147
void nfc_comparator_reader_worker_start(void* context) {
137148
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
138149
furi_assert(nfc_comparator_reader_worker);
139-
furi_thread_start(nfc_comparator_reader_worker->thread);
150+
if(nfc_comparator_reader_worker->state == NfcComparatorReaderWorkerState_Stopped) {
151+
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Scanning;
152+
furi_thread_start(nfc_comparator_reader_worker->thread);
153+
}
140154
}
141155

142-
void nfc_comparator_reader_worker_stop(void* context) {
156+
NfcComparatorReaderWorkerCompareChecks
157+
nfc_comparator_reader_worker_get_compare_checks(void* context) {
143158
NfcComparatorReaderWorker* nfc_comparator_reader_worker = context;
144159
furi_assert(nfc_comparator_reader_worker);
145-
nfc_comparator_reader_worker->state = NfcComparatorReaderWorkerState_Stopped;
146-
furi_thread_join(nfc_comparator_reader_worker->thread);
160+
return nfc_comparator_reader_worker->compare_checks;
147161
}

lib/reader_worker/nfc_comparator_reader_worker.h

+7-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ typedef struct {
1818
bool protocol;
1919
} NfcComparatorReaderWorkerCompareChecks;
2020

21-
2221
typedef struct {
2322
Nfc* nfc;
2423
FuriThread* thread;
@@ -27,18 +26,20 @@ typedef struct {
2726
NfcDevice* loaded_nfc_card;
2827
NfcPoller* nfc_poller;
2928
NfcScanner* nfc_scanner;
30-
NfcComparatorReaderWorkerCompareChecks* compare_checks;
29+
NfcComparatorReaderWorkerCompareChecks compare_checks;
3130
} NfcComparatorReaderWorker;
3231

3332
NfcComparatorReaderWorker* nfc_comparator_reader_worker_alloc();
3433
void nfc_comparator_reader_worker_free(void* context);
35-
void nfc_comparator_reader_worker_start(void* context);
36-
void nfc_comparator_reader_worker_stop(void* context);
3734

3835
void nfc_comparator_reader_worker_scanner_callback(NfcScannerEvent event, void* context);
3936
NfcCommand nfc_comparator_reader_worker_poller_callback(NfcGenericEvent event, void* context);
4037
int32_t nfc_comparator_reader_worker_task(void* context);
4138
void nfc_comparator_reader_worker_set_compare_nfc_device(void* context, NfcDevice* nfc_device);
4239

43-
bool nfc_comparator_reader_worker_is_done(void* context);
44-
NfcComparatorReaderWorkerCompareChecks* nfc_comparator_reader_worker_get_compare_checks(void* context);
40+
bool nfc_comparator_reader_worker_is_running(void* context);
41+
NfcComparatorReaderWorkerState nfc_comparator_reader_worker_get_state(void* context);
42+
void nfc_comparator_reader_worker_stop(void* context);
43+
void nfc_comparator_reader_worker_start(void* context);
44+
NfcComparatorReaderWorkerCompareChecks
45+
nfc_comparator_reader_worker_get_compare_checks(void* context);

nfc_comparator.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ static void nfc_comparator_free(NfcComparator* nfc_comparator) {
6161
submenu_free(nfc_comparator->submenu);
6262
file_browser_free(nfc_comparator->file_browser);
6363
furi_string_free(nfc_comparator->file_browser_output);
64-
nfc_device_free(nfc_comparator->loaded_nfc_card);
64+
if(nfc_comparator->loaded_nfc_card) {
65+
nfc_device_free(nfc_comparator->loaded_nfc_card);
66+
}
6567
popup_free(nfc_comparator->popup);
6668

6769
free(nfc_comparator);

nfc_comparator.h

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ typedef struct {
4141
FuriString* file_browser_output;
4242
Popup* popup;
4343
NfcDevice* loaded_nfc_card;
44-
NfcComparatorReaderWorkerCompareChecks* compare_results;
4544
} NfcComparator;
4645

4746
#define NFC_ITEM_LOCATION "/ext/nfc/"
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
#include "../nfc_comparator.h"
3+
4+
void nfc_comparator_comparator_menu_callback(void* context, uint32_t index) {
5+
NfcComparator* nfc_comparator = context;
6+
scene_manager_handle_custom_event(nfc_comparator->scene_manager, index);
7+
}
8+
9+
void nfc_comparator_comparator_scene_on_enter(void* context) {
10+
NfcComparator* nfc_comparator = context;
11+
furi_assert(nfc_comparator);
12+
13+
popup_set_context(nfc_comparator->popup, nfc_comparator);
14+
view_dispatcher_switch_to_view(nfc_comparator->view_dispatcher, NfcComparatorView_Popup);
15+
16+
NfcComparatorReaderWorker* worker = nfc_comparator_reader_worker_alloc();
17+
nfc_comparator_reader_worker_set_compare_nfc_device(worker, nfc_comparator->loaded_nfc_card);
18+
nfc_comparator_reader_worker_start(worker);
19+
20+
while(nfc_comparator_reader_worker_is_running(worker)) {
21+
switch(nfc_comparator_reader_worker_get_state(worker)) {
22+
case NfcComparatorReaderWorkerState_Scanning:
23+
popup_set_header(nfc_comparator->popup, "Scanning....", 64, 5, AlignCenter, AlignTop);
24+
break;
25+
case NfcComparatorReaderWorkerState_Polling:
26+
popup_set_header(nfc_comparator->popup, "Polling....", 64, 5, AlignCenter, AlignTop);
27+
break;
28+
case NfcComparatorReaderWorkerState_Comparing:
29+
popup_set_header(nfc_comparator->popup, "Comparing....", 64, 5, AlignCenter, AlignTop);
30+
break;
31+
default:
32+
break;
33+
}
34+
furi_delay_ms(100);
35+
}
36+
nfc_comparator_reader_worker_stop(worker);
37+
38+
popup_set_header(nfc_comparator->popup, "Compare Results", 64, 5, AlignCenter, AlignTop);
39+
40+
NfcComparatorReaderWorkerCompareChecks checks =
41+
nfc_comparator_reader_worker_get_compare_checks(worker);
42+
nfc_comparator_reader_worker_free(worker);
43+
44+
FuriString* comparator = furi_string_alloc();
45+
furi_string_printf(
46+
comparator,
47+
"UID: %s\nProtocol: %s",
48+
checks.uid ? "Match" : "Mismatch",
49+
checks.protocol ? "Match" : "Mismatch");
50+
51+
char result_buffer[158];
52+
strncpy(result_buffer, furi_string_get_cstr(comparator), sizeof(result_buffer) - 1);
53+
54+
furi_string_free(comparator);
55+
56+
popup_set_text(nfc_comparator->popup, result_buffer, 64, 30, AlignCenter, AlignCenter);
57+
}
58+
59+
bool nfc_comparator_comparator_scene_on_event(void* context, SceneManagerEvent event) {
60+
UNUSED(context);
61+
UNUSED(event);
62+
bool consumed = false;
63+
return consumed;
64+
}
65+
66+
void nfc_comparator_comparator_scene_on_exit(void* context) {
67+
NfcComparator* nfc_comparator = context;
68+
popup_reset(nfc_comparator->popup);
69+
}

scenes/nfc_comparator_scene_config.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
ADD_SCENE(nfc_comparator, main_menu, MainMenu)
22
ADD_SCENE(nfc_comparator, select_nfc_card, SelectNfcCard)
3-
ADD_SCENE(nfc_comparator, results, Results)
3+
ADD_SCENE(nfc_comparator, comparator, Comparator)

scenes/nfc_comparator_scene_main_menu.c

+7-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "../nfc_comparator.h"
33

44
typedef enum {
5-
NfcComparatorMainMenu_Start,
5+
NfcComparatorMainMenu_StartComparator,
66
NfcComparatorMainMenu_SelectNfcCard
77
} NfcComparatorMainMenuMenuSelection;
88

@@ -20,8 +20,8 @@ void nfc_comparator_main_menu_scene_on_enter(void* context) {
2020

2121
submenu_add_lockable_item(
2222
nfc_comparator->submenu,
23-
"Start",
24-
NfcComparatorMainMenu_Start,
23+
"Start Comparator",
24+
NfcComparatorMainMenu_StartComparator,
2525
nfc_comparator_main_menu_menu_callback,
2626
nfc_comparator,
2727
!nfc_comparator->loaded_nfc_card,
@@ -34,6 +34,8 @@ void nfc_comparator_main_menu_scene_on_enter(void* context) {
3434
nfc_comparator_main_menu_menu_callback,
3535
nfc_comparator);
3636

37+
submenu_add_item(nfc_comparator->submenu, "By acegoal07", 0, NULL, NULL);
38+
3739
view_dispatcher_switch_to_view(nfc_comparator->view_dispatcher, NfcComparatorView_Submenu);
3840
}
3941

@@ -42,21 +44,10 @@ bool nfc_comparator_main_menu_scene_on_event(void* context, SceneManagerEvent ev
4244
bool consumed = false;
4345
if(event.type == SceneManagerEventTypeCustom) {
4446
switch(event.event) {
45-
case NfcComparatorMainMenu_Start: {
46-
NfcComparatorReaderWorker* worker = nfc_comparator_reader_worker_alloc();
47-
nfc_comparator_reader_worker_set_compare_nfc_device(
48-
worker, nfc_comparator->loaded_nfc_card);
49-
nfc_comparator_reader_worker_start(worker);
50-
while(!nfc_comparator_reader_worker_is_done(worker)) {
51-
furi_delay_ms(100);
52-
}
53-
nfc_comparator_reader_worker_stop(worker);
54-
nfc_comparator->compare_results = nfc_comparator_reader_worker_get_compare_checks(worker);
55-
nfc_comparator_reader_worker_free(worker);
56-
scene_manager_next_scene(nfc_comparator->scene_manager, NfcComparatorScene_Results);
47+
case NfcComparatorMainMenu_StartComparator:
48+
scene_manager_next_scene(nfc_comparator->scene_manager, NfcComparatorScene_Comparator);
5749
consumed = true;
5850
break;
59-
}
6051
case NfcComparatorMainMenu_SelectNfcCard:
6152
scene_manager_next_scene(nfc_comparator->scene_manager, NfcComparatorScene_SelectNfcCard);
6253
consumed = true;

scenes/nfc_comparator_scene_results.c

-37
This file was deleted.

0 commit comments

Comments
 (0)