Tetris game for mbed.

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

Fork of HelloWorld by Simon Ford

Revision:
2:36cda8980746
Parent:
0:fb6bbc10ffa0
--- a/main.cpp	Sun Jan 01 20:57:57 2012 +0000
+++ b/main.cpp	Mon Nov 07 00:43:45 2016 +0000
@@ -1,12 +1,135 @@
 #include "mbed.h"
+#include "uLCD_4DGL.h"
+#include "SDFileSystem.h"
+#include "rtos.h"
+#include "wave_player.h"
+#include <mpr121.h>
+#include "tetris.h"
+
+
+Serial pc(USBTX, USBRX);
+SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+Mutex brd_mutex;
+Mutex input_mutex;
+Ticker gravity;
+
+// Create the interrupt receiver object on pin 12
+InterruptIn interrupt(p12);
+// Setup the i2c bus on pins 9 and 10
+I2C i2c(p9, p10);
+// Setup the Mpr121:
+// constructor(i2c object, i2c address of the mpr121)
+Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
+    
+Board brd;
+int gotInput = 0;
+int gotDown = 0;
 
-DigitalOut myled(LED1);
+void playTheme(void const *args){
+    FILE *wave_file;
+    while(1){
+        wave_file=fopen("/sd/TetrisA.wav","r");
+        waver.play(wave_file);
+        fclose(wave_file);
+    }
+}    
+    
+    
+    // Key hit/release interrupt routine
+void keyPress() {
+  int key_code=0;
+  int i=0;
+  int value=mpr121.read(0x00);
+  value +=mpr121.read(0x01)<<8;
+  gotInput = 1;
+  input_mutex.lock();
+  if(value == (0x01 << 4)){
+      //Move the active block left
+      brd_mutex.lock();
+      brd.nextBlock.movL();
+      brd_mutex.unlock();
+      }else if(value == (0x01 << 6)){
+        brd_mutex.lock();
+        brd.nextBlock.movR();
+        brd_mutex.unlock();
+      } else if(value == (0x01 << 9)){
+        brd_mutex.lock();
+        brd.nextBlock.movD();
+        brd_mutex.unlock();
+        gotDown = 1;
+        } else if(value == (0x01 << 0)){
+        brd_mutex.lock();
+        brd.nextBlock.movF();
+        brd_mutex.unlock();
+        } else if(value == (0x01 << 2)){
+        brd_mutex.lock();
+        brd.nextBlock.movB();
+        brd_mutex.unlock();
+        } else if(value == (0x01 << 5)){
+        brd_mutex.lock();
+        brd.nextBlock.rotY();
+        brd_mutex.unlock();
+        } else if(value == (0x01 << 11)){
+        brd_mutex.lock();
+        brd.nextBlock.rotZ();
+        brd_mutex.unlock();
+        } else if(value == (0x01 << 3)){
+        brd_mutex.lock();
+        brd.nextBlock.rotX();
+        brd_mutex.unlock();
+        }else if(value == (0x01 << 8)){
+        brd_mutex.lock();
+        brd.blockFall();
+        brd_mutex.unlock();
+        }
+        else gotInput = 0;
+      
+}
+
+void gravTick(){
+    brd_mutex.lock();
+    brd.nextBlock.movD();
+    brd_mutex.unlock();
+    gotDown = 1;
+    gotInput = 1;
+}
 
 int main() {
+    printf("Starting main...\n");
+    printf("Setting up interrupts...\n");
+    interrupt.fall(&keyPress);
+    interrupt.mode(PullUp);
+    printf("Setting up audio thread...\n");
+    Thread tetrisA(playTheme);
+    tetrisA.set_priority(osPriorityNormal);
+    printf("Setting up the ticker timer");
+    gravity.attach(&gravTick, 4.0);
+    printf("Setting up LCD thread...\n");
+    brd_mutex.lock();
+    brd.drawGrid();
+    brd_mutex.unlock();
+
     while(1) {
-        myled = 1;
-        wait(0.2);
-        myled = 0;
-        wait(0.2);
+        if (gotInput){
+            if(gotDown){
+                if(!brd.check()){
+                    brd.setBlock();
+                    brd.getNewBlock();
+                }
+            }
+            brd.checkAndUpdate();
+            gotDown = 0;
+            gotInput = 0;
+            input_mutex.unlock();
+        }
+        Thread::wait(20);
+
     }
 }