mfc_editor_scene_block_select.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. SubmenuIndexManufacturerBytes,
  8. // Special options - All sectors
  9. SubmenuIndexKeyA,
  10. SubmenuIndexKeyB,
  11. SubmenuIndexAccessBits,
  12. SubmenuIndexUserByte,
  13. };
  14. void mfc_editor_scene_block_select_submenu_callback(void* context, uint32_t index) {
  15. MfcEditorApp* instance = context;
  16. view_dispatcher_send_custom_event(instance->view_dispatcher, index);
  17. }
  18. void mfc_editor_scene_block_select_on_enter(void* context) {
  19. MfcEditorApp* instance = context;
  20. Submenu* submenu = instance->submenu;
  21. char header[sizeof("Sector ") + 2];
  22. snprintf(header, sizeof(header), "Sector %hhu", instance->current_sector);
  23. submenu_set_header(submenu, header);
  24. uint8_t first_block = mf_classic_get_first_block_num_of_sector(instance->current_sector);
  25. uint8_t block_num = mf_classic_get_blocks_num_in_sector(instance->current_sector);
  26. for(uint8_t i = 0; i < block_num; i++) {
  27. uint8_t block_index = first_block + i;
  28. char label[sizeof("Block ") + 3];
  29. snprintf(label, sizeof(label), "Block %hhu", block_index);
  30. submenu_add_item(
  31. submenu, label, block_index, mfc_editor_scene_block_select_submenu_callback, instance);
  32. }
  33. if(instance->current_sector == 0) {
  34. submenu_add_item(
  35. submenu,
  36. "UID",
  37. SubmenuIndexUID,
  38. mfc_editor_scene_block_select_submenu_callback,
  39. instance);
  40. submenu_add_item(
  41. submenu,
  42. "Manufacturer Bytes",
  43. SubmenuIndexManufacturerBytes,
  44. mfc_editor_scene_block_select_submenu_callback,
  45. instance);
  46. }
  47. submenu_add_item(
  48. submenu,
  49. "Key A",
  50. SubmenuIndexKeyA,
  51. mfc_editor_scene_block_select_submenu_callback,
  52. instance);
  53. submenu_add_item(
  54. submenu,
  55. "Key B",
  56. SubmenuIndexKeyB,
  57. mfc_editor_scene_block_select_submenu_callback,
  58. instance);
  59. submenu_add_item(
  60. submenu,
  61. "Access Bits",
  62. SubmenuIndexAccessBits,
  63. mfc_editor_scene_block_select_submenu_callback,
  64. instance);
  65. submenu_add_item(
  66. submenu,
  67. "User Byte",
  68. SubmenuIndexUserByte,
  69. mfc_editor_scene_block_select_submenu_callback,
  70. instance);
  71. submenu_set_selected_item(
  72. submenu,
  73. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneBlockSelect));
  74. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewSubmenu);
  75. }
  76. bool mfc_editor_scene_block_select_on_event(void* context, SceneManagerEvent event) {
  77. MfcEditorApp* instance = context;
  78. bool consumed = false;
  79. UNUSED(instance);
  80. if(event.type == SceneManagerEventTypeCustom) {
  81. scene_manager_set_scene_state(
  82. instance->scene_manager, MfcEditorSceneBlockSelect, event.event);
  83. FURI_LOG_I(TAG, "Block select event %lu", event.event);
  84. consumed = true;
  85. }
  86. return consumed;
  87. }
  88. void mfc_editor_scene_block_select_on_exit(void* context) {
  89. MfcEditorApp* instance = context;
  90. submenu_reset(instance->submenu);
  91. }