[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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user