Using mbed LPC1768, navigation swith (Joystick), uLCD-144-G2, microSD Transflash Breakout, Class D high-efficiency audio amp and a small speaker.

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

main.cpp

Committer:
hfu36
Date:
2017-03-13
Revision:
0:19998fa94cbc

File content as of revision 0:19998fa94cbc:

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

DigitalOut led1(LED1);
DigitalOut led2(LED2);
SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
uLCD_4DGL uLCD(p13,p14,p11); // serial tx, serial rx, reset pin;
AnalogOut DACout(p18);
wave_player waver(&DACout);
Serial pc(USBTX, USBRX); 

void sanke_ladder(){
    //ladder
    uLCD.line(84, 20, 84, 44, WHITE);
    uLCD.line(92, 20, 92, 44, WHITE);
    uLCD.line(84, 24, 92, 24, WHITE);
    uLCD.line(84, 40, 92, 40, WHITE);
    
    //sanke
    uLCD.line(72, 24, 72, 56, WHITE);
    uLCD.line(64, 32, 72, 24, WHITE);
    uLCD.line(72, 24, 80, 32, WHITE);
    }

void playdice(){       
       FILE *wave_file;
       wave_file=fopen("/sd/Dice.wav","r");
       waver.play(wave_file);
       fclose(wave_file);
       wait(0.01);
}

void playTaDa(){
       FILE *wave_file;
       wave_file=fopen("/sd/TaDa.wav","r");
       waver.play(wave_file);
       fclose(wave_file);
       wait(0.01);
}

void playSad(){
       FILE *wave_file;
       wave_file=fopen("/sd/Sad.wav","r");
       waver.play(wave_file);
       fclose(wave_file);
       wait(0.01);
}

void rollingdice1(){
       playdice();
       uLCD.filled_rectangle(17, 91, 47, 121, 0xFF0000);
       uLCD.filled_rectangle(17, 91, 47, 121, 0x000000);
       uLCD.filled_rectangle(17, 91, 47, 121, 0xFF0000);
       uLCD.filled_rectangle(17, 91, 47, 121, 0x000000);
       wait(1);
}

void rollingdice2(){
       playdice();
       uLCD.filled_rectangle(81, 91, 111, 121, 0x0080FF);
       uLCD.filled_rectangle(81, 91, 111, 121, 0x000000);
       uLCD.filled_rectangle(81, 91, 111, 121, 0x0080FF);
       uLCD.filled_rectangle(81, 91, 111, 121, 0x000000);
       wait(1);
}



class Nav_Switch
{
public:
    Nav_Switch(PinName up,PinName down);
    //int read();
//boolean functions to test each switch
    bool up();
    bool down();

private:
    BusIn _pins;
};
Nav_Switch::Nav_Switch (PinName up,PinName down):
    _pins(up, down)
{
    _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
    wait(0.1); //delays just a bit for pullups to pull inputs high
}
inline bool Nav_Switch::up()
{
    return !(_pins[0]);
}
inline bool Nav_Switch::down()
{
    return !(_pins[1]);
}

Nav_Switch myNav( p25, p22); //pin order on Sparkfun breakout
 
int main()
{
    pc.printf("GAME START\r\n"); 
    
    //draw the board
    //horizongtal line
    uLCD.line(32, 16, 96, 16, WHITE);
    uLCD.line(32, 32, 96, 32, WHITE);
    uLCD.line(32, 48, 96, 48, WHITE);
    uLCD.line(32, 64, 96, 64, WHITE);
    uLCD.line(32, 80, 96, 80, WHITE);
    
    //veritical line
    uLCD.line(32, 16, 32, 80, WHITE);
    uLCD.line(48, 16, 48, 80, WHITE);
    uLCD.line(64, 16, 64, 80, WHITE);
    uLCD.line(80, 16, 80, 80, WHITE);
    uLCD.line(96, 16, 96, 80, WHITE);
    
    //sanke%ladder
    sanke_ladder();
     
    //draw the dice1
    //horizontal
    uLCD.line(16, 90, 48, 90, WHITE);
    uLCD.line(16, 122, 48, 122, WHITE);
    //vertical
    uLCD.line(16, 90, 16, 122, WHITE);
    uLCD.line(48, 90, 48, 122, WHITE);  
    
    //draw the dice2
    //horizontal
    uLCD.line(80, 90, 112, 90, WHITE);
    uLCD.line(80, 122, 112, 122, WHITE);
    //vertical
    uLCD.line(80, 90, 80, 122, WHITE);
    uLCD.line(112, 90, 112, 122, WHITE); 
    //initialize the positions of dot1 and dot 2
    int p1=0;
    int p2=0;
    while(1) {

        //Push to roll the dice1
        if(myNav.up()) {
        led1=1;led2=0;
        pc.printf("rolling Dice 1\r\n"); 
        wait(0.5); 
        int move1=rand()%6+1;
        pc.printf(" Move1:%d\r\n",move1); 
        
       switch (move1){
       case 1:
       rollingdice1();
       uLCD.filled_circle(32, 106, 3, 0xFF0000);
       break;
       
       case 2:
       rollingdice1();
       uLCD.filled_circle(40, 98, 3, 0xFF0000);
       uLCD.filled_circle(24, 114, 3, 0xFF0000);       
       break;
       
       case 3:
       rollingdice1();
       uLCD.filled_circle(40, 98, 3, 0xFF0000);
       uLCD.filled_circle(32, 106, 3, 0xFF0000);
       uLCD.filled_circle(24, 114, 3, 0xFF0000);     
       break;
       
       case 4:
       rollingdice1();
       uLCD.filled_circle(24, 98, 3, 0xFF0000);
       uLCD.filled_circle(40, 98, 3, 0xFF0000);
       uLCD.filled_circle(24, 113, 3, 0xFF0000);
       uLCD.filled_circle(40, 113, 3, 0xFF0000);      
       break;
       
       case 5:
       rollingdice1();
       uLCD.filled_circle(24, 98, 3, 0xFF0000);
       uLCD.filled_circle(40, 98, 3, 0xFF0000);
       uLCD.filled_circle(24, 113, 3, 0xFF0000);
       uLCD.filled_circle(40, 113, 3, 0xFF0000);
       uLCD.filled_circle(32, 105, 3, 0xFF0000);       
       break;
       
       case 6:
       rollingdice1();
       uLCD.filled_circle(24, 98, 3, 0xFF0000);
       uLCD.filled_circle(40, 98, 3, 0xFF0000);
       uLCD.filled_circle(24, 105.5, 3, 0xFF0000);
       uLCD.filled_circle(40, 105.5, 3, 0xFF0000);
       uLCD.filled_circle(24, 113, 3, 0xFF0000);
       uLCD.filled_circle(40, 113, 3, 0xFF0000);
       break; }//end of switch move1
       
       //draw dot 1
           if (p1 + move1>16){
            //clear screen
            int x1; int y1;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            //new P1
            p1 =16-(p1+move1 -16);   
            pc.printf("New P1: %d\r\n",p1);
            //draw P1 dot
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            pc.printf("x1:%d\r\n",x1);
            pc.printf("y1:%d\r\n\n",y1);
            
            //draw P1 dot
            sanke_ladder();
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            wait(1);
            
            //snake and ladder
            if(p1==4){
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            sanke_ladder();
            playTaDa();
            p1=8;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            pc.printf("x1 jump to:%d\r\n",x1);
            pc.printf("y1 jump to:%d\r\n\n",y1);  
            }//end of if(p1==4)
            
            else if (p1==11) {
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            sanke_ladder();
            playSad();
            p1=3;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            pc.printf("x1 drop to:%d\r\n",x1);
            pc.printf("y1 drop to:%d\r\n\n",y1);
            }//end of else if (p1==1)
    
            }//end of if(p1 + move1>16)
          else {
            //clear screen
            int x1; int y1;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            //new P1
            p1 =p1 + move1;
            pc.printf("New P1:%d\r\n",p1);
                   
            //calculate P1 (x,y)
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            pc.printf("x1:%d\r\n",x1);
            pc.printf("y1:%d\r\n\n",y1);
            sanke_ladder();
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            wait(0.1);
            
            //snake and ladder
            if(p1==4){
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            sanke_ladder();
            playTaDa();
            p1=8;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            pc.printf("x1 jump to:%d\r\n",x1);
            pc.printf("y1 jump to:%d\r\n\n",y1);  
            }//end of if(p1==4)
            
            else if (p1==11) {
            uLCD.filled_circle(x1, y1, 3, 0x000000);
            sanke_ladder();
            playSad();
            p1=3;
            x1=(((p1%4)+3)%4)*16+36;
            y1=((p1-((((p1%4)+3)%4)+1))/4)*16+20;
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            pc.printf("x1 drop to:%d\r\n",x1);
            pc.printf("y1 drop to:%d\r\n\n",y1);
            } //end of elseif(p1==11)
            
            //draw P1 dot
            uLCD.filled_circle(x1, y1, 3, 0xFF0000);
            wait(1);
            }//end of else_p1<16
            
    if (p1 ==16){
    //SD card needed with image and video files for last two demos
    uLCD.cls();
    uLCD.media_init();
    uLCD.set_sector_address(0x0000, 0x0000);
    uLCD.display_image(0,0);
    
    //Play the wave file
    FILE *wave_file;
    //printf("\n\n\nHello, wave world!\n");
    wave_file=fopen("/sd/Cheering.wav","r");
    waver.play(wave_file);
    fclose(wave_file);
    wait(0.01);
    
        pc.printf("P1 WIN!");
        uLCD.cls();
        uLCD.color(RED);
        uLCD.locate(2,6);
        uLCD.text_width(2); 
        uLCD.text_height(2);
        uLCD.printf("P1 WON!");
        break;
    }//end of if(p1==16)
    
       wait(0.5);  
       }//end of if(myNav.up())
        
    //push to roll the dice2 
    else if(myNav.down()){
       led1=0;
       led2=1;
       pc.printf("rolling Dice 2\r\n");
       int move2 = rand()%6+1; 
       pc.printf("DICE2: %d\r\n\n",move2);
       
       switch (move2){
       case 1:  
       rollingdice2();
       uLCD.filled_circle(96, 106, 3, 0x0080FF);
       break;
       
       case 2:
       rollingdice2();
       uLCD.filled_circle(104, 98, 3, 0x0080FF);
       uLCD.filled_circle(88, 114, 3, 0x0080FF);       
       break;
       
       case 3:
       rollingdice2();
       uLCD.filled_circle(104, 98, 3, 0x0080FF);
       uLCD.filled_circle(96, 106, 3, 0x0080FF);
       uLCD.filled_circle(88, 114, 3, 0x0080FF);     
       break;
       
       case 4:
       rollingdice2();
       uLCD.filled_rectangle(81, 91, 111, 121, 0x000000);
       uLCD.filled_circle(88, 98, 3, 0x0080FF);
       uLCD.filled_circle(104, 98, 3, 0x0080FF);
       uLCD.filled_circle(88, 113, 3, 0x0080FF);
       uLCD.filled_circle(104, 113, 3, 0x0080FF);      
       break;
       
       case 5:
       rollingdice2();
       uLCD.filled_rectangle(81, 91, 111, 121, 0x000000);
       uLCD.filled_circle(88, 98, 3, 0x0080FF);
       uLCD.filled_circle(104, 98, 3, 0x0080FF);
       uLCD.filled_circle(88, 113, 3, 0x0080FF);
       uLCD.filled_circle(104, 113, 3, 0x0080FF);
       uLCD.filled_circle(96, 105, 3, 0x0080FF);       
       break;
       
       case 6:
       rollingdice2();
       uLCD.filled_circle(88, 98, 3, 0x0080FF);
       uLCD.filled_circle(104, 98, 3, 0x0080FF);
       uLCD.filled_circle(88, 105.5, 3, 0x0080FF);
       uLCD.filled_circle(104, 105.5, 3, 0x0080FF);
       uLCD.filled_circle(88, 113, 3, 0x0080FF);
       uLCD.filled_circle(104, 113, 3, 0x0080FF);
       break; 
       }//end of switch move2
    
       //draw dot 2
        if (p2 + move2>16){
            //clear screen
            int x2; int y2;
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            //new P2
            p2 =16-(p2+move2 -16);   
            pc.printf("New P2: %d\r\n",p2);
            //draw P1 dot
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2:%d\r\n",x2);
            pc.printf("y2:%d\r\n\n",y2);
            
            //draw P1 dot
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            wait(1);
            
            //snake and ladder
            if(p2==4){
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            sanke_ladder();
            playTaDa();
            p2=8;
            pc.printf("P2 jump to:%d\r\n",p2);
                
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2 jump to:%d\r\n",x2);
            pc.printf("y2 jump to:%d\r\n\n",y2);
            
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            }//end of if(p2==4)
            
            else if (p2==11) {
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            sanke_ladder();
            playSad();
            p2=3;
            pc.printf("P2 drop to:%d\r\n",p2);
            
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p1%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2 drop to:%d\r\n",x2);
            pc.printf("y2 drop to:%d\r\n\n",y2);
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            }//end of elseif(p2==1)   
        }//end of if(p2 + move2>16)
        
        else {
            //clear screen
            int x2; int y2;
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            //new P2
            p2 =p2 + move2;
            pc.printf("New P2:%d\r\n",p2);        
            //calculate P2(x,y)
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2:%d\r\n",x2);
            pc.printf("y2:%d\r\n\n",y2);
            
            //draw P2 dot
            sanke_ladder();
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            wait(0.5);
            
            //snake and ladder
            if(p2==4){
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            sanke_ladder();
            playTaDa();
            p2=8;
            pc.printf("P2 jump to:%d\r\n",p2);
                
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p2%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2 jump to:%d\r\n",x2);
            pc.printf("y2 jump to:%d\r\n\n",y2);
            
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            }//end of if
            
            else if (p2==11) {
            uLCD.filled_circle(x2, y2, 3, 0x000000);
            sanke_ladder();
            playSad();
            p2=3;
            pc.printf("P2 drop to:%d\r\n",p2);
            
            x2=(((p2%4)+3)%4)*16+36;
            y2=((p2-((((p1%4)+3)%4)+1))/4)*16+28;
            pc.printf("x2 drop to:%d\r\n",x2);
            pc.printf("y2 drop to:%d\r\n\n",y2);
            uLCD.filled_circle(x2, y2, 3, 0x0080FF);
            } //end of elseif
             
            wait(1);
        }//end of else
       
           if (p2 ==16){    
           //SD card needed with image and video files for last two demos
           uLCD.cls();
           uLCD.media_init();
           uLCD.set_sector_address(0x0000, 0x0000);
           uLCD.display_image(0,0);
    
           //Play the wave file
           FILE *wave_file;
           //printf("\n\n\nHello, wave world!\n");
           wave_file=fopen("/sd/Cheering.wav","r");
           waver.play(wave_file);
           fclose(wave_file);
           wait(0.01);
    
           pc.printf("P2 WIN!");
        
           uLCD.cls();
           uLCD.color(BLUE);
           uLCD.locate(2,6);
           uLCD.text_width(2);
           uLCD.text_height(2);
           uLCD.printf("P2 WON!");
           break;
           }//end of if(p2 ==16)
        
           wait(0.5); 
    }//end of else if(myNav.down())
           wait(0.02);
    }//end of while(1)
}//end of main