One player pong with seven segment display for score keeping

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

Fork of ECE2036Lab2StarterCode by Joseph Lind

Committer:
dcleary
Date:
Thu Mar 17 20:38:26 2016 +0000
Revision:
3:c93d1b51785c
Parent:
2:6163865f5ce3
Pong

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jlind6 0:356124c0bafc 1 #include "mbed.h"
jlind6 0:356124c0bafc 2 #include "PinDetect.h"
jlind6 0:356124c0bafc 3 #include "uLCD_4DGL.h"
dcleary 3:c93d1b51785c 4 #include "wave_player.h"
dcleary 3:c93d1b51785c 5 #include "SDFileSystem.h"
dcleary 3:c93d1b51785c 6 #include "ball.h"
dcleary 3:c93d1b51785c 7 #include "paddle.h"
dcleary 3:c93d1b51785c 8
dcleary 3:c93d1b51785c 9 Serial pc(USBTX, USBRX); // tx, rx
dcleary 3:c93d1b51785c 10 SDFileSystem sd(p5, p6, p7, p8, "sd");
dcleary 3:c93d1b51785c 11 AnalogOut DACout(p18);
dcleary 3:c93d1b51785c 12 wave_player waver(&DACout);
dcleary 3:c93d1b51785c 13
dcleary 3:c93d1b51785c 14 //Seven Segment Display
dcleary 3:c93d1b51785c 15 DigitalOut a(p11);
dcleary 3:c93d1b51785c 16 DigitalOut b(p12);
dcleary 3:c93d1b51785c 17 DigitalOut c(p13);
dcleary 3:c93d1b51785c 18 DigitalOut d(p14);
dcleary 3:c93d1b51785c 19 DigitalOut e(p15);
dcleary 3:c93d1b51785c 20 DigitalOut f(p16);
dcleary 3:c93d1b51785c 21 DigitalOut g(p17);
dcleary 3:c93d1b51785c 22
dcleary 3:c93d1b51785c 23 Ticker sevSegDisplay;
jlind6 0:356124c0bafc 24
jlind6 0:356124c0bafc 25 // Pushbuttons
dcleary 3:c93d1b51785c 26 PinDetect pbUp(p23);//p15
dcleary 3:c93d1b51785c 27 PinDetect pbDown(p24);//p16
jlind6 0:356124c0bafc 28 // uLCD
jlind6 0:356124c0bafc 29 uLCD_4DGL uLCD(p28, p27, p29);
dcleary 3:c93d1b51785c 30 //Ball
dcleary 3:c93d1b51785c 31 Ball myBall;
dcleary 3:c93d1b51785c 32 //Paddle
dcleary 3:c93d1b51785c 33 Paddle myPaddle;
jlind6 0:356124c0bafc 34
jlind6 0:356124c0bafc 35 // State machine definitions
jlind6 0:356124c0bafc 36 enum gameStateType {START, WAIT, GAME_SETUP, GAME, LOSE};
jlind6 0:356124c0bafc 37 /* State Definitions:
jlind6 0:356124c0bafc 38 * START -- Creates the start screen
jlind6 0:356124c0bafc 39 * WAIT -- After the start screen, goes into wait where mbed spins and does nothing
jlind6 0:356124c0bafc 40 * GAME_SETUP -- Sets up one time things (like boarders, initializes beginning velocity
jlind6 0:356124c0bafc 41 * GAME -- When the user actually gets to play
jlind6 0:356124c0bafc 42 * LOSE -- clears the screen, prints you lose, waits, then goes back to start
jlind6 0:356124c0bafc 43 */
jlind6 0:356124c0bafc 44
jlind6 0:356124c0bafc 45 // Global state machine variable (So that the pushbuttons can modify it)
jlind6 0:356124c0bafc 46 gameStateType gameState = START;
jlind6 0:356124c0bafc 47
dcleary 3:c93d1b51785c 48 void dScore()
dcleary 3:c93d1b51785c 49 {
dcleary 3:c93d1b51785c 50 switch(myPaddle.getScore()){
dcleary 3:c93d1b51785c 51 case 0://Zero digit
dcleary 3:c93d1b51785c 52 a=0;b=0;c=0;d=0;e=0;f =0;g=1;
dcleary 3:c93d1b51785c 53 break;
dcleary 3:c93d1b51785c 54 case 1://One digit
dcleary 3:c93d1b51785c 55 b=0;c =0;
dcleary 3:c93d1b51785c 56 a=1;d=1;e=1;f=1;g = 1;
dcleary 3:c93d1b51785c 57 break;
dcleary 3:c93d1b51785c 58 case 2://Two digit
dcleary 3:c93d1b51785c 59 a=0;b=0;g=0;e=0;d =0;
dcleary 3:c93d1b51785c 60 f=1;c = 1;
dcleary 3:c93d1b51785c 61 break;
dcleary 3:c93d1b51785c 62 case 3://Three digit
dcleary 3:c93d1b51785c 63 e=1;f =1;
dcleary 3:c93d1b51785c 64 a=0;b=0;c=0;d=0;g = 0;
dcleary 3:c93d1b51785c 65 break;
dcleary 3:c93d1b51785c 66 case 4://Four digit
dcleary 3:c93d1b51785c 67 f=0;g=0;b=0;c =0;
dcleary 3:c93d1b51785c 68 a=1;d=1;e = 1;
dcleary 3:c93d1b51785c 69 break;
dcleary 3:c93d1b51785c 70 case 5://Five digit
dcleary 3:c93d1b51785c 71 b=1;e =1;
dcleary 3:c93d1b51785c 72 a=0;c=0;d=0;f=0;g = 0;
dcleary 3:c93d1b51785c 73 break;
dcleary 3:c93d1b51785c 74 case 6://Six digit
dcleary 3:c93d1b51785c 75 b =1;
dcleary 3:c93d1b51785c 76 a=0;c=0;d=0;e=0;f=0;g = 0;
dcleary 3:c93d1b51785c 77 break;
dcleary 3:c93d1b51785c 78 case 7://Seven digit
dcleary 3:c93d1b51785c 79 a=0;b=0;c =0;
dcleary 3:c93d1b51785c 80 d=1;e=1;f=1;g = 1;
dcleary 3:c93d1b51785c 81 break;
dcleary 3:c93d1b51785c 82 case 8://Eight digit
dcleary 3:c93d1b51785c 83 a=0;b=0;c=0;d=0;e=0;f=0;g = 0;
dcleary 3:c93d1b51785c 84 break;
dcleary 3:c93d1b51785c 85 case 9://Nine digit
dcleary 3:c93d1b51785c 86 e=0;d =0;
dcleary 3:c93d1b51785c 87 a=1;b=1;c=1;f=1;g = 1;
dcleary 3:c93d1b51785c 88 break;
dcleary 3:c93d1b51785c 89 }
dcleary 3:c93d1b51785c 90 }
dcleary 3:c93d1b51785c 91
jlind6 0:356124c0bafc 92 // Pushbutton callbacks
jlind6 0:356124c0bafc 93 void pbUp_hit_callback (void)
jlind6 0:356124c0bafc 94 {
jlind6 0:356124c0bafc 95 switch (gameState)
jlind6 0:356124c0bafc 96 {
jlind6 0:356124c0bafc 97 case WAIT:
jlind6 0:356124c0bafc 98 gameState = GAME_SETUP;
jlind6 0:356124c0bafc 99 break;
jlind6 0:356124c0bafc 100 case GAME:
dcleary 3:c93d1b51785c 101 myPaddle.movePaddleUp();
jlind6 0:356124c0bafc 102 break;
jlind6 0:356124c0bafc 103 }
jlind6 0:356124c0bafc 104 }
jlind6 0:356124c0bafc 105
jlind6 0:356124c0bafc 106 void pbDown_hit_callback (void)
jlind6 0:356124c0bafc 107 {
jlind6 0:356124c0bafc 108 switch (gameState)
jlind6 0:356124c0bafc 109 {
jlind6 0:356124c0bafc 110 case WAIT:
jlind6 0:356124c0bafc 111 gameState = GAME_SETUP;
jlind6 0:356124c0bafc 112 break;
jlind6 0:356124c0bafc 113 case GAME:
dcleary 3:c93d1b51785c 114 myPaddle.movePaddleDown();
jlind6 0:356124c0bafc 115 break;
jlind6 0:356124c0bafc 116 }
jlind6 0:356124c0bafc 117 }
jlind6 0:356124c0bafc 118
jlind6 0:356124c0bafc 119 int main()
jlind6 0:356124c0bafc 120 {
jlind6 0:356124c0bafc 121 // This is setting up the pushbuttons
jlind6 0:356124c0bafc 122 pbUp.mode(PullUp);
jlind6 0:356124c0bafc 123 pbDown.mode(PullUp);
jlind6 0:356124c0bafc 124 wait(0.1);
jlind6 0:356124c0bafc 125 pbUp.attach_deasserted(&pbUp_hit_callback);
jlind6 0:356124c0bafc 126 pbDown.attach_deasserted(&pbDown_hit_callback);
jlind6 0:356124c0bafc 127 pbUp.setSampleFrequency();
jlind6 0:356124c0bafc 128 pbDown.setSampleFrequency();
dcleary 3:c93d1b51785c 129
dcleary 3:c93d1b51785c 130 uLCD.display_control(PORTRAIT_R);
jlind6 0:356124c0bafc 131 uLCD.cls();
jlind6 0:356124c0bafc 132 uLCD.baudrate(BAUD_3000000);
jlind6 0:356124c0bafc 133 uLCD.background_color(BLACK);
dcleary 3:c93d1b51785c 134
jlind6 0:356124c0bafc 135 int i = 0;
dcleary 3:c93d1b51785c 136 sevSegDisplay.attach(&dScore, 0.001);
dcleary 3:c93d1b51785c 137
jlind6 0:356124c0bafc 138 while (1)
jlind6 0:356124c0bafc 139 {
jlind6 0:356124c0bafc 140 switch (gameState)
jlind6 0:356124c0bafc 141 {
jlind6 0:356124c0bafc 142 case START:
dcleary 3:c93d1b51785c 143 gameState = WAIT;
dcleary 3:c93d1b51785c 144 //Bouncing Ball Demo
dcleary 3:c93d1b51785c 145 float fx=50.0,fy=21.0,vx=1.3,vy=0.8;
dcleary 3:c93d1b51785c 146 int x=50,y=21,radius=4;
dcleary 3:c93d1b51785c 147 uLCD.background_color(BLACK);
jlind6 0:356124c0bafc 148 uLCD.cls();
dcleary 3:c93d1b51785c 149 //draw walls
dcleary 3:c93d1b51785c 150 uLCD.line(0, 0, 127, 0, WHITE);
dcleary 3:c93d1b51785c 151 uLCD.line(127, 0, 127, 127, WHITE);
dcleary 3:c93d1b51785c 152 uLCD.line(127, 127, 0, 127, WHITE);
dcleary 3:c93d1b51785c 153 uLCD.line(0, 127, 0, 0, WHITE);
dcleary 3:c93d1b51785c 154 while(gameState == WAIT) {//for (int i=0; i<1500; i++) {
dcleary 3:c93d1b51785c 155 //draw ball
dcleary 3:c93d1b51785c 156 uLCD.filled_circle(x, y, radius, RED);
dcleary 3:c93d1b51785c 157 //bounce off edge walls and slow down a bit?
dcleary 3:c93d1b51785c 158 if ((x<=radius+1) || (x>=126-radius)) vx = -vx;
dcleary 3:c93d1b51785c 159 if ((y<=radius+1) || (y>=126-radius)) vy = -vy;
dcleary 3:c93d1b51785c 160 //erase old ball location
dcleary 3:c93d1b51785c 161 uLCD.filled_circle(x, y, radius, BLACK);
dcleary 3:c93d1b51785c 162 //move ball
dcleary 3:c93d1b51785c 163 fx=fx+vx;
dcleary 3:c93d1b51785c 164 fy=fy+vy;
dcleary 3:c93d1b51785c 165 x=(int)fx;
dcleary 3:c93d1b51785c 166 y=(int)fy;
dcleary 3:c93d1b51785c 167 }
jlind6 0:356124c0bafc 168 break;
jlind6 0:356124c0bafc 169 case GAME_SETUP:
jlind6 0:356124c0bafc 170 uLCD.cls();
jlind6 0:356124c0bafc 171 uLCD.line(0, 0, 127, 0, 0xCFB53B);
jlind6 0:356124c0bafc 172 uLCD.line(127, 0, 127, 127, 0xCFB53B);
jlind6 0:356124c0bafc 173 uLCD.line(127, 127, 0, 127, 0xCFB53B);
jlind6 0:356124c0bafc 174 uLCD.line(0, 127, 0, 0, 0xCFB53B);
dcleary 3:c93d1b51785c 175 myBall.startPong( i, &uLCD );
dcleary 3:c93d1b51785c 176 myPaddle.initDraw( &uLCD );
jlind6 0:356124c0bafc 177 gameState = GAME;
jlind6 0:356124c0bafc 178 break;
jlind6 0:356124c0bafc 179 case GAME:
dcleary 3:c93d1b51785c 180 myBall.testConditions(&myPaddle, &uLCD);
dcleary 3:c93d1b51785c 181 if (myBall.getLose())
jlind6 0:356124c0bafc 182 gameState = LOSE;
dcleary 3:c93d1b51785c 183 myBall.update( &uLCD );
dcleary 3:c93d1b51785c 184 myPaddle.redraw( &uLCD );
jlind6 0:356124c0bafc 185 break;
jlind6 0:356124c0bafc 186 case LOSE:
jlind6 0:356124c0bafc 187 uLCD.cls();
dcleary 3:c93d1b51785c 188 //uLCD.printf("YOU LOSE D:");
dcleary 3:c93d1b51785c 189 myPaddle.resetScore();
dcleary 3:c93d1b51785c 190 myBall.setLose(0);
dcleary 3:c93d1b51785c 191 myBall.resetBall();
jlind6 0:356124c0bafc 192 wait(5.0);
jlind6 0:356124c0bafc 193 gameState = START;
jlind6 0:356124c0bafc 194 break;
jlind6 0:356124c0bafc 195 case WAIT:
jlind6 0:356124c0bafc 196 // Used to seed the rand() function so we don't get the same starting position every time.
jlind6 0:356124c0bafc 197 i++;
jlind6 0:356124c0bafc 198 break;
jlind6 0:356124c0bafc 199 }
dcleary 3:c93d1b51785c 200 }
jlind6 0:356124c0bafc 201 }