
Code
Dependencies: mbed BSP_DISCO_F746NG LSM303D
main.cpp@1:5e219d4c8b33, 2020-06-24 (annotated)
- Committer:
- annaelle
- Date:
- Wed Jun 24 16:39:40 2020 +0000
- Revision:
- 1:5e219d4c8b33
- Parent:
- 0:1849768f6d76
Projet
Who changed what in which revision?
User | Revision | Line number | New 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 |