Code

Dependencies:   mbed BSP_DISCO_F746NG LSM303D

Revision:
0:1849768f6d76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 24 16:33:09 2020 +0000
@@ -0,0 +1,249 @@
+#include "mbed.h"
+#include "LSM303D.h"
+#include "stm32746g_discovery_lcd.h"
+#include "stm32746g_discovery_ts.h"
+#include "time.h"
+
+//LIGNES D'ECRITURE
+#define ligne1 75
+#define ligne2 175
+#define ligneMilieu 125
+//LIMITE ECRAN PAR RAPPORT AU CENTRE DU CERCLE DU JOUEUR
+#define limiteMinX 12
+#define limiteMinY 12
+#define limiteMaxX 467
+#define limiteMaxY 259
+//PARAMETRE JEU
+#define nbrCoup 10
+
+//VARIABLES GLOBALES
+char buffer[100];
+char bufferM[100];
+float randX, randY;
+float randXmemoire, randYmemoire;
+bool etatRec = false;
+
+//DigitalOut myled(LED1);
+LSM303D lsm(PB_9, PB_8);
+
+//FONCTIONS
+void affichageValeurs() //AFFICHAGE VALEUR ACCELEROMETRE
+{
+    for(int i=0; i<20; i++)
+    {
+        BSP_LCD_DisplayStringAt(0, ligne1, (uint8_t *)buffer, CENTER_MODE);  //ACCELEROMETRE
+        //BSP_LCD_DisplayStringAt(0, ligne2, (uint8_t *)bufferM, CENTER_MODE);  //MAGNETOMETRE
+    }
+}
+void nouveauRectangle() //CREATION D'UN NOUVEAU CARRE - POSITION ALEATOIRE
+{
+    //X
+    randX=rand()%limiteMaxX;   //Valeur aléatoire entre 0 à 467
+    if(randX<=0)               //si la valeur aléatoire est égale à 0 donc hors limite de l'écran
+        randX=limiteMaxX/2;   
+    else if(randX<limiteMinX && randX>0)    //sinon si la variable est entre 0 et 12
+        randX=randX*37;        //de 0 à 444
+    //Y         
+    randY=rand()%limiteMaxY;
+    if(randX<=0)
+        randX=limiteMaxY/2;
+    else if(randX<limiteMinY && randX>0)
+        randX=randX*21; //de 0 à 252
+        
+    //ETAT
+    etatRec = true;
+}
+void parametreAffichage()
+{
+    BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
+    BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
+    BSP_LCD_SetBackColor(LCD_COLOR_LIGHTGREEN);
+    BSP_LCD_SetTextColor(LCD_COLOR_DARKCYAN);
+}
+
+int main() 
+{  
+    //DECLARATIONS VARIABLES
+        //JEU
+    float ax, ay, az, mx, my, mz;
+    uint8_t text[30];
+    int compteur = 0;
+    int compteurCoup = 0;
+    clock_t t1, t2;
+    float temps;
+    float memoireMeilleurScore = 10000.0;
+        //ECRAN TACTIL
+    TS_StateTypeDef TS_State;
+    uint16_t x, y;
+    uint8_t status;
+    uint8_t idx;
+    uint8_t cleared = 0;
+    uint8_t prev_nb_touches = 0;
+    
+    //INITIALISATION INTERFACE
+    BSP_LCD_Init();
+    BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
+    BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
+    parametreAffichage();
+    BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Projet Interfacage", CENTER_MODE);
+    HAL_Delay(2000);
+    
+    //INITIALISATION TACTILE
+    status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
+    if (status != TS_OK) {
+        BSP_LCD_Clear(LCD_COLOR_RED);
+        BSP_LCD_SetBackColor(LCD_COLOR_RED);
+        BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
+        BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
+        HAL_Delay(2000);
+    } /*else {
+        BSP_LCD_Clear(LCD_COLOR_GREEN);
+        BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
+        BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
+        HAL_Delay(2000);
+    }*/
+    
+    //TOUCHE DEBUT JEU
+    do { 
+        parametreAffichage();
+        for(int i=0; i<20; i++)
+        { 
+            BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Appuyer pour commencer", CENTER_MODE);
+        }
+        BSP_TS_GetState(&TS_State);
+        if (TS_State.touchDetected) 
+        {
+            // Clear lines corresponding to old touches coordinates
+            if (TS_State.touchDetected < prev_nb_touches) 
+            {
+                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) 
+                {
+                    BSP_LCD_ClearStringLine(idx);
+                }
+            }
+            prev_nb_touches = TS_State.touchDetected;
+
+            cleared = 0;
+
+            for (idx = 0; idx < TS_State.touchDetected; idx++) 
+            {
+                x = TS_State.touchX[idx];
+                y = TS_State.touchY[idx];
+                //sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
+                //BSP_LCD_DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
+                
+                if(x>limiteMinX && x<limiteMaxX && y>limiteMinY && y<limiteMaxY)
+                {
+                    //JEU
+                    compteurCoup = 0;
+                    t1 = clock(); //TEMPS DEBUT PARTIE
+                    BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
+                    while(1){
+                        //LECTURE VALEURS
+                        lsm.read(&ax, &ay, &az, &mx, &my, &mz);
+        
+                        //AFFICHAGE SUR LE BUFFER
+                        sprintf(buffer, "%f  %f  %f", ax, ay, az);  //ACCELEROMETRE
+                        //sprintf(bufferM, "%f  %f  %f", mx, my, mz); //MAGNETOMETRE
+                        
+                        //PARAMETRE AFFICHAGE
+                        //BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
+                        BSP_LCD_SetFont(&Font12); //BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
+                        BSP_LCD_SetBackColor(LCD_COLOR_LIGHTGREEN);
+                        BSP_LCD_SetTextColor(LCD_COLOR_DARKCYAN);
+                        
+                        
+                        //AFFICHAGE VALEURS 
+                        //affichageValeurs();
+                        
+                        //LIMITES TERRAIN
+                        //si le cercle du joueur sort du terrain, il restera à la limite
+                        if(ax < limiteMinX)
+                            ax = limiteMinX; 
+                        if(ay < limiteMinY)
+                            ay = limiteMinY; 
+                        if(ax > limiteMaxX)
+                            ax = limiteMaxX; 
+                        if(ay > limiteMaxY)
+                            ay = limiteMaxY; 
+                        
+                        //AFFICHE CERCLE JOUEUR
+                        BSP_LCD_SetTextColor(LCD_COLOR_RED);
+                        for(int i=0; i<20; i++) 
+                        {   
+                            BSP_LCD_FillCircle(ax, ay, 10);
+                        }   
+                        //HAL_Delay(25);
+        
+                        //VERIFICATION ETAT PRECEDENT
+                        if(etatRec==false)
+                        {
+                            nouveauRectangle();
+                            compteurCoup++;
+                        }
+                        
+                        //AFFICHAGE VALEUR RECTANGLE
+                        sprintf((char*)text, "x=%f y=%f ", randX, randY);   
+                        //BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)&text, LEFT_MODE);
+                        
+                        
+                        //AFFICHAGE RECTANGLE
+                        BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
+                        for(int i=0; i<20; i++)
+                            BSP_LCD_FillRect(randX, randY, 15, 15);
+        
+        
+                        //VERIFICATION ETAT
+                        if(ax>randX-10 && ax<randX+10 && ay>randY-10 && ay<randY+10)
+                        {
+                            etatRec=false;
+                        }
+                        
+                        //COMPTEUR DE COUP
+                        if(compteurCoup>nbrCoup)
+                            break; //sortir de la boucle
+        
+                    }//FIN WHILE JEU
+                    t2 = clock();   //temps à la fin du jeu
+                    temps = (float)(t2-t1)/CLOCKS_PER_SEC; //calcul du temps de la partie
+                    compteur++;
+                    parametreAffichage();
+                    
+                    if(compteur == 1) //s'il s'agit de la 1ère partie
+                    {
+                        memoireMeilleurScore = temps;
+                        sprintf((char*)text, "Score : %f s", temps);   
+                        BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)&text, CENTER_MODE);
+                    }
+                    else //sinon
+                    {
+                        if(temps < memoireMeilleurScore)
+                        {
+                            memoireMeilleurScore = temps;
+                            sprintf((char*)text, "Bravo ! Score battu");   
+                            BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text, CENTER_MODE);
+                            sprintf((char*)text, "Score : %f s", temps);   
+                            BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text, CENTER_MODE);
+                        }
+                        else
+                        {
+                            sprintf((char*)text, "Score : %f s", temps);   
+                            BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text, CENTER_MODE);
+                            BSP_LCD_SetFont(&Font16);
+                            sprintf((char*)text, "  Meilleur score : %f s", memoireMeilleurScore);   
+                            BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text, LEFT_MODE);
+                        }
+                    }
+                    HAL_Delay(8000);
+                    break;
+                }//FIN IF   
+                
+            }//FIN FOR
+            
+        }//FIN IF
+        
+    }while(1); //x<limiteMinX && x>limiteMaxX); 
+    //BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Suivant", CENTER_MODE);
+    //HAL_Delay(2000);
+} //FIN MAIN