summaryrefslogtreecommitdiff
path: root/Core/Src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/Src/main.c')
-rw-r--r--Core/Src/main.c212
1 files changed, 186 insertions, 26 deletions
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 2ec05eb..1001ae9 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -26,8 +26,12 @@
/* USER CODE BEGIN Includes */
#include "led.h"
#include "button.h"
-#include "simon.h"
#include "lcd_1602.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
@@ -59,17 +63,54 @@ void SystemClock_Config(void);
/* USER CODE BEGIN 0 */
//Declaration des leds et buttons
-LED_TypeDef led_rouge; //rouge
-LED_TypeDef led_verte; //verte
-LED_TypeDef led_jaune; //jaune
-LED_TypeDef led_system; //vert sur la carte
-
-BUTTON_TypeDef button_rouge; //rouge
-BUTTON_TypeDef button_vert; //vert
-BUTTON_TypeDef button_jaune; //jaune
-BUTTON_TypeDef button_start; //gris
-BUTTON_TypeDef button_system; //bleu sur la carte
-//
+LED_TypeDef led_rouge; //rouge
+LED_TypeDef led_verte; //verte
+LED_TypeDef led_jaune; //jaune
+LED_TypeDef led_system; //vert sur la carte
+
+BUTTON_TypeDef button_rouge; //rouge
+BUTTON_TypeDef button_vert; //vert
+BUTTON_TypeDef button_jaune; //jaune
+BUTTON_TypeDef button_deux_joueur; //gris
+BUTTON_TypeDef button_system; //bleu sur la carte
+
+// fonction pour allumer et eteindre les leds
+void fonction_led(char* couleur, int position) {
+ if (strcmp(couleur,"R")==0 && (position==0)){ //eteind rouge
+ Led_turnOff(&led_rouge);
+ } else if (strcmp(couleur,"R")==0 && (position==1)){ //allume rouge
+ Led_turnOn(&led_rouge);
+ } else if (strcmp(couleur,"V")==0 && (position==0)){
+ Led_turnOff(&led_verte);
+ } else if (strcmp(couleur,"V")==0 && (position==1)){
+ Led_turnOn(&led_verte);
+ } else if (strcmp(couleur,"J")==0 && (position==0)){
+ Led_turnOff(&led_jaune);
+ } else if (strcmp(couleur,"J")==0 && (position==1)){
+ Led_turnOn(&led_jaune);
+ } else if (strcmp(couleur,"S")==0 && (position==0)){
+ Led_turnOff(&led_system);
+ } else if (strcmp(couleur,"S")==0 && (position==1)){
+ Led_turnOn(&led_system);
+ }
+}
+
+void affiche_lcd(char* contenu, int positiony, int clear) {
+ if (clear==1){
+ lcd_clr();
+ }
+ lcd_gotoxy(0,positiony);
+ lcd_puts(contenu);
+}
+
+char* choix_aleatoire(void) {
+ char* couleur_leds[3]={"R","V","J"}; //nos couleurs de led
+ srand(time(0));
+ int aleatoire = (rand() % (2 - 0 + 1)) + 0; //choix entre 0 et 2 pour avoir 3 valeurs differentes (3 couleurs/leds)
+ char* choix = couleur_leds[aleatoire];
+ return choix;
+}
+
/* USER CODE END 0 */
/**
@@ -112,16 +153,16 @@ int main(void)
//
// Init de nos leds et buttons
- Led_init(&led_rouge, GPIOA,5); //led_rouge sur PA5
- Led_init(&led_verte, GPIOA,6); //led_verte sur PA6
- Led_init(&led_jaune, GPIOA,7); //led_jaune sur PA7
- Led_init(&led_system, GPIOB,6); //led_system sur PB6
-
- Button_init(&button_rouge, GPIOC, 13); //button_jaune sur PC13
- Button_init(&button_vert, GPIOC, 14); //button_vert sur PC13
- Button_init(&button_jaune, GPIOC, 15); //button_jaune sur PC13
- Button_init(&button_start, GPIOH, 0); //button_start sur PH0
- Button_init(&button_system, GPIOH, 1); //button_system sur PH1
+ Led_init(&led_system, GPIOA,5); //led_system sur PA5
+ Led_init(&led_rouge, GPIOA,6); //led_rouge sur PA6
+ Led_init(&led_verte, GPIOA,7); //led_verte sur PA7
+ Led_init(&led_jaune, GPIOB,6); //led_jaune sur PB6
+
+ Button_init(&button_system, GPIOC, 13); //button_system sur PC13
+ Button_init(&button_rouge, GPIOC, 14); //button_rouge sur PC13
+ Button_init(&button_vert, GPIOC, 15); //button_vert sur PC13
+ Button_init(&button_jaune, GPIOH, 0); //button_jaune sur PH0
+ Button_init(&button_deux_joueur, GPIOH, 1); //button_deux_joueur sur PH1
//
/* EXEMPLE D'UTILISATION POUR LED ET BUTTON
@@ -147,6 +188,13 @@ int main(void)
last_button_state = current_button_state;
}
*/
+ affiche_lcd("SIMON_STM32",0,1);
+
+ int score = 0; //pour le systeme de score
+ int deuxieme_joueur_joue = 0; //pour check si le 2e joueur a joué
+ int score_un=0; //pour store le score du j1
+ int score_deux=0; //pour store le score du j1
+ char* suite_de_leds[100]={}; //la suite de leds a faire cligoter
/* USER CODE END 2 */
@@ -155,11 +203,123 @@ int main(void)
while (1)
{
/* USER CODE BEGIN WHILE */
-
lcd_init();
- lcd_clr();
- lcd_gotoxy(0,0);
- lcd_puts("Hello World !");
+
+
+//gestion du mode 2joueurs
+ uint8_t last_button_2j_state = 1;
+ uint8_t current_button_2j_state = 1;
+ int etat_bouton_deux_joueurs=0;
+
+ //lire l’état courant
+ current_button_2j_state = Button_State(&button_deux_joueur);
+ //si front descendant (bouton appuyé)
+ if (last_button_2j_state == 1 && (current_button_2j_state == 0) && (etat_bouton_deux_joueurs==0)) {
+ etat_bouton_deux_joueurs = 1;
+ fonction_led("S",1); //allume la led de la carte
+ } else if (last_button_2j_state == 1 && (current_button_2j_state == 0) && (etat_bouton_deux_joueurs==1)) {
+ etat_bouton_deux_joueurs = 0;
+ fonction_led("S",0); //eteind la led de la carte
+ }
+ //mise à jour de l’état précédent du bouton
+ last_button_2j_state = current_button_2j_state;
+
+
+//gestion du bouton start/system
+ uint8_t last_button_system_state = 1; //button non appuyé
+ uint8_t current_button_system_state = 1; //button non appuyé
+ int etat_bouton_start=0;
+
+ //lire l’état courant
+ current_button_system_state = Button_State(&button_system);
+ //si front descendant (bouton appuyé)
+ if (last_button_system_state == 1 && (current_button_system_state == 0) && (etat_bouton_deux_joueurs==0)) {
+ etat_bouton_start = 1;
+ } else if (last_button_system_state == 1 && (current_button_system_state == 0) && (etat_bouton_deux_joueurs==1)) {
+ etat_bouton_start = 0;
+ }
+ //mise à jour de l’état précédent du bouton
+ last_button_system_state = current_button_system_state;
+
+
+ int perdu = 0; //pour check si le j a perdu
+
+ if (etat_bouton_start){
+//Sequence d'allumage
+ affiche_lcd("LET'S GO !",0,1);
+ fonction_led("R", 1);
+ HAL_Delay(250);
+ fonction_led("V", 1);
+ HAL_Delay(250);
+ fonction_led("J", 1);
+ HAL_Delay(250);
+ fonction_led("R", 0);
+ HAL_Delay(250);
+ fonction_led("V", 0);
+ HAL_Delay(250);
+ fonction_led("J", 0);
+ HAL_Delay(250);
+
+ if (etat_bouton_deux_joueurs && !deuxieme_joueur_joue){ //lancement du mode 2J
+ affiche_lcd("MODE 2J",0,1);
+ affiche_lcd("J1!",1,0);
+ }
+ else if (!etat_bouton_deux_joueurs && !deuxieme_joueur_joue) { //lancement du mode 1J
+ affiche_lcd("MODE 1J",0,1);
+ }
+
+ while (perdu!= 1) { //ici on lance un niveau (suite de leds), tant qu'on a pas perdu
+
+ suite_de_leds[score] = choix_aleatoire();
+ score++;
+ for (int i = 0; i<score; i++){ //allume et eteinds les leds une par une par rapport au niveau
+ fonction_led(suite_de_leds[i], 1); //on
+ HAL_Delay(500);
+ fonction_led(suite_de_leds[i], 0); //off
+ HAL_Delay(100);
+ }
+
+ affiche_lcd("A VOUS !",0,1);
+ int iLed=0;
+ do { //le joueur appuie sur les boutons
+ char bouton[100];
+ scanf("%s", bouton); //correspondance
+ char* bouton_couleur = bouton; //boutons poussoirs
+
+ if (*bouton_couleur!=*suite_de_leds[iLed]){ //le joueur se trompe
+ affiche_lcd("GAME OVER !",0,1);
+ affiche_lcd("SCORE :",0,1);
+
+ char score_char[10];
+ sprintf(score_char, "%d", score-1); //rendre un int en char
+
+ affiche_lcd(score_char,1,0);
+ perdu = 1;
+ etat_bouton_start=0;
+ } else {
+ perdu = 0;
+ }
+ iLed++;
+ } while (iLed<score && perdu!=1);
+ //tant qu'on a des leds a faire allume et qu'on a pas perdu
+ }
+
+ if (etat_bouton_deux_joueurs && perdu==1 && !deuxieme_joueur_joue){ //si le premier joueur perd en mode 2J
+ affiche_lcd("J2!",0,1);
+ etat_bouton_deux_joueurs = 0;
+ perdu = 0;
+ etat_bouton_start=1;
+ score_un = score;
+ deuxieme_joueur_joue = 1;
+ } else if (deuxieme_joueur_joue){ //si tout le monde a joue en mode 2 joueurs, on fait la comparaison des scores
+ score_deux = score;
+ if (score_un>score_deux){affiche_lcd("JOUEUR 1 GAGNE!",0,1);}
+ else if (score_un<score_deux){affiche_lcd("JOUEUR 2 GAGNE!",0,1);}
+ else {affiche_lcd("EGALITE...",0,1);}
+ }
+
+ }
+ score=0;
/* USER CODE END WHILE */
}