nfc_scene_mf_desfire_read_success.c 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "../nfc_i.h"
  2. #include <dolphin/dolphin.h>
  3. #define NFC_SCENE_READ_SUCCESS_SHIFT " "
  4. enum {
  5. MfDesfireReadSuccessStateShowUID,
  6. MfDesfireReadSuccessStateShowData,
  7. };
  8. void nfc_scene_mf_desfire_read_success_dialog_callback(DialogExResult result, void* context) {
  9. Nfc* nfc = context;
  10. view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
  11. }
  12. void nfc_scene_mf_desfire_read_success_on_enter(void* context) {
  13. Nfc* nfc = context;
  14. MifareDesfireData* data = &nfc->dev->dev_data.mf_df_data;
  15. DialogEx* dialog_ex = nfc->dialog_ex;
  16. dialog_ex_set_left_button_text(dialog_ex, "Retry");
  17. dialog_ex_set_center_button_text(dialog_ex, "Data");
  18. dialog_ex_set_right_button_text(dialog_ex, "More");
  19. dialog_ex_set_icon(dialog_ex, 8, 16, &I_Medium_chip_22x21);
  20. uint16_t n_apps = 0;
  21. uint16_t n_files = 0;
  22. for(MifareDesfireApplication* app = data->app_head; app; app = app->next) {
  23. n_apps++;
  24. for(MifareDesfireFile* file = app->file_head; file; file = file->next) {
  25. n_files++;
  26. }
  27. }
  28. // TODO rework info view
  29. nfc_text_store_set(
  30. nfc,
  31. NFC_SCENE_READ_SUCCESS_SHIFT "Mifare DESFire\n" NFC_SCENE_READ_SUCCESS_SHIFT
  32. "%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
  33. "%d application%s, %d file%s",
  34. 1 << (data->version.sw_storage >> 1),
  35. (data->version.sw_storage & 1) ? "+" : "",
  36. data->free_memory ? data->free_memory->bytes : 0,
  37. n_apps,
  38. n_apps == 1 ? "" : "s",
  39. n_files,
  40. n_files == 1 ? "" : "s");
  41. dialog_ex_set_text(dialog_ex, nfc->text_store, 8, 6, AlignLeft, AlignTop);
  42. dialog_ex_set_context(dialog_ex, nfc);
  43. dialog_ex_set_result_callback(dialog_ex, nfc_scene_mf_desfire_read_success_dialog_callback);
  44. scene_manager_set_scene_state(
  45. nfc->scene_manager, NfcSceneMfDesfireReadSuccess, MfDesfireReadSuccessStateShowUID);
  46. view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
  47. }
  48. bool nfc_scene_mf_desfire_read_success_on_event(void* context, SceneManagerEvent event) {
  49. Nfc* nfc = context;
  50. bool consumed = false;
  51. uint32_t state =
  52. scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireReadSuccess);
  53. if(event.type == SceneManagerEventTypeCustom) {
  54. if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultLeft) {
  55. scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm);
  56. consumed = true;
  57. } else if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultCenter) {
  58. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireData);
  59. consumed = true;
  60. } else if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultRight) {
  61. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireMenu);
  62. consumed = true;
  63. }
  64. } else if(event.type == SceneManagerEventTypeBack) {
  65. if(state == MfDesfireReadSuccessStateShowData) {
  66. view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
  67. scene_manager_set_scene_state(
  68. nfc->scene_manager,
  69. NfcSceneMfDesfireReadSuccess,
  70. MfDesfireReadSuccessStateShowUID);
  71. consumed = true;
  72. } else {
  73. scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm);
  74. consumed = true;
  75. }
  76. }
  77. return consumed;
  78. }
  79. void nfc_scene_mf_desfire_read_success_on_exit(void* context) {
  80. Nfc* nfc = context;
  81. // Clean dialog
  82. dialog_ex_reset(nfc->dialog_ex);
  83. }