seos_scene_start.c 4.7 KB

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