mfc_editor_scene_data_edit_access_bits.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. furi_string_printf(
  41. instance->data_view_header,
  42. "Edit B. %u-%u Access",
  43. instance->current_block / 5 * 5,
  44. instance->current_block / 5 * 5 + 4);
  45. } else {
  46. furi_string_printf(
  47. instance->data_view_header, "Edit Block %u Access", instance->current_block);
  48. }
  49. dialog_ex_set_header(
  50. dialog_ex, furi_string_get_cstr(instance->data_view_header), 63, 3, AlignCenter, AlignTop);
  51. instance->access_bits_edit =
  52. mfc_editor_get_block_access_bits(instance->mf_classic_data, instance->current_block);
  53. if(instance->access_bits_edit.bits != instance->access_bits_edit.check_bits) {
  54. // If access check bits don't match, make them match now
  55. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  56. }
  57. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  58. dialog_ex_set_center_button_text(dialog_ex, "Save");
  59. dialog_ex_set_left_button_text(dialog_ex, "Prev");
  60. dialog_ex_set_right_button_text(dialog_ex, "Next");
  61. dialog_ex_set_result_callback(
  62. dialog_ex, mfc_editor_scene_data_edit_access_bits_dialog_ex_callback);
  63. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewDialogEx);
  64. }
  65. bool mfc_editor_scene_data_edit_access_bits_on_event(void* context, SceneManagerEvent event) {
  66. MfcEditorApp* instance = context;
  67. bool consumed = false;
  68. if(event.type == SceneManagerEventTypeCustom) {
  69. if(event.event == DialogExResultLeft) {
  70. instance->access_bits_edit.bits--;
  71. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  72. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  73. consumed = true;
  74. } else if(event.event == DialogExResultRight) {
  75. instance->access_bits_edit.bits++;
  76. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  77. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  78. consumed = true;
  79. } else if(event.event == DialogExResultCenter) {
  80. mfc_editor_set_block_access_bits(
  81. instance->mf_classic_data, instance->current_block, &instance->access_bits_edit);
  82. instance->is_unsaved_changes = true;
  83. scene_manager_previous_scene(instance->scene_manager);
  84. consumed = true;
  85. }
  86. }
  87. return consumed;
  88. }
  89. void mfc_editor_scene_data_edit_access_bits_on_exit(void* context) {
  90. MfcEditorApp* instance = context;
  91. dialog_ex_reset(instance->dialog_ex);
  92. }