Jacob Smith / Mbed 2 deprecated Flip_Tile

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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(&center_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 }