Code

Dependencies:   mbed BSP_DISCO_F746NG LSM303D

Committer:
annaelle
Date:
Wed Jun 24 16:39:40 2020 +0000
Revision:
1:5e219d4c8b33
Parent:
0:1849768f6d76
Projet

Who changed what in which revision?

UserRevisionLine numberNew contents of line
annaelle 0:1849768f6d76 1 #include "mbed.h"
annaelle 0:1849768f6d76 2 #include "LSM303D.h"
annaelle 0:1849768f6d76 3 #include "stm32746g_discovery_lcd.h"
annaelle 0:1849768f6d76 4 #include "stm32746g_discovery_ts.h"
annaelle 0:1849768f6d76 5 #include "time.h"
annaelle 0:1849768f6d76 6
annaelle 0:1849768f6d76 7 //LIGNES D'ECRITURE
annaelle 0:1849768f6d76 8 #define ligne1 75
annaelle 0:1849768f6d76 9 #define ligne2 175
annaelle 0:1849768f6d76 10 #define ligneMilieu 125
annaelle 0:1849768f6d76 11 //LIMITE ECRAN PAR RAPPORT AU CENTRE DU CERCLE DU JOUEUR
annaelle 0:1849768f6d76 12 #define limiteMinX 12
annaelle 0:1849768f6d76 13 #define limiteMinY 12
annaelle 0:1849768f6d76 14 #define limiteMaxX 467
annaelle 0:1849768f6d76 15 #define limiteMaxY 259
annaelle 0:1849768f6d76 16 //PARAMETRE JEU
annaelle 0:1849768f6d76 17 #define nbrCoup 10
annaelle 0:1849768f6d76 18
annaelle 0:1849768f6d76 19 //VARIABLES GLOBALES
annaelle 0:1849768f6d76 20 char buffer[100];
annaelle 0:1849768f6d76 21 char bufferM[100];
annaelle 0:1849768f6d76 22 float randX, randY;
annaelle 0:1849768f6d76 23 float randXmemoire, randYmemoire;
annaelle 0:1849768f6d76 24 bool etatRec = false;
annaelle 0:1849768f6d76 25
annaelle 0:1849768f6d76 26 //DigitalOut myled(LED1);
annaelle 0:1849768f6d76 27 LSM303D lsm(PB_9, PB_8);
annaelle 0:1849768f6d76 28
annaelle 0:1849768f6d76 29 //FONCTIONS
annaelle 0:1849768f6d76 30 void affichageValeurs() //AFFICHAGE VALEUR ACCELEROMETRE
annaelle 0:1849768f6d76 31 {
annaelle 0:1849768f6d76 32 for(int i=0; i<20; i++)
annaelle 0:1849768f6d76 33 {
annaelle 0:1849768f6d76 34 BSP_LCD_DisplayStringAt(0, ligne1, (uint8_t *)buffer, CENTER_MODE); //ACCELEROMETRE
annaelle 0:1849768f6d76 35 //BSP_LCD_DisplayStringAt(0, ligne2, (uint8_t *)bufferM, CENTER_MODE); //MAGNETOMETRE
annaelle 0:1849768f6d76 36 }
annaelle 0:1849768f6d76 37 }
annaelle 0:1849768f6d76 38 void nouveauRectangle() //CREATION D'UN NOUVEAU CARRE - POSITION ALEATOIRE
annaelle 0:1849768f6d76 39 {
annaelle 0:1849768f6d76 40 //X
annaelle 0:1849768f6d76 41 randX=rand()%limiteMaxX; //Valeur aléatoire entre 0 à 467
annaelle 0:1849768f6d76 42 if(randX<=0) //si la valeur aléatoire est égale à 0 donc hors limite de l'écran
annaelle 0:1849768f6d76 43 randX=limiteMaxX/2;
annaelle 0:1849768f6d76 44 else if(randX<limiteMinX && randX>0) //sinon si la variable est entre 0 et 12
annaelle 0:1849768f6d76 45 randX=randX*37; //de 0 à 444
annaelle 0:1849768f6d76 46 //Y
annaelle 0:1849768f6d76 47 randY=rand()%limiteMaxY;
annaelle 0:1849768f6d76 48 if(randX<=0)
annaelle 0:1849768f6d76 49 randX=limiteMaxY/2;
annaelle 0:1849768f6d76 50 else if(randX<limiteMinY && randX>0)
annaelle 0:1849768f6d76 51 randX=randX*21; //de 0 à 252
annaelle 0:1849768f6d76 52
annaelle 0:1849768f6d76 53 //ETAT
annaelle 0:1849768f6d76 54 etatRec = true;
annaelle 0:1849768f6d76 55 }
annaelle 0:1849768f6d76 56 void parametreAffichage()
annaelle 0:1849768f6d76 57 {
annaelle 0:1849768f6d76 58 BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
annaelle 0:1849768f6d76 59 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
annaelle 0:1849768f6d76 60 BSP_LCD_SetBackColor(LCD_COLOR_LIGHTGREEN);
annaelle 0:1849768f6d76 61 BSP_LCD_SetTextColor(LCD_COLOR_DARKCYAN);
annaelle 0:1849768f6d76 62 }
annaelle 0:1849768f6d76 63
annaelle 0:1849768f6d76 64 int main()
annaelle 0:1849768f6d76 65 {
annaelle 0:1849768f6d76 66 //DECLARATIONS VARIABLES
annaelle 0:1849768f6d76 67 //JEU
annaelle 0:1849768f6d76 68 float ax, ay, az, mx, my, mz;
annaelle 0:1849768f6d76 69 uint8_t text[30];
annaelle 0:1849768f6d76 70 int compteur = 0;
annaelle 0:1849768f6d76 71 int compteurCoup = 0;
annaelle 0:1849768f6d76 72 clock_t t1, t2;
annaelle 0:1849768f6d76 73 float temps;
annaelle 0:1849768f6d76 74 float memoireMeilleurScore = 10000.0;
annaelle 0:1849768f6d76 75 //ECRAN TACTIL
annaelle 0:1849768f6d76 76 TS_StateTypeDef TS_State;
annaelle 0:1849768f6d76 77 uint16_t x, y;
annaelle 0:1849768f6d76 78 uint8_t status;
annaelle 0:1849768f6d76 79 uint8_t idx;
annaelle 0:1849768f6d76 80 uint8_t cleared = 0;
annaelle 0:1849768f6d76 81 uint8_t prev_nb_touches = 0;
annaelle 0:1849768f6d76 82
annaelle 0:1849768f6d76 83 //INITIALISATION INTERFACE
annaelle 0:1849768f6d76 84 BSP_LCD_Init();
annaelle 0:1849768f6d76 85 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
annaelle 0:1849768f6d76 86 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
annaelle 0:1849768f6d76 87 parametreAffichage();
annaelle 0:1849768f6d76 88 BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Projet Interfacage", CENTER_MODE);
annaelle 0:1849768f6d76 89 HAL_Delay(2000);
annaelle 0:1849768f6d76 90
annaelle 0:1849768f6d76 91 //INITIALISATION TACTILE
annaelle 0:1849768f6d76 92 status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
annaelle 0:1849768f6d76 93 if (status != TS_OK) {
annaelle 0:1849768f6d76 94 BSP_LCD_Clear(LCD_COLOR_RED);
annaelle 0:1849768f6d76 95 BSP_LCD_SetBackColor(LCD_COLOR_RED);
annaelle 0:1849768f6d76 96 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
annaelle 0:1849768f6d76 97 BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
annaelle 0:1849768f6d76 98 HAL_Delay(2000);
annaelle 0:1849768f6d76 99 } /*else {
annaelle 0:1849768f6d76 100 BSP_LCD_Clear(LCD_COLOR_GREEN);
annaelle 0:1849768f6d76 101 BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
annaelle 0:1849768f6d76 102 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
annaelle 0:1849768f6d76 103 BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
annaelle 0:1849768f6d76 104 HAL_Delay(2000);
annaelle 0:1849768f6d76 105 }*/
annaelle 0:1849768f6d76 106
annaelle 0:1849768f6d76 107 //TOUCHE DEBUT JEU
annaelle 0:1849768f6d76 108 do {
annaelle 0:1849768f6d76 109 parametreAffichage();
annaelle 0:1849768f6d76 110 for(int i=0; i<20; i++)
annaelle 0:1849768f6d76 111 {
annaelle 0:1849768f6d76 112 BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Appuyer pour commencer", CENTER_MODE);
annaelle 0:1849768f6d76 113 }
annaelle 0:1849768f6d76 114 BSP_TS_GetState(&TS_State);
annaelle 0:1849768f6d76 115 if (TS_State.touchDetected)
annaelle 0:1849768f6d76 116 {
annaelle 0:1849768f6d76 117 // Clear lines corresponding to old touches coordinates
annaelle 0:1849768f6d76 118 if (TS_State.touchDetected < prev_nb_touches)
annaelle 0:1849768f6d76 119 {
annaelle 0:1849768f6d76 120 for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++)
annaelle 0:1849768f6d76 121 {
annaelle 0:1849768f6d76 122 BSP_LCD_ClearStringLine(idx);
annaelle 0:1849768f6d76 123 }
annaelle 0:1849768f6d76 124 }
annaelle 0:1849768f6d76 125 prev_nb_touches = TS_State.touchDetected;
annaelle 0:1849768f6d76 126
annaelle 0:1849768f6d76 127 cleared = 0;
annaelle 0:1849768f6d76 128
annaelle 0:1849768f6d76 129 for (idx = 0; idx < TS_State.touchDetected; idx++)
annaelle 0:1849768f6d76 130 {
annaelle 0:1849768f6d76 131 x = TS_State.touchX[idx];
annaelle 0:1849768f6d76 132 y = TS_State.touchY[idx];
annaelle 0:1849768f6d76 133 //sprintf((char*)text, "Touch %d: x=%d y=%d ", idx+1, x, y);
annaelle 0:1849768f6d76 134 //BSP_LCD_DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
annaelle 0:1849768f6d76 135
annaelle 0:1849768f6d76 136 if(x>limiteMinX && x<limiteMaxX && y>limiteMinY && y<limiteMaxY)
annaelle 0:1849768f6d76 137 {
annaelle 0:1849768f6d76 138 //JEU
annaelle 0:1849768f6d76 139 compteurCoup = 0;
annaelle 0:1849768f6d76 140 t1 = clock(); //TEMPS DEBUT PARTIE
annaelle 0:1849768f6d76 141 BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
annaelle 0:1849768f6d76 142 while(1){
annaelle 0:1849768f6d76 143 //LECTURE VALEURS
annaelle 0:1849768f6d76 144 lsm.read(&ax, &ay, &az, &mx, &my, &mz);
annaelle 0:1849768f6d76 145
annaelle 0:1849768f6d76 146 //AFFICHAGE SUR LE BUFFER
annaelle 0:1849768f6d76 147 sprintf(buffer, "%f %f %f", ax, ay, az); //ACCELEROMETRE
annaelle 0:1849768f6d76 148 //sprintf(bufferM, "%f %f %f", mx, my, mz); //MAGNETOMETRE
annaelle 0:1849768f6d76 149
annaelle 0:1849768f6d76 150 //PARAMETRE AFFICHAGE
annaelle 0:1849768f6d76 151 //BSP_LCD_Clear(LCD_COLOR_LIGHTGREEN);
annaelle 0:1849768f6d76 152 BSP_LCD_SetFont(&Font12); //BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
annaelle 0:1849768f6d76 153 BSP_LCD_SetBackColor(LCD_COLOR_LIGHTGREEN);
annaelle 0:1849768f6d76 154 BSP_LCD_SetTextColor(LCD_COLOR_DARKCYAN);
annaelle 0:1849768f6d76 155
annaelle 0:1849768f6d76 156
annaelle 0:1849768f6d76 157 //AFFICHAGE VALEURS
annaelle 0:1849768f6d76 158 //affichageValeurs();
annaelle 0:1849768f6d76 159
annaelle 0:1849768f6d76 160 //LIMITES TERRAIN
annaelle 0:1849768f6d76 161 //si le cercle du joueur sort du terrain, il restera à la limite
annaelle 0:1849768f6d76 162 if(ax < limiteMinX)
annaelle 0:1849768f6d76 163 ax = limiteMinX;
annaelle 0:1849768f6d76 164 if(ay < limiteMinY)
annaelle 0:1849768f6d76 165 ay = limiteMinY;
annaelle 0:1849768f6d76 166 if(ax > limiteMaxX)
annaelle 0:1849768f6d76 167 ax = limiteMaxX;
annaelle 0:1849768f6d76 168 if(ay > limiteMaxY)
annaelle 0:1849768f6d76 169 ay = limiteMaxY;
annaelle 0:1849768f6d76 170
annaelle 0:1849768f6d76 171 //AFFICHE CERCLE JOUEUR
annaelle 0:1849768f6d76 172 BSP_LCD_SetTextColor(LCD_COLOR_RED);
annaelle 0:1849768f6d76 173 for(int i=0; i<20; i++)
annaelle 0:1849768f6d76 174 {
annaelle 0:1849768f6d76 175 BSP_LCD_FillCircle(ax, ay, 10);
annaelle 0:1849768f6d76 176 }
annaelle 0:1849768f6d76 177 //HAL_Delay(25);
annaelle 0:1849768f6d76 178
annaelle 0:1849768f6d76 179 //VERIFICATION ETAT PRECEDENT
annaelle 0:1849768f6d76 180 if(etatRec==false)
annaelle 0:1849768f6d76 181 {
annaelle 0:1849768f6d76 182 nouveauRectangle();
annaelle 0:1849768f6d76 183 compteurCoup++;
annaelle 0:1849768f6d76 184 }
annaelle 0:1849768f6d76 185
annaelle 0:1849768f6d76 186 //AFFICHAGE VALEUR RECTANGLE
annaelle 0:1849768f6d76 187 sprintf((char*)text, "x=%f y=%f ", randX, randY);
annaelle 0:1849768f6d76 188 //BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)&text, LEFT_MODE);
annaelle 0:1849768f6d76 189
annaelle 0:1849768f6d76 190
annaelle 0:1849768f6d76 191 //AFFICHAGE RECTANGLE
annaelle 0:1849768f6d76 192 BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
annaelle 0:1849768f6d76 193 for(int i=0; i<20; i++)
annaelle 0:1849768f6d76 194 BSP_LCD_FillRect(randX, randY, 15, 15);
annaelle 0:1849768f6d76 195
annaelle 0:1849768f6d76 196
annaelle 0:1849768f6d76 197 //VERIFICATION ETAT
annaelle 0:1849768f6d76 198 if(ax>randX-10 && ax<randX+10 && ay>randY-10 && ay<randY+10)
annaelle 0:1849768f6d76 199 {
annaelle 0:1849768f6d76 200 etatRec=false;
annaelle 0:1849768f6d76 201 }
annaelle 0:1849768f6d76 202
annaelle 0:1849768f6d76 203 //COMPTEUR DE COUP
annaelle 0:1849768f6d76 204 if(compteurCoup>nbrCoup)
annaelle 0:1849768f6d76 205 break; //sortir de la boucle
annaelle 0:1849768f6d76 206
annaelle 0:1849768f6d76 207 }//FIN WHILE JEU
annaelle 0:1849768f6d76 208 t2 = clock(); //temps à la fin du jeu
annaelle 0:1849768f6d76 209 temps = (float)(t2-t1)/CLOCKS_PER_SEC; //calcul du temps de la partie
annaelle 0:1849768f6d76 210 compteur++;
annaelle 0:1849768f6d76 211 parametreAffichage();
annaelle 0:1849768f6d76 212
annaelle 0:1849768f6d76 213 if(compteur == 1) //s'il s'agit de la 1ère partie
annaelle 0:1849768f6d76 214 {
annaelle 0:1849768f6d76 215 memoireMeilleurScore = temps;
annaelle 0:1849768f6d76 216 sprintf((char*)text, "Score : %f s", temps);
annaelle 0:1849768f6d76 217 BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)&text, CENTER_MODE);
annaelle 0:1849768f6d76 218 }
annaelle 0:1849768f6d76 219 else //sinon
annaelle 0:1849768f6d76 220 {
annaelle 0:1849768f6d76 221 if(temps < memoireMeilleurScore)
annaelle 0:1849768f6d76 222 {
annaelle 0:1849768f6d76 223 memoireMeilleurScore = temps;
annaelle 0:1849768f6d76 224 sprintf((char*)text, "Bravo ! Score battu");
annaelle 0:1849768f6d76 225 BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text, CENTER_MODE);
annaelle 0:1849768f6d76 226 sprintf((char*)text, "Score : %f s", temps);
annaelle 0:1849768f6d76 227 BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text, CENTER_MODE);
annaelle 0:1849768f6d76 228 }
annaelle 0:1849768f6d76 229 else
annaelle 0:1849768f6d76 230 {
annaelle 0:1849768f6d76 231 sprintf((char*)text, "Score : %f s", temps);
annaelle 0:1849768f6d76 232 BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text, CENTER_MODE);
annaelle 0:1849768f6d76 233 BSP_LCD_SetFont(&Font16);
annaelle 0:1849768f6d76 234 sprintf((char*)text, " Meilleur score : %f s", memoireMeilleurScore);
annaelle 0:1849768f6d76 235 BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text, LEFT_MODE);
annaelle 0:1849768f6d76 236 }
annaelle 0:1849768f6d76 237 }
annaelle 0:1849768f6d76 238 HAL_Delay(8000);
annaelle 0:1849768f6d76 239 break;
annaelle 0:1849768f6d76 240 }//FIN IF
annaelle 0:1849768f6d76 241
annaelle 0:1849768f6d76 242 }//FIN FOR
annaelle 0:1849768f6d76 243
annaelle 0:1849768f6d76 244 }//FIN IF
annaelle 0:1849768f6d76 245
annaelle 0:1849768f6d76 246 }while(1); //x<limiteMinX && x>limiteMaxX);
annaelle 0:1849768f6d76 247 //BSP_LCD_DisplayStringAt(0, ligneMilieu, (uint8_t *)"Suivant", CENTER_MODE);
annaelle 0:1849768f6d76 248 //HAL_Delay(2000);
annaelle 0:1849768f6d76 249 } //FIN MAIN