فهرست منبع

Snake2: Manifest and mutex fixes

Willy-JL 2 سال پیش
والد
کامیت
c6ab779d7f
2فایلهای تغییر یافته به همراه15 افزوده شده و 15 حذف شده
  1. 3 3
      snake_2/application.fam
  2. 12 12
      snake_2/snake_20.c

+ 3 - 3
snake_2/application.fam

@@ -1,12 +1,12 @@
 App(
-    appid="Snake20",
+    appid="snake20",
     name="Snake 2.0",
-    apptype=FlipperAppType.PLUGIN,
+    apptype=FlipperAppType.EXTERNAL,
     entry_point="snake_20_app",
     cdefines=["APP_SNAKE_20"],
     requires=["gui"],
     stack_size=1 * 1024,
     order=30,
     fap_icon="snake_10px.png",
-    fap_category="Games_Extra",
+    fap_category="Games",
 )

+ 12 - 12
snake_2/snake_20.c

@@ -46,6 +46,7 @@ typedef enum {
 #define y_back_symbol 9
 
 typedef struct {
+    FuriMutex* mutex;
     Point points[MAX_SNAKE_LEN];
     uint16_t len;
     Direction currentMovement;
@@ -97,10 +98,9 @@ const NotificationSequence sequence_eat = {
 };
 
 static void snake_game_render_callback(Canvas* const canvas, void* ctx) {
-    const SnakeState* snake_state = acquire_mutex((ValueMutex*)ctx, 25);
-    if(snake_state == NULL) {
-        return;
-    }
+    furi_assert(ctx);
+    const SnakeState* snake_state = ctx;
+    furi_mutex_acquire(snake_state->mutex, FuriWaitForever);
 
     // Before the function is called, the state is set with the canvas_reset(canvas)
 
@@ -187,7 +187,7 @@ static void snake_game_render_callback(Canvas* const canvas, void* ctx) {
 
     }
 
-    release_mutex((ValueMutex*)ctx, snake_state);
+    furi_mutex_release(snake_state->mutex);
 }
 
 static void snake_game_input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
@@ -376,8 +376,8 @@ int32_t snake_20_app(void* p) {
     SnakeState* snake_state = malloc(sizeof(SnakeState));
     snake_game_init_game(snake_state);
 
-    ValueMutex state_mutex;
-    if(!init_mutex(&state_mutex, snake_state, sizeof(SnakeState))) {
+    snake_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
+    if(!snake_state->mutex) {
         FURI_LOG_E("SnakeGame", "cannot create mutex\r\n");
         furi_message_queue_free(event_queue);
         free(snake_state);
@@ -385,7 +385,7 @@ int32_t snake_20_app(void* p) {
     }
 
     ViewPort* view_port = view_port_alloc();
-    view_port_draw_callback_set(view_port, snake_game_render_callback, &state_mutex);
+    view_port_draw_callback_set(view_port, snake_game_render_callback, snake_state);
     view_port_input_callback_set(view_port, snake_game_input_callback, event_queue);
 
     FuriTimer* timer =
@@ -399,13 +399,13 @@ int32_t snake_20_app(void* p) {
 
     notification_message_block(notification, &sequence_display_backlight_enforce_on);
 
-    DOLPHIN_DEED(DolphinDeedPluginGameStart);
+    dolphin_deed(DolphinDeedPluginGameStart);
 
     SnakeEvent event;
     for(bool processing = true; processing;) {
         FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
 
-        SnakeState* snake_state = (SnakeState*)acquire_mutex_block(&state_mutex);
+        furi_mutex_acquire(snake_state->mutex, FuriWaitForever);
 
         if(event_status == FuriStatusOk) {
             if(event.type == EventTypeKey) {
@@ -508,7 +508,7 @@ int32_t snake_20_app(void* p) {
         }
 
         view_port_update(view_port);
-        release_mutex(&state_mutex, snake_state);
+        furi_mutex_release(snake_state->mutex);
     }
 
     // Wait for all notifications to be played and return backlight to normal state
@@ -521,7 +521,7 @@ int32_t snake_20_app(void* p) {
     furi_record_close(RECORD_NOTIFICATION);
     view_port_free(view_port);
     furi_message_queue_free(event_queue);
-    delete_mutex(&state_mutex);
+    furi_mutex_free(snake_state->mutex);
     free(snake_state);
 
     return 0;