mfc_editor_scene_data_edit_access_bits.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "../mfc_editor_app_i.h"
  2. void mfc_editor_scene_data_edit_access_bits_dialog_ex_callback(
  3. DialogExResult result,
  4. void* context) {
  5. MfcEditorApp* instance = context;
  6. view_dispatcher_send_custom_event(instance->view_dispatcher, result);
  7. }
  8. void mfc_editor_scene_data_edit_access_bits_update_display(MfcEditorApp* instance) {
  9. DialogEx* dialog_ex = instance->dialog_ex;
  10. uint8_t sector_trailer_num =
  11. mf_classic_get_sector_trailer_num_by_sector(instance->current_sector);
  12. furi_string_printf(
  13. instance->data_view_text,
  14. "C1: %i, C2: %i, C3: %i\n",
  15. FURI_BIT(instance->access_bits_edit.bits, 0),
  16. FURI_BIT(instance->access_bits_edit.bits, 1),
  17. FURI_BIT(instance->access_bits_edit.bits, 2));
  18. if(instance->current_block == sector_trailer_num) {
  19. furi_string_cat(
  20. instance->data_view_text,
  21. access_sector_trailer_labels[instance->access_bits_edit.bits]);
  22. } else {
  23. furi_string_cat(
  24. instance->data_view_text, access_data_block_labels[instance->access_bits_edit.bits]);
  25. }
  26. dialog_ex_set_text(
  27. dialog_ex,
  28. furi_string_get_cstr(instance->data_view_text),
  29. 63,
  30. 31,
  31. AlignCenter,
  32. AlignCenter);
  33. }
  34. void mfc_editor_scene_data_edit_access_bits_on_enter(void* context) {
  35. MfcEditorApp* instance = context;
  36. DialogEx* dialog_ex = instance->dialog_ex;
  37. dialog_ex_set_context(instance->dialog_ex, instance);
  38. if(instance->current_sector >= 32 && !mf_classic_is_sector_trailer(instance->current_block)) {
  39. // 4K large sector - access bits affect range of blocks
  40. uint8_t sector_start_num =
  41. mf_classic_get_first_block_num_of_sector(instance->current_sector);
  42. // Relative to the sector start, round down to multiple of 5
  43. uint8_t relative_block_num = (instance->current_block - sector_start_num) / 5 * 5;
  44. furi_string_printf(
  45. instance->data_view_header,
  46. "Edit B. %u-%u Access",
  47. sector_start_num + relative_block_num,
  48. sector_start_num + relative_block_num + 4);
  49. } else {
  50. furi_string_printf(
  51. instance->data_view_header, "Edit Block %u Access", instance->current_block);
  52. }
  53. dialog_ex_set_header(
  54. dialog_ex, furi_string_get_cstr(instance->data_view_header), 63, 3, AlignCenter, AlignTop);
  55. instance->access_bits_edit =
  56. mfc_editor_get_block_access_bits(instance->mf_classic_data, instance->current_block);
  57. if(instance->access_bits_edit.bits != instance->access_bits_edit.check_bits) {
  58. // If access check bits don't match, make them match now
  59. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  60. }
  61. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  62. dialog_ex_set_center_button_text(dialog_ex, "Save");
  63. dialog_ex_set_left_button_text(dialog_ex, "Prev");
  64. dialog_ex_set_right_button_text(dialog_ex, "Next");
  65. dialog_ex_set_result_callback(
  66. dialog_ex, mfc_editor_scene_data_edit_access_bits_dialog_ex_callback);
  67. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewDialogEx);
  68. }
  69. bool mfc_editor_scene_data_edit_access_bits_on_event(void* context, SceneManagerEvent event) {
  70. MfcEditorApp* instance = context;
  71. bool consumed = false;
  72. if(event.type == SceneManagerEventTypeCustom) {
  73. if(event.event == DialogExResultLeft) {
  74. instance->access_bits_edit.bits--;
  75. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  76. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  77. consumed = true;
  78. } else if(event.event == DialogExResultRight) {
  79. instance->access_bits_edit.bits++;
  80. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  81. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  82. consumed = true;
  83. } else if(event.event == DialogExResultCenter) {
  84. mfc_editor_set_block_access_bits(
  85. instance->mf_classic_data, instance->current_block, &instance->access_bits_edit);
  86. instance->is_unsaved_changes = true;
  87. scene_manager_previous_scene(instance->scene_manager);
  88. consumed = true;
  89. }
  90. }
  91. return consumed;
  92. }
  93. void mfc_editor_scene_data_edit_access_bits_on_exit(void* context) {
  94. MfcEditorApp* instance = context;
  95. dialog_ex_reset(instance->dialog_ex);
  96. }