mfc_editor_scene_data_view.c 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "../mfc_editor_app_i.h"
  2. void mfc_editor_scene_data_view_on_enter(void* context) {
  3. MfcEditorApp* instance = context;
  4. DialogEx* dialog_ex = instance->dialog_ex;
  5. dialog_ex_set_context(instance->dialog_ex, instance);
  6. MfcEditorBlockView block_view =
  7. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneDataView);
  8. const MfClassicData* mf_classic_data = instance->mf_classic_data;
  9. Iso14443_3aData* iso14443_3a_data = mf_classic_data->iso14443_3a_data;
  10. if(block_view == MfcEditorBlockViewUID) {
  11. dialog_ex_set_header(dialog_ex, "UID", 63, 3, AlignCenter, AlignTop);
  12. furi_string_set(instance->data_view_text, "");
  13. for(int i = 0; i < iso14443_3a_data->uid_len; i++) {
  14. furi_string_cat_printf(instance->data_view_text, "%02hhX ", iso14443_3a_data->uid[i]);
  15. }
  16. // Remove trailing space
  17. furi_string_trim(instance->data_view_text);
  18. } else if(block_view == MfcEditorBlockViewManufacturerBytes) {
  19. dialog_ex_set_header(dialog_ex, "Manufacturer Bytes", 63, 3, AlignCenter, AlignTop);
  20. if(mf_classic_is_block_read(mf_classic_data, 0)) {
  21. furi_string_set(instance->data_view_text, "");
  22. uint8_t byte_num = MF_CLASSIC_BLOCK_SIZE - iso14443_3a_data->uid_len - 1;
  23. // +1 to ignore BCC byte
  24. // TODO: should we do this for 4K?
  25. for(int i = iso14443_3a_data->uid_len + 1; i < MF_CLASSIC_BLOCK_SIZE; i++) {
  26. furi_string_cat_printf(
  27. instance->data_view_text, "%02hhX", mf_classic_data->block[0].data[i]);
  28. // Go onto next line when halfway through
  29. if(MF_CLASSIC_BLOCK_SIZE - i - 1 == byte_num / 2) {
  30. furi_string_cat(instance->data_view_text, "\n");
  31. } else {
  32. furi_string_cat(instance->data_view_text, " ");
  33. }
  34. }
  35. // Remove trailing space
  36. furi_string_trim(instance->data_view_text);
  37. } else {
  38. furi_string_set(
  39. instance->data_view_text, "Data unavailable.\nBlock 0 has not been read.");
  40. }
  41. } else if(block_view == MfcEditorBlockViewKeyA) {
  42. dialog_ex_set_header(dialog_ex, "Key A", 63, 3, AlignCenter, AlignTop);
  43. } else if(block_view == MfcEditorBlockViewKeyB) {
  44. dialog_ex_set_header(dialog_ex, "Key B", 63, 3, AlignCenter, AlignTop);
  45. } else if(block_view == MfcEditorBlockViewAccessBits) {
  46. dialog_ex_set_header(dialog_ex, "Access Bits", 63, 3, AlignCenter, AlignTop);
  47. } else if(block_view == MfcEditorBlockViewUserByte) {
  48. dialog_ex_set_header(dialog_ex, "User Byte", 63, 3, AlignCenter, AlignTop);
  49. } else {
  50. furi_string_printf(instance->data_view_header, "Block %hhu Data", instance->current_block);
  51. dialog_ex_set_header(
  52. dialog_ex,
  53. furi_string_get_cstr(instance->data_view_header),
  54. 63,
  55. 3,
  56. AlignCenter,
  57. AlignTop);
  58. }
  59. dialog_ex_set_text(
  60. dialog_ex,
  61. furi_string_get_cstr(instance->data_view_text),
  62. 63,
  63. 31,
  64. AlignCenter,
  65. AlignCenter);
  66. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewDialogEx);
  67. }
  68. bool mfc_editor_scene_data_view_on_event(void* context, SceneManagerEvent event) {
  69. MfcEditorApp* instance = context;
  70. bool consumed = false;
  71. UNUSED(instance);
  72. UNUSED(event);
  73. return consumed;
  74. }
  75. void mfc_editor_scene_data_view_on_exit(void* context) {
  76. MfcEditorApp* instance = context;
  77. dialog_ex_reset(instance->dialog_ex);
  78. }