|
|
@@ -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);
|