ibutton_scene_read_key_menu.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "../ibutton_i.h"
  2. #include <dolphin/dolphin.h>
  3. typedef enum {
  4. SubmenuIndexSave,
  5. SubmenuIndexEmulate,
  6. SubmenuIndexViewData,
  7. SubmenuIndexWriteBlank,
  8. SubmenuIndexWriteCopy,
  9. } SubmenuIndex;
  10. void ibutton_scene_read_key_menu_submenu_callback(void* context, uint32_t index) {
  11. iButton* ibutton = context;
  12. view_dispatcher_send_custom_event(ibutton->view_dispatcher, index);
  13. }
  14. void ibutton_scene_read_key_menu_on_enter(void* context) {
  15. iButton* ibutton = context;
  16. Submenu* submenu = ibutton->submenu;
  17. const iButtonProtocolId protocol_id = ibutton_key_get_protocol_id(ibutton->key);
  18. const uint32_t features = ibutton_protocols_get_features(ibutton->protocols, protocol_id);
  19. submenu_add_item(
  20. submenu, "Save", SubmenuIndexSave, ibutton_scene_read_key_menu_submenu_callback, ibutton);
  21. submenu_add_item(
  22. submenu,
  23. "Emulate",
  24. SubmenuIndexEmulate,
  25. ibutton_scene_read_key_menu_submenu_callback,
  26. ibutton);
  27. if(features & iButtonProtocolFeatureExtData) {
  28. submenu_add_item(
  29. submenu,
  30. "View Data",
  31. SubmenuIndexViewData,
  32. ibutton_scene_read_key_menu_submenu_callback,
  33. ibutton);
  34. }
  35. if(features & iButtonProtocolFeatureWriteBlank) {
  36. submenu_add_item(
  37. submenu,
  38. "Write Blank",
  39. SubmenuIndexWriteBlank,
  40. ibutton_scene_read_key_menu_submenu_callback,
  41. ibutton);
  42. }
  43. if(features & iButtonProtocolFeatureWriteCopy) {
  44. submenu_add_item(
  45. submenu,
  46. "Write Copy",
  47. SubmenuIndexWriteCopy,
  48. ibutton_scene_read_key_menu_submenu_callback,
  49. ibutton);
  50. }
  51. submenu_set_selected_item(
  52. submenu, scene_manager_get_scene_state(ibutton->scene_manager, iButtonSceneReadKeyMenu));
  53. view_dispatcher_switch_to_view(ibutton->view_dispatcher, iButtonViewSubmenu);
  54. }
  55. bool ibutton_scene_read_key_menu_on_event(void* context, SceneManagerEvent event) {
  56. iButton* ibutton = context;
  57. SceneManager* scene_manager = ibutton->scene_manager;
  58. bool consumed = false;
  59. if(event.type == SceneManagerEventTypeCustom) {
  60. scene_manager_set_scene_state(scene_manager, iButtonSceneReadKeyMenu, event.event);
  61. consumed = true;
  62. if(event.event == SubmenuIndexSave) {
  63. scene_manager_next_scene(scene_manager, iButtonSceneSaveName);
  64. } else if(event.event == SubmenuIndexEmulate) {
  65. scene_manager_next_scene(scene_manager, iButtonSceneEmulate);
  66. DOLPHIN_DEED(DolphinDeedIbuttonEmulate);
  67. } else if(event.event == SubmenuIndexViewData) {
  68. scene_manager_next_scene(scene_manager, iButtonSceneViewData);
  69. } else if(event.event == SubmenuIndexWriteBlank) {
  70. ibutton->write_mode = iButtonWriteModeBlank;
  71. scene_manager_next_scene(scene_manager, iButtonSceneWrite);
  72. } else if(event.event == SubmenuIndexWriteCopy) {
  73. ibutton->write_mode = iButtonWriteModeCopy;
  74. scene_manager_next_scene(scene_manager, iButtonSceneWrite);
  75. }
  76. } else if(event.event == SceneManagerEventTypeBack) {
  77. scene_manager_set_scene_state(
  78. ibutton->scene_manager, iButtonSceneReadKeyMenu, SubmenuIndexSave);
  79. // Event is not consumed
  80. }
  81. return consumed;
  82. }
  83. void ibutton_scene_read_key_menu_on_exit(void* context) {
  84. iButton* ibutton = context;
  85. submenu_reset(ibutton->submenu);
  86. }