engine.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <furi.h>
  2. #include "dolphin_scene/dolphin_scene.h"
  3. void dolphin_engine_tick_cb(void* p) {
  4. osMessageQueueId_t event_queue = p;
  5. AppEvent tick_event;
  6. tick_event.type = EventTypeTick;
  7. osMessageQueuePut(event_queue, (void*)&tick_event, 0, 0);
  8. }
  9. static void dolphin_engine_event_cb(InputEvent* input_event, void* ctx) {
  10. osMessageQueueId_t event_queue = ctx;
  11. AppEvent event;
  12. event.type = EventTypeKey;
  13. event.value.input = *input_event;
  14. osMessageQueuePut(event_queue, (void*)&event, 0, osWaitForever);
  15. }
  16. ValueMutex* scene_init() {
  17. SceneState* scene_state = furi_alloc(sizeof(SceneState));
  18. scene_state->ui.mqueue = osMessageQueueNew(2, sizeof(AppEvent), NULL);
  19. scene_state->player.y = DOLPHIN_DEFAULT_Y;
  20. scene_state->player.x = DOLPHIN_CENTER;
  21. //randomize position
  22. scene_state->player_global.x = random() % WORLD_WIDTH / 4;
  23. scene_state->screen.x = scene_state->player.x;
  24. scene_state->screen.y = scene_state->player.y;
  25. ValueMutex* scene_state_mutex = furi_alloc(sizeof(ValueMutex));
  26. if(scene_state_mutex == NULL ||
  27. !init_mutex(scene_state_mutex, scene_state, sizeof(SceneState))) {
  28. printf("[menu_task] cannot create menu mutex\r\n");
  29. furi_check(0);
  30. }
  31. // Open GUI and register view_port
  32. scene_state->ui.gui = furi_record_open("gui");
  33. // Allocate and configure view_port
  34. scene_state->ui.view_port = view_port_alloc();
  35. // Open GUI and register fullscreen view_port
  36. gui_add_view_port(scene_state->ui.gui, scene_state->ui.view_port, GuiLayerMain);
  37. view_port_draw_callback_set(
  38. scene_state->ui.view_port, dolphin_scene_redraw, scene_state_mutex);
  39. view_port_input_callback_set(
  40. scene_state->ui.view_port, dolphin_engine_event_cb, scene_state->ui.mqueue);
  41. view_port_enabled_set(scene_state->ui.view_port, true);
  42. scene_state->ui.timer =
  43. osTimerNew(dolphin_engine_tick_cb, osTimerPeriodic, scene_state->ui.mqueue, NULL);
  44. return scene_state_mutex;
  45. }
  46. void scene_free(ValueMutex* scene_state_mutex) {
  47. furi_assert(scene_state_mutex);
  48. SceneState* scene_state = (SceneState*)acquire_mutex_block(scene_state_mutex);
  49. osTimerDelete(scene_state->ui.timer);
  50. gui_remove_view_port(scene_state->ui.gui, scene_state->ui.view_port);
  51. view_port_free(scene_state->ui.view_port);
  52. furi_record_close("gui");
  53. osMessageQueueDelete(scene_state->ui.mqueue);
  54. free(scene_state);
  55. release_mutex(scene_state_mutex, scene_state);
  56. delete_mutex(scene_state_mutex);
  57. free(scene_state_mutex);
  58. }
  59. int32_t dolphin_scene(void* p) {
  60. ValueMutex* scene_state_mutex = scene_init();
  61. furi_record_create("scene", scene_state_mutex);
  62. SceneState* _state = (SceneState*)acquire_mutex_block(scene_state_mutex);
  63. osTimerStart(_state->ui.timer, 40);
  64. uint32_t t = xTaskGetTickCount();
  65. uint32_t prev_t = 0;
  66. osMessageQueueId_t q = _state->ui.mqueue;
  67. release_mutex(scene_state_mutex, _state);
  68. while(1) {
  69. AppEvent event;
  70. if(osMessageQueueGet(q, &event, 0, osWaitForever) == osOK) {
  71. SceneState* _state = (SceneState*)acquire_mutex_block(scene_state_mutex);
  72. if(event.type == EventTypeTick) {
  73. t = xTaskGetTickCount();
  74. dolphin_scene_tick_handler(_state, t, (t - prev_t) % 1024);
  75. prev_t = t;
  76. } else if(event.type == EventTypeKey) {
  77. if(event.value.input.key == InputKeyBack &&
  78. event.value.input.type == InputTypeShort) {
  79. release_mutex(scene_state_mutex, _state);
  80. break;
  81. } else {
  82. dolphin_scene_handle_input(_state, &event.value.input);
  83. }
  84. }
  85. release_mutex(scene_state_mutex, _state);
  86. view_port_update(_state->ui.view_port);
  87. }
  88. }
  89. scene_free(scene_state_mutex);
  90. return 0;
  91. }