Tetris game for mbed.

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

Fork of HelloWorld by Simon Ford

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "uLCD_4DGL.h"
00003 #include "SDFileSystem.h"
00004 #include "rtos.h"
00005 #include "wave_player.h"
00006 #include <mpr121.h>
00007 #include "tetris.h"
00008 
00009 
00010 Serial pc(USBTX, USBRX);
00011 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
00012 
00013 AnalogOut DACout(p18);
00014 wave_player waver(&DACout);
00015 DigitalOut led1(LED1);
00016 DigitalOut led2(LED2);
00017 DigitalOut led3(LED3);
00018 DigitalOut led4(LED4);
00019 Mutex brd_mutex;
00020 Mutex input_mutex;
00021 Ticker gravity;
00022 
00023 // Create the interrupt receiver object on pin 12
00024 InterruptIn interrupt(p12);
00025 // Setup the i2c bus on pins 9 and 10
00026 I2C i2c(p9, p10);
00027 // Setup the Mpr121:
00028 // constructor(i2c object, i2c address of the mpr121)
00029 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
00030     
00031 Board brd;
00032 int gotInput = 0;
00033 int gotDown = 0;
00034 
00035 void playTheme(void const *args){
00036     FILE *wave_file;
00037     while(1){
00038         wave_file=fopen("/sd/TetrisA.wav","r");
00039         waver.play(wave_file);
00040         fclose(wave_file);
00041     }
00042 }    
00043     
00044     
00045     // Key hit/release interrupt routine
00046 void keyPress() {
00047   int key_code=0;
00048   int i=0;
00049   int value=mpr121.read(0x00);
00050   value +=mpr121.read(0x01)<<8;
00051   gotInput = 1;
00052   input_mutex.lock();
00053   if(value == (0x01 << 4)){
00054       //Move the active block left
00055       brd_mutex.lock();
00056       brd.nextBlock.movL();
00057       brd_mutex.unlock();
00058       }else if(value == (0x01 << 6)){
00059         brd_mutex.lock();
00060         brd.nextBlock.movR();
00061         brd_mutex.unlock();
00062       } else if(value == (0x01 << 9)){
00063         brd_mutex.lock();
00064         brd.nextBlock.movD();
00065         brd_mutex.unlock();
00066         gotDown = 1;
00067         } else if(value == (0x01 << 0)){
00068         brd_mutex.lock();
00069         brd.nextBlock.movF();
00070         brd_mutex.unlock();
00071         } else if(value == (0x01 << 2)){
00072         brd_mutex.lock();
00073         brd.nextBlock.movB();
00074         brd_mutex.unlock();
00075         } else if(value == (0x01 << 5)){
00076         brd_mutex.lock();
00077         brd.nextBlock.rotY();
00078         brd_mutex.unlock();
00079         } else if(value == (0x01 << 11)){
00080         brd_mutex.lock();
00081         brd.nextBlock.rotZ();
00082         brd_mutex.unlock();
00083         } else if(value == (0x01 << 3)){
00084         brd_mutex.lock();
00085         brd.nextBlock.rotX();
00086         brd_mutex.unlock();
00087         }else if(value == (0x01 << 8)){
00088         brd_mutex.lock();
00089         brd.blockFall();
00090         brd_mutex.unlock();
00091         }
00092         else gotInput = 0;
00093       
00094 }
00095 
00096 void gravTick(){
00097     brd_mutex.lock();
00098     brd.nextBlock.movD();
00099     brd_mutex.unlock();
00100     gotDown = 1;
00101     gotInput = 1;
00102 }
00103 
00104 int main() {
00105     printf("Starting main...\n");
00106     printf("Setting up interrupts...\n");
00107     interrupt.fall(&keyPress);
00108     interrupt.mode(PullUp);
00109     printf("Setting up audio thread...\n");
00110     Thread tetrisA(playTheme);
00111     tetrisA.set_priority(osPriorityNormal);
00112     printf("Setting up the ticker timer");
00113     gravity.attach(&gravTick, 4.0);
00114     printf("Setting up LCD thread...\n");
00115     brd_mutex.lock();
00116     brd.drawGrid();
00117     brd_mutex.unlock();
00118 
00119     while(1) {
00120         if (gotInput){
00121             if(gotDown){
00122                 if(!brd.check()){
00123                     brd.setBlock();
00124                     brd.getNewBlock();
00125                 }
00126             }
00127             brd.checkAndUpdate();
00128             gotDown = 0;
00129             gotInput = 0;
00130             input_mutex.unlock();
00131         }
00132         Thread::wait(20);
00133 
00134     }
00135 }