|
|
@@ -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;
|