SimplyMinimal 3 лет назад
Родитель
Сommit
00b66aba7f
1 измененных файлов с 46 добавлено и 7 удалено
  1. 46 7
      simon_says.c

+ 46 - 7
simon_says.c

@@ -194,9 +194,40 @@ void draw_current_score(Canvas* canvas, const SimonData* simon_data) {
     canvas_draw_str_aligned(canvas, SCREEN_XRES / 2 + 4, 2, AlignCenter, AlignTop, str_score);
     canvas_draw_str_aligned(canvas, SCREEN_XRES / 2 + 4, 2, AlignCenter, AlignTop, str_score);
 }
 }
 
 
+void play_sound_up(SimonData* const app) {
+    if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
+        furi_hal_speaker_start(NOTE_UP, app->volume);
+    }
+}
+
+void play_sound_down(SimonData* const app) {
+    if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
+        furi_hal_speaker_start(NOTE_DOWN, app->volume);
+    }
+}
+
+void play_sound_left(SimonData* const app) {
+    if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
+        furi_hal_speaker_start(NOTE_LEFT, app->volume);
+    }
+}
+
+void play_sound_right(SimonData* const app) {
+    if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
+        furi_hal_speaker_start(NOTE_RIGHT, app->volume);
+    }
+}
+
+void stop_sound() {
+    if(furi_hal_speaker_is_mine()) {
+        furi_hal_speaker_stop();
+        furi_hal_speaker_release();
+    }
+}
+
 /* Main Render Function */
 /* Main Render Function */
 void simon_draw_callback(Canvas* canvas, void* ctx) {
 void simon_draw_callback(Canvas* canvas, void* ctx) {
-    const SimonData* simon_state = acquire_mutex((ValueMutex*)ctx, 25);
+    SimonData* const simon_state = acquire_mutex((ValueMutex*)ctx, 25);
     if(simon_state == NULL) {
     if(simon_state == NULL) {
         if(DEBUG_MSG) FURI_LOG_E(TAG, "[simon_draw_callback] Null simon state");
         if(DEBUG_MSG) FURI_LOG_E(TAG, "[simon_draw_callback] Null simon state");
         return;
         return;
@@ -255,19 +286,27 @@ void simon_draw_callback(Canvas* canvas, void* ctx) {
         if(simon_state->set_board_neutral) {
         if(simon_state->set_board_neutral) {
             // Draw Neutral Board
             // Draw Neutral Board
             canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_board); // Draw Board
             canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_board); // Draw Board
+
+            // Stop Sound TODO: Move this to a better place
+            //@todo Sound
+            stop_sound();
         } else {
         } else {
             switch(simon_state->selectedShape) {
             switch(simon_state->selectedShape) {
             case up:
             case up:
-                canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_up); // Draw Down
+                canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_up); // Draw Up
+                play_sound_up(simon_state);
                 break;
                 break;
             case down:
             case down:
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_down); // Draw Down
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_down); // Draw Down
+                play_sound_down(simon_state);
                 break;
                 break;
             case left:
             case left:
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_left); // Draw Left
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_left); // Draw Left
+                play_sound_left(simon_state);
                 break;
                 break;
             case right:
             case right:
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_right); // Draw Right
                 canvas_draw_icon(canvas, BOARD_X, BOARD_Y, &I_right); // Draw Right
+                play_sound_right(simon_state);
                 break;
                 break;
             default:
             default:
                 if(DEBUG_MSG)
                 if(DEBUG_MSG)
@@ -280,6 +319,7 @@ void simon_draw_callback(Canvas* canvas, void* ctx) {
 
 
     // ######################### Game Over #########################
     // ######################### Game Over #########################
     if(simon_state->gameState == gameOver) {
     if(simon_state->gameState == gameOver) {
+        stop_sound(); //TODO: Make a game over sequence
         canvas_set_color(canvas, ColorXOR);
         canvas_set_color(canvas, ColorXOR);
         canvas_set_font(canvas, FontPrimary);
         canvas_set_font(canvas, FontPrimary);
 
 
@@ -457,10 +497,7 @@ enum shape_names getCurrentSimonMove(SimonData* app) {
 }
 }
 
 
 void onPlayerSelectedShapeCallback(enum shape_names shape, SimonData* app) {
 void onPlayerSelectedShapeCallback(enum shape_names shape, SimonData* app) {
-    if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(30)) {
-        furi_hal_speaker_start(NOTE_UP, app->volume);
-    }
-
+    //@todo Sound on select
     if(shape == getCurrentSimonMove(app)) {
     if(shape == getCurrentSimonMove(app)) {
         onPlayerAnsweredCorrect(app);
         onPlayerAnsweredCorrect(app);
     } else {
     } else {
@@ -551,7 +588,7 @@ int32_t simon_says_app_entry(void* p) {
         FuriStatus q_status = furi_message_queue_get(
         FuriStatus q_status = furi_message_queue_get(
             event_queue, &input, simon_state->numberOfMillisecondsBeforeShapeDisappears);
             event_queue, &input, simon_state->numberOfMillisecondsBeforeShapeDisappears);
 
 
-        if(q_status == FuriStatusOk) {
+        if(q_status == FuriStatusOk && simon_state->activePlayer == player) {
             FURI_LOG_D(TAG, "Got input event: %d", input.key);
             FURI_LOG_D(TAG, "Got input event: %d", input.key);
             //break out of the loop if the back key is pressed
             //break out of the loop if the back key is pressed
             if(input.key == InputKeyBack && input.type == InputTypeLong) {
             if(input.key == InputKeyBack && input.type == InputTypeLong) {
@@ -599,6 +636,7 @@ int32_t simon_says_app_entry(void* p) {
                         onPlayerSelectedShapeCallback(right, simon_state);
                         onPlayerSelectedShapeCallback(right, simon_state);
                         break;
                         break;
                     default:
                     default:
+                        simon_state->set_board_neutral = true;
                         break;
                         break;
                     }
                     }
                 } else {
                 } else {
@@ -619,6 +657,7 @@ int32_t simon_says_app_entry(void* p) {
         view_port_update(view_port);
         view_port_update(view_port);
     }
     }
 
 
+    stop_sound();
     notification_message(notification, &sequence_cleanup);
     notification_message(notification, &sequence_cleanup);
     gui_remove_view_port(gui, view_port);
     gui_remove_view_port(gui, view_port);
     view_port_free(view_port);
     view_port_free(view_port);