seos_scene_start.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "../seos_i.h"
  2. #define TAG "SceneStart"
  3. enum SubmenuIndex {
  4. SubmenuIndexSaved,
  5. SubmenuIndexRead,
  6. SubmenuIndexBLEReader,
  7. SubmenuIndexScannerMenu,
  8. SubmenuIndexBLECredInterrogate,
  9. SubmenuIndexAbout,
  10. SubmenuIndexInspect,
  11. };
  12. static SeosHci* seos_hci = NULL;
  13. static int8_t ble_checks;
  14. void seos_scene_start_submenu_callback(void* context, uint32_t index) {
  15. Seos* seos = context;
  16. view_dispatcher_send_custom_event(seos->view_dispatcher, index);
  17. }
  18. void seos_scene_start_on_update(void* context) {
  19. Seos* seos = context;
  20. Submenu* submenu = seos->submenu;
  21. submenu_reset(submenu);
  22. submenu_add_item(submenu, "Saved", SubmenuIndexSaved, seos_scene_start_submenu_callback, seos);
  23. submenu_add_item(
  24. submenu, "Read NFC", SubmenuIndexRead, seos_scene_start_submenu_callback, seos);
  25. if(seos->has_ble) {
  26. submenu_add_item(
  27. submenu,
  28. "Start BLE Reader",
  29. SubmenuIndexBLEReader,
  30. seos_scene_start_submenu_callback,
  31. seos);
  32. submenu_add_item(
  33. submenu,
  34. "Scanners >",
  35. SubmenuIndexScannerMenu,
  36. seos_scene_start_submenu_callback,
  37. seos);
  38. /*
  39. submenu_add_item(
  40. submenu,
  41. "BLE Cred Interrogate",
  42. SubmenuIndexBLECredInterrogate,
  43. seos_scene_start_submenu_callback,
  44. seos);
  45. */
  46. }
  47. submenu_add_item(
  48. submenu, "Inspect", SubmenuIndexInspect, seos_scene_start_submenu_callback, seos);
  49. submenu_add_item(submenu, "About", SubmenuIndexAbout, seos_scene_start_submenu_callback, seos);
  50. submenu_set_selected_item(
  51. seos->submenu, scene_manager_get_scene_state(seos->scene_manager, SeosSceneStart));
  52. view_dispatcher_switch_to_view(seos->view_dispatcher, SeosViewMenu);
  53. }
  54. void seos_scene_start_on_enter(void* context) {
  55. Seos* seos = context;
  56. // Dont' check if we've checked before
  57. if(seos->has_ble == false) {
  58. ble_checks = 3;
  59. seos_hci = seos_hci_alloc(seos);
  60. seos_hci_start(seos_hci, BLE_PERIPHERAL, FLOW_TEST);
  61. }
  62. seos_scene_start_on_update(context);
  63. }
  64. bool seos_scene_start_on_event(void* context, SceneManagerEvent event) {
  65. Seos* seos = context;
  66. bool consumed = false;
  67. if(event.type == SceneManagerEventTypeCustom) {
  68. if(event.event == SubmenuIndexRead) {
  69. scene_manager_set_scene_state(seos->scene_manager, SeosSceneStart, SubmenuIndexRead);
  70. scene_manager_next_scene(seos->scene_manager, SeosSceneRead);
  71. consumed = true;
  72. } else if(event.event == SubmenuIndexBLEReader) {
  73. scene_manager_set_scene_state(
  74. seos->scene_manager, SeosSceneStart, SubmenuIndexBLEReader);
  75. seos->flow_mode = FLOW_READER;
  76. scene_manager_next_scene(seos->scene_manager, SeosSceneBlePeripheral);
  77. consumed = true;
  78. } else if(event.event == SubmenuIndexScannerMenu) {
  79. scene_manager_set_scene_state(
  80. seos->scene_manager, SeosSceneStart, SubmenuIndexScannerMenu);
  81. scene_manager_next_scene(seos->scene_manager, SeosSceneScannerMenu);
  82. consumed = true;
  83. } else if(event.event == SubmenuIndexBLECredInterrogate) {
  84. scene_manager_set_scene_state(
  85. seos->scene_manager, SeosSceneStart, SubmenuIndexBLECredInterrogate);
  86. seos->flow_mode = FLOW_READER;
  87. scene_manager_next_scene(seos->scene_manager, SeosSceneBleCentral);
  88. consumed = true;
  89. } else if(event.event == SubmenuIndexSaved) {
  90. scene_manager_set_scene_state(seos->scene_manager, SeosSceneStart, SubmenuIndexSaved);
  91. scene_manager_next_scene(seos->scene_manager, SeosSceneFileSelect);
  92. consumed = true;
  93. } else if(event.event == SubmenuIndexInspect) {
  94. scene_manager_set_scene_state(
  95. seos->scene_manager, SeosSceneStart, SubmenuIndexInspect);
  96. seos->flow_mode = FLOW_INSPECT;
  97. scene_manager_next_scene(seos->scene_manager, SeosSceneEmulate);
  98. consumed = true;
  99. } else if(event.event == SubmenuIndexAbout) {
  100. scene_manager_set_scene_state(seos->scene_manager, SeosSceneStart, SubmenuIndexAbout);
  101. scene_manager_next_scene(seos->scene_manager, SeosSceneAbout);
  102. consumed = true;
  103. } else if(event.event == SeosCustomEventHCIInit) {
  104. seos->has_ble = true;
  105. FURI_LOG_I(TAG, "HCI Init");
  106. if(seos_hci) {
  107. seos_hci_stop(seos_hci);
  108. seos_hci_free(seos_hci);
  109. seos_hci = NULL;
  110. }
  111. }
  112. } else if(event.type == SceneManagerEventTypeTick) {
  113. if(ble_checks > 0) {
  114. FURI_LOG_D(TAG, "ble check %d has_ble %d", ble_checks, seos->has_ble);
  115. ble_checks--;
  116. if(seos->has_ble) {
  117. ble_checks = 0;
  118. seos_scene_start_on_update(context);
  119. }
  120. }
  121. }
  122. return consumed;
  123. }
  124. void seos_scene_start_on_exit(void* context) {
  125. Seos* seos = context;
  126. if(seos_hci) {
  127. seos_hci_stop(seos_hci);
  128. seos_hci_free(seos_hci);
  129. seos_hci = NULL;
  130. }
  131. submenu_reset(seos->submenu);
  132. }