[FL-662] Read Mifare Ultralight (#518)

* nfc: add read mifare ultralight to menu
* emv_decoder: add pragma once
* nfc: add mifare ultralight reader
* nfc: add mifare ultralight read draw
* nfc: add mifare ultralight type checker
* nfc: rework menu callback
* mifare ultralight: change type names

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
gornekich
2021-06-15 17:54:09 +03:00
committed by GitHub
parent 0b14db4fb3
commit a0fdc559c9
10 changed files with 351 additions and 17 deletions

View File

@@ -22,17 +22,7 @@ uint32_t nfc_view_exit(void* context) {
void nfc_menu_callback(void* context, uint32_t index) {
furi_assert(message_queue);
NfcMessage message;
if(index == 0) {
message.type = NfcMessageTypeDetect;
} else if(index == 1) {
message.type = NfcMessageTypeReadEMV;
} else if(index == 2) {
message.type = NfcMessageTypeEmulateEMV;
} else if(index == 3) {
message.type = NfcMessageTypeEmulate;
} else if(index == 4) {
message.type = NfcMessageTypeField;
}
message.type = index;
furi_check(osMessageQueuePut(message_queue, &message, 0, osWaitForever) == osOK);
}
@@ -52,11 +42,15 @@ Nfc* nfc_alloc() {
// Menu
nfc->submenu = submenu_alloc();
submenu_add_item(nfc->submenu, "Detect", 0, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Read EMV", 1, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Emulate EMV", 2, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Emulate", 3, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Field", 4, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Detect", NfcMessageTypeDetect, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Read EMV", NfcMessageTypeReadEMV, nfc_menu_callback, nfc);
submenu_add_item(
nfc->submenu, "Emulate EMV", NfcMessageTypeEmulateEMV, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Emulate", NfcMessageTypeEmulate, nfc_menu_callback, nfc);
submenu_add_item(nfc->submenu, "Field", NfcMessageTypeField, nfc_menu_callback, nfc);
submenu_add_item(
nfc->submenu, "Read MfUltralight", NfcMessageTypeReadMfUltralight, nfc_menu_callback, nfc);
View* submenu_view = submenu_get_view(nfc->submenu);
view_set_previous_callback(submenu_view, nfc_view_exit);
view_dispatcher_add_view(nfc->view_dispatcher, NfcViewMenu, submenu_view);
@@ -98,6 +92,16 @@ Nfc* nfc_alloc() {
view_set_previous_callback(nfc->view_field, nfc_view_stop);
view_dispatcher_add_view(nfc->view_dispatcher, NfcViewField, nfc->view_field);
// Read Mifare Ultralight
nfc->view_read_mf_ultralight = view_alloc();
view_set_context(nfc->view_read_mf_ultralight, nfc);
view_set_draw_callback(nfc->view_read_mf_ultralight, nfc_view_read_mf_ultralight_draw);
view_set_previous_callback(nfc->view_read_mf_ultralight, nfc_view_stop);
view_allocate_model(
nfc->view_read_mf_ultralight, ViewModelTypeLocking, sizeof(NfcViewReadModel));
view_dispatcher_add_view(
nfc->view_dispatcher, NfcViewReadMfUltralight, nfc->view_read_mf_ultralight);
// Error
nfc->view_error = view_alloc();
view_set_context(nfc->view_error, nfc);
@@ -144,6 +148,10 @@ void nfc_free(Nfc* nfc) {
view_dispatcher_remove_view(nfc->view_dispatcher, NfcViewField);
view_free(nfc->view_field);
// Read Mifare Ultralight
view_dispatcher_remove_view(nfc->view_dispatcher, NfcViewReadMfUltralight);
view_free(nfc->view_read_mf_ultralight);
// Error
view_dispatcher_remove_view(nfc->view_dispatcher, NfcViewError);
view_free(nfc->view_error);
@@ -180,6 +188,7 @@ int32_t nfc_task(void* p) {
NfcMessage message;
while(1) {
furi_check(osMessageQueueGet(message_queue, &message, NULL, osWaitForever) == osOK);
if(message.type == NfcMessageTypeDetect) {
with_view_model(
nfc->view_detect, (NfcViewReadModel * model) {
@@ -200,6 +209,8 @@ int32_t nfc_task(void* p) {
nfc_start(nfc, NfcViewEmulate, NfcWorkerStateEmulate);
} else if(message.type == NfcMessageTypeField) {
nfc_start(nfc, NfcViewField, NfcWorkerStateField);
} else if(message.type == NfcMessageTypeReadMfUltralight) {
nfc_start(nfc, NfcViewReadMfUltralight, NfcWorkerStateReadMfUltralight);
} else if(message.type == NfcMessageTypeStop) {
nfc_worker_stop(nfc->worker);
} else if(message.type == NfcMessageTypeDeviceFound) {
@@ -228,6 +239,19 @@ int32_t nfc_task(void* p) {
model->found = false;
return true;
});
} else if(message.type == NfcMessageTypeMfUlFound) {
with_view_model(
nfc->view_read_mf_ultralight, (NfcViewReadModel * model) {
model->found = true;
model->device = message.device;
return true;
});
} else if(message.type == NfcMessageTypeMfUlNotFound) {
with_view_model(
nfc->view_read_mf_ultralight, (NfcViewReadModel * model) {
model->found = false;
return true;
});
} else if(message.type == NfcMessageTypeExit) {
nfc_free(nfc);
break;