Tetris game for mbed.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
Fork of HelloWorld by
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 }
Generated on Sat Jul 23 2022 12:39:35 by 1.7.2