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
main.cpp@3:c93d1b51785c, 2016-03-17 (annotated)
- Committer:
- dcleary
- Date:
- Thu Mar 17 20:38:26 2016 +0000
- Revision:
- 3:c93d1b51785c
- Parent:
- 2:6163865f5ce3
Pong
Who changed what in which revision?
User | Revision | Line number | New 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 | } |