|
@@ -34,7 +34,8 @@ static void draw_ui(Canvas *const canvas, const GameState *game_state) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void render_callback(Canvas *const canvas, void *ctx) {
|
|
static void render_callback(Canvas *const canvas, void *ctx) {
|
|
|
- const GameState *game_state = acquire_mutex((ValueMutex *) ctx, 25);
|
|
|
|
|
|
|
+ const GameState *game_state = ctx;
|
|
|
|
|
+ furi_mutex_acquire(game_state->mutex, 25);
|
|
|
|
|
|
|
|
if (game_state == NULL) {
|
|
if (game_state == NULL) {
|
|
|
return;
|
|
return;
|
|
@@ -61,7 +62,7 @@ static void render_callback(Canvas *const canvas, void *ctx) {
|
|
|
settings_page(canvas, game_state);
|
|
settings_page(canvas, game_state);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- release_mutex((ValueMutex *) ctx, game_state);
|
|
|
|
|
|
|
+ furi_mutex_release(game_state->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//region card draw
|
|
//region card draw
|
|
@@ -484,15 +485,15 @@ int32_t blackjack_app(void *p) {
|
|
|
|
|
|
|
|
game_state->state = GameStateStart;
|
|
game_state->state = GameStateStart;
|
|
|
|
|
|
|
|
- ValueMutex state_mutex;
|
|
|
|
|
- if (!init_mutex(&state_mutex, game_state, sizeof(GameState))) {
|
|
|
|
|
|
|
+ game_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
|
|
|
|
|
+ if (!game_state->mutex) {
|
|
|
FURI_LOG_E(APP_NAME, "cannot create mutex\r\n");
|
|
FURI_LOG_E(APP_NAME, "cannot create mutex\r\n");
|
|
|
return_code = 255;
|
|
return_code = 255;
|
|
|
goto free_and_exit;
|
|
goto free_and_exit;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ViewPort *view_port = view_port_alloc();
|
|
ViewPort *view_port = view_port_alloc();
|
|
|
- view_port_draw_callback_set(view_port, render_callback, &state_mutex);
|
|
|
|
|
|
|
+ view_port_draw_callback_set(view_port, render_callback, game_state);
|
|
|
view_port_input_callback_set(view_port, input_callback, event_queue);
|
|
view_port_input_callback_set(view_port, input_callback, event_queue);
|
|
|
|
|
|
|
|
FuriTimer *timer =
|
|
FuriTimer *timer =
|
|
@@ -506,48 +507,48 @@ int32_t blackjack_app(void *p) {
|
|
|
|
|
|
|
|
for (bool processing = true; processing;) {
|
|
for (bool processing = true; processing;) {
|
|
|
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
|
|
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
|
|
|
- GameState *localstate = (GameState *) acquire_mutex_block(&state_mutex);
|
|
|
|
|
|
|
+ furi_mutex_acquire(game_state->mutex, FuriWaitForever);
|
|
|
if (event_status == FuriStatusOk) {
|
|
if (event_status == FuriStatusOk) {
|
|
|
if (event.type == EventTypeKey) {
|
|
if (event.type == EventTypeKey) {
|
|
|
|
|
|
|
|
if (event.input.type == InputTypePress) {
|
|
if (event.input.type == InputTypePress) {
|
|
|
switch (event.input.key) {
|
|
switch (event.input.key) {
|
|
|
case InputKeyUp:
|
|
case InputKeyUp:
|
|
|
- localstate->selectDirection = DirectionUp;
|
|
|
|
|
|
|
+ game_state->selectDirection = DirectionUp;
|
|
|
break;
|
|
break;
|
|
|
case InputKeyDown:
|
|
case InputKeyDown:
|
|
|
- localstate->selectDirection = DirectionDown;
|
|
|
|
|
|
|
+ game_state->selectDirection = DirectionDown;
|
|
|
break;
|
|
break;
|
|
|
case InputKeyRight:
|
|
case InputKeyRight:
|
|
|
- localstate->selectDirection = DirectionRight;
|
|
|
|
|
|
|
+ game_state->selectDirection = DirectionRight;
|
|
|
break;
|
|
break;
|
|
|
case InputKeyLeft:
|
|
case InputKeyLeft:
|
|
|
- localstate->selectDirection = DirectionLeft;
|
|
|
|
|
|
|
+ game_state->selectDirection = DirectionLeft;
|
|
|
break;
|
|
break;
|
|
|
case InputKeyBack:
|
|
case InputKeyBack:
|
|
|
- if (localstate->state == GameStateSettings) {
|
|
|
|
|
- localstate->state = GameStateStart;
|
|
|
|
|
- save_settings(localstate->settings);
|
|
|
|
|
|
|
+ if (game_state->state == GameStateSettings) {
|
|
|
|
|
+ game_state->state = GameStateStart;
|
|
|
|
|
+ save_settings(game_state->settings);
|
|
|
} else
|
|
} else
|
|
|
processing = false;
|
|
processing = false;
|
|
|
break;
|
|
break;
|
|
|
case InputKeyOk:
|
|
case InputKeyOk:
|
|
|
- localstate->selectDirection = Select;
|
|
|
|
|
|
|
+ game_state->selectDirection = Select;
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else if (event.type == EventTypeTick) {
|
|
} else if (event.type == EventTypeTick) {
|
|
|
- tick(localstate);
|
|
|
|
|
- processing = localstate->processing;
|
|
|
|
|
|
|
+ tick(game_state);
|
|
|
|
|
+ processing = game_state->processing;
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
FURI_LOG_D(APP_NAME, "osMessageQueue: event timeout");
|
|
FURI_LOG_D(APP_NAME, "osMessageQueue: event timeout");
|
|
|
// event timeout
|
|
// event timeout
|
|
|
}
|
|
}
|
|
|
view_port_update(view_port);
|
|
view_port_update(view_port);
|
|
|
- release_mutex(&state_mutex, localstate);
|
|
|
|
|
|
|
+ furi_mutex_release(game_state->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -556,7 +557,7 @@ int32_t blackjack_app(void *p) {
|
|
|
gui_remove_view_port(gui, view_port);
|
|
gui_remove_view_port(gui, view_port);
|
|
|
furi_record_close(RECORD_GUI);
|
|
furi_record_close(RECORD_GUI);
|
|
|
view_port_free(view_port);
|
|
view_port_free(view_port);
|
|
|
- delete_mutex(&state_mutex);
|
|
|
|
|
|
|
+ furi_mutex_free(game_state->mutex);
|
|
|
|
|
|
|
|
free_and_exit:
|
|
free_and_exit:
|
|
|
free(game_state->deck.cards);
|
|
free(game_state->deck.cards);
|