Rocket threading between missiles game, using touch keypad, audio amp, sd card, ulcd, ulcd sd graphics

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

main.cpp

Committer:
atran43
Date:
2016-11-01
Revision:
1:def75d5dff9d
Parent:
0:d3ee0d224bca

File content as of revision 1:def75d5dff9d:

#include "mbed.h"
#include "rtos.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "uLCD_4DGL.h"
#include "mpr121.h"

Mutex lcd_mutex;

uLCD_4DGL uLCD(p9, p10, p12); // uLCD-144-G2 screen, (serial tx, serial rx, reset pin)
int currentShipX;
float x;
AnalogOut DACout(p18);
wave_player waver(&DACout);


//8 missiles 
int missile0 [1][2]; // 1 row 2 col
int missile1 [1][2];
int missile2 [1][2];
int missile3 [1][2];

SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card

// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);
// Setup the i2c bus on pins 9 and 10
I2C i2c(p28, p27);
// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

void fallInterrupt();
void gameover();
void moveShip(void const *args);
void moveMissile0(void const *args);
//void sd_sound(void const *args);
int getRandNum();

void moveShip(void const *args){
        
    currentShipX = 64;
    lcd_mutex.lock();
    uLCD.media_init();
    uLCD.set_sector_address(0x0040, 0x4083);
    uLCD.display_image(currentShipX, 112);
    lcd_mutex.unlock();
    
    while(1) {
        
        lcd_mutex.lock();
        uLCD.filled_rectangle(currentShipX - 16, 112 , currentShipX , 128 ,WHITE);
        uLCD.filled_rectangle(currentShipX + 16, 112 ,currentShipX + 32 , 128 ,WHITE);
        uLCD.media_init();
        uLCD.set_sector_address(0x0040, 0x4083);
        uLCD.display_image(currentShipX, 112);
        uLCD.filled_rectangle(currentShipX - 16, 112 , currentShipX , 128 ,WHITE);
        uLCD.filled_rectangle(currentShipX + 16, 112 ,currentShipX + 32 , 128 ,WHITE);
        lcd_mutex.unlock();
        
    }
    
        
}

//Move Missile 0
void moveMissile0(void const *args) {
        Thread::wait(1000);
        
        missile0[0][0] = getRandNum(); //x coordinate
        missile0[0][1] = 0;  //y coordinate
        
        //draw Missile
        lcd_mutex.lock();
        uLCD.media_init();
        uLCD.set_sector_address(0x0040, 0x4081);
        uLCD.display_image(missile0[0][0], missile0[0][1]);
        lcd_mutex.unlock();

        while(1) {
             
             lcd_mutex.lock();
             uLCD.filled_rectangle(missile0[0][0], missile0[0][1] ,missile0[0][0]+16 , missile0[0][1]+16 ,WHITE);
             uLCD.media_init();
             uLCD.set_sector_address(0x0040, 0x4081);
             //Reset missile
             if (missile0[0][1] == 112) {
                missile0[0][1] = -16;
                missile0[0][0] = getRandNum();    
             }
             uLCD.display_image(missile0[0][0], missile0[0][1]+16);//Move missile down
             lcd_mutex.unlock();
             missile0[0][1] = missile0[0][1]+16;//Update new y value
             
        }

}

//Move Missile 1
void moveMissile1(void const *args) {
        Thread::wait(2000);
        
        missile1[0][0] = getRandNum(); //x coordinate
        missile1[0][1] = 0;  //y coordinate
        
        //draw Missile
        lcd_mutex.lock();
        uLCD.media_init();
        uLCD.set_sector_address(0x0040, 0x4081);
        uLCD.display_image(missile1[0][0], missile1[0][1]);
        lcd_mutex.unlock();

        while(1) {
             
             lcd_mutex.lock();
             uLCD.filled_rectangle(missile1[0][0], missile1[0][1] ,missile1[0][0]+16 , missile1[0][1]+16 ,WHITE);
             uLCD.media_init();
             uLCD.set_sector_address(0x0040, 0x4081);
             //Reset missile
             if (missile1[0][1] == 112) {
                missile1[0][1] = -16;
                missile1[0][0] = getRandNum();    
             }
             uLCD.display_image(missile1[0][0], missile1[0][1]+16);//Move missile down
             lcd_mutex.unlock();
             missile1[0][1] = missile1[0][1]+16;//Update new y value
             
        }

}

//Move Missile 2
void moveMissile2(void const *args) {
        Thread::wait(3000);
        
        missile2[0][0] = getRandNum(); //x coordinate
        missile2[0][1] = 0;  //y coordinate
        
        //draw Missile
        lcd_mutex.lock();
        uLCD.media_init();
        uLCD.set_sector_address(0x0040, 0x4081);
        uLCD.display_image(missile2[0][0], missile2[0][1]);
        lcd_mutex.unlock();

        while(1) {
             
             lcd_mutex.lock();
             uLCD.filled_rectangle(missile2[0][0], missile2[0][1] ,missile2[0][0]+16 , missile2[0][1]+16 ,WHITE);
             uLCD.media_init();
             uLCD.set_sector_address(0x0040, 0x4081);
             //Reset missile
             if (missile2[0][1] == 112) {
                missile2[0][1] = -16;
                missile2[0][0] = getRandNum();    
             }
             uLCD.display_image(missile2[0][0], missile2[0][1]+16);//Move missile down
             lcd_mutex.unlock();
             missile2[0][1] = missile2[0][1]+16;//Update new y value
             
        }

}

//Move Missile 3
void moveMissile3(void const *args) {
        Thread::wait(4000);
        
        missile3[0][0] = getRandNum(); //x coordinate
        missile3[0][1] = 0;  //y coordinate
        
        //draw Missile
        lcd_mutex.lock();
        uLCD.media_init();
        uLCD.set_sector_address(0x0040, 0x4081);
        uLCD.display_image(missile3[0][0], missile3[0][1]);
        lcd_mutex.unlock();

        while(1) {
             
             lcd_mutex.lock();
             uLCD.filled_rectangle(missile3[0][0], missile3[0][1] ,missile3[0][0]+16 , missile3[0][1]+16 ,WHITE);
             uLCD.media_init();
             uLCD.set_sector_address(0x0040, 0x4081);
             //Reset missile
             if (missile3[0][1] == 112) {
                missile3[0][1] = -16;
                missile3[0][0] = getRandNum();    
             }
             uLCD.display_image(missile3[0][0], missile3[0][1]+16);//Move missile down
             lcd_mutex.unlock();
             missile3[0][1] = missile3[0][1]+16;//Update new y value
             
        }

}


// Key hit/release interrupt routine
void fallInterrupt() {
  int key_code=0;
  int i=0;
  int value=mpr121.read(0x00);
  value +=mpr121.read(0x01)<<8;
  // LED demo mod
  i=0;
  // puts key number out to LEDs for demo
  for (i=0; i<12; i++) {
  if (((value>>i)&0x01)==1) key_code=i+1;
  }
  
  if (key_code == 0x4 && currentShipX != 16) {
        currentShipX = currentShipX - 16;
   }
  if (key_code == 0x3 && currentShipX != 96) {
        currentShipX = currentShipX + 16;
   }      
}

inline float random_number()
{
    return (rand()/(float(RAND_MAX)));
}

int getRandNum() {
        
    x = random_number();
    x = x * 6;
    x = x+1;
    
    return (((int)x) * 16);
    
}


void gameover() {
    
    uLCD.background_color(WHITE);
    uLCD.cls();
    uLCD.background_color(WHITE);
    uLCD.textbackground_color(WHITE);
    
    uLCD.media_init();
    uLCD.set_sector_address(0x0040, 0x4089);
    uLCD.display_video(0, 0);
    
    uLCD.background_color(WHITE);
    uLCD.cls();
    uLCD.background_color(WHITE);
    uLCD.textbackground_color(WHITE);
    
    uLCD.printf("Gameover");
    FILE *wave_file;
    wave_file=fopen("/sd/gameover.wav","r");
    waver.play(wave_file);
    fclose(wave_file);    
}

int main() {
    
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
    
    uLCD.baudrate(3000000);
        
    uLCD.background_color(WHITE);
    uLCD.cls();
    uLCD.background_color(WHITE);
    uLCD.textbackground_color(WHITE);
    
    Thread thread0(moveShip);
    Thread thread1(moveMissile0);
    Thread thread2(moveMissile1);
    Thread thread3(moveMissile2);
    Thread thread4(moveMissile3);    
    bool keepGoing = true;

      
    while(1) {
        
        if (((currentShipX == missile0[0][0] && missile0[0][1] == 112)|| 
            (currentShipX == missile1[0][0] && missile1[0][1]== 112) ||
            (currentShipX == missile2[0][0] && missile2[0][1]== 112) || 
            (currentShipX == missile3[0][0] && missile3[0][1]== 112)) && 
            keepGoing) {
                keepGoing = false;
                thread0.terminate();
                thread1.terminate();
                thread2.terminate();
                thread3.terminate();
                thread4.terminate();
                gameover();
        }

    }
}