Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player
main.cpp
00001 #include "mbed.h" 00002 #include "rtos.h" 00003 #include "PinDetect.h" 00004 #include "uLCD_4DGL.h" 00005 #include "SDFileSystem.h" 00006 #include "wave_player.h" 00007 #include "tile.h" 00008 #include "cursor.h" 00009 00010 DigitalOut led1(LED1); 00011 DigitalOut led2(LED2); 00012 DigitalOut led3(LED3); 00013 DigitalOut led4(LED4); 00014 00015 00016 #ifndef TILE_OFF 00017 #define TILE_OFF 0xFF0000 00018 #endif 00019 #ifndef TILE_ON 00020 #define TILE_ON 0x00FF00 00021 #endif 00022 #ifndef CURSOR 00023 #define CURSOR 0x0000CC 00024 #endif 00025 00026 //uLCD 00027 uLCD_4DGL lcd(p28, p27, p30); 00028 00029 // speaker 00030 AnalogOut DACout(p18); 00031 00032 // SD card reader 00033 SDFileSystem sd(p5, p6, p7, p8, "sd"); 00034 00035 // wave player & FILE objects 00036 wave_player waver(&DACout); 00037 FILE *wave_file; 00038 00039 // 5 way tactical joystick 00040 PinDetect up(p15); // left p17 00041 PinDetect center(p19); 00042 PinDetect left(p20); // down p16 00043 PinDetect down(p17); // right p15 00044 PinDetect right(p16); // up p20 00045 // pause button 00046 PinDetect pause(p21); 00047 00048 //tile objects 00049 Tile GameBoard(p28, p27, p30); 00050 bool gameSize; 00051 bool changePattern; 00052 bool unpause; 00053 //cursor objects 00054 Cursor gameCursor(p28, p27, p30); 00055 int newCursor; 00056 int oldCursor; 00057 int oldCursorColor; 00058 00059 //function prototypes 00060 void decideWhereUp(); 00061 void decideWhereLeft(); 00062 void decideWhereDown(); 00063 void decideWhereRight(); 00064 00065 enum GameState {START, WAIT, SETUP, GAME, UPDATE, PAUSE, PAUSED, OVER}; 00066 /*State Definitions: 00067 * START -- Creates the start screen 00068 * WAIT -- Waits after the start screen, mbed does nothing 00069 * SETUP -- Sets up one time things 00070 * GAME -- User actually gets to play the game 00071 * UPDATE-- Updates the screen 00072 * PAUSE -- Pause the screen, gives the user the option to start over 00073 * PAUSED-- Does nothing while game is paused 00074 * OVER -- Clears the screen, prints you win, goes back to start 00075 */ 00076 GameState GameStatus = START; 00077 00078 // Pushbutton callbacks 00079 void up_hit_callback(void){ 00080 led1 = !led1; 00081 switch(GameStatus){ 00082 case WAIT: 00083 gameSize = true; 00084 GameStatus = SETUP; 00085 break; 00086 case GAME: 00087 if(GameBoard.drawCursor(newCursor) == true) 00088 oldCursorColor = TILE_ON; 00089 else 00090 oldCursorColor = TILE_OFF; 00091 oldCursor = newCursor; 00092 decideWhereUp(); 00093 GameStatus = UPDATE; 00094 break; 00095 } 00096 } 00097 00098 void center_hit_callback(void){ 00099 switch(GameStatus){ 00100 case GAME: 00101 changePattern = true; 00102 GameStatus = UPDATE; 00103 break; 00104 case PAUSED: 00105 //GameBoard.unpause(); 00106 unpause = true; 00107 GameStatus = UPDATE; 00108 break; 00109 } 00110 } 00111 00112 void left_hit_callback(void){ 00113 led2 = !led2; 00114 switch(GameStatus){ 00115 case GAME: 00116 if(GameBoard.drawCursor(newCursor) == true) 00117 oldCursorColor = TILE_ON; 00118 else 00119 oldCursorColor = TILE_OFF; 00120 oldCursor = newCursor; 00121 decideWhereLeft(); 00122 GameStatus = UPDATE; 00123 break; 00124 } 00125 } 00126 00127 void down_hit_callback(void){ //choose 4x4 00128 led3 = !led3; 00129 switch(GameStatus){ 00130 case WAIT: 00131 gameSize = false; 00132 GameStatus = SETUP; 00133 break; 00134 case GAME: 00135 if(GameBoard.drawCursor(newCursor) == true) 00136 oldCursorColor = TILE_ON; 00137 else 00138 oldCursorColor = TILE_OFF; 00139 oldCursor = newCursor; 00140 decideWhereDown(); 00141 GameStatus = UPDATE; 00142 break; 00143 } 00144 } 00145 00146 void right_hit_callback(void){ 00147 led4 = !led4; 00148 switch(GameStatus){ 00149 case GAME: 00150 if(GameBoard.drawCursor(newCursor) == true) 00151 oldCursorColor = TILE_ON; 00152 else 00153 oldCursorColor = TILE_OFF; 00154 oldCursor = newCursor; 00155 decideWhereRight(); 00156 GameStatus = UPDATE; 00157 break; 00158 } 00159 } 00160 00161 void pause_hit_callback(void){ 00162 switch(GameStatus){ 00163 case WAIT: 00164 GameStatus = START; 00165 break; 00166 case GAME: 00167 GameStatus = PAUSE; 00168 break; 00169 case PAUSED: 00170 GameStatus = START; 00171 break; 00172 } 00173 } 00174 00175 void lcdSetup(){ 00176 lcd.baudrate(3000000); 00177 lcd.background_color(0); 00178 lcd.color(BLUE); 00179 lcd.text_width(1); 00180 lcd.text_height(1); 00181 //lcd.cls(); 00182 } 00183 00184 00185 // Music thread 00186 void music(void const *args){ 00187 while(true){ 00188 wave_file = fopen("/sd/myMusic/beethoven.wav", "r"); 00189 waver.play(wave_file); 00190 fclose(wave_file); 00191 Thread::wait(1); 00192 } 00193 } 00194 00195 int main(){ 00196 // setup some modules 00197 // 00198 // LCD screen 00199 lcdSetup(); 00200 wait(0.01); 00201 00202 // Joystick & pushbutton setup 00203 pause.mode(PullUp); 00204 wait(0.01); 00205 up.attach_deasserted(&up_hit_callback); 00206 center.attach_deasserted(¢er_hit_callback); 00207 left.attach_deasserted(&left_hit_callback); 00208 down.attach_deasserted(&down_hit_callback); 00209 right.attach_deasserted(&right_hit_callback); 00210 pause.attach_deasserted(&pause_hit_callback); 00211 up.setSampleFrequency(); 00212 center.setSampleFrequency(); 00213 left.setSampleFrequency(); 00214 down.setSampleFrequency(); 00215 right.setSampleFrequency(); 00216 pause.setSampleFrequency(); 00217 wait(0.01); 00218 00219 Thread backgroundMusic(music); 00220 led1 = led2 = led3 = led4 = 0; 00221 00222 // GAME 00223 while(true){ 00224 switch(GameStatus){ 00225 case START: 00226 lcd.cls(); 00227 lcd.locate(0,0); 00228 lcd.printf("Flip Tile!!!\n\n"); 00229 lcd.printf("Select Game mode:\n"); 00230 lcd.printf("\tup for 3x3\n"); 00231 lcd.printf("\tdown for 4x4\n"); 00232 GameStatus = WAIT; 00233 break; 00234 case WAIT: 00235 break; 00236 case SETUP: 00237 lcd.cls(); 00238 GameBoard.setNumberOfTiles(gameSize); 00239 gameCursor.number_of_circles = gameSize; 00240 GameBoard.reset(); 00241 newCursor = 0; 00242 gameCursor.drawCircle(newCursor, CURSOR); 00243 GameStatus = GAME; 00244 changePattern = false; 00245 unpause = false; 00246 break; 00247 case GAME: 00248 if(GameBoard.win == true){ 00249 GameStatus = OVER; 00250 } 00251 break; 00252 case UPDATE: 00253 gameCursor.drawCircle(oldCursor, oldCursorColor); 00254 if(changePattern == true){ 00255 if(gameSize == true) 00256 GameBoard.TilePattern3(newCursor); 00257 else 00258 GameBoard.TilePattern4(newCursor); 00259 changePattern = false; 00260 } 00261 if(unpause == true){ 00262 lcd.cls(); 00263 GameBoard.unpause(); 00264 unpause = false; 00265 } 00266 gameCursor.drawCircle(newCursor, CURSOR); 00267 GameStatus = GAME; 00268 break; 00269 case PAUSE: 00270 lcd.cls(); 00271 lcd.printf("Press button to\nstart a new game\n\n"); 00272 lcd.printf("Press center to\nresume"); 00273 GameBoard.pause(); 00274 GameStatus = PAUSED; 00275 break; 00276 case PAUSED: 00277 break; 00278 case OVER: 00279 lcd.cls(); 00280 lcd.printf("Completed!!!\n\n"); 00281 lcd.printf("# of Moves: %d\n\n", GameBoard.getScore()); 00282 lcd.printf("Press button for\nnew game"); 00283 GameStatus = WAIT; 00284 break; 00285 } 00286 } 00287 } 00288 00289 // ***************************************** // 00290 // FUNCTION DEFINITIONS // 00291 // ***************************************** // 00292 00293 00294 void decideWhereUp(){ 00295 switch(gameSize){ 00296 case true: 00297 if((newCursor >= 0) && (newCursor <=5)) 00298 newCursor = newCursor + 3; 00299 break; 00300 00301 case false: 00302 if((newCursor >= 0) && (newCursor <= 11)) 00303 newCursor = newCursor + 4; 00304 break; 00305 } 00306 } 00307 00308 void decideWhereLeft(){ 00309 switch(gameSize){ 00310 case true: 00311 if((newCursor == 0) || (newCursor == 1) || (newCursor == 3) || (newCursor == 4) || (newCursor == 6) ||(newCursor == 7)) 00312 newCursor = newCursor + 1; 00313 break; 00314 00315 case false: 00316 if((newCursor == 0) || (newCursor == 1) || (newCursor == 2) || 00317 (newCursor == 4) || (newCursor == 5) || (newCursor == 6) || 00318 (newCursor == 8) || (newCursor == 9) || (newCursor == 10) || 00319 (newCursor == 12) || (newCursor == 13) || (newCursor == 14)) 00320 newCursor = newCursor + 1; 00321 break; 00322 } 00323 } 00324 00325 void decideWhereDown(){ 00326 switch(gameSize){ 00327 case true: 00328 if((newCursor >= 3) && (newCursor <= 8)) 00329 newCursor = newCursor - 3; 00330 break; 00331 00332 case false: 00333 if((newCursor >= 4) && (newCursor <= 15)) 00334 newCursor = newCursor - 4; 00335 break; 00336 } 00337 } 00338 00339 void decideWhereRight(){ 00340 switch(gameSize){ 00341 case true: 00342 if((newCursor == 1) || (newCursor == 2) || (newCursor == 4) ||(newCursor == 5) || (newCursor == 7) || (newCursor == 8)) 00343 newCursor = newCursor - 1; 00344 break; 00345 00346 case false: 00347 if((newCursor == 1) || (newCursor == 2) || (newCursor == 3) || 00348 (newCursor == 5) || (newCursor == 6) || (newCursor == 7) || 00349 (newCursor == 9) || (newCursor == 10) || (newCursor == 11) || 00350 (newCursor == 13) || (newCursor == 14) || (newCursor == 15)) 00351 newCursor = newCursor - 1; 00352 break; 00353 } 00354 }
Generated on Sun Jul 24 2022 11:46:39 by
1.7.2