You will be able to control a yellow ball through a level like a labyrinth

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG MMA7660FC TS_DISCO_F746NG mbed

Committer:
IUT_Nicolas_C
Date:
Tue Jun 12 14:46:18 2018 +0000
Revision:
1:f41e3d62e7b2
Parent:
0:9167afeead2e
This is the final version of the "La-bille-rinthe" where you can control a little yellow ball through a level with an accelerometer sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IUT_Nicolas_C 0:9167afeead2e 1 #include "mbed.h"
IUT_Nicolas_C 1:f41e3d62e7b2 2 #include "TS_DISCO_F746NG.h"
IUT_Nicolas_C 0:9167afeead2e 3 #include "LCD_DISCO_F746NG.h"
IUT_Nicolas_C 0:9167afeead2e 4 #include <MMA7660FC.h>
IUT_Nicolas_C 0:9167afeead2e 5
IUT_Nicolas_C 1:f41e3d62e7b2 6 #define SLAVE_ADRESS 0x4c
IUT_Nicolas_C 1:f41e3d62e7b2 7 //---USER---//
IUT_Nicolas_C 1:f41e3d62e7b2 8 int level = 1; //Actual Level
IUT_Nicolas_C 1:f41e3d62e7b2 9 int old_charac[2] = {0,0}; //Old Position
IUT_Nicolas_C 1:f41e3d62e7b2 10 int charac[2] = {0,0}; //Actual Position on the grid
IUT_Nicolas_C 1:f41e3d62e7b2 11 float origin[3] = {0.0,0.0,0.0}; //Sensor Position
IUT_Nicolas_C 1:f41e3d62e7b2 12 bool drawn = 0; //Is Character drawn ?
IUT_Nicolas_C 1:f41e3d62e7b2 13 //---BUTTONS---//
IUT_Nicolas_C 1:f41e3d62e7b2 14 int btnNext[4] = {415, 35,465, 85};//Position of the buttons
IUT_Nicolas_C 1:f41e3d62e7b2 15 int btnPrev[4] = {415,115,465,165};//
IUT_Nicolas_C 1:f41e3d62e7b2 16 int btnReset[4] = {415,207,465,257};//
IUT_Nicolas_C 1:f41e3d62e7b2 17 //---labyrinth---//
IUT_Nicolas_C 1:f41e3d62e7b2 18 //Size : 16 * 10
IUT_Nicolas_C 1:f41e3d62e7b2 19 //Square Size : 25 * 25
IUT_Nicolas_C 1:f41e3d62e7b2 20 bool labyrinth1[160] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 21 1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 22 1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 23 0,0,1,1,1,0,1,1,1,0,1,0,1,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 24 1,0,1,0,0,0,0,0,1,0,1,0,0,1,1,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 25 1,0,0,0,1,0,1,0,0,0,1,1,0,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 26 1,1,1,0,1,0,1,0,1,1,0,0,0,1,0,0 ,
IUT_Nicolas_C 1:f41e3d62e7b2 27 1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 28 1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 29 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
IUT_Nicolas_C 1:f41e3d62e7b2 30 };
IUT_Nicolas_C 1:f41e3d62e7b2 31 bool labyrinth2[160] = { 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 32 1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 33 1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 34 1,0,1,0,1,0,0,0,1,0,1,1,1,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 35 1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 36 1,0,1,1,1,0,0,0,0,0,1,1,0,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 37 1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 38 1,0,1,0,0,0,0,0,1,0,1,0,1,1,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 39 1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1 ,
IUT_Nicolas_C 1:f41e3d62e7b2 40 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
IUT_Nicolas_C 1:f41e3d62e7b2 41 };
IUT_Nicolas_C 0:9167afeead2e 42
IUT_Nicolas_C 1:f41e3d62e7b2 43
IUT_Nicolas_C 1:f41e3d62e7b2 44 bool* labyrinths[2] = {labyrinth1, labyrinth2}; // All labyrinths in one tab
IUT_Nicolas_C 0:9167afeead2e 45 //---PIN SETUP
IUT_Nicolas_C 1:f41e3d62e7b2 46 MMA7660FC sensor(PB_9,PB_8,SLAVE_ADRESS<<1); // Init Sensor
IUT_Nicolas_C 1:f41e3d62e7b2 47 LCD_DISCO_F746NG lcd; // Init LCD
IUT_Nicolas_C 1:f41e3d62e7b2 48 TS_DISCO_F746NG ts; // Init TouchScreen
IUT_Nicolas_C 0:9167afeead2e 49
IUT_Nicolas_C 1:f41e3d62e7b2 50 //---DECLARATION_FUNCTIONS
IUT_Nicolas_C 1:f41e3d62e7b2 51 void checkPos(int,int);
IUT_Nicolas_C 0:9167afeead2e 52 void displayAcc(float,float,float);
IUT_Nicolas_C 1:f41e3d62e7b2 53 void displayCharPos();
IUT_Nicolas_C 0:9167afeead2e 54 void displayPos(int,int,int);
IUT_Nicolas_C 0:9167afeead2e 55 void displayOrientation(const char*);
IUT_Nicolas_C 1:f41e3d62e7b2 56 void drawChar();
IUT_Nicolas_C 0:9167afeead2e 57 void drawRect(int,int,int,int);
IUT_Nicolas_C 1:f41e3d62e7b2 58 void drawLabyrinth(int);
IUT_Nicolas_C 1:f41e3d62e7b2 59 void drawLevel(bool[]);
IUT_Nicolas_C 1:f41e3d62e7b2 60 void drawOptions();
IUT_Nicolas_C 0:9167afeead2e 61 void drawUi();
IUT_Nicolas_C 0:9167afeead2e 62 void drawUiButtons();
IUT_Nicolas_C 0:9167afeead2e 63 void drawUiStructure();
IUT_Nicolas_C 1:f41e3d62e7b2 64 void initLCD();
IUT_Nicolas_C 1:f41e3d62e7b2 65 void updateChar(float,float,float,bool[]);
IUT_Nicolas_C 1:f41e3d62e7b2 66 void resetPos();
IUT_Nicolas_C 1:f41e3d62e7b2 67 void nextLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 68 void prevLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 69 void isWinning(int);
IUT_Nicolas_C 0:9167afeead2e 70
IUT_Nicolas_C 1:f41e3d62e7b2 71 //---INITIALISATION_FUNCTIONS
IUT_Nicolas_C 1:f41e3d62e7b2 72 /** Function checkPos
IUT_Nicolas_C 1:f41e3d62e7b2 73 * Checking actual position of a finger on the touchscreen
IUT_Nicolas_C 1:f41e3d62e7b2 74 */
IUT_Nicolas_C 1:f41e3d62e7b2 75 void checkPos(int x, int y)
IUT_Nicolas_C 1:f41e3d62e7b2 76 {
IUT_Nicolas_C 1:f41e3d62e7b2 77 if(x > btnReset[0] && y > btnReset[1] && x < btnReset[2] && y < btnReset[3]) {
IUT_Nicolas_C 1:f41e3d62e7b2 78 resetPos();
IUT_Nicolas_C 1:f41e3d62e7b2 79 } else if(x > btnNext[0] && y > btnNext[1] && x < btnNext[2] && y < btnNext[3]) {
IUT_Nicolas_C 1:f41e3d62e7b2 80 nextLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 81 } else if(x > btnPrev[0] && y > btnPrev[1] && x < btnPrev[2] && y < btnPrev[3]) {
IUT_Nicolas_C 1:f41e3d62e7b2 82 prevLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 83 }
IUT_Nicolas_C 1:f41e3d62e7b2 84 }
IUT_Nicolas_C 1:f41e3d62e7b2 85 /** Function displayAcc
IUT_Nicolas_C 1:f41e3d62e7b2 86 * Displays the actual acceleration of the sensor (not used)
IUT_Nicolas_C 1:f41e3d62e7b2 87 */
IUT_Nicolas_C 1:f41e3d62e7b2 88 void displayAcc(float x, float y, float z)
IUT_Nicolas_C 1:f41e3d62e7b2 89 {
IUT_Nicolas_C 1:f41e3d62e7b2 90 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 0:9167afeead2e 91 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 0:9167afeead2e 92 char string[50];
IUT_Nicolas_C 0:9167afeead2e 93 sprintf(string,"AX = %3.3f",x);
IUT_Nicolas_C 0:9167afeead2e 94 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 0:9167afeead2e 95 sprintf(string,"AY = %3.3f",y);
IUT_Nicolas_C 0:9167afeead2e 96 lcd.DisplayStringAt(0, LINE(6), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 0:9167afeead2e 97 sprintf(string,"AZ = %3.3f",z);
IUT_Nicolas_C 0:9167afeead2e 98 lcd.DisplayStringAt(0, LINE(7), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 99 lcd.SetTextColor(color);
IUT_Nicolas_C 0:9167afeead2e 100 }
IUT_Nicolas_C 1:f41e3d62e7b2 101 /** Function displayCharPos
IUT_Nicolas_C 1:f41e3d62e7b2 102 * Displays the actual position of the character (not used)
IUT_Nicolas_C 1:f41e3d62e7b2 103 */
IUT_Nicolas_C 1:f41e3d62e7b2 104 void displayCharPos()
IUT_Nicolas_C 1:f41e3d62e7b2 105 {
IUT_Nicolas_C 1:f41e3d62e7b2 106 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 107 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 108 char string[50];
IUT_Nicolas_C 1:f41e3d62e7b2 109 sprintf(string,"X = %3d",charac[0]);
IUT_Nicolas_C 1:f41e3d62e7b2 110 lcd.DisplayStringAt(0, LINE(8), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 111 sprintf(string,"Y = %3d",charac[1]);
IUT_Nicolas_C 1:f41e3d62e7b2 112 lcd.DisplayStringAt(0, LINE(9), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 113 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 114 }
IUT_Nicolas_C 1:f41e3d62e7b2 115 /** Function displayOri
IUT_Nicolas_C 1:f41e3d62e7b2 116 * Displays the origin acceleration of the sensor (not used)
IUT_Nicolas_C 1:f41e3d62e7b2 117 */
IUT_Nicolas_C 1:f41e3d62e7b2 118 void displayOri()
IUT_Nicolas_C 1:f41e3d62e7b2 119 {
IUT_Nicolas_C 1:f41e3d62e7b2 120 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 121 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 122 char string[50];
IUT_Nicolas_C 1:f41e3d62e7b2 123 sprintf(string,"AX = %3.3f",origin[0]);
IUT_Nicolas_C 1:f41e3d62e7b2 124 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 125 sprintf(string,"AY = %3.3f",origin[1]);
IUT_Nicolas_C 1:f41e3d62e7b2 126 lcd.DisplayStringAt(0, LINE(2), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 127 sprintf(string,"AZ = %3.3f",origin[2]);
IUT_Nicolas_C 1:f41e3d62e7b2 128 lcd.DisplayStringAt(0, LINE(3), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 129 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 130 }
IUT_Nicolas_C 1:f41e3d62e7b2 131 /** Function displayOrientation
IUT_Nicolas_C 1:f41e3d62e7b2 132 * Displays the actual orientation of the sensor (not used)
IUT_Nicolas_C 1:f41e3d62e7b2 133 */
IUT_Nicolas_C 1:f41e3d62e7b2 134 void displayOrientation(const char *o)
IUT_Nicolas_C 1:f41e3d62e7b2 135 {
IUT_Nicolas_C 1:f41e3d62e7b2 136 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 137 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 0:9167afeead2e 138 char string[50];
IUT_Nicolas_C 0:9167afeead2e 139 sprintf(string,"O = %s",o);
IUT_Nicolas_C 0:9167afeead2e 140 lcd.DisplayStringAt(0, LINE(4), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 141 lcd.SetTextColor(color);
IUT_Nicolas_C 0:9167afeead2e 142 }
IUT_Nicolas_C 1:f41e3d62e7b2 143 /** Function displayPos
IUT_Nicolas_C 1:f41e3d62e7b2 144 * Displays the actual position of the sensor (not used)
IUT_Nicolas_C 1:f41e3d62e7b2 145 */
IUT_Nicolas_C 1:f41e3d62e7b2 146 void displayPos(int x, int y, int z)
IUT_Nicolas_C 1:f41e3d62e7b2 147 {
IUT_Nicolas_C 1:f41e3d62e7b2 148 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 149 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 0:9167afeead2e 150 char string[50];
IUT_Nicolas_C 0:9167afeead2e 151 sprintf(string,"X = %03d",x);
IUT_Nicolas_C 0:9167afeead2e 152 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 0:9167afeead2e 153 sprintf(string,"Y = %03d",y);
IUT_Nicolas_C 0:9167afeead2e 154 lcd.DisplayStringAt(0, LINE(2), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 0:9167afeead2e 155 sprintf(string,"Z = %03d",z);
IUT_Nicolas_C 0:9167afeead2e 156 lcd.DisplayStringAt(0, LINE(3), (uint8_t *)string, CENTER_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 157 lcd.SetTextColor(color);
IUT_Nicolas_C 0:9167afeead2e 158 }
IUT_Nicolas_C 1:f41e3d62e7b2 159 /** Function drawChar
IUT_Nicolas_C 1:f41e3d62e7b2 160 * Draws the character on the labyrinth
IUT_Nicolas_C 1:f41e3d62e7b2 161 */
IUT_Nicolas_C 1:f41e3d62e7b2 162 void drawChar()
IUT_Nicolas_C 1:f41e3d62e7b2 163 {
IUT_Nicolas_C 1:f41e3d62e7b2 164 if((old_charac[0] != charac[0] || old_charac[1] != charac[1])||(drawn == 0)) {
IUT_Nicolas_C 1:f41e3d62e7b2 165 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 166 lcd.SetTextColor(LCD_COLOR_WHITE);
IUT_Nicolas_C 1:f41e3d62e7b2 167 lcd.FillCircle(old_charac[0]*25+11+12,old_charac[1]*25+10+12,11);
IUT_Nicolas_C 1:f41e3d62e7b2 168 lcd.SetTextColor(LCD_COLOR_YELLOW);
IUT_Nicolas_C 1:f41e3d62e7b2 169 lcd.FillCircle(charac[0]*25+11+12,charac[1]*25+10+12,11);
IUT_Nicolas_C 1:f41e3d62e7b2 170 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 171 old_charac[0] = charac[0];
IUT_Nicolas_C 1:f41e3d62e7b2 172 old_charac[1] = charac[1];
IUT_Nicolas_C 1:f41e3d62e7b2 173 drawn = 1;
IUT_Nicolas_C 1:f41e3d62e7b2 174 }
IUT_Nicolas_C 1:f41e3d62e7b2 175 }
IUT_Nicolas_C 1:f41e3d62e7b2 176 /** Function drawLabyrinth
IUT_Nicolas_C 1:f41e3d62e7b2 177 * Sets the position of the character and calls drawLevel()
IUT_Nicolas_C 1:f41e3d62e7b2 178 */
IUT_Nicolas_C 1:f41e3d62e7b2 179 void drawLabyrinth(int lvl)
IUT_Nicolas_C 1:f41e3d62e7b2 180 {
IUT_Nicolas_C 1:f41e3d62e7b2 181 switch(lvl) {
IUT_Nicolas_C 1:f41e3d62e7b2 182 case 1:
IUT_Nicolas_C 1:f41e3d62e7b2 183 drawLevel(labyrinth1);
IUT_Nicolas_C 1:f41e3d62e7b2 184 charac[0]= 0;
IUT_Nicolas_C 1:f41e3d62e7b2 185 charac[1]= 3;
IUT_Nicolas_C 1:f41e3d62e7b2 186 old_charac[0]= 0;
IUT_Nicolas_C 1:f41e3d62e7b2 187 old_charac[1]= 3;
IUT_Nicolas_C 1:f41e3d62e7b2 188 break;
IUT_Nicolas_C 1:f41e3d62e7b2 189 case 2:
IUT_Nicolas_C 1:f41e3d62e7b2 190 drawLevel(labyrinth2);
IUT_Nicolas_C 1:f41e3d62e7b2 191 charac[0]= 7;
IUT_Nicolas_C 1:f41e3d62e7b2 192 charac[1]= 0;
IUT_Nicolas_C 1:f41e3d62e7b2 193 old_charac[0]= 7;
IUT_Nicolas_C 1:f41e3d62e7b2 194 old_charac[1]= 0;
IUT_Nicolas_C 1:f41e3d62e7b2 195 break;
IUT_Nicolas_C 1:f41e3d62e7b2 196 default:
IUT_Nicolas_C 1:f41e3d62e7b2 197 break;
IUT_Nicolas_C 1:f41e3d62e7b2 198 }
IUT_Nicolas_C 0:9167afeead2e 199 }
IUT_Nicolas_C 1:f41e3d62e7b2 200 /** Function drawLevel
IUT_Nicolas_C 1:f41e3d62e7b2 201 * Displays the labyrinth on the screen
IUT_Nicolas_C 1:f41e3d62e7b2 202 */
IUT_Nicolas_C 1:f41e3d62e7b2 203 void drawLevel(bool labyrinth[])
IUT_Nicolas_C 1:f41e3d62e7b2 204 {
IUT_Nicolas_C 1:f41e3d62e7b2 205 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 206 for(int i = 0; i<10; i++) {
IUT_Nicolas_C 1:f41e3d62e7b2 207 for(int j = 0; j<16; j++) {
IUT_Nicolas_C 1:f41e3d62e7b2 208 if(labyrinth[j+(i*16)] == 1) {
IUT_Nicolas_C 1:f41e3d62e7b2 209 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 210 lcd.FillRect(11+(j*25),10+(i*25), 25, 25);
IUT_Nicolas_C 1:f41e3d62e7b2 211 } else if(labyrinth[j+(i*16)] == 0) {
IUT_Nicolas_C 1:f41e3d62e7b2 212 lcd.SetTextColor(LCD_COLOR_WHITE);
IUT_Nicolas_C 1:f41e3d62e7b2 213 lcd.FillRect(11+(j*25),10+(i*25), 25, 25);
IUT_Nicolas_C 1:f41e3d62e7b2 214 }
IUT_Nicolas_C 1:f41e3d62e7b2 215 }
IUT_Nicolas_C 1:f41e3d62e7b2 216 }
IUT_Nicolas_C 1:f41e3d62e7b2 217 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 218 }
IUT_Nicolas_C 1:f41e3d62e7b2 219 /** Function drawLevelNbr
IUT_Nicolas_C 1:f41e3d62e7b2 220 * Displays the level number on the options menu
IUT_Nicolas_C 1:f41e3d62e7b2 221 */
IUT_Nicolas_C 1:f41e3d62e7b2 222 void drawLevelNbr()
IUT_Nicolas_C 1:f41e3d62e7b2 223 {
IUT_Nicolas_C 1:f41e3d62e7b2 224 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 225 sFONT *font = lcd.GetFont();
IUT_Nicolas_C 1:f41e3d62e7b2 226 sFONT f = Font20;
IUT_Nicolas_C 1:f41e3d62e7b2 227 char str[50];
IUT_Nicolas_C 1:f41e3d62e7b2 228
IUT_Nicolas_C 1:f41e3d62e7b2 229 lcd.SetFont(&f);
IUT_Nicolas_C 1:f41e3d62e7b2 230 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 231 sprintf(str,"%d",level);
IUT_Nicolas_C 1:f41e3d62e7b2 232 lcd.DisplayStringAt(440-8, 100-7,(uint8_t *) str, LEFT_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 233
IUT_Nicolas_C 1:f41e3d62e7b2 234 lcd.SetFont(font);
IUT_Nicolas_C 1:f41e3d62e7b2 235 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 236 }
IUT_Nicolas_C 1:f41e3d62e7b2 237 /** Function drawOptions
IUT_Nicolas_C 1:f41e3d62e7b2 238 * Displays the option tab
IUT_Nicolas_C 1:f41e3d62e7b2 239 */
IUT_Nicolas_C 1:f41e3d62e7b2 240 void drawOptions()
IUT_Nicolas_C 1:f41e3d62e7b2 241 {
IUT_Nicolas_C 1:f41e3d62e7b2 242 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 243 sFONT *font = lcd.GetFont();
IUT_Nicolas_C 1:f41e3d62e7b2 244 sFONT f = Font16;
IUT_Nicolas_C 1:f41e3d62e7b2 245 lcd.SetFont(&f);
IUT_Nicolas_C 1:f41e3d62e7b2 246 uint8_t str[6] = "Level";
IUT_Nicolas_C 1:f41e3d62e7b2 247 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 248 lcd.DisplayStringAt(414, 15, str, LEFT_MODE);
IUT_Nicolas_C 1:f41e3d62e7b2 249 lcd.SetFont(font);
IUT_Nicolas_C 1:f41e3d62e7b2 250 drawUiButtons();
IUT_Nicolas_C 1:f41e3d62e7b2 251 drawLevelNbr();
IUT_Nicolas_C 1:f41e3d62e7b2 252 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 253 }
IUT_Nicolas_C 1:f41e3d62e7b2 254 /** Function drawRect
IUT_Nicolas_C 1:f41e3d62e7b2 255 * Displays a rectangle on the screen
IUT_Nicolas_C 1:f41e3d62e7b2 256 */
IUT_Nicolas_C 1:f41e3d62e7b2 257 void drawRect(int x1, int y1, int x2, int y2)
IUT_Nicolas_C 1:f41e3d62e7b2 258 {
IUT_Nicolas_C 1:f41e3d62e7b2 259 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 260 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 261 lcd.DrawRect(x1, y1, x2-x1, y2-y1);
IUT_Nicolas_C 1:f41e3d62e7b2 262 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 263 }
IUT_Nicolas_C 1:f41e3d62e7b2 264 /** Function drawUi
IUT_Nicolas_C 1:f41e3d62e7b2 265 * Draws the UI
IUT_Nicolas_C 1:f41e3d62e7b2 266 */
IUT_Nicolas_C 1:f41e3d62e7b2 267 void drawUi()
IUT_Nicolas_C 1:f41e3d62e7b2 268 {
IUT_Nicolas_C 0:9167afeead2e 269 drawUiStructure();
IUT_Nicolas_C 1:f41e3d62e7b2 270 drawOptions();
IUT_Nicolas_C 0:9167afeead2e 271 }
IUT_Nicolas_C 1:f41e3d62e7b2 272 /** Function drawUiButtons
IUT_Nicolas_C 1:f41e3d62e7b2 273 * Draws buttons on the option tab
IUT_Nicolas_C 1:f41e3d62e7b2 274 */
IUT_Nicolas_C 1:f41e3d62e7b2 275 void drawUiButtons()
IUT_Nicolas_C 1:f41e3d62e7b2 276 {
IUT_Nicolas_C 1:f41e3d62e7b2 277 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 278 lcd.SetTextColor(LCD_COLOR_BLUE);
IUT_Nicolas_C 1:f41e3d62e7b2 279 drawRect(415, 35,465, 85); // Next Level
IUT_Nicolas_C 1:f41e3d62e7b2 280 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 281 lcd.DisplayChar(440-8,50,'N');
IUT_Nicolas_C 1:f41e3d62e7b2 282
IUT_Nicolas_C 1:f41e3d62e7b2 283 lcd.SetTextColor(LCD_COLOR_BLUE);
IUT_Nicolas_C 1:f41e3d62e7b2 284 drawRect(415,115,465,165); // Previous Level
IUT_Nicolas_C 1:f41e3d62e7b2 285 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 286 lcd.DisplayChar(440-8,130,'P');
IUT_Nicolas_C 1:f41e3d62e7b2 287
IUT_Nicolas_C 1:f41e3d62e7b2 288 lcd.SetTextColor(LCD_COLOR_BLUE);
IUT_Nicolas_C 1:f41e3d62e7b2 289 drawRect(415,207,465,257); // Reset Pos
IUT_Nicolas_C 1:f41e3d62e7b2 290 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 291 lcd.DisplayChar(440-8,232-10,'R');
IUT_Nicolas_C 1:f41e3d62e7b2 292 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 293 }
IUT_Nicolas_C 1:f41e3d62e7b2 294 /** Function drawUiStructure
IUT_Nicolas_C 1:f41e3d62e7b2 295 * Draws rectangle on the UI as delimiters
IUT_Nicolas_C 1:f41e3d62e7b2 296 */
IUT_Nicolas_C 1:f41e3d62e7b2 297 void drawUiStructure()
IUT_Nicolas_C 1:f41e3d62e7b2 298 {
IUT_Nicolas_C 1:f41e3d62e7b2 299 uint8_t color = lcd.GetTextColor();
IUT_Nicolas_C 1:f41e3d62e7b2 300 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 301 drawRect( 11, 10,411,260); //Partie labyrinth
IUT_Nicolas_C 1:f41e3d62e7b2 302 drawRect(411, 10,470,260); //Partie Utilisateur
IUT_Nicolas_C 1:f41e3d62e7b2 303 lcd.SetTextColor(color);
IUT_Nicolas_C 1:f41e3d62e7b2 304 }
IUT_Nicolas_C 1:f41e3d62e7b2 305 /** Function initLCD
IUT_Nicolas_C 1:f41e3d62e7b2 306 * Initializes the LCD
IUT_Nicolas_C 1:f41e3d62e7b2 307 */
IUT_Nicolas_C 1:f41e3d62e7b2 308 void initLCD()
IUT_Nicolas_C 1:f41e3d62e7b2 309 {
IUT_Nicolas_C 1:f41e3d62e7b2 310 lcd.Clear(LCD_COLOR_WHITE);
IUT_Nicolas_C 1:f41e3d62e7b2 311 //lcd.SetBackColor(LCD_COLOR_BLUE);
IUT_Nicolas_C 1:f41e3d62e7b2 312 lcd.SetTextColor(LCD_COLOR_BLACK);
IUT_Nicolas_C 1:f41e3d62e7b2 313 wait(0.3);
IUT_Nicolas_C 0:9167afeead2e 314 }
IUT_Nicolas_C 1:f41e3d62e7b2 315 /** Function updateChar
IUT_Nicolas_C 1:f41e3d62e7b2 316 * Updates the position of the character if
IUT_Nicolas_C 1:f41e3d62e7b2 317 * - The sensor is in the range
IUT_Nicolas_C 1:f41e3d62e7b2 318 * - The character is nearby a white square
IUT_Nicolas_C 1:f41e3d62e7b2 319 * - The direction is oriented to a white square
IUT_Nicolas_C 1:f41e3d62e7b2 320 * Checks if the player has won the level
IUT_Nicolas_C 1:f41e3d62e7b2 321 */
IUT_Nicolas_C 1:f41e3d62e7b2 322 void updateChar(float ax, float ay, float az, bool lab[])
IUT_Nicolas_C 1:f41e3d62e7b2 323 {
IUT_Nicolas_C 1:f41e3d62e7b2 324 float oldX = origin[0], oldY = origin[1], oldZ = origin[2];
IUT_Nicolas_C 1:f41e3d62e7b2 325
IUT_Nicolas_C 1:f41e3d62e7b2 326 //Sensor is bended downwards
IUT_Nicolas_C 1:f41e3d62e7b2 327 if ((az >= oldZ+30) || (az <= oldZ-30)) {
IUT_Nicolas_C 1:f41e3d62e7b2 328 //Sensor is bended left
IUT_Nicolas_C 1:f41e3d62e7b2 329 if (ax <= oldX-30) {
IUT_Nicolas_C 1:f41e3d62e7b2 330 if (!(charac[0] <= 0) && (lab[16*charac[1]+charac[0]-1] == 0)) {
IUT_Nicolas_C 1:f41e3d62e7b2 331 charac[0]--;
IUT_Nicolas_C 1:f41e3d62e7b2 332 }
IUT_Nicolas_C 1:f41e3d62e7b2 333 }
IUT_Nicolas_C 1:f41e3d62e7b2 334 //Sensor is bended right
IUT_Nicolas_C 1:f41e3d62e7b2 335 else if (ax >= oldX+30) {
IUT_Nicolas_C 1:f41e3d62e7b2 336 if (!(charac[0] >= 15) && (lab[16*charac[1]+charac[0]+1] == 0)) {
IUT_Nicolas_C 1:f41e3d62e7b2 337 charac[0]++;
IUT_Nicolas_C 1:f41e3d62e7b2 338 }
IUT_Nicolas_C 1:f41e3d62e7b2 339 }
IUT_Nicolas_C 1:f41e3d62e7b2 340 //Sensor is bended forward
IUT_Nicolas_C 1:f41e3d62e7b2 341 else if (ay <= oldY-30) {
IUT_Nicolas_C 1:f41e3d62e7b2 342 if (!(charac[1] <= 0) && (lab[16*charac[1]+charac[0]-16] == 0)) {
IUT_Nicolas_C 1:f41e3d62e7b2 343 charac[1]--;
IUT_Nicolas_C 1:f41e3d62e7b2 344 }
IUT_Nicolas_C 1:f41e3d62e7b2 345 }
IUT_Nicolas_C 1:f41e3d62e7b2 346 //Sensor is bended backward
IUT_Nicolas_C 1:f41e3d62e7b2 347 else if (ay >= oldX+30) {
IUT_Nicolas_C 1:f41e3d62e7b2 348 if (!(charac[1] >= 9) && (lab[16*charac[1]+charac[0]+16] == 0)) {
IUT_Nicolas_C 1:f41e3d62e7b2 349 charac[1]++;
IUT_Nicolas_C 1:f41e3d62e7b2 350 }
IUT_Nicolas_C 1:f41e3d62e7b2 351 }
IUT_Nicolas_C 1:f41e3d62e7b2 352 }
IUT_Nicolas_C 1:f41e3d62e7b2 353
IUT_Nicolas_C 1:f41e3d62e7b2 354 isWinning(level);
IUT_Nicolas_C 1:f41e3d62e7b2 355 //charac[0] = {x}; should be used to update character position on x
IUT_Nicolas_C 1:f41e3d62e7b2 356 //charac[1] = {y}; should be used to update character position on y
IUT_Nicolas_C 0:9167afeead2e 357 }
IUT_Nicolas_C 1:f41e3d62e7b2 358 /** Function resetPos
IUT_Nicolas_C 1:f41e3d62e7b2 359 * Reset the original acceleration of the sensor
IUT_Nicolas_C 1:f41e3d62e7b2 360 */
IUT_Nicolas_C 1:f41e3d62e7b2 361 void resetPos()
IUT_Nicolas_C 1:f41e3d62e7b2 362 {
IUT_Nicolas_C 1:f41e3d62e7b2 363 float ax=0,ay=0,az=0;
IUT_Nicolas_C 1:f41e3d62e7b2 364 sensor.read_Tilt(&ax,&ay,&az);
IUT_Nicolas_C 1:f41e3d62e7b2 365 origin[0] = ax;
IUT_Nicolas_C 1:f41e3d62e7b2 366 origin[1] = ay;
IUT_Nicolas_C 1:f41e3d62e7b2 367 origin[2] = az;
IUT_Nicolas_C 1:f41e3d62e7b2 368 }
IUT_Nicolas_C 1:f41e3d62e7b2 369 /** Function nextLvl
IUT_Nicolas_C 1:f41e3d62e7b2 370 * Loads the next level
IUT_Nicolas_C 1:f41e3d62e7b2 371 */
IUT_Nicolas_C 1:f41e3d62e7b2 372 void nextLvl()
IUT_Nicolas_C 1:f41e3d62e7b2 373 {
IUT_Nicolas_C 1:f41e3d62e7b2 374 if(level < 2)
IUT_Nicolas_C 1:f41e3d62e7b2 375 level++;
IUT_Nicolas_C 1:f41e3d62e7b2 376 drawLabyrinth(level);
IUT_Nicolas_C 1:f41e3d62e7b2 377 drawLevelNbr();
IUT_Nicolas_C 1:f41e3d62e7b2 378 drawn = 0;
IUT_Nicolas_C 1:f41e3d62e7b2 379 drawChar();
IUT_Nicolas_C 1:f41e3d62e7b2 380 }
IUT_Nicolas_C 1:f41e3d62e7b2 381 /** Function prevLvl
IUT_Nicolas_C 1:f41e3d62e7b2 382 * Loads the previous level
IUT_Nicolas_C 1:f41e3d62e7b2 383 */
IUT_Nicolas_C 1:f41e3d62e7b2 384 void prevLvl()
IUT_Nicolas_C 1:f41e3d62e7b2 385 {
IUT_Nicolas_C 1:f41e3d62e7b2 386 if(level > 1)
IUT_Nicolas_C 1:f41e3d62e7b2 387 level--;
IUT_Nicolas_C 1:f41e3d62e7b2 388 drawLabyrinth(level);
IUT_Nicolas_C 1:f41e3d62e7b2 389 drawLevelNbr();
IUT_Nicolas_C 1:f41e3d62e7b2 390 drawn = 0;
IUT_Nicolas_C 1:f41e3d62e7b2 391 drawChar();
IUT_Nicolas_C 1:f41e3d62e7b2 392 }
IUT_Nicolas_C 1:f41e3d62e7b2 393 /** Function isWinning
IUT_Nicolas_C 1:f41e3d62e7b2 394 * Checks if the player has won the level
IUT_Nicolas_C 1:f41e3d62e7b2 395 */
IUT_Nicolas_C 1:f41e3d62e7b2 396 void isWinning(int lvl)
IUT_Nicolas_C 1:f41e3d62e7b2 397 {
IUT_Nicolas_C 1:f41e3d62e7b2 398 switch(lvl) {
IUT_Nicolas_C 1:f41e3d62e7b2 399 case 1:
IUT_Nicolas_C 1:f41e3d62e7b2 400 if (charac[0]== 15 && charac[1]== 6)
IUT_Nicolas_C 1:f41e3d62e7b2 401 nextLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 402 break;
IUT_Nicolas_C 1:f41e3d62e7b2 403 case 2:
IUT_Nicolas_C 1:f41e3d62e7b2 404 if (charac[0]== 7 && charac[1]== 9)
IUT_Nicolas_C 1:f41e3d62e7b2 405 nextLvl();
IUT_Nicolas_C 1:f41e3d62e7b2 406 break;
IUT_Nicolas_C 1:f41e3d62e7b2 407 default:
IUT_Nicolas_C 1:f41e3d62e7b2 408 break;
IUT_Nicolas_C 1:f41e3d62e7b2 409 }
IUT_Nicolas_C 1:f41e3d62e7b2 410 }
IUT_Nicolas_C 0:9167afeead2e 411 //---MAIN
IUT_Nicolas_C 1:f41e3d62e7b2 412 int main()
IUT_Nicolas_C 1:f41e3d62e7b2 413 {
IUT_Nicolas_C 1:f41e3d62e7b2 414 //Declaration
IUT_Nicolas_C 1:f41e3d62e7b2 415 int x, y, i=0;
IUT_Nicolas_C 0:9167afeead2e 416 float ax=0,ay=0,az=0;
IUT_Nicolas_C 1:f41e3d62e7b2 417 //Initialization
IUT_Nicolas_C 0:9167afeead2e 418 sensor.init();
IUT_Nicolas_C 0:9167afeead2e 419 initLCD();
IUT_Nicolas_C 1:f41e3d62e7b2 420 ts.Init(lcd.GetXSize(), lcd.GetYSize());
IUT_Nicolas_C 1:f41e3d62e7b2 421 TS_StateTypeDef TS_State;
IUT_Nicolas_C 1:f41e3d62e7b2 422 //Setting up the UI
IUT_Nicolas_C 0:9167afeead2e 423 drawUi();
IUT_Nicolas_C 1:f41e3d62e7b2 424 drawLabyrinth(level);
IUT_Nicolas_C 1:f41e3d62e7b2 425
IUT_Nicolas_C 1:f41e3d62e7b2 426 //Setting up the sensor configuration
IUT_Nicolas_C 0:9167afeead2e 427 sensor.write_reg(0x07,0);
IUT_Nicolas_C 0:9167afeead2e 428 sensor.write_reg(0x04,0x000);
IUT_Nicolas_C 0:9167afeead2e 429 sensor.write_reg(0x07,1);
IUT_Nicolas_C 1:f41e3d62e7b2 430
IUT_Nicolas_C 1:f41e3d62e7b2 431 //Setting original acceleration
IUT_Nicolas_C 1:f41e3d62e7b2 432 resetPos();
IUT_Nicolas_C 1:f41e3d62e7b2 433
IUT_Nicolas_C 0:9167afeead2e 434 while(1) {
IUT_Nicolas_C 0:9167afeead2e 435 //Getting Values
IUT_Nicolas_C 1:f41e3d62e7b2 436 sensor.read_Tilt(&ax,&ay,&az);
IUT_Nicolas_C 1:f41e3d62e7b2 437 //Getting touchscreen state
IUT_Nicolas_C 1:f41e3d62e7b2 438 ts.GetState(&TS_State);
IUT_Nicolas_C 1:f41e3d62e7b2 439 //Getting pos on the touchscreen
IUT_Nicolas_C 1:f41e3d62e7b2 440 x = TS_State.touchX[0];
IUT_Nicolas_C 1:f41e3d62e7b2 441 y = TS_State.touchY[0];
IUT_Nicolas_C 1:f41e3d62e7b2 442
IUT_Nicolas_C 1:f41e3d62e7b2 443 //Check Pos
IUT_Nicolas_C 1:f41e3d62e7b2 444 if(TS_State.touchDetected>0)
IUT_Nicolas_C 1:f41e3d62e7b2 445 checkPos(x,y);
IUT_Nicolas_C 0:9167afeead2e 446
IUT_Nicolas_C 1:f41e3d62e7b2 447 //If timeout updating character position
IUT_Nicolas_C 1:f41e3d62e7b2 448 if(i > 6) {
IUT_Nicolas_C 1:f41e3d62e7b2 449 updateChar(ax,ay,az,labyrinths[level-1]);
IUT_Nicolas_C 1:f41e3d62e7b2 450 i = -1;
IUT_Nicolas_C 1:f41e3d62e7b2 451 }
IUT_Nicolas_C 1:f41e3d62e7b2 452
IUT_Nicolas_C 1:f41e3d62e7b2 453 //---DEBUG
IUT_Nicolas_C 0:9167afeead2e 454 //Printing Values
IUT_Nicolas_C 1:f41e3d62e7b2 455 /*displayAcc(ax,ay,az);
IUT_Nicolas_C 1:f41e3d62e7b2 456 displayCharPos();
IUT_Nicolas_C 1:f41e3d62e7b2 457 displayOri();//*/
IUT_Nicolas_C 1:f41e3d62e7b2 458
IUT_Nicolas_C 1:f41e3d62e7b2 459 drawChar();
IUT_Nicolas_C 1:f41e3d62e7b2 460 i++;
IUT_Nicolas_C 1:f41e3d62e7b2 461 wait_ms(100);
IUT_Nicolas_C 0:9167afeead2e 462 }
IUT_Nicolas_C 0:9167afeead2e 463 }