nfc_magic_scene_gen4_show_info.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "../nfc_magic_app_i.h"
  2. #include "gui/modules/widget_elements/widget_element.h"
  3. #include "gui/scene_manager.h"
  4. #include "protocols/gen4/gen4_poller_i.h"
  5. #include <bit_lib.h>
  6. #define CONFIG_SIZE (32)
  7. static char* gen4_get_shadow_mode_name(Gen4PollerShadowMode mode) {
  8. switch(mode) {
  9. case Gen4PollerShadowModePreWrite:
  10. return "Pre-Write";
  11. case Gen4PollerShadowModeRestore:
  12. return "Restore";
  13. case Gen4PollerShadowModeDisabled:
  14. return "Disabled";
  15. case Gen4PollerShadowModeHighSpeedDisabled:
  16. return "Disabled (High-speed)";
  17. case Gen4PollerShadowModeSplit:
  18. return "Split";
  19. default:
  20. return "Unknown";
  21. }
  22. }
  23. static char* gen4_get_direct_write_mode_name(Gen4PollerDirectWriteBlock0Mode mode) {
  24. switch(mode) {
  25. case Gen4PollerDirectWriteBlock0ModeEnabled:
  26. return "Enabled";
  27. case Gen4PollerDirectWriteBlock0ModeDisabled:
  28. return "Disabled";
  29. case Gen4PollerDirectWriteBlock0ModeDefault:
  30. return "Default";
  31. default:
  32. return "Unknown";
  33. }
  34. }
  35. static char* gen4_get_uid_len(uint8_t byte) {
  36. switch(byte) {
  37. case 0:
  38. return "4";
  39. case 1:
  40. return "7";
  41. default:
  42. return "Unknown";
  43. }
  44. }
  45. void nfc_magic_scene_gen4_show_info_widget_callback(
  46. GuiButtonType result,
  47. InputType type,
  48. void* context) {
  49. NfcMagicApp* instance = context;
  50. if(type == InputTypeShort) {
  51. view_dispatcher_send_custom_event(instance->view_dispatcher, result);
  52. }
  53. }
  54. void nfc_magic_scene_gen4_show_info_on_enter(void* context) {
  55. NfcMagicApp* instance = context;
  56. Widget* widget = instance->widget;
  57. notification_message(instance->notifications, &sequence_success);
  58. Gen4PollerDirectWriteBlock0Mode dw_mode = instance->gen4_config[29];
  59. Gen4PollerShadowMode s_mode = instance->gen4_config[6];
  60. uint8_t ats_len = instance->gen4_config[7];
  61. FuriString* output = furi_string_alloc();
  62. // Revision
  63. furi_string_cat_printf(
  64. output, "Revision: %02X %02X\n", instance->gen4_revision[3], instance->gen4_revision[4]);
  65. // Password
  66. furi_string_cat_printf(
  67. output, "Password: %08llX\n", bit_lib_bytes_to_num_be(instance->gen4_config + 2, 4));
  68. // Shadow mode
  69. furi_string_cat_printf(output, "Shadow Mode: %s\n", gen4_get_shadow_mode_name(s_mode));
  70. // Direct write to block 0 mode
  71. furi_string_cat_printf(
  72. output, "Direct Write Mode: %s\n", gen4_get_direct_write_mode_name(dw_mode));
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////
  74. furi_string_cat_printf(output, ":::::::::::::[Configured As]::::::::::::::\n");
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////
  76. // UID len
  77. furi_string_cat_printf(output, "UID Length: %s\n", gen4_get_uid_len(instance->gen4_config[1]));
  78. // ATS
  79. furi_string_cat_printf(output, "ATS:");
  80. if(ats_len)
  81. for(uint8_t i = 0; i < ats_len; i++)
  82. furi_string_cat_printf(output, " %02X", instance->gen4_config[8 + i]);
  83. else
  84. furi_string_cat_printf(output, " No");
  85. furi_string_cat_printf(output, "\n");
  86. // ATQA
  87. furi_string_cat_printf(
  88. output,
  89. "ATQA: %02X %02X\n",
  90. instance->gen4_config[25],
  91. instance->gen4_config[24]); // invert for big endian
  92. // SAK
  93. furi_string_cat_printf(output, "SAK: %02X\n", instance->gen4_config[26]);
  94. // Blocks
  95. furi_string_cat_printf(
  96. output,
  97. "Total blocks: %u",
  98. instance->gen4_config[28] + 1); // config stores the number of the last block
  99. widget_add_string_element(widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "Gen4 Info");
  100. widget_add_text_scroll_element(widget, 3, 17, 124, 50, furi_string_get_cstr(output));
  101. widget_add_button_element(
  102. widget,
  103. GuiButtonTypeRight,
  104. "More",
  105. nfc_magic_scene_gen4_show_info_widget_callback,
  106. instance);
  107. furi_string_free(output);
  108. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewWidget);
  109. }
  110. bool nfc_magic_scene_gen4_show_info_on_event(void* context, SceneManagerEvent event) {
  111. NfcMagicApp* instance = context;
  112. bool consumed = false;
  113. if(event.type == SceneManagerEventTypeCustom) {
  114. if(event.event == GuiButtonTypeRight) {
  115. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4ShowCfg);
  116. consumed = true;
  117. }
  118. } else if(event.type == SceneManagerEventTypeBack) {
  119. consumed = scene_manager_search_and_switch_to_previous_scene(
  120. instance->scene_manager, NfcMagicSceneGen4Menu);
  121. }
  122. return consumed;
  123. }
  124. void nfc_magic_scene_gen4_show_info_on_exit(void* context) {
  125. NfcMagicApp* instance = context;
  126. widget_reset(instance->widget);
  127. }