mfc_editor_scene_block_select.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "../mfc_editor_app_i.h"
  2. enum SubmenuIndex {
  3. // Reserve first indices for opening normal block
  4. SubmenuIndexReserved = MF_CLASSIC_TOTAL_BLOCKS_MAX,
  5. // Special options - Sector 0 only
  6. SubmenuIndexUID,
  7. SubmenuIndexBCC,
  8. SubmenuIndexManufacturerBytes,
  9. // Special options - All sectors
  10. SubmenuIndexKeyA,
  11. SubmenuIndexKeyB,
  12. SubmenuIndexAccessBits,
  13. SubmenuIndexUserByte,
  14. };
  15. void mfc_editor_scene_block_select_submenu_callback(void* context, uint32_t index) {
  16. MfcEditorApp* instance = context;
  17. view_dispatcher_send_custom_event(instance->view_dispatcher, index);
  18. }
  19. void mfc_editor_scene_block_select_on_enter(void* context) {
  20. MfcEditorApp* instance = context;
  21. Submenu* submenu = instance->submenu;
  22. uint8_t first_block = mf_classic_get_first_block_num_of_sector(instance->current_sector);
  23. uint8_t block_num = mf_classic_get_blocks_num_in_sector(instance->current_sector);
  24. FuriString* label = furi_string_alloc();
  25. for(uint8_t i = 0; i < block_num; i++) {
  26. uint8_t block_index = first_block + i;
  27. furi_string_printf(label, "Block %u", block_index);
  28. submenu_add_item(
  29. submenu,
  30. furi_string_get_cstr(label),
  31. block_index,
  32. mfc_editor_scene_block_select_submenu_callback,
  33. instance);
  34. }
  35. furi_string_free(label);
  36. if(instance->current_sector == 0) {
  37. submenu_add_item(
  38. submenu,
  39. "UID",
  40. SubmenuIndexUID,
  41. mfc_editor_scene_block_select_submenu_callback,
  42. instance);
  43. if(instance->mf_classic_data->iso14443_3a_data->uid_len == 4) {
  44. // 7-byte UID cards don't store a BCC byte
  45. submenu_add_item(
  46. submenu,
  47. "BCC",
  48. SubmenuIndexBCC,
  49. mfc_editor_scene_block_select_submenu_callback,
  50. instance);
  51. }
  52. submenu_add_item(
  53. submenu,
  54. "Manufacturer Bytes",
  55. SubmenuIndexManufacturerBytes,
  56. mfc_editor_scene_block_select_submenu_callback,
  57. instance);
  58. }
  59. submenu_add_item(
  60. submenu,
  61. "Key A",
  62. SubmenuIndexKeyA,
  63. mfc_editor_scene_block_select_submenu_callback,
  64. instance);
  65. submenu_add_item(
  66. submenu,
  67. "Key B",
  68. SubmenuIndexKeyB,
  69. mfc_editor_scene_block_select_submenu_callback,
  70. instance);
  71. submenu_add_item(
  72. submenu,
  73. "Access Bits",
  74. SubmenuIndexAccessBits,
  75. mfc_editor_scene_block_select_submenu_callback,
  76. instance);
  77. submenu_add_item(
  78. submenu,
  79. "User Byte",
  80. SubmenuIndexUserByte,
  81. mfc_editor_scene_block_select_submenu_callback,
  82. instance);
  83. submenu_set_selected_item(
  84. submenu,
  85. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneBlockSelect));
  86. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewSubmenu);
  87. }
  88. bool mfc_editor_scene_block_select_on_event(void* context, SceneManagerEvent event) {
  89. MfcEditorApp* instance = context;
  90. bool consumed = false;
  91. if(event.type == SceneManagerEventTypeCustom) {
  92. scene_manager_set_scene_state(
  93. instance->scene_manager, MfcEditorSceneBlockSelect, event.event);
  94. MfcEditorBlockView block_view;
  95. if(event.event == SubmenuIndexUID) {
  96. block_view = MfcEditorBlockViewUID;
  97. } else if(event.event == SubmenuIndexBCC) {
  98. block_view = MfcEditorBlockViewBCC;
  99. } else if(event.event == SubmenuIndexManufacturerBytes) {
  100. block_view = MfcEditorBlockViewManufacturerBytes;
  101. } else if(event.event == SubmenuIndexKeyA) {
  102. block_view = MfcEditorBlockViewKeyA;
  103. } else if(event.event == SubmenuIndexKeyB) {
  104. block_view = MfcEditorBlockViewKeyB;
  105. } else if(event.event == SubmenuIndexAccessBits) {
  106. block_view = MfcEditorBlockViewAccessBits;
  107. instance->current_block =
  108. mf_classic_get_first_block_num_of_sector(instance->current_sector);
  109. } else if(event.event == SubmenuIndexUserByte) {
  110. block_view = MfcEditorBlockViewUserByte;
  111. } else {
  112. block_view = MfcEditorBlockViewNormal;
  113. instance->current_block = event.event;
  114. }
  115. scene_manager_set_scene_state(instance->scene_manager, MfcEditorSceneDataView, block_view);
  116. scene_manager_next_scene(instance->scene_manager, MfcEditorSceneDataView);
  117. consumed = true;
  118. }
  119. return consumed;
  120. }
  121. void mfc_editor_scene_block_select_on_exit(void* context) {
  122. MfcEditorApp* instance = context;
  123. submenu_reset(instance->submenu);
  124. }