seader_scene_start.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "../seader_i.h"
  2. enum SubmenuIndex {
  3. SubmenuIndexSamPresent,
  4. SubmenuIndexSamMissing,
  5. };
  6. static void seader_scene_start_detect_callback(void* context) {
  7. Seader* seader = context;
  8. view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderWorkerEventSamMissing);
  9. }
  10. void seader_sam_check_worker_callback(SeaderWorkerEvent event, void* context) {
  11. Seader* seader = context;
  12. view_dispatcher_send_custom_event(seader->view_dispatcher, event);
  13. }
  14. void seader_scene_start_submenu_callback(void* context, uint32_t index) {
  15. Seader* seader = context;
  16. view_dispatcher_send_custom_event(seader->view_dispatcher, index);
  17. }
  18. void seader_scene_start_on_enter(void* context) {
  19. Seader* seader = context;
  20. Popup* popup = seader->popup;
  21. popup_set_context(seader->popup, seader);
  22. popup_set_callback(seader->popup, seader_scene_start_detect_callback);
  23. popup_set_header(popup, "Detecting SAM", 58, 48, AlignCenter, AlignCenter);
  24. popup_set_timeout(seader->popup, 2500);
  25. popup_enable_timeout(seader->popup);
  26. // Start worker
  27. seader_worker_start(
  28. seader->worker,
  29. SeaderWorkerStateCheckSam,
  30. seader->uart,
  31. seader_sam_check_worker_callback,
  32. seader);
  33. view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup);
  34. }
  35. bool seader_scene_start_on_event(void* context, SceneManagerEvent event) {
  36. Seader* seader = context;
  37. bool consumed = false;
  38. if(event.type == SceneManagerEventTypeCustom) {
  39. if(event.event == SeaderWorkerEventSamPresent) {
  40. scene_manager_next_scene(seader->scene_manager, SeaderSceneSamPresent);
  41. consumed = true;
  42. } else if(event.event == SeaderWorkerEventSamMissing) {
  43. scene_manager_next_scene(seader->scene_manager, SeaderSceneSamMissing);
  44. consumed = true;
  45. } else if(event.event == SeaderWorkerEventSamWrong) {
  46. scene_manager_next_scene(seader->scene_manager, SeaderSceneSamWrong);
  47. consumed = true;
  48. }
  49. scene_manager_set_scene_state(seader->scene_manager, SeaderSceneStart, event.event);
  50. }
  51. return consumed;
  52. }
  53. void seader_scene_start_on_exit(void* context) {
  54. Seader* seader = context;
  55. popup_reset(seader->popup);
  56. }