Code

Dependencies:   mbed BSP_DISCO_F746NG LSM303D

main.cpp

Committer:
annaelle
Date:
2020-06-24
Revision:
1:5e219d4c8b33
Parent:
0:1849768f6d76

File content as of revision 1:5e219d4c8b33:

#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