seader_scene_card_menu.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "../seader_i.h"
  2. enum SubmenuIndex {
  3. SubmenuIndexSave,
  4. SubmenuIndexSavePicopass,
  5. SubmenuIndexSaveRFID,
  6. SubmenuIndexSaveSR,
  7. SubmenuIndexSaveMFC,
  8. SubmenuIndexParse,
  9. };
  10. void seader_scene_card_menu_submenu_callback(void* context, uint32_t index) {
  11. Seader* seader = context;
  12. view_dispatcher_send_custom_event(seader->view_dispatcher, index);
  13. }
  14. void seader_scene_card_menu_on_enter(void* context) {
  15. Seader* seader = context;
  16. SeaderCredential* credential = seader->credential;
  17. PluginWiegand* plugin = seader->plugin_wiegand;
  18. Submenu* submenu = seader->submenu;
  19. submenu_add_item(
  20. submenu, "Save", SubmenuIndexSave, seader_scene_card_menu_submenu_callback, seader);
  21. submenu_add_item(
  22. submenu,
  23. "Save Picopass",
  24. SubmenuIndexSavePicopass,
  25. seader_scene_card_menu_submenu_callback,
  26. seader);
  27. submenu_add_item(
  28. submenu,
  29. "Save RFID",
  30. SubmenuIndexSaveRFID,
  31. seader_scene_card_menu_submenu_callback,
  32. seader);
  33. if(credential->sio[0] == 0x30 && credential->diversifier_len == RFAL_PICOPASS_UID_LEN) {
  34. submenu_add_item(
  35. submenu,
  36. "Save SR",
  37. SubmenuIndexSaveSR,
  38. seader_scene_card_menu_submenu_callback,
  39. seader);
  40. }
  41. submenu_add_item(
  42. submenu, "Save MFC", SubmenuIndexSaveMFC, seader_scene_card_menu_submenu_callback, seader);
  43. if(plugin) {
  44. size_t format_count = plugin->count(credential->bit_length, credential->credential);
  45. if(format_count > 0) {
  46. submenu_add_item(
  47. submenu,
  48. "Parse",
  49. SubmenuIndexParse,
  50. seader_scene_card_menu_submenu_callback,
  51. seader);
  52. }
  53. }
  54. submenu_set_selected_item(
  55. seader->submenu,
  56. scene_manager_get_scene_state(seader->scene_manager, SeaderSceneCardMenu));
  57. view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewMenu);
  58. }
  59. bool seader_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
  60. Seader* seader = context;
  61. bool consumed = false;
  62. if(event.type == SceneManagerEventTypeCustom) {
  63. if(event.event == SubmenuIndexSave) {
  64. scene_manager_set_scene_state(
  65. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexSave);
  66. scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
  67. consumed = true;
  68. } else if(event.event == SubmenuIndexSavePicopass) {
  69. scene_manager_set_scene_state(
  70. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexSavePicopass);
  71. seader->credential->save_format = SeaderCredentialSaveFormatPicopass;
  72. scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
  73. consumed = true;
  74. } else if(event.event == SubmenuIndexSaveRFID) {
  75. scene_manager_set_scene_state(
  76. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexSaveRFID);
  77. seader->credential->save_format = SeaderCredentialSaveFormatRFID;
  78. scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
  79. consumed = true;
  80. } else if(event.event == SubmenuIndexSaveSR) {
  81. scene_manager_set_scene_state(
  82. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexSaveSR);
  83. seader->credential->save_format = SeaderCredentialSaveFormatSR;
  84. scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
  85. consumed = true;
  86. } else if(event.event == SubmenuIndexSaveMFC) {
  87. scene_manager_set_scene_state(
  88. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexSaveMFC);
  89. seader->credential->save_format = SeaderCredentialSaveFormatMFC;
  90. scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
  91. consumed = true;
  92. } else if(event.event == SubmenuIndexParse) {
  93. scene_manager_set_scene_state(
  94. seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexParse);
  95. scene_manager_next_scene(seader->scene_manager, SeaderSceneFormats);
  96. consumed = true;
  97. }
  98. } else if(event.type == SceneManagerEventTypeBack) {
  99. consumed = scene_manager_search_and_switch_to_previous_scene(
  100. seader->scene_manager, SeaderSceneSamPresent);
  101. }
  102. return consumed;
  103. }
  104. void seader_scene_card_menu_on_exit(void* context) {
  105. Seader* seader = context;
  106. submenu_reset(seader->submenu);
  107. }