|
@@ -84,6 +84,8 @@ typedef struct {
|
|
|
|
|
|
|
|
int rerolls;
|
|
int rerolls;
|
|
|
int score;
|
|
int score;
|
|
|
|
|
+
|
|
|
|
|
+ FuriMutex* mutex;
|
|
|
} GameState;
|
|
} GameState;
|
|
|
|
|
|
|
|
typedef struct {
|
|
typedef struct {
|
|
@@ -565,10 +567,9 @@ static void draw_end_ui(Canvas* canvas, GameState* state) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void roots_draw_callback(Canvas* const canvas, void* ctx) {
|
|
static void roots_draw_callback(Canvas* const canvas, void* ctx) {
|
|
|
- GameState* state = acquire_mutex((ValueMutex*)ctx, 25);
|
|
|
|
|
- if(state == NULL) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ furi_assert(ctx);
|
|
|
|
|
+ GameState* state = ctx;
|
|
|
|
|
+ furi_mutex_acquire(state->mutex, FuriWaitForever);
|
|
|
|
|
|
|
|
if(!state->initialDraw) {
|
|
if(!state->initialDraw) {
|
|
|
state->initialDraw = true;
|
|
state->initialDraw = true;
|
|
@@ -600,7 +601,7 @@ static void roots_draw_callback(Canvas* const canvas, void* ctx) {
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- release_mutex((ValueMutex*)ctx, state);
|
|
|
|
|
|
|
+ furi_mutex_release(state->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void roots_input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
|
|
static void roots_input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
|
|
@@ -678,8 +679,8 @@ int32_t roots_of_life_game_app(void* p) {
|
|
|
GameState* state = malloc(sizeof(GameState));
|
|
GameState* state = malloc(sizeof(GameState));
|
|
|
game_state_init(state);
|
|
game_state_init(state);
|
|
|
|
|
|
|
|
- ValueMutex state_mutex;
|
|
|
|
|
- if(!init_mutex(&state_mutex, state, sizeof(GameState))) {
|
|
|
|
|
|
|
+ state->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
|
|
|
|
|
+ if(!state->mutex) {
|
|
|
FURI_LOG_E(TAG, "Cannot create mutex\r\n");
|
|
FURI_LOG_E(TAG, "Cannot create mutex\r\n");
|
|
|
return_code = 255;
|
|
return_code = 255;
|
|
|
goto free_and_exit;
|
|
goto free_and_exit;
|
|
@@ -687,7 +688,7 @@ int32_t roots_of_life_game_app(void* p) {
|
|
|
|
|
|
|
|
// Set system callbacks
|
|
// Set system callbacks
|
|
|
ViewPort* view_port = view_port_alloc();
|
|
ViewPort* view_port = view_port_alloc();
|
|
|
- view_port_draw_callback_set(view_port, roots_draw_callback, &state_mutex);
|
|
|
|
|
|
|
+ view_port_draw_callback_set(view_port, roots_draw_callback, state);
|
|
|
view_port_input_callback_set(view_port, roots_input_callback, event_queue);
|
|
view_port_input_callback_set(view_port, roots_input_callback, event_queue);
|
|
|
|
|
|
|
|
FuriTimer* timer =
|
|
FuriTimer* timer =
|
|
@@ -702,7 +703,7 @@ int32_t roots_of_life_game_app(void* p) {
|
|
|
GameEvent event;
|
|
GameEvent event;
|
|
|
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* state = (GameState*)acquire_mutex_block(&state_mutex);
|
|
|
|
|
|
|
+ furi_mutex_acquire(state->mutex, FuriWaitForever);
|
|
|
|
|
|
|
|
if(event_status == FuriStatusOk) {
|
|
if(event_status == FuriStatusOk) {
|
|
|
// Key events
|
|
// Key events
|
|
@@ -733,7 +734,7 @@ int32_t roots_of_life_game_app(void* p) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
view_port_update(view_port);
|
|
view_port_update(view_port);
|
|
|
- release_mutex(&state_mutex, state);
|
|
|
|
|
|
|
+ furi_mutex_release(state->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
furi_timer_free(timer);
|
|
furi_timer_free(timer);
|
|
@@ -742,7 +743,7 @@ int32_t roots_of_life_game_app(void* p) {
|
|
|
furi_record_close(RECORD_GUI);
|
|
furi_record_close(RECORD_GUI);
|
|
|
furi_record_close(RECORD_NOTIFICATION);
|
|
furi_record_close(RECORD_NOTIFICATION);
|
|
|
view_port_free(view_port);
|
|
view_port_free(view_port);
|
|
|
- delete_mutex(&state_mutex);
|
|
|
|
|
|
|
+ furi_mutex_free(state->mutex);
|
|
|
|
|
|
|
|
free_and_exit:
|
|
free_and_exit:
|
|
|
FURI_LOG_D(TAG, "Quitting game...");
|
|
FURI_LOG_D(TAG, "Quitting game...");
|