picopass_scene_saved_menu.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "../picopass_i.h"
  2. enum SubmenuIndex {
  3. SubmenuIndexInfo,
  4. SubmenuIndexWrite,
  5. SubmenuIndexEmulate,
  6. SubmenuIndexRename,
  7. SubmenuIndexDelete,
  8. SubmenuIndexSaveAsLF,
  9. SubmenuIndexSaveLegacy,
  10. };
  11. void picopass_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
  12. Picopass* picopass = context;
  13. view_dispatcher_send_custom_event(picopass->view_dispatcher, index);
  14. }
  15. void picopass_scene_saved_menu_on_enter(void* context) {
  16. Picopass* picopass = context;
  17. Submenu* submenu = picopass->submenu;
  18. PicopassPacs* pacs = &picopass->dev->dev_data.pacs;
  19. PicopassBlock* card_data = picopass->dev->dev_data.card_data;
  20. bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
  21. PICOPASS_FUSE_CRYPT0;
  22. bool no_credential = picopass_is_memset(pacs->credential, 0x00, sizeof(pacs->credential));
  23. bool SR = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0] == 0xA3 &&
  24. card_data[10].valid && 0x30 == card_data[10].data[0];
  25. submenu_add_item(
  26. submenu, "Info", SubmenuIndexInfo, picopass_scene_saved_menu_submenu_callback, picopass);
  27. submenu_add_item(
  28. submenu, "Write", SubmenuIndexWrite, picopass_scene_saved_menu_submenu_callback, picopass);
  29. submenu_add_item(
  30. submenu,
  31. "Emulate",
  32. SubmenuIndexEmulate,
  33. picopass_scene_saved_menu_submenu_callback,
  34. picopass);
  35. if(secured && !no_credential) {
  36. submenu_add_item(
  37. submenu,
  38. "Save as LFRFID",
  39. SubmenuIndexSaveAsLF,
  40. picopass_scene_saved_menu_submenu_callback,
  41. picopass);
  42. if(SR) {
  43. submenu_add_item(
  44. submenu,
  45. "Save as Legacy",
  46. SubmenuIndexSaveLegacy,
  47. picopass_scene_saved_menu_submenu_callback,
  48. picopass);
  49. }
  50. }
  51. submenu_add_item(
  52. submenu,
  53. "Rename",
  54. SubmenuIndexRename,
  55. picopass_scene_saved_menu_submenu_callback,
  56. picopass);
  57. submenu_add_item(
  58. submenu,
  59. "Delete",
  60. SubmenuIndexDelete,
  61. picopass_scene_saved_menu_submenu_callback,
  62. picopass);
  63. submenu_set_selected_item(
  64. picopass->submenu,
  65. scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneSavedMenu));
  66. view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewMenu);
  67. }
  68. bool picopass_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
  69. Picopass* picopass = context;
  70. bool consumed = false;
  71. if(event.type == SceneManagerEventTypeCustom) {
  72. scene_manager_set_scene_state(
  73. picopass->scene_manager, PicopassSceneSavedMenu, event.event);
  74. if(event.event == SubmenuIndexDelete) {
  75. scene_manager_next_scene(picopass->scene_manager, PicopassSceneDelete);
  76. consumed = true;
  77. } else if(event.event == SubmenuIndexInfo) {
  78. scene_manager_next_scene(picopass->scene_manager, PicopassSceneDeviceInfo);
  79. consumed = true;
  80. } else if(event.event == SubmenuIndexWrite) {
  81. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCard);
  82. consumed = true;
  83. } else if(event.event == SubmenuIndexEmulate) {
  84. scene_manager_next_scene(picopass->scene_manager, PicopassSceneEmulate);
  85. consumed = true;
  86. } else if(event.event == SubmenuIndexRename) {
  87. scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
  88. consumed = true;
  89. } else if(event.event == SubmenuIndexSaveAsLF) {
  90. scene_manager_set_scene_state(
  91. picopass->scene_manager, PicopassSceneSavedMenu, SubmenuIndexSaveAsLF);
  92. picopass->dev->format = PicopassDeviceSaveFormatLF;
  93. scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
  94. consumed = true;
  95. } else if(event.event == SubmenuIndexSaveLegacy) {
  96. scene_manager_set_scene_state(
  97. picopass->scene_manager, PicopassSceneSavedMenu, SubmenuIndexSaveLegacy);
  98. picopass->dev->format = PicopassDeviceSaveFormatLegacy;
  99. scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
  100. consumed = true;
  101. }
  102. }
  103. return consumed;
  104. }
  105. void picopass_scene_saved_menu_on_exit(void* context) {
  106. Picopass* picopass = context;
  107. submenu_reset(picopass->submenu);
  108. }