Tetris game for mbed.

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

Fork of HelloWorld by Simon Ford

Committer:
greiner218
Date:
Mon Nov 07 07:18:59 2016 +0000
Revision:
3:803d3e67513f
Parent:
2:36cda8980746
Added .wav file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:fb6bbc10ffa0 1 #include "mbed.h"
greiner218 2:36cda8980746 2 #include "uLCD_4DGL.h"
greiner218 2:36cda8980746 3 #include "SDFileSystem.h"
greiner218 2:36cda8980746 4 #include "rtos.h"
greiner218 2:36cda8980746 5 #include "wave_player.h"
greiner218 2:36cda8980746 6 #include <mpr121.h>
greiner218 2:36cda8980746 7 #include "tetris.h"
greiner218 2:36cda8980746 8
greiner218 2:36cda8980746 9
greiner218 2:36cda8980746 10 Serial pc(USBTX, USBRX);
greiner218 2:36cda8980746 11 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
greiner218 2:36cda8980746 12
greiner218 2:36cda8980746 13 AnalogOut DACout(p18);
greiner218 2:36cda8980746 14 wave_player waver(&DACout);
greiner218 2:36cda8980746 15 DigitalOut led1(LED1);
greiner218 2:36cda8980746 16 DigitalOut led2(LED2);
greiner218 2:36cda8980746 17 DigitalOut led3(LED3);
greiner218 2:36cda8980746 18 DigitalOut led4(LED4);
greiner218 2:36cda8980746 19 Mutex brd_mutex;
greiner218 2:36cda8980746 20 Mutex input_mutex;
greiner218 2:36cda8980746 21 Ticker gravity;
greiner218 2:36cda8980746 22
greiner218 2:36cda8980746 23 // Create the interrupt receiver object on pin 12
greiner218 2:36cda8980746 24 InterruptIn interrupt(p12);
greiner218 2:36cda8980746 25 // Setup the i2c bus on pins 9 and 10
greiner218 2:36cda8980746 26 I2C i2c(p9, p10);
greiner218 2:36cda8980746 27 // Setup the Mpr121:
greiner218 2:36cda8980746 28 // constructor(i2c object, i2c address of the mpr121)
greiner218 2:36cda8980746 29 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
greiner218 2:36cda8980746 30
greiner218 2:36cda8980746 31 Board brd;
greiner218 2:36cda8980746 32 int gotInput = 0;
greiner218 2:36cda8980746 33 int gotDown = 0;
simon 0:fb6bbc10ffa0 34
greiner218 2:36cda8980746 35 void playTheme(void const *args){
greiner218 2:36cda8980746 36 FILE *wave_file;
greiner218 2:36cda8980746 37 while(1){
greiner218 2:36cda8980746 38 wave_file=fopen("/sd/TetrisA.wav","r");
greiner218 2:36cda8980746 39 waver.play(wave_file);
greiner218 2:36cda8980746 40 fclose(wave_file);
greiner218 2:36cda8980746 41 }
greiner218 2:36cda8980746 42 }
greiner218 2:36cda8980746 43
greiner218 2:36cda8980746 44
greiner218 2:36cda8980746 45 // Key hit/release interrupt routine
greiner218 2:36cda8980746 46 void keyPress() {
greiner218 2:36cda8980746 47 int key_code=0;
greiner218 2:36cda8980746 48 int i=0;
greiner218 2:36cda8980746 49 int value=mpr121.read(0x00);
greiner218 2:36cda8980746 50 value +=mpr121.read(0x01)<<8;
greiner218 2:36cda8980746 51 gotInput = 1;
greiner218 2:36cda8980746 52 input_mutex.lock();
greiner218 2:36cda8980746 53 if(value == (0x01 << 4)){
greiner218 2:36cda8980746 54 //Move the active block left
greiner218 2:36cda8980746 55 brd_mutex.lock();
greiner218 2:36cda8980746 56 brd.nextBlock.movL();
greiner218 2:36cda8980746 57 brd_mutex.unlock();
greiner218 2:36cda8980746 58 }else if(value == (0x01 << 6)){
greiner218 2:36cda8980746 59 brd_mutex.lock();
greiner218 2:36cda8980746 60 brd.nextBlock.movR();
greiner218 2:36cda8980746 61 brd_mutex.unlock();
greiner218 2:36cda8980746 62 } else if(value == (0x01 << 9)){
greiner218 2:36cda8980746 63 brd_mutex.lock();
greiner218 2:36cda8980746 64 brd.nextBlock.movD();
greiner218 2:36cda8980746 65 brd_mutex.unlock();
greiner218 2:36cda8980746 66 gotDown = 1;
greiner218 2:36cda8980746 67 } else if(value == (0x01 << 0)){
greiner218 2:36cda8980746 68 brd_mutex.lock();
greiner218 2:36cda8980746 69 brd.nextBlock.movF();
greiner218 2:36cda8980746 70 brd_mutex.unlock();
greiner218 2:36cda8980746 71 } else if(value == (0x01 << 2)){
greiner218 2:36cda8980746 72 brd_mutex.lock();
greiner218 2:36cda8980746 73 brd.nextBlock.movB();
greiner218 2:36cda8980746 74 brd_mutex.unlock();
greiner218 2:36cda8980746 75 } else if(value == (0x01 << 5)){
greiner218 2:36cda8980746 76 brd_mutex.lock();
greiner218 2:36cda8980746 77 brd.nextBlock.rotY();
greiner218 2:36cda8980746 78 brd_mutex.unlock();
greiner218 2:36cda8980746 79 } else if(value == (0x01 << 11)){
greiner218 2:36cda8980746 80 brd_mutex.lock();
greiner218 2:36cda8980746 81 brd.nextBlock.rotZ();
greiner218 2:36cda8980746 82 brd_mutex.unlock();
greiner218 2:36cda8980746 83 } else if(value == (0x01 << 3)){
greiner218 2:36cda8980746 84 brd_mutex.lock();
greiner218 2:36cda8980746 85 brd.nextBlock.rotX();
greiner218 2:36cda8980746 86 brd_mutex.unlock();
greiner218 2:36cda8980746 87 }else if(value == (0x01 << 8)){
greiner218 2:36cda8980746 88 brd_mutex.lock();
greiner218 2:36cda8980746 89 brd.blockFall();
greiner218 2:36cda8980746 90 brd_mutex.unlock();
greiner218 2:36cda8980746 91 }
greiner218 2:36cda8980746 92 else gotInput = 0;
greiner218 2:36cda8980746 93
greiner218 2:36cda8980746 94 }
greiner218 2:36cda8980746 95
greiner218 2:36cda8980746 96 void gravTick(){
greiner218 2:36cda8980746 97 brd_mutex.lock();
greiner218 2:36cda8980746 98 brd.nextBlock.movD();
greiner218 2:36cda8980746 99 brd_mutex.unlock();
greiner218 2:36cda8980746 100 gotDown = 1;
greiner218 2:36cda8980746 101 gotInput = 1;
greiner218 2:36cda8980746 102 }
simon 0:fb6bbc10ffa0 103
simon 0:fb6bbc10ffa0 104 int main() {
greiner218 2:36cda8980746 105 printf("Starting main...\n");
greiner218 2:36cda8980746 106 printf("Setting up interrupts...\n");
greiner218 2:36cda8980746 107 interrupt.fall(&keyPress);
greiner218 2:36cda8980746 108 interrupt.mode(PullUp);
greiner218 2:36cda8980746 109 printf("Setting up audio thread...\n");
greiner218 2:36cda8980746 110 Thread tetrisA(playTheme);
greiner218 2:36cda8980746 111 tetrisA.set_priority(osPriorityNormal);
greiner218 2:36cda8980746 112 printf("Setting up the ticker timer");
greiner218 2:36cda8980746 113 gravity.attach(&gravTick, 4.0);
greiner218 2:36cda8980746 114 printf("Setting up LCD thread...\n");
greiner218 2:36cda8980746 115 brd_mutex.lock();
greiner218 2:36cda8980746 116 brd.drawGrid();
greiner218 2:36cda8980746 117 brd_mutex.unlock();
greiner218 2:36cda8980746 118
simon 0:fb6bbc10ffa0 119 while(1) {
greiner218 2:36cda8980746 120 if (gotInput){
greiner218 2:36cda8980746 121 if(gotDown){
greiner218 2:36cda8980746 122 if(!brd.check()){
greiner218 2:36cda8980746 123 brd.setBlock();
greiner218 2:36cda8980746 124 brd.getNewBlock();
greiner218 2:36cda8980746 125 }
greiner218 2:36cda8980746 126 }
greiner218 2:36cda8980746 127 brd.checkAndUpdate();
greiner218 2:36cda8980746 128 gotDown = 0;
greiner218 2:36cda8980746 129 gotInput = 0;
greiner218 2:36cda8980746 130 input_mutex.unlock();
greiner218 2:36cda8980746 131 }
greiner218 2:36cda8980746 132 Thread::wait(20);
greiner218 2:36cda8980746 133
simon 0:fb6bbc10ffa0 134 }
simon 0:fb6bbc10ffa0 135 }