4180 lab4

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

Fork of WavePlayer_HelloWorld by jim hamblen

main.cpp

Committer:
ihansw
Date:
2016-11-03
Revision:
2:82f454fd6efa
Parent:
1:5b8e223e983d

File content as of revision 2:82f454fd6efa:


#include <mbed.h>
#include <string>
#include <list>
#include "uLCD_4DGL.h"
#include "DebounceIn.h"
#include "wave_player.h"
#include "SDFileSystem.h"
#include "rtos.h"
#include "stdio.h"
#include "map_public.h"
#include "globals.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

DebounceIn  push5(p21);
DebounceIn  push4(p22);
DebounceIn  push3(p23);

DebounceIn  push2(p24);
DebounceIn  push1(p25);

InterruptIn interrupt(p11);
I2C i2c(p9, p10);



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

AnalogOut DACout(p18);
uLCD_4DGL uLCD(p13,p14,p15);
wave_player waver(&DACout);

Mutex stdio_mutex; 
Mutex lcd_mutex;


volatile int check = 0;
volatile int status = 0;
volatile int global;
volatile int point_bar = 4;
volatile int songNum = 1;


int score = 0;
volatile int meter = 15;
int scrollSpeed = 6;

int node1Pressed = 0;
int node2Pressed = 0;
int node3Pressed = 0;
int node4Pressed = 0;


struct gameNode {
    int yPos;
    int alive;
    gameNode *next;
};

gameNode* node1Root = NULL;
gameNode* node2Root = NULL;
gameNode* node3Root = NULL;
gameNode* node4Root = NULL;

enum gameState{
    begin,
    playing,
    over
};


enum node{
    node1,
    node2,
    node3,
    node4,
    none,
};

int nodeToDelete(none);

void deleteRoot (gameNode* &gNode, int nodeNum) {
    gameNode* temp = gNode;
    
    switch(nodeNum) {
        case 1:
        //uLCD.line(4, gNode->yPos-scrollSpeed, 14, gNode->yPos+10-scrollSpeed, BACKGROUND_COLOR);
        //uLCD.line(4, gNode->yPos-scrollSpeed, 14, gNode->yPos-10-scrollSpeed, BACKGROUND_COLOR);
        if(gNode->yPos>100 && gNode->yPos<120)
        {
            uLCD.filled_rectangle(37, gNode->yPos-scrollSpeed, 59, gNode->yPos-scrollSpeed+5, YELLOW);
        }
        else
        {
            uLCD.filled_rectangle(37, gNode->yPos-scrollSpeed,59,gNode->yPos-scrollSpeed+5,0x1E01AF);
        }
        break;
        
        case 2:
        if(gNode->yPos>100 && gNode->yPos<120)
        {
            uLCD.filled_rectangle(60, gNode->yPos-scrollSpeed, 82, gNode->yPos-scrollSpeed+5, YELLOW);
        }
        else
        {
            uLCD.filled_rectangle(60, gNode->yPos-scrollSpeed,82,gNode->yPos-scrollSpeed+5,0x1E01AF);
        }
        //uLCD.filled_rectangle(37,gNode->yPos-scrollSpeed,57,gNode->yPos-scrollSpeed+5,BACKGROUND_COLOR); 
        //uLCD.line(47, gNode->yPos-scrollSpeed-10, 37, gNode->yPos-scrollSpeed, BACKGROUND_COLOR);
        //uLCD.line(47, gNode->yPos-scrollSpeed-10, 57, gNode->yPos-scrollSpeed, BACKGROUND_COLOR);
        break;
        
        case 3:
        if(gNode->yPos>100 && gNode->yPos<120)
        {
            uLCD.filled_rectangle(83, gNode->yPos-scrollSpeed, 105, gNode->yPos-scrollSpeed+5, YELLOW);
        }
        else
        {
            uLCD.filled_rectangle(83, gNode->yPos-scrollSpeed,105,gNode->yPos-scrollSpeed+5,0x1E01AF);
        }
        //uLCD.filled_rectangle(70,gNode->yPos-scrollSpeed,90,gNode->yPos-scrollSpeed+5,BACKGROUND_COLOR); 
        //uLCD.line(80, gNode->yPos-scrollSpeed+10, 70, gNode->yPos-scrollSpeed, BACKGROUND_COLOR);
        //uLCD.line(80, gNode->yPos-scrollSpeed+10, 90, gNode->yPos-scrollSpeed, BACKGROUND_COLOR);
        break;
        
        case 4:
        if(gNode->yPos>100 && gNode->yPos<120)
        {
            uLCD.filled_rectangle(106, gNode->yPos-scrollSpeed, 128, gNode->yPos-scrollSpeed+5, YELLOW);
        }
        else
        {
            uLCD.filled_rectangle(106, gNode->yPos-scrollSpeed,128,gNode->yPos-scrollSpeed+5,0x1E01AF);
        }
        //uLCD.filled_rectangle(104,gNode->yPos-scrollSpeed,124,gNode->yPos-scrollSpeed+5,BACKGROUND_COLOR); 
        //uLCD.line(124, gNode->yPos-scrollSpeed, 114, gNode->yPos-scrollSpeed+10, BACKGROUND_COLOR);
        //uLCD.line(124, gNode->yPos-scrollSpeed, 114, gNode->yPos-scrollSpeed-10, BACKGROUND_COLOR);
        break;    
    }
    
    gNode = gNode->next;
    delete temp;
}



void addToEnd (gameNode* &root) {
    gameNode * temp = root;
    if (root == NULL)
    {
        root = new gameNode;
        root->yPos = 10;
        root->alive = 1;
        root->next = 0;  
    }
    else {
        while (temp->next)
        {
            temp = temp->next;    
        }    
    
        temp->next = new gameNode;
        temp = temp->next;
        temp->yPos = 10;
        temp->alive = 1;
        temp->next = 0;  
    }
}


void drawnode1gameNode (int y) {
    if(y > 100 && y < 120)
    {
        uLCD.filled_rectangle(37,y-scrollSpeed, 59, y-scrollSpeed+5, YELLOW);
    }
    else {
        uLCD.filled_rectangle(37,y-scrollSpeed,59,y-scrollSpeed+5,0x1E01AF);
    }
    uLCD.filled_rectangle(37,y,59,y+5,WHITE); 
    
}

void drawnode2gameNode (int y) {
    if(y > 100 && y < 120)
    {
        uLCD.filled_rectangle(60,y-scrollSpeed, 82, y-scrollSpeed+5, YELLOW);
    }
    else {
        uLCD.filled_rectangle(60,y-scrollSpeed,82,y-scrollSpeed+5,0x1E01AF);
    }
    uLCD.filled_rectangle(60,y,82,y+5,WHITE); 

}

void drawnode3gameNode (int y) {
    if(y > 100 && y < 120)
    {
        uLCD.filled_rectangle(83,y-scrollSpeed, 105, y-scrollSpeed+5, YELLOW);
    }
    else {
        uLCD.filled_rectangle(83,y-scrollSpeed,105,y-scrollSpeed+5,0x1E01AF);
    }
    uLCD.filled_rectangle(83,y,105,y+5,WHITE); 
    
}

void drawnode4gameNode (int y) {
    if(y > 100 && y < 120)
    {
        uLCD.filled_rectangle(106,y-scrollSpeed, 128, y-scrollSpeed+5, YELLOW);
    }
    else {
        uLCD.filled_rectangle(106,y-scrollSpeed,128,y-scrollSpeed+5,0x1E01AF);
    } 
    uLCD.filled_rectangle(106,y,128,y+5,WHITE); 
}



void notify(const char* name, int state) {
    stdio_mutex.lock();
    printf("%s: %d\n\r", name, state);
    stdio_mutex.unlock();
}

void test_thread(void const *args) {
    while (true) {
        notify((const char*)args, 0); Thread::wait(1000);
        notify((const char*)args, 1); Thread::wait(1000);
    }
}

void thread1(void const *args)
{
    
    while(1)
    {
        if(status == 1)
        {
            
            
            //led1 = 1;
            status = 0;
            
            if(songNum == 1)
            {
                FILE *wave_file;
                wave_file=fopen("/sd/TWICE_TT_converted.wav","r");
                waver.play(wave_file);
                fclose(wave_file);
                meter = 0;
            }
            
            else if(songNum == 2)
            {
                FILE *wave_file;
                wave_file=fopen("/sd/Star_Wars_converted.wav","r");
                waver.play(wave_file);
                fclose(wave_file);
                meter = 0;
            }
                
            else
            {
                FILE *wave_file;
                wave_file=fopen("/sd/Terra_converted.wav","r");
                waver.play(wave_file);
                fclose(wave_file);
                meter = 0;
            }
            
            //led2 = 1;
        }
    }
    
}



int main()
{
    srand(time(NULL));
    push1.mode(PullUp);
    push2.mode(PullUp);
    push3.mode(PullUp);
    push4.mode(PullUp);
    push5.mode(PullUp);
    
    int setup = 1;
    
    Thread t1(thread1);
    
    uLCD.baudrate(3000000);
    
    int gameOn=1;
    int ready;
    int node1Counter;
    int node2Counter;
    int node3Counter;
    int node4Counter;
    int deleted=0;
    int drawgameNode=1;
    Timer t;
    float time = 0.0;
    gameNode* temp;
    node1Counter = rand()%150+50;
    node2Counter = rand()%150+50;
    node3Counter = rand()%150+50;
    node4Counter = rand()%150+50;
    scrollSpeed = 6;
    
    
    
    while(setup)
    {
        int GameStart = 0;
        int GameOver = 0;
        int old_pb = 0;
    
        int new_pb1;
        int new_pb2;
        int new_pb3;
        
        uLCD.locate(0,0);
        uLCD.printf("Rhythm Game");
        uLCD.locate(0,2);
        uLCD.printf("Song Select");
        uLCD.locate(3,4);
        uLCD.printf("TWICE_TT");
        uLCD.locate(3,5);
        uLCD.printf("Star_Wars");
        uLCD.locate(3,6);
        uLCD.printf("Terra");
        uLCD.locate(0,4);
        uLCD.printf("->");
    
        int p_bar = 4;
        
        
        while(!GameOver)
        {
            new_pb1 = push1;
            new_pb2 = push2;
            new_pb3 = push3;
            
            //Moving Down
            if((new_pb1 ==0)&&(old_pb==1)&&(p_bar!=4))
            {
                if(p_bar==5)
                {
                    p_bar = 4;
                    uLCD.locate(0,p_bar);
                    uLCD.printf("->");
                    uLCD.locate(0,5);
                    uLCD.printf("  ");
                    uLCD.locate(0,6);
                    uLCD.printf("  ");
                }
        
                else
                {
                    p_bar = 5;
                    uLCD.locate(0,p_bar);
                    uLCD.printf("->");
                    uLCD.locate(0,4);
                    uLCD.printf("  ");
                    uLCD.locate(0,6);
                    uLCD.printf("  ");
                }
                old_pb = new_pb1;
            }
            //Moving Up
            else if((new_pb3 ==0)&&(old_pb==1)&&(p_bar!=6))
            {
                if(p_bar==4)
                {
                    p_bar = 5;
                    uLCD.locate(0,p_bar);
                    uLCD.printf("->");
                    uLCD.locate(0,6);
                    uLCD.printf("  ");
                    uLCD.locate(0,4);
                    uLCD.printf("  ");
                }
        
                else
                {
                    p_bar = 6;
                    uLCD.locate(0,p_bar);
                    uLCD.printf("->");
                    uLCD.locate(0,4);
                    uLCD.printf("  ");
                    uLCD.locate(0,5);
                    uLCD.printf("  ");
                }
                old_pb = new_pb3;
            }
            
            
            else if((new_pb2 ==0)&&(old_pb==1))
            {
               
               
               
                uLCD.locate(0,8);
                uLCD.printf("song is selected");
                wait(1);
                
                uLCD.cls();
                
                if(p_bar == 4)
                {
                    songNum = 1;
                    status = 1;
                    
                    uLCD.cls();
                    uLCD.locate(0,3);
                    uLCD.printf("Start TT");
                    wait(.3);
                    GameOver = 1;
                    uLCD.cls();
                }           
                
                else if(p_bar == 5)
                {
                    songNum = 2;
                    status = 1;
                    
                    uLCD.cls();
                    uLCD.locate(0,3);
                    uLCD.printf("Start StarWars");
                    wait(.3);
                    GameOver = 1;
                    uLCD.cls();
                }   
                     
                else
                {
                    songNum = 3;
                    status = 1;
                    
                    uLCD.cls();
                    uLCD.locate(0,3);
                    uLCD.printf("Start Terra");
                    wait(.3);
                    GameOver = 1;
                    uLCD.cls();
                }     
                
            
                
                while(gameOn)
                {
                    t.reset();
                    t.start();
                    drawgameNode = 1;
        
                    //map_init();
                    uLCD.filled_rectangle(31,0,36,128,0xD9431C);
                    uLCD.filled_rectangle(37,0,128,120,0x1E01AF);
                    uLCD.filled_rectangle(37,98,128,120,YELLOW);
                    if(node1Counter <= 0)
                    {
                        addToEnd(node1Root);
                        node1Counter = rand()%150+50;
                        drawgameNode = 0;
                    }
                    node1Counter -= scrollSpeed;
                    temp = node1Root;//node1Root = NULL
                    while(temp!=NULL)
                    {
                        drawnode1gameNode(temp->yPos);
                        temp->yPos += scrollSpeed;
                        temp = temp->next;
                    }
                    if(node1Root != NULL)
                    {
                        if(node1Root->yPos >= 120 || nodeToDelete == node1)
                        {
                            //meter--;
                            deleteRoot(node1Root, 1);
                            deleted = 1;
                        }
                    }
        
                    if(node2Counter<=0&&drawgameNode)
                    {
                        addToEnd(node2Root);
                        node2Counter = rand()%150+50;
                        drawgameNode=0;
                    }
                    node2Counter -=scrollSpeed;//node2Counter = node2Counter - scrollSpeed
                    temp = node2Root;
                    while(temp != NULL)
                    {
                        drawnode2gameNode(temp->yPos);
                        temp->yPos += scrollSpeed;
                        temp = temp->next;
                    }
                    if(node2Root != NULL)
                    {
                        if(node2Root->yPos >= 120 || nodeToDelete == node2)
                        {
                            //meter--;
                            deleteRoot(node2Root, 2);
                            deleted = 1;
                        }
                    }
        
                    if(node3Counter<=0&&drawgameNode)
                    {
                        addToEnd(node3Root);
                        node3Counter = rand()%150+50;
                        drawgameNode=0;
                    }
                    node3Counter -=scrollSpeed;
                    temp = node3Root;
                    while(temp != NULL)
                    {
                        drawnode3gameNode(temp->yPos);
                        temp->yPos += scrollSpeed;
                        temp = temp->next;
                    }
                    
                    if(node3Root != NULL)
                    {
                        if(node3Root->yPos >= 120 || nodeToDelete == node3)
                        {
                            //meter--;
                            deleteRoot(node3Root, 3);
                            deleted = 1;
                        }
                    }
        
                    if(node4Counter<=0&&drawgameNode)
                    {
                        addToEnd(node4Root);
                        node4Counter = rand()%150+50;
                        drawgameNode=0;
                    }
                    node4Counter -=scrollSpeed;
                    temp = node4Root;
                    while(temp != NULL)
                    {
                        drawnode4gameNode(temp->yPos);
                        temp->yPos += scrollSpeed;
                        temp = temp->next;
                    }
                    if(node4Root != NULL)
                    {
                        if(node4Root->yPos >= 120 || nodeToDelete == node4)
                        {
                            //meter--;
                            deleteRoot(node4Root, 4);
                            deleted = 1;
                        }
                    }
        
                    //interrupt
                    if(!push2)
                    {//push button is a Pull-Up, so the initial condition is 1 flippled to 0
                        node1Pressed = 1;
                        if(node1Root)
                        {
                            if(node1Root->yPos > 90 && node1Root->yPos < 128)
                            {
                                score++;
                                //meter+=2;
                            }
                            if(node1Root->yPos > 95)
                            {
                                nodeToDelete = node1;
                            }
                        }
                    }
                    if(!push3)
                    {
                        node2Pressed = 1;
                        if(node2Root)
                        {
                            if(node2Root->yPos > 90 && node2Root->yPos < 128)
                            {
                                score++;
                                //meter+=2;
                            }
                            if(node2Root->yPos > 95)
                            {
                                nodeToDelete = node2;
                            }
                        }
                    }
                    if(!push4)
                    {
                        node3Pressed = 1;
                        if(node3Root)
                        {
                            if(node3Root->yPos > 90 && node3Root->yPos < 128)
                            {
                                score++;
                                //meter+=2;
                            }
                            if(node3Root->yPos > 95)
                            {
                                nodeToDelete = node3;
                            }
                        }
                    }
                    if(!push5)
                    {
                        node4Pressed = 1;
                        if(node4Root)
                        {
                            if(node4Root->yPos > 90 && node4Root->yPos < 128)
                            {
                                score++;
                                //meter+=2;
                            }
                            if(node4Root->yPos > 95)
                            {
                                nodeToDelete = node4;
                            }
                        }
                    }
                    if(!push1)
                    {
                        status = 0;
                        uLCD.cls();
                        break;
                    }
        
        
                    /////interrupt done
                    t.stop();
                    time = .1-t.read();
                    if (time < 0) time = 0;
                    uLCD.locate(0,0);
                    uLCD.text_width(1);
                    uLCD.printf("Score");
                    uLCD.locate(0,1);
                    uLCD.printf("%04d",score);
                    if(meter>15) meter=15;
                    
                    if(meter==0)
                    {
                        while(node1Root)
                        {
                            deleteRoot(node1Root,1);
                        }
                        while(node2Root)
                        {
                            deleteRoot(node2Root,2);
                        }
                        while(node3Root)
                        {
                            deleteRoot(node3Root,3);
                        }
                        while(node4Root)
                        {
                            deleteRoot(node4Root,4);
                        }
                        uLCD.cls();
                        uLCD.locate(5,8);
                        uLCD.text_mode(OPAQUE);
                        uLCD.printf("GAME OVER");
                        uLCD.locate(2,9);
                        uLCD.printf("your score: %d", score);
                        meter=15;
                        score=0;
                        wait(2);
                        break;
                    }
                    
                    
                    //uLCD.locate(0,2);
                    //uLCD.set_font_size(4,4);
                    //uLCD.printf("Life");
                    //uLCD.locate(0,3);
                    //uLCD.printf("%2d",meter);
                    
                    if (deleted)
                    {
                        nodeToDelete = none;
                        deleted = 0;
                    }
                    
                    //wait(time);
                    
                    //uLCD.cls();
                    old_pb = new_pb2; 
                    
                }//GameOn over      
            
                
            }
            else
            {
                uLCD.locate(0,9);
                //uLCD.printf("else else");
                old_pb = new_pb1;
            }
        }
        
    
    }
    
}