Kostadin Chakarov / Mbed 2 deprecated el17kec

Dependencies:   mbed

Committer:
kocemax
Date:
Thu May 09 10:53:00 2019 +0000
Revision:
10:da5743dfb137
Parent:
9:f720f5d87420
Child:
12:b3ec47d606a5
Added test files and completed any left-overs. Ready to submit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kocemax 0:2f0362fef062 1 /*
kocemax 0:2f0362fef062 2 ELEC2645 Embedded Systems Project
kocemax 0:2f0362fef062 3 School of Electronic & Electrical Engineering University of Leeds
kocemax 0:2f0362fef062 4 Name: Kostadin Chakarov
kocemax 0:2f0362fef062 5 Username: el17kec
kocemax 0:2f0362fef062 6 Student ID Number:201171978 Date:11/03/2019
kocemax 0:2f0362fef062 7 */
kocemax 7:cd3cafda3dd4 8
kocemax 8:9b77eea95088 9 /** Breakout logo sprite */
kocemax 1:b82c4c2de9a8 10 const int breakout[10][75] = {
kocemax 1:b82c4c2de9a8 11 { 1,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 12 { 1,0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1 },
kocemax 1:b82c4c2de9a8 13 { 1,1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 14 { 1,1,0,1,1,1,1,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 15 { 1,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0 },
kocemax 1:b82c4c2de9a8 16 { 1,1,0,1,1,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1 },
kocemax 1:b82c4c2de9a8 17 { 1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0 },
kocemax 1:b82c4c2de9a8 18 { 1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 19 { 1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 20 { 1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0 },
kocemax 1:b82c4c2de9a8 21 };
kocemax 0:2f0362fef062 22
kocemax 1:b82c4c2de9a8 23 ///////// pre-processor directives ////////
kocemax 0:2f0362fef062 24 #include "mbed.h"
kocemax 1:b82c4c2de9a8 25 #include "N5110.h"
kocemax 1:b82c4c2de9a8 26 #include "Gamepad.h"
kocemax 8:9b77eea95088 27 #include "Paddle.h"
kocemax 6:39bda45efeed 28 #include "Ball.h"
kocemax 6:39bda45efeed 29 #include "Map.h"
kocemax 1:b82c4c2de9a8 30
kocemax 10:da5743dfb137 31 #define WITH_TESTING
kocemax 10:da5743dfb137 32 #ifdef WITH_TESTING
kocemax 10:da5743dfb137 33 #include "tests.h"
kocemax 10:da5743dfb137 34 #endif
kocemax 10:da5743dfb137 35
kocemax 8:9b77eea95088 36 const int fps = 20; /** Sets the fps of the game, doesn't change */
kocemax 4:0e01cbb95434 37
kocemax 1:b82c4c2de9a8 38 /////////////// objects ///////////////
kocemax 8:9b77eea95088 39 AnalogIn pot(PTB2); /** Potentiometer to set contrast of screen */
kocemax 8:9b77eea95088 40 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); /** K64F - pwr from 3V3 */
kocemax 8:9b77eea95088 41 Gamepad pad; /** Gamepad buttons */
kocemax 8:9b77eea95088 42 Paddle paddle; /** Paddle object */
kocemax 8:9b77eea95088 43 Ball ball; /** Ball object */
kocemax 8:9b77eea95088 44 Map map; /** Map object */
kocemax 1:b82c4c2de9a8 45
kocemax 1:b82c4c2de9a8 46 ///////////// function prototypes ///////////////
kocemax 8:9b77eea95088 47 void init(); /** Initialize LCD and Gamepad */
kocemax 8:9b77eea95088 48 void welcome(); /** Simple welcome screen displayed on start-up */
kocemax 8:9b77eea95088 49 void render(); /** Used as the game loop */
kocemax 8:9b77eea95088 50 void contrast(); /** Allows to set contrast, if not suitable */
kocemax 0:2f0362fef062 51
kocemax 1:b82c4c2de9a8 52 ///////////// functions ////////////////
kocemax 1:b82c4c2de9a8 53 int main()
kocemax 10:da5743dfb137 54 {
kocemax 10:da5743dfb137 55 #ifdef WITH_TESTING
kocemax 10:da5743dfb137 56 int number_of_failures = run_tests();
kocemax 10:da5743dfb137 57 if(number_of_failures > 0) return number_of_failures;
kocemax 10:da5743dfb137 58 #endif
kocemax 10:da5743dfb137 59
kocemax 8:9b77eea95088 60 init(); /** Initialize LCD and Gamepad */
kocemax 8:9b77eea95088 61 welcome(); /** Waiting for the user to start */
kocemax 8:9b77eea95088 62 render(); /** Game Loop */
kocemax 1:b82c4c2de9a8 63 }
kocemax 1:b82c4c2de9a8 64
kocemax 8:9b77eea95088 65
kocemax 1:b82c4c2de9a8 66 void init()
kocemax 1:b82c4c2de9a8 67 {
kocemax 8:9b77eea95088 68 lcd.init(); /** Initialize the LCD */
kocemax 8:9b77eea95088 69 pad.init(); /** Initialize the Gamepad */
kocemax 8:9b77eea95088 70 lcd.setContrast(0.55); /** Initially set contrast to 55% */
kocemax 8:9b77eea95088 71 lcd.normalMode(); /** Normal color mode */
kocemax 8:9b77eea95088 72 lcd.setBrightness(0.5); /** Puts LED backlight on 50% */
kocemax 1:b82c4c2de9a8 73 }
kocemax 1:b82c4c2de9a8 74
kocemax 8:9b77eea95088 75 /** Simple welcome screen displayed on start-up */
kocemax 1:b82c4c2de9a8 76 void welcome()
kocemax 0:2f0362fef062 77 {
kocemax 1:b82c4c2de9a8 78 lcd.printString("Welcome to",12,0);
kocemax 8:9b77eea95088 79 lcd.drawSprite(5,15,10,75,(int *)breakout); // x origin, y origin, rows, cols, sprite
kocemax 8:9b77eea95088 80 lcd.printString("Press A ",2,4);
kocemax 8:9b77eea95088 81 lcd.printString("for Controls ",11,5);
kocemax 1:b82c4c2de9a8 82 lcd.refresh();
kocemax 1:b82c4c2de9a8 83
kocemax 9:f720f5d87420 84 /** Wait to move to next menu */
kocemax 8:9b77eea95088 85 while (pad.check_event(Gamepad::A_PRESSED) == false)
kocemax 8:9b77eea95088 86 {
kocemax 8:9b77eea95088 87
kocemax 8:9b77eea95088 88 }
kocemax 8:9b77eea95088 89 lcd.clear();
kocemax 8:9b77eea95088 90 lcd.printString("Use pot to ->",4,0);
kocemax 8:9b77eea95088 91 lcd.printString("set contrast",4,1);
kocemax 8:9b77eea95088 92 lcd.printString("Use Joystick ",6,2);
kocemax 8:9b77eea95088 93 lcd.printString("to move paddle ",0,3);
kocemax 8:9b77eea95088 94 lcd.printString("Press Start ",9,4);
kocemax 8:9b77eea95088 95 lcd.printString("to begin ",16,5);
kocemax 8:9b77eea95088 96 lcd.refresh();
kocemax 9:f720f5d87420 97 /** Flash LEDs until start button is pressed */
kocemax 1:b82c4c2de9a8 98 while (pad.check_event(Gamepad::START_PRESSED) == false)
kocemax 1:b82c4c2de9a8 99 {
kocemax 1:b82c4c2de9a8 100 for (int i = 1; i < 7; i++)
kocemax 1:b82c4c2de9a8 101 {
kocemax 5:12c179da4788 102 pad.led(i,1);
kocemax 5:12c179da4788 103 wait(0.1);
kocemax 5:12c179da4788 104 pad.led(i,0);
kocemax 8:9b77eea95088 105 }
kocemax 1:b82c4c2de9a8 106 }
kocemax 1:b82c4c2de9a8 107 }
kocemax 0:2f0362fef062 108
kocemax 8:9b77eea95088 109 /** Resets everything if game is won / lost */
kocemax 7:cd3cafda3dd4 110 void resetGame()
kocemax 7:cd3cafda3dd4 111 {
kocemax 8:9b77eea95088 112 paddle.reset(); /** Reset paddle */
kocemax 8:9b77eea95088 113 ball.reset(); /** Reset ball */
kocemax 8:9b77eea95088 114 map.reset(); /** Reset map */
kocemax 9:f720f5d87420 115 map.score = 0; /** Reset score */
kocemax 7:cd3cafda3dd4 116 }
kocemax 7:cd3cafda3dd4 117
kocemax 8:9b77eea95088 118 /** Checks if game is lost */
kocemax 7:cd3cafda3dd4 119 void checkLost()
kocemax 7:cd3cafda3dd4 120 {
kocemax 8:9b77eea95088 121 const Vector2D& posPad = paddle.getPos();
kocemax 8:9b77eea95088 122 /** Checks if ball is below paddle, i.e. lost */
kocemax 7:cd3cafda3dd4 123 if (ball.getPos().y > posPad.y)
kocemax 7:cd3cafda3dd4 124 {
kocemax 7:cd3cafda3dd4 125 while (1)
kocemax 7:cd3cafda3dd4 126 {
kocemax 9:f720f5d87420 127 /** Prints a simple 'lost' message and score and asks if you want to restart */
kocemax 7:cd3cafda3dd4 128 lcd.clear();
kocemax 9:f720f5d87420 129 char finalscore[14];
kocemax 9:f720f5d87420 130 sprintf(finalscore,"Score = %d",map.score);
kocemax 9:f720f5d87420 131 lcd.printString(finalscore,0,0);
kocemax 7:cd3cafda3dd4 132 lcd.printString("You Lost",17,2);
kocemax 7:cd3cafda3dd4 133 lcd.printString("Press A",20,3);
kocemax 7:cd3cafda3dd4 134 lcd.printString("to restart",12,4);
kocemax 7:cd3cafda3dd4 135 wait(0.1);
kocemax 7:cd3cafda3dd4 136 lcd.refresh();
kocemax 8:9b77eea95088 137 /** Checks if reset button is pressed, if it is reset */
kocemax 7:cd3cafda3dd4 138 if (pad.check_event(Gamepad::A_PRESSED) == true)
kocemax 7:cd3cafda3dd4 139 {
kocemax 7:cd3cafda3dd4 140 resetGame();
kocemax 7:cd3cafda3dd4 141 break;
kocemax 7:cd3cafda3dd4 142 }
kocemax 7:cd3cafda3dd4 143 }
kocemax 7:cd3cafda3dd4 144 }
kocemax 7:cd3cafda3dd4 145 }
kocemax 7:cd3cafda3dd4 146
kocemax 8:9b77eea95088 147 /** Checks if level / game is won */
kocemax 8:9b77eea95088 148 void checkWon()
kocemax 8:9b77eea95088 149 {
kocemax 7:cd3cafda3dd4 150 if (map.checkLevel()) {
kocemax 8:9b77eea95088 151 /** We have cleared a level */
kocemax 8:9b77eea95088 152 ball.reset(); /** Reset ball */
kocemax 8:9b77eea95088 153 paddle.reset(); /** Reset paddle */
kocemax 7:cd3cafda3dd4 154
kocemax 7:cd3cafda3dd4 155 if (map.hasWon()) {
kocemax 8:9b77eea95088 156 /** We have cleared all levels */
kocemax 7:cd3cafda3dd4 157 while (1)
kocemax 8:9b77eea95088 158 {
kocemax 9:f720f5d87420 159 /** Prints win message and score and asks if you want to restart */
kocemax 7:cd3cafda3dd4 160 lcd.clear();
kocemax 9:f720f5d87420 161 char finalscore[14];
kocemax 9:f720f5d87420 162 sprintf(finalscore,"Score = %d",map.score);
kocemax 9:f720f5d87420 163 lcd.printString(finalscore,0,0);
kocemax 7:cd3cafda3dd4 164 lcd.printString("You WON!",17,2);
kocemax 10:da5743dfb137 165 lcd.printString("Press B",20,3);
kocemax 7:cd3cafda3dd4 166 lcd.printString("to restart",12,4);
kocemax 7:cd3cafda3dd4 167 wait(0.1);
kocemax 7:cd3cafda3dd4 168 lcd.refresh();
kocemax 8:9b77eea95088 169 /** Checks if reset button is pressed, if it is reset */
kocemax 10:da5743dfb137 170 if (pad.check_event(Gamepad::B_PRESSED) == true)
kocemax 7:cd3cafda3dd4 171 {
kocemax 7:cd3cafda3dd4 172 resetGame();
kocemax 7:cd3cafda3dd4 173 break;
kocemax 7:cd3cafda3dd4 174 }
kocemax 7:cd3cafda3dd4 175 }
kocemax 7:cd3cafda3dd4 176 }
kocemax 7:cd3cafda3dd4 177 }
kocemax 7:cd3cafda3dd4 178 }
kocemax 7:cd3cafda3dd4 179
kocemax 8:9b77eea95088 180 /** Game loop */
kocemax 6:39bda45efeed 181 void render()
kocemax 6:39bda45efeed 182 {
kocemax 8:9b77eea95088 183
kocemax 8:9b77eea95088 184
kocemax 8:9b77eea95088 185 map.initBricks(); /** Initialize the map */
kocemax 6:39bda45efeed 186
kocemax 4:0e01cbb95434 187 while(1)
kocemax 8:9b77eea95088 188 {
kocemax 8:9b77eea95088 189
kocemax 8:9b77eea95088 190 /** Physics, movement, control input + game logic */
kocemax 8:9b77eea95088 191 /** Control Input */
kocemax 8:9b77eea95088 192 paddle.controlPaddle(pad);
kocemax 8:9b77eea95088 193
kocemax 8:9b77eea95088 194 /** Movement and physics */
kocemax 6:39bda45efeed 195 ball.move();
kocemax 8:9b77eea95088 196 paddle.move();
kocemax 8:9b77eea95088 197
kocemax 8:9b77eea95088 198 map.checkCollision(ball, paddle);
kocemax 8:9b77eea95088 199 map.update();
kocemax 8:9b77eea95088 200 ball.hitPad(paddle);
kocemax 8:9b77eea95088 201
kocemax 8:9b77eea95088 202 /** Rendering */
kocemax 8:9b77eea95088 203 lcd.clear(); /** Initialize render */
kocemax 8:9b77eea95088 204 contrast(); /** Sets contrast */
kocemax 8:9b77eea95088 205 map.drawMap(lcd); /** Draw map objects */
kocemax 8:9b77eea95088 206 paddle.draw(lcd); /** Draws paddle */
kocemax 8:9b77eea95088 207 ball.draw(lcd); /** Draws ball */
kocemax 8:9b77eea95088 208
kocemax 8:9b77eea95088 209 lcd.refresh(); /** Finalize render */
kocemax 8:9b77eea95088 210
kocemax 8:9b77eea95088 211 wait(1.0f/fps); /** Frames per second */
kocemax 8:9b77eea95088 212
kocemax 8:9b77eea95088 213 /** Check Lost/Won */
kocemax 7:cd3cafda3dd4 214 checkLost();
kocemax 7:cd3cafda3dd4 215 checkWon();
kocemax 4:0e01cbb95434 216 }
kocemax 8:9b77eea95088 217 }
kocemax 8:9b77eea95088 218
kocemax 8:9b77eea95088 219 /** Allows to set contrast, if not suitable */
kocemax 8:9b77eea95088 220 void contrast()
kocemax 8:9b77eea95088 221 {
kocemax 8:9b77eea95088 222 float contrast = pot.read(); /** Read value from potentiometer(0-1) */
kocemax 8:9b77eea95088 223 lcd.setContrast(contrast); /** Set that value for the contrast */
kocemax 8:9b77eea95088 224 }
kocemax 8:9b77eea95088 225