Procházet zdrojové kódy

Merge pull request #2 from eugene-kirzhanov/update

Update code to match one in unleashed-firmware repo
Eugene Kirzhanov před 2 roky
rodič
revize
663bbe7bd1
1 změnil soubory, kde provedl 16 přidání a 10 odebrání
  1. 16 10
      game_2048.c

+ 16 - 10
game_2048.c

@@ -13,6 +13,7 @@
 #include <gui/gui.h>
 #include <input/input.h>
 #include <storage/storage.h>
+#include <dolphin/dolphin.h>
 
 #include "digits.h"
 #include "array_utils.h"
@@ -33,6 +34,7 @@ typedef enum {
 } State;
 
 typedef struct {
+    FuriMutex* mutex;
     State state;
     uint8_t table[CELLS_COUNT][CELLS_COUNT];
     uint32_t score;
@@ -103,8 +105,9 @@ static void gray_canvas(Canvas* const canvas) {
 }
 
 static void draw_callback(Canvas* const canvas, void* ctx) {
-    const GameState* game_state = acquire_mutex((ValueMutex*)ctx, 25);
-    if(game_state == NULL) return;
+    furi_assert(ctx);
+    const GameState* game_state = ctx;
+    furi_mutex_acquire(game_state->mutex, FuriWaitForever);
 
     canvas_clear(canvas);
 
@@ -180,7 +183,7 @@ static void draw_callback(Canvas* const canvas, void* ctx) {
         canvas_draw_str_aligned(canvas, 64, 48, AlignCenter, AlignBottom, buf);
     }
 
-    release_mutex((ValueMutex*)ctx, game_state);
+    furi_mutex_release(game_state->mutex);
 }
 
 void calculate_move_to_left(uint8_t arr[], MoveResult* const move_result) {
@@ -380,9 +383,9 @@ int32_t game_2048_app() {
 
     MoveResult* move_result = malloc(sizeof(MoveResult));
 
-    ValueMutex state_mutex;
-    if(!init_mutex(&state_mutex, game_state, sizeof(GameState))) {
-        FURI_LOG_E("SnakeGame", "cannot create mutex\r\n");
+    game_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
+    if(!game_state->mutex) {
+        FURI_LOG_E("2048Game", "cannot create mutex\r\n");
         free(game_state);
         return 255;
     }
@@ -391,12 +394,15 @@ int32_t game_2048_app() {
     FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent));
 
     ViewPort* view_port = view_port_alloc();
-    view_port_draw_callback_set(view_port, draw_callback, &state_mutex);
+    view_port_draw_callback_set(view_port, draw_callback, game_state);
     view_port_input_callback_set(view_port, input_callback, event_queue);
 
     Gui* gui = furi_record_open(RECORD_GUI);
     gui_add_view_port(gui, view_port, GuiLayerFullscreen);
 
+    // Call dolphin deed on game start
+    DOLPHIN_DEED(DolphinDeedPluginGameStart);
+
     bool is_finished = false;
     while(!is_finished) {
         FuriStatus event_status = furi_message_queue_get(event_queue, &input, FuriWaitForever);
@@ -404,7 +410,7 @@ int32_t game_2048_app() {
             // handle only press event, ignore repeat/release events
             if(input.type != InputTypePress) continue;
 
-            GameState* game_state = (GameState*)acquire_mutex_block(&state_mutex);
+            furi_mutex_acquire(game_state->mutex, FuriWaitForever);
 
             switch(game_state->state) {
             case GameStateMenu:
@@ -489,7 +495,7 @@ int32_t game_2048_app() {
             }
 
             view_port_update(view_port);
-            release_mutex(&state_mutex, game_state);
+            furi_mutex_release(game_state->mutex);
         }
     }
 
@@ -500,7 +506,7 @@ int32_t game_2048_app() {
 
     furi_message_queue_free(event_queue);
 
-    delete_mutex(&state_mutex);
+    furi_mutex_free(game_state->mutex);
 
     free(game_state);
     free(move_result);