nfc_scene_read_mifare_ul_success.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "nfc_scene_read_mifare_ul_success.h"
  2. #include "../nfc_i.h"
  3. #include <furi.h>
  4. #include <gui/modules/dialog_ex.h>
  5. #include <gui/view_dispatcher.h>
  6. #define NFC_SCENE_READ_SUCCESS_SHIFT " "
  7. #define NFC_SCENE_READ_MF_UL_CUSTOM_EVENT (0UL)
  8. enum {
  9. ReadMifareUlStateShowUID,
  10. ReadMifareUlStateShowData,
  11. };
  12. void nfc_scene_read_mifare_ul_success_dialog_callback(DialogExResult result, void* context) {
  13. Nfc* nfc = (Nfc*)context;
  14. view_dispatcher_send_custom_event(nfc->nfc_common.view_dispatcher, result);
  15. }
  16. void nfc_scene_read_mifare_ul_success_text_box_callback(void* context) {
  17. Nfc* nfc = (Nfc*)context;
  18. view_dispatcher_send_custom_event(
  19. nfc->nfc_common.view_dispatcher, NFC_SCENE_READ_MF_UL_CUSTOM_EVENT);
  20. }
  21. const void nfc_scene_read_mifare_ul_success_on_enter(void* context) {
  22. Nfc* nfc = (Nfc*)context;
  23. // Clear device name
  24. nfc_device_set_name(&nfc->device, "");
  25. // Send notification
  26. notification_message(nfc->notifications, &sequence_success);
  27. // Setup dialog view
  28. NfcDeviceData* data =
  29. (NfcDeviceData*)&nfc->nfc_common.worker_result.nfc_mifare_ul_data.nfc_data;
  30. DialogEx* dialog_ex = nfc->dialog_ex;
  31. dialog_ex_set_left_button_text(dialog_ex, "Retry");
  32. dialog_ex_set_right_button_text(dialog_ex, "More");
  33. dialog_ex_set_center_button_text(dialog_ex, "Data");
  34. dialog_ex_set_header(dialog_ex, "Mifare Ultralight", 22, 8, AlignLeft, AlignCenter);
  35. dialog_ex_set_icon(dialog_ex, 8, 13, &I_Medium_chip_22x21);
  36. // Display UID
  37. nfc_set_text_store(
  38. nfc,
  39. NFC_SCENE_READ_SUCCESS_SHIFT "ATQA: %02X%02X\n" NFC_SCENE_READ_SUCCESS_SHIFT
  40. "SAK: %02X\nUID: %02X %02X %02X %02X %02X %02X %02X",
  41. data->atqa[0],
  42. data->atqa[1],
  43. data->sak,
  44. data->uid[0],
  45. data->uid[1],
  46. data->uid[2],
  47. data->uid[3],
  48. data->uid[4],
  49. data->uid[5],
  50. data->uid[6]);
  51. dialog_ex_set_text(dialog_ex, nfc->text_store, 8, 16, AlignLeft, AlignTop);
  52. dialog_ex_set_context(dialog_ex, nfc);
  53. dialog_ex_set_result_callback(dialog_ex, nfc_scene_read_mifare_ul_success_dialog_callback);
  54. // Setup TextBox view
  55. NfcMifareUlData* mf_ul_data =
  56. (NfcMifareUlData*)&nfc->nfc_common.worker_result.nfc_mifare_ul_data;
  57. TextBox* text_box = nfc->text_box;
  58. text_box_set_context(text_box, nfc);
  59. text_box_set_exit_callback(text_box, nfc_scene_read_mifare_ul_success_text_box_callback);
  60. text_box_set_font(text_box, TextBoxFontHex);
  61. for(uint16_t i = 0; i < mf_ul_data->dump_size; i += 2) {
  62. if(!(i % 8) && i) {
  63. string_push_back(nfc->text_box_store, '\n');
  64. }
  65. string_cat_printf(
  66. nfc->text_box_store,
  67. "%02X%02X ",
  68. mf_ul_data->full_dump[i],
  69. mf_ul_data->full_dump[i + 1]);
  70. }
  71. text_box_set_text(text_box, string_get_cstr(nfc->text_box_store));
  72. nfc->scene_read_mifare_ul_success->state = ReadMifareUlStateShowUID;
  73. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewDialogEx);
  74. }
  75. const bool nfc_scene_read_mifare_ul_success_on_event(void* context, uint32_t event) {
  76. Nfc* nfc = (Nfc*)context;
  77. if((nfc->scene_read_mifare_ul_success->state == ReadMifareUlStateShowUID) &&
  78. (event == DialogExResultLeft)) {
  79. view_dispatcher_send_navigation_event(
  80. nfc->nfc_common.view_dispatcher, ViewNavigatorEventBack);
  81. return true;
  82. } else if(
  83. (nfc->scene_read_mifare_ul_success->state == ReadMifareUlStateShowUID) &&
  84. (event == DialogExResultRight)) {
  85. view_dispatcher_add_scene(nfc->nfc_common.view_dispatcher, nfc->scene_mifare_ul_menu);
  86. view_dispatcher_send_navigation_event(
  87. nfc->nfc_common.view_dispatcher, ViewNavigatorEventNext);
  88. return true;
  89. } else if(
  90. (nfc->scene_read_mifare_ul_success->state == ReadMifareUlStateShowUID) &&
  91. (event == DialogExResultCenter)) {
  92. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewTextBox);
  93. nfc->scene_read_mifare_ul_success->state = ReadMifareUlStateShowData;
  94. return true;
  95. } else if(
  96. (nfc->scene_read_mifare_ul_success->state == ReadMifareUlStateShowData) &&
  97. (event == NFC_SCENE_READ_MF_UL_CUSTOM_EVENT)) {
  98. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewDialogEx);
  99. nfc->scene_read_mifare_ul_success->state = ReadMifareUlStateShowUID;
  100. return true;
  101. }
  102. return false;
  103. }
  104. const void nfc_scene_read_mifare_ul_success_on_exit(void* context) {
  105. Nfc* nfc = (Nfc*)context;
  106. // Clean dialog
  107. DialogEx* dialog_ex = nfc->dialog_ex;
  108. dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
  109. dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
  110. dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
  111. dialog_ex_set_left_button_text(dialog_ex, NULL);
  112. dialog_ex_set_right_button_text(dialog_ex, NULL);
  113. dialog_ex_set_center_button_text(dialog_ex, NULL);
  114. dialog_ex_set_result_callback(dialog_ex, NULL);
  115. dialog_ex_set_context(dialog_ex, NULL);
  116. // Clean TextBox
  117. TextBox* text_box = nfc->text_box;
  118. text_box_clean(text_box);
  119. string_clean(nfc->text_box_store);
  120. }
  121. AppScene* nfc_scene_read_mifare_ul_success_alloc() {
  122. AppScene* scene = furi_alloc(sizeof(AppScene));
  123. scene->id = NfcSceneReadMifareUlSuccess;
  124. scene->on_enter = nfc_scene_read_mifare_ul_success_on_enter;
  125. scene->on_event = nfc_scene_read_mifare_ul_success_on_event;
  126. scene->on_exit = nfc_scene_read_mifare_ul_success_on_exit;
  127. return scene;
  128. }
  129. void nfc_scene_read_mifare_ul_success_free(AppScene* scene) {
  130. free(scene);
  131. }