1D-Pong game based on a LED strip with 150 LPD6803-controlled pixels. Game keeps score for 'best-of-21' game. Written for KL25Z

Dependencies:   MODSERIAL mbed

Committer:
vsluiter
Date:
Mon Aug 26 14:20:32 2013 +0000
Revision:
20:a63273c11af0
Parent:
19:bb0179b9043f
Child:
21:a554229e884b
Made the speed selectio a bit more child-friendly, and swapped buttons

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:cde34c55fa20 1 #include "mbed.h"
vsluiter 12:97c71b84c984 2 #include "MODSERIAL.h"
vsluiter 0:cde34c55fa20 3 #define NUMBER_OF_PIXELS 50
vsluiter 0:cde34c55fa20 4 #define PADDLE_LENGTH 5
vsluiter 12:97c71b84c984 5 #define STARTING_SPEED 20
vsluiter 2:d2f8772a8db5 6 #define LEFT false
vsluiter 2:d2f8772a8db5 7 #define RIGHT true
vsluiter 5:d2e819018807 8
vsluiter 5:d2e819018807 9 #define MAX_PADDLE_SIZE 10
vsluiter 0:cde34c55fa20 10 void Randomblinks(float seconds, bool colored = false);
vsluiter 0:cde34c55fa20 11 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 1:7a2ec350cdf5 12 void WinLoose(float seconds, bool side);
vsluiter 5:d2e819018807 13 void UpdateDemoPaddle(void);
vsluiter 2:d2f8772a8db5 14 void Score(uint8_t left, uint8_t right);
vsluiter 5:d2e819018807 15 void DrawGamePaddle(void);
vsluiter 9:c5086fe3c0cc 16 void HandleScore(uint8_t *, uint8_t *, bool, Timer *);
vsluiter 16:f0176e9e4a9d 17 void DrawLine(uint8_t start, uint8_t end, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 0:cde34c55fa20 18 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 19 volatile int8_t paddlestart= 0;
vsluiter 18:789e9fafa5f6 20 bool strip_drawable = true;
vsluiter 0:cde34c55fa20 21 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 12:97c71b84c984 22 MODSERIAL pc(USBTX,USBRX);
vsluiter 0:cde34c55fa20 23
vsluiter 5:d2e819018807 24 class Paddle
vsluiter 5:d2e819018807 25 {
vsluiter 5:d2e819018807 26 public:
vsluiter 5:d2e819018807 27 Paddle();//constructor
vsluiter 5:d2e819018807 28 // ~Paddle();//deconstructor
vsluiter 11:fc80c39ba9f0 29 int16_t position;
vsluiter 5:d2e819018807 30 uint8_t direction;
vsluiter 12:97c71b84c984 31 void setSpeed(float speed); //pixels per second
vsluiter 5:d2e819018807 32 void setColor(uint8_t red, uint8_t green, uint8_t blue);
vsluiter 5:d2e819018807 33 uint8_t getSize(void);
vsluiter 18:789e9fafa5f6 34 uint8_t getSpeed(void){return m_speed;};
vsluiter 5:d2e819018807 35 void setSize(uint8_t size);
vsluiter 5:d2e819018807 36 uint8_t getColor(uint8_t pixel, uint8_t color);
vsluiter 5:d2e819018807 37 private:
vsluiter 5:d2e819018807 38 uint8_t m_red ,m_green ,m_blue;
vsluiter 5:d2e819018807 39 uint8_t m_size;
vsluiter 5:d2e819018807 40 uint8_t m_paddle[MAX_PADDLE_SIZE][3];
vsluiter 7:e605dbca7330 41 float m_speed;
vsluiter 7:e605dbca7330 42 Ticker UpdatePosition;
vsluiter 7:e605dbca7330 43 void PositionUpdater(void);
vsluiter 5:d2e819018807 44 };
vsluiter 5:d2e819018807 45
vsluiter 5:d2e819018807 46 Paddle::Paddle()
vsluiter 5:d2e819018807 47 {
vsluiter 5:d2e819018807 48 setColor(255,255,255);
vsluiter 5:d2e819018807 49 setSize(4);
vsluiter 5:d2e819018807 50 position = -getSize();
vsluiter 5:d2e819018807 51 direction = 1;
vsluiter 7:e605dbca7330 52 setSpeed(50);
vsluiter 7:e605dbca7330 53 }
vsluiter 7:e605dbca7330 54
vsluiter 7:e605dbca7330 55 void Paddle::setSpeed(float speed)
vsluiter 7:e605dbca7330 56 {
vsluiter 7:e605dbca7330 57 //truncate
vsluiter 7:e605dbca7330 58 float time;
vsluiter 7:e605dbca7330 59 if(speed > 100000)
vsluiter 7:e605dbca7330 60 speed = 100000;
vsluiter 7:e605dbca7330 61 if(speed <= 0)
vsluiter 7:e605dbca7330 62 speed = 0.001;
vsluiter 7:e605dbca7330 63 m_speed = speed;
vsluiter 7:e605dbca7330 64 time = 1/m_speed;
vsluiter 10:6f9624c7425d 65 UpdatePosition.detach();
vsluiter 7:e605dbca7330 66 UpdatePosition.attach(this,&Paddle::PositionUpdater, time);
vsluiter 7:e605dbca7330 67 }
vsluiter 7:e605dbca7330 68
vsluiter 7:e605dbca7330 69 void Paddle::PositionUpdater(void)
vsluiter 7:e605dbca7330 70 {
vsluiter 7:e605dbca7330 71 if(direction == 1)
vsluiter 7:e605dbca7330 72 position++;
vsluiter 7:e605dbca7330 73 else
vsluiter 7:e605dbca7330 74 position--;
vsluiter 5:d2e819018807 75 }
vsluiter 5:d2e819018807 76
vsluiter 5:d2e819018807 77 uint8_t Paddle::getColor(uint8_t pixel, uint8_t color)
vsluiter 5:d2e819018807 78 {
vsluiter 5:d2e819018807 79 if(pixel<MAX_PADDLE_SIZE && color < 3)
vsluiter 5:d2e819018807 80 return m_paddle[pixel][color];
vsluiter 5:d2e819018807 81 else
vsluiter 5:d2e819018807 82 return 0;
vsluiter 5:d2e819018807 83 }
vsluiter 5:d2e819018807 84
vsluiter 5:d2e819018807 85 uint8_t Paddle::getSize(void)
vsluiter 5:d2e819018807 86 {
vsluiter 5:d2e819018807 87 return m_size;
vsluiter 5:d2e819018807 88 }
vsluiter 5:d2e819018807 89
vsluiter 5:d2e819018807 90 void Paddle::setSize(uint8_t size)
vsluiter 5:d2e819018807 91 {
vsluiter 5:d2e819018807 92 if(size > MAX_PADDLE_SIZE)
vsluiter 5:d2e819018807 93 size = MAX_PADDLE_SIZE;
vsluiter 5:d2e819018807 94 m_size = size;
vsluiter 5:d2e819018807 95 setColor(m_red, m_green, m_blue);
vsluiter 5:d2e819018807 96 }
vsluiter 5:d2e819018807 97
vsluiter 5:d2e819018807 98 void Paddle::setColor(uint8_t red, uint8_t green, uint8_t blue)
vsluiter 5:d2e819018807 99 {
vsluiter 5:d2e819018807 100 uint8_t paddlepixel;
vsluiter 5:d2e819018807 101 m_red = red;
vsluiter 5:d2e819018807 102 m_green = green;
vsluiter 5:d2e819018807 103 m_blue = blue;
vsluiter 5:d2e819018807 104 for(paddlepixel = 0 ; paddlepixel < MAX_PADDLE_SIZE ; paddlepixel++)
vsluiter 5:d2e819018807 105 {
vsluiter 5:d2e819018807 106 float factor;
vsluiter 5:d2e819018807 107 factor = 1.0*paddlepixel/(m_size*1.0);
vsluiter 5:d2e819018807 108 if (factor > 1)
vsluiter 5:d2e819018807 109 factor = 1;
vsluiter 5:d2e819018807 110 factor = factor*factor*factor;// make the effect more dramatic
vsluiter 5:d2e819018807 111 m_paddle[paddlepixel][0] = (float)m_red * factor;
vsluiter 5:d2e819018807 112 m_paddle[paddlepixel][1] = (float)m_green * factor;
vsluiter 5:d2e819018807 113 m_paddle[paddlepixel][2] = (float)m_blue * factor;
vsluiter 5:d2e819018807 114 }
vsluiter 5:d2e819018807 115 }
vsluiter 0:cde34c55fa20 116
vsluiter 16:f0176e9e4a9d 117 class GameButton
vsluiter 16:f0176e9e4a9d 118 {
vsluiter 16:f0176e9e4a9d 119 public:
vsluiter 18:789e9fafa5f6 120 GameButton(){};
vsluiter 16:f0176e9e4a9d 121 GameButton(PinName pin, float time);
vsluiter 16:f0176e9e4a9d 122 bool pushflag;
vsluiter 16:f0176e9e4a9d 123 bool getTimeoutActive(void);
vsluiter 18:789e9fafa5f6 124 protected:
vsluiter 18:789e9fafa5f6 125 virtual void pushhandlercallback(void){};
vsluiter 16:f0176e9e4a9d 126 private:
vsluiter 16:f0176e9e4a9d 127 InterruptIn *intpin;
vsluiter 16:f0176e9e4a9d 128 Timeout timeout;
vsluiter 16:f0176e9e4a9d 129 float m_time;
vsluiter 16:f0176e9e4a9d 130 bool m_timeoutactive;
vsluiter 16:f0176e9e4a9d 131 void TimeOutHandler(void);
vsluiter 18:789e9fafa5f6 132 virtual void PushHandler(void);
vsluiter 16:f0176e9e4a9d 133 };
vsluiter 16:f0176e9e4a9d 134
vsluiter 17:c5a38d01dfbe 135 GameButton::GameButton(PinName pin, float time=0.5)
vsluiter 16:f0176e9e4a9d 136 {
vsluiter 16:f0176e9e4a9d 137 pushflag = false;
vsluiter 16:f0176e9e4a9d 138 intpin = new InterruptIn(pin);
vsluiter 16:f0176e9e4a9d 139 (*intpin).mode(PullUp);
vsluiter 16:f0176e9e4a9d 140 (*intpin).fall(this, &GameButton::PushHandler);
vsluiter 16:f0176e9e4a9d 141 m_time = time;
vsluiter 18:789e9fafa5f6 142 m_timeoutactive = false;
vsluiter 16:f0176e9e4a9d 143 //timeout = new Timeout(m_time);
vsluiter 16:f0176e9e4a9d 144 }
vsluiter 16:f0176e9e4a9d 145
vsluiter 16:f0176e9e4a9d 146 void GameButton::PushHandler(void)
vsluiter 16:f0176e9e4a9d 147 {
vsluiter 16:f0176e9e4a9d 148 pushflag = true;
vsluiter 16:f0176e9e4a9d 149 m_timeoutactive = true;
vsluiter 16:f0176e9e4a9d 150 timeout.attach(this, &GameButton::TimeOutHandler, m_time);
vsluiter 18:789e9fafa5f6 151 pushhandlercallback();
vsluiter 16:f0176e9e4a9d 152 }
vsluiter 16:f0176e9e4a9d 153
vsluiter 16:f0176e9e4a9d 154 void GameButton::TimeOutHandler(void)
vsluiter 16:f0176e9e4a9d 155 {
vsluiter 16:f0176e9e4a9d 156 m_timeoutactive = false;
vsluiter 16:f0176e9e4a9d 157 }
vsluiter 16:f0176e9e4a9d 158
vsluiter 16:f0176e9e4a9d 159 bool GameButton::getTimeoutActive(void)
vsluiter 16:f0176e9e4a9d 160 {
vsluiter 16:f0176e9e4a9d 161 return m_timeoutactive;
vsluiter 16:f0176e9e4a9d 162 }
vsluiter 16:f0176e9e4a9d 163
vsluiter 18:789e9fafa5f6 164 Paddle paddle;
vsluiter 18:789e9fafa5f6 165
vsluiter 17:c5a38d01dfbe 166 class PongGameButton : public GameButton
vsluiter 17:c5a38d01dfbe 167 {
vsluiter 17:c5a38d01dfbe 168 public:
vsluiter 18:789e9fafa5f6 169 PongGameButton(PinName name, float time);
vsluiter 18:789e9fafa5f6 170 void pushhandlercallback(void);
vsluiter 18:789e9fafa5f6 171 int16_t paddlepos;
vsluiter 17:c5a38d01dfbe 172 };
vsluiter 17:c5a38d01dfbe 173
vsluiter 18:789e9fafa5f6 174 PongGameButton::PongGameButton(PinName name, float time) : GameButton(name)
vsluiter 18:789e9fafa5f6 175 {
vsluiter 18:789e9fafa5f6 176 paddlepos = 0;
vsluiter 18:789e9fafa5f6 177 }
vsluiter 18:789e9fafa5f6 178
vsluiter 18:789e9fafa5f6 179 void PongGameButton::pushhandlercallback(void)
vsluiter 18:789e9fafa5f6 180 {
vsluiter 18:789e9fafa5f6 181 paddlepos = paddle.position;
vsluiter 18:789e9fafa5f6 182 }
vsluiter 18:789e9fafa5f6 183
vsluiter 0:cde34c55fa20 184 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 185 {
vsluiter 0:cde34c55fa20 186 uint8_t pixelcounter;
vsluiter 18:789e9fafa5f6 187 if(strip_drawable)
vsluiter 18:789e9fafa5f6 188 {
vsluiter 18:789e9fafa5f6 189 /*start by writing 32 zeroes */
vsluiter 18:789e9fafa5f6 190 ledstrip.write(0);
vsluiter 18:789e9fafa5f6 191 ledstrip.write(0);
vsluiter 18:789e9fafa5f6 192 ledstrip.write(0);
vsluiter 18:789e9fafa5f6 193 ledstrip.write(0);
vsluiter 18:789e9fafa5f6 194 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 18:789e9fafa5f6 195 ledstrip.write( uint8_t(totalstrip[pixelcounter]>>8));//uint8_t(temp16));//(totalstrip.ledcounter[pixelcounter].red << 2) | (totalstrip.ledcounter[pixelcounter].high << 7) |(totalstrip.ledcounter[pixelcounter].green & 0x << 2) );
vsluiter 18:789e9fafa5f6 196 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 18:789e9fafa5f6 197 }
vsluiter 18:789e9fafa5f6 198 }
vsluiter 0:cde34c55fa20 199 }
vsluiter 0:cde34c55fa20 200
vsluiter 0:cde34c55fa20 201 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 202 {
vsluiter 0:cde34c55fa20 203 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 204 }
vsluiter 5:d2e819018807 205
vsluiter 18:789e9fafa5f6 206
vsluiter 18:789e9fafa5f6 207 bool rightpushed = false;
vsluiter 18:789e9fafa5f6 208 int16_t rightpushpos = 0;
vsluiter 6:c2040b4cf589 209
vsluiter 6:c2040b4cf589 210 void right_pushed(void)
vsluiter 6:c2040b4cf589 211 {
vsluiter 12:97c71b84c984 212 rightpushpos = paddle.position;
vsluiter 8:f46db1ff5ec9 213 if(paddle.direction == 1)
vsluiter 6:c2040b4cf589 214 rightpushed = true;
vsluiter 6:c2040b4cf589 215 }
vsluiter 5:d2e819018807 216
vsluiter 0:cde34c55fa20 217 int main()
vsluiter 0:cde34c55fa20 218 {
vsluiter 0:cde34c55fa20 219 Ticker updater;
vsluiter 12:97c71b84c984 220 //Ticker demopaddlepos;
vsluiter 8:f46db1ff5ec9 221 Timer gametimer;
vsluiter 20:a63273c11af0 222 PongGameButton buttonleft(PTD0,1);
vsluiter 20:a63273c11af0 223 PongGameButton buttonright(PTD5, 1);
vsluiter 0:cde34c55fa20 224 uint8_t ledcounter;
vsluiter 8:f46db1ff5ec9 225 uint8_t left_score = 0, right_score = 0;
vsluiter 12:97c71b84c984 226 pc.baud(115200);
vsluiter 18:789e9fafa5f6 227 // buttonleft.mode(PullUp);
vsluiter 18:789e9fafa5f6 228 // buttonright.mode(PullUp);
vsluiter 18:789e9fafa5f6 229 // buttonright.fall(right_pushed);
vsluiter 18:789e9fafa5f6 230 // buttonleft.fall(left_pushed);
vsluiter 12:97c71b84c984 231 updater.attach(UpdateLEDstrip, .03);
vsluiter 12:97c71b84c984 232 //demopaddlepos.attach(UpdateDemoPaddle, .03);
vsluiter 0:cde34c55fa20 233 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 11:fc80c39ba9f0 234 ledstrip.frequency(1000000); //1MHz clock
vsluiter 4:119537f0ff8e 235 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {//turn off leds
vsluiter 0:cde34c55fa20 236 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 237 }
vsluiter 5:d2e819018807 238 paddle.setSize(6);
vsluiter 12:97c71b84c984 239 paddle.setSpeed(STARTING_SPEED);
vsluiter 5:d2e819018807 240 paddle.setColor(255,0,255);
vsluiter 9:c5086fe3c0cc 241 gametimer.start();
vsluiter 0:cde34c55fa20 242 while(1) {
vsluiter 10:6f9624c7425d 243 static uint8_t naglevel1 = 0, naglevel2 = 0;
vsluiter 12:97c71b84c984 244 //paddle.position = 48;
vsluiter 12:97c71b84c984 245 //while(1);
vsluiter 18:789e9fafa5f6 246 strip_drawable = false;
vsluiter 16:f0176e9e4a9d 247 DrawGamePaddle();
vsluiter 18:789e9fafa5f6 248 if(buttonleft.getTimeoutActive())
vsluiter 19:bb0179b9043f 249 DrawLine(0,1,0,0,255);
vsluiter 18:789e9fafa5f6 250 if(buttonright.getTimeoutActive())
vsluiter 19:bb0179b9043f 251 DrawLine(NUMBER_OF_PIXELS-1, NUMBER_OF_PIXELS,0,0,255);
vsluiter 18:789e9fafa5f6 252 strip_drawable = true;
vsluiter 18:789e9fafa5f6 253 if(buttonleft.pushflag || buttonright.pushflag)
vsluiter 6:c2040b4cf589 254 {
vsluiter 13:e96098b6660d 255 if(paddle.direction == 1)
vsluiter 6:c2040b4cf589 256 {
vsluiter 18:789e9fafa5f6 257 if(buttonright.pushflag)
vsluiter 12:97c71b84c984 258 {
vsluiter 13:e96098b6660d 259 //printf("\n\rright pushed");
vsluiter 18:789e9fafa5f6 260 buttonright.pushflag = false;
vsluiter 18:789e9fafa5f6 261 if(buttonright.paddlepos >= NUMBER_OF_PIXELS-1 ) //also count when hit at last pixel = NUMBER_OF_PIXELS-1
vsluiter 13:e96098b6660d 262 {
vsluiter 13:e96098b6660d 263 paddle.direction = 0;
vsluiter 20:a63273c11af0 264 paddle.setSpeed(20+(buttonright.paddlepos-(NUMBER_OF_PIXELS-1))*2);
vsluiter 18:789e9fafa5f6 265 paddle.position = NUMBER_OF_PIXELS-2;
vsluiter 13:e96098b6660d 266 }
vsluiter 18:789e9fafa5f6 267 pc.printf("\n\rright pushed. Paddle position: %d, registered: %d, speed: %", paddle.position, buttonright.paddlepos,paddle.getSpeed());
vsluiter 12:97c71b84c984 268 }
vsluiter 18:789e9fafa5f6 269 buttonleft.pushflag = false;
vsluiter 13:e96098b6660d 270 }
vsluiter 13:e96098b6660d 271 else
vsluiter 13:e96098b6660d 272 {
vsluiter 18:789e9fafa5f6 273 if(buttonleft.pushflag)
vsluiter 13:e96098b6660d 274 {
vsluiter 13:e96098b6660d 275 //printf("\n\rleft pushed");
vsluiter 18:789e9fafa5f6 276 buttonleft.pushflag = false;
vsluiter 18:789e9fafa5f6 277 if(buttonleft.paddlepos <= 0 )
vsluiter 13:e96098b6660d 278 {
vsluiter 13:e96098b6660d 279 paddle.direction = 1;
vsluiter 20:a63273c11af0 280 paddle.setSpeed(20+(-buttonleft.paddlepos)*2);
vsluiter 13:e96098b6660d 281 paddle.position = 0;
vsluiter 13:e96098b6660d 282 }
vsluiter 18:789e9fafa5f6 283 pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d, speed %d", paddle.position, buttonleft.paddlepos, paddle.getSpeed());
vsluiter 13:e96098b6660d 284 }
vsluiter 18:789e9fafa5f6 285 buttonright.pushflag = false;
vsluiter 6:c2040b4cf589 286 }
vsluiter 6:c2040b4cf589 287 }
vsluiter 5:d2e819018807 288 else
vsluiter 13:e96098b6660d 289 {
vsluiter 13:e96098b6660d 290 if(paddle.position > ( NUMBER_OF_PIXELS + paddle.getSize() ) && (paddle.direction == 1))
vsluiter 6:c2040b4cf589 291 {
vsluiter 13:e96098b6660d 292 pc.printf("\n\rleft player score. Paddle position: %d", paddle.position);
vsluiter 13:e96098b6660d 293 //left player scores!
vsluiter 13:e96098b6660d 294 left_score++;
vsluiter 13:e96098b6660d 295 HandleScore(&left_score,&right_score,false, &gametimer);
vsluiter 13:e96098b6660d 296 paddle.position = -paddle.getSize();
vsluiter 13:e96098b6660d 297 naglevel1=naglevel2 = 0;
vsluiter 17:c5a38d01dfbe 298 paddle.setSpeed(30);
vsluiter 19:bb0179b9043f 299 buttonright.pushflag = false;
vsluiter 19:bb0179b9043f 300 buttonleft.pushflag = false;
vsluiter 6:c2040b4cf589 301 }
vsluiter 13:e96098b6660d 302 if(paddle.position < -paddle.getSize() && (paddle.direction == 0))
vsluiter 13:e96098b6660d 303 {
vsluiter 13:e96098b6660d 304 pc.printf("\n\rlright player score. Paddle position: %d", paddle.position);
vsluiter 13:e96098b6660d 305 //right player scores!
vsluiter 13:e96098b6660d 306 right_score++;
vsluiter 13:e96098b6660d 307 HandleScore(&left_score,&right_score,true, &gametimer);
vsluiter 13:e96098b6660d 308 naglevel1=naglevel2 = 0;
vsluiter 13:e96098b6660d 309 paddle.position = NUMBER_OF_PIXELS;
vsluiter 17:c5a38d01dfbe 310 paddle.setSpeed(30);
vsluiter 19:bb0179b9043f 311 buttonright.pushflag = false;
vsluiter 19:bb0179b9043f 312 buttonleft.pushflag = false;
vsluiter 13:e96098b6660d 313 }
vsluiter 12:97c71b84c984 314 }
vsluiter 15:72c494e934c8 315 if(gametimer.read()>10 && !naglevel1)
vsluiter 9:c5086fe3c0cc 316 {
vsluiter 10:6f9624c7425d 317 naglevel1 = 1;
vsluiter 19:bb0179b9043f 318 paddle.setSize(8);
vsluiter 14:5b588ea6bd8f 319 //paddle.setSpeed(40);
vsluiter 9:c5086fe3c0cc 320 }
vsluiter 15:72c494e934c8 321 if(gametimer.read()>15 && !naglevel2)
vsluiter 9:c5086fe3c0cc 322 {
vsluiter 10:6f9624c7425d 323 naglevel2 = 1;
vsluiter 9:c5086fe3c0cc 324 paddle.setSize(2);
vsluiter 14:5b588ea6bd8f 325 //paddle.setSpeed(70);
vsluiter 9:c5086fe3c0cc 326 }
vsluiter 18:789e9fafa5f6 327 wait(0.05);
vsluiter 0:cde34c55fa20 328 }
vsluiter 0:cde34c55fa20 329 }
vsluiter 0:cde34c55fa20 330
vsluiter 9:c5086fe3c0cc 331 void HandleScore(uint8_t *leftscore, uint8_t *rightscore, bool last_won, Timer *gametimer)
vsluiter 9:c5086fe3c0cc 332 {
vsluiter 10:6f9624c7425d 333 WinLoose(1.5, last_won);
vsluiter 9:c5086fe3c0cc 334 Score(*leftscore, *rightscore);
vsluiter 9:c5086fe3c0cc 335 if(*leftscore + *rightscore == 11)
vsluiter 9:c5086fe3c0cc 336 {
vsluiter 9:c5086fe3c0cc 337 *leftscore = 0;
vsluiter 9:c5086fe3c0cc 338 *rightscore = 0;
vsluiter 19:bb0179b9043f 339 Randomblinks(5,false);
vsluiter 9:c5086fe3c0cc 340 }
vsluiter 9:c5086fe3c0cc 341 (*(mbed::Timer *)gametimer).reset();
vsluiter 9:c5086fe3c0cc 342 paddle.setSize(6);
vsluiter 12:97c71b84c984 343 paddle.setSpeed(STARTING_SPEED);
vsluiter 9:c5086fe3c0cc 344 }
vsluiter 9:c5086fe3c0cc 345
vsluiter 5:d2e819018807 346 void DrawGamePaddle(void)
vsluiter 5:d2e819018807 347 {
vsluiter 5:d2e819018807 348 uint8_t ledcounter;
vsluiter 12:97c71b84c984 349 uint8_t colorpos;
vsluiter 5:d2e819018807 350 for(ledcounter = 0; ledcounter< NUMBER_OF_PIXELS; ledcounter++)
vsluiter 5:d2e819018807 351 {
vsluiter 12:97c71b84c984 352 if(paddle.direction == 1)
vsluiter 5:d2e819018807 353 {
vsluiter 12:97c71b84c984 354 if(ledcounter > paddle.position-paddle.getSize() && ledcounter <= paddle.position)
vsluiter 5:d2e819018807 355 {
vsluiter 12:97c71b84c984 356 colorpos = paddle.getSize()-(paddle.position - ledcounter);//paddle.getSize()-(ledcounter-paddle.position);
vsluiter 5:d2e819018807 357 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 358 }
vsluiter 5:d2e819018807 359 else
vsluiter 12:97c71b84c984 360 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 12:97c71b84c984 361 }
vsluiter 12:97c71b84c984 362 else
vsluiter 12:97c71b84c984 363 {
vsluiter 12:97c71b84c984 364 if(ledcounter >= paddle.position && ledcounter <= paddle.position+paddle.getSize())
vsluiter 5:d2e819018807 365 {
vsluiter 5:d2e819018807 366 colorpos = paddle.getSize()-(ledcounter-paddle.position);
vsluiter 5:d2e819018807 367 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 368 }
vsluiter 12:97c71b84c984 369 else
vsluiter 12:97c71b84c984 370 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 5:d2e819018807 371 }
vsluiter 5:d2e819018807 372 }
vsluiter 5:d2e819018807 373 }
vsluiter 5:d2e819018807 374
vsluiter 2:d2f8772a8db5 375 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 376 {
vsluiter 2:d2f8772a8db5 377 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 378 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 379 uint8_t scorecounter;
vsluiter 3:a2b58da5c03b 380 typedef struct ledcolor
vsluiter 3:a2b58da5c03b 381 {
vsluiter 3:a2b58da5c03b 382 uint8_t red;
vsluiter 3:a2b58da5c03b 383 uint8_t green;
vsluiter 3:a2b58da5c03b 384 uint8_t blue;
vsluiter 3:a2b58da5c03b 385 }ledcolor_t;
vsluiter 3:a2b58da5c03b 386 ledcolor_t rightled={0,0,0}, leftled={0,0,0};
vsluiter 16:f0176e9e4a9d 387 left>=right?maxscore = left: maxscore = right;
vsluiter 2:d2f8772a8db5 388 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 389 {
vsluiter 2:d2f8772a8db5 390 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 391 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 392 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 393 uint8_t sidecounter;
vsluiter 20:a63273c11af0 394 if(scorecounter == maxscore-1)
vsluiter 16:f0176e9e4a9d 395 {
vsluiter 16:f0176e9e4a9d 396 if(left >= right)
vsluiter 16:f0176e9e4a9d 397 {
vsluiter 16:f0176e9e4a9d 398 leftled.green = 255;
vsluiter 16:f0176e9e4a9d 399 rightled.red = 255;
vsluiter 16:f0176e9e4a9d 400 }
vsluiter 16:f0176e9e4a9d 401 if(right >= left)
vsluiter 16:f0176e9e4a9d 402 {
vsluiter 16:f0176e9e4a9d 403 leftled.red = 255;
vsluiter 16:f0176e9e4a9d 404 rightled.green = 255;
vsluiter 16:f0176e9e4a9d 405 }
vsluiter 16:f0176e9e4a9d 406 }
vsluiter 16:f0176e9e4a9d 407 else
vsluiter 16:f0176e9e4a9d 408 {
vsluiter 16:f0176e9e4a9d 409 leftled.green = leftled.red = leftled.blue = rightled.green = rightled.red = rightled.blue = 255;
vsluiter 16:f0176e9e4a9d 410 }
vsluiter 16:f0176e9e4a9d 411
vsluiter 20:a63273c11af0 412 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)//blank memory
vsluiter 2:d2f8772a8db5 413 {
vsluiter 2:d2f8772a8db5 414 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 415 }
vsluiter 2:d2f8772a8db5 416 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 417 {
vsluiter 3:a2b58da5c03b 418 write_led(&totalstrip[sidecounter*2],leftled.red,leftled.green,leftled.blue);
vsluiter 2:d2f8772a8db5 419 }
vsluiter 2:d2f8772a8db5 420 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 421 {
vsluiter 3:a2b58da5c03b 422 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
vsluiter 2:d2f8772a8db5 423 }
vsluiter 16:f0176e9e4a9d 424 wait(0.2);
vsluiter 2:d2f8772a8db5 425 }
vsluiter 16:f0176e9e4a9d 426 wait(0.7);
vsluiter 16:f0176e9e4a9d 427 }
vsluiter 16:f0176e9e4a9d 428
vsluiter 16:f0176e9e4a9d 429
vsluiter 16:f0176e9e4a9d 430 //Only writes pixels that are in 'line'. Does not clear, only overwrites.
vsluiter 16:f0176e9e4a9d 431 void DrawLine(uint8_t start, uint8_t end, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 16:f0176e9e4a9d 432 {
vsluiter 16:f0176e9e4a9d 433 uint8_t ledcounter;
vsluiter 18:789e9fafa5f6 434 if(end >= NUMBER_OF_PIXELS)
vsluiter 19:bb0179b9043f 435 end = NUMBER_OF_PIXELS;
vsluiter 18:789e9fafa5f6 436 if(start < end)
vsluiter 16:f0176e9e4a9d 437 {
vsluiter 18:789e9fafa5f6 438 for(ledcounter = start; ledcounter < end ; ledcounter++)
vsluiter 18:789e9fafa5f6 439 {
vsluiter 18:789e9fafa5f6 440 write_led(&totalstrip[ledcounter], red, green, blue);
vsluiter 18:789e9fafa5f6 441 }
vsluiter 16:f0176e9e4a9d 442 }
vsluiter 2:d2f8772a8db5 443 }
vsluiter 2:d2f8772a8db5 444
vsluiter 1:7a2ec350cdf5 445 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 446 {
vsluiter 1:7a2ec350cdf5 447 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 448 Timer timer;
vsluiter 1:7a2ec350cdf5 449 timer.start();
vsluiter 1:7a2ec350cdf5 450 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 451 {
vsluiter 1:7a2ec350cdf5 452 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 453 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 454 {
vsluiter 1:7a2ec350cdf5 455 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 456 {
vsluiter 1:7a2ec350cdf5 457 if(side)
vsluiter 1:7a2ec350cdf5 458 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 459 else
vsluiter 1:7a2ec350cdf5 460 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 461 }
vsluiter 1:7a2ec350cdf5 462 else
vsluiter 1:7a2ec350cdf5 463 {
vsluiter 1:7a2ec350cdf5 464 if(side)
vsluiter 1:7a2ec350cdf5 465 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 466 else
vsluiter 1:7a2ec350cdf5 467 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 468
vsluiter 1:7a2ec350cdf5 469 }
vsluiter 1:7a2ec350cdf5 470 }
vsluiter 1:7a2ec350cdf5 471 }
vsluiter 1:7a2ec350cdf5 472 }
vsluiter 11:fc80c39ba9f0 473
vsluiter 0:cde34c55fa20 474 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 475 {
vsluiter 0:cde34c55fa20 476 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 477 Timer timer;
vsluiter 0:cde34c55fa20 478 timer.start();
vsluiter 0:cde34c55fa20 479 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 480 {
vsluiter 0:cde34c55fa20 481 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 482 {
vsluiter 0:cde34c55fa20 483 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 484 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 485 else
vsluiter 0:cde34c55fa20 486 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 487 }
vsluiter 0:cde34c55fa20 488 }
vsluiter 0:cde34c55fa20 489 }
vsluiter 0:cde34c55fa20 490
vsluiter 0:cde34c55fa20 491 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 492 {
vsluiter 0:cde34c55fa20 493 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 494 uint8_t test;
vsluiter 0:cde34c55fa20 495 Timer timer;
vsluiter 0:cde34c55fa20 496 timer.start();
vsluiter 0:cde34c55fa20 497 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 498 {
vsluiter 0:cde34c55fa20 499 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 500 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 501 {
vsluiter 0:cde34c55fa20 502 if(ledcounter == test)
vsluiter 0:cde34c55fa20 503 {
vsluiter 0:cde34c55fa20 504 if(colored)
vsluiter 0:cde34c55fa20 505 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 506 else
vsluiter 0:cde34c55fa20 507 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 508 }
vsluiter 0:cde34c55fa20 509 else
vsluiter 0:cde34c55fa20 510 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 511 }
vsluiter 0:cde34c55fa20 512 }
vsluiter 0:cde34c55fa20 513 }
vsluiter 0:cde34c55fa20 514
vsluiter 5:d2e819018807 515 void UpdateDemoPaddle(void)
vsluiter 1:7a2ec350cdf5 516 {
vsluiter 1:7a2ec350cdf5 517 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 518 if(direction) {
vsluiter 1:7a2ec350cdf5 519 paddlestart++;
vsluiter 1:7a2ec350cdf5 520 } else {
vsluiter 1:7a2ec350cdf5 521 paddlestart--;
vsluiter 1:7a2ec350cdf5 522 }
vsluiter 1:7a2ec350cdf5 523
vsluiter 1:7a2ec350cdf5 524 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 525 direction = 0;
vsluiter 1:7a2ec350cdf5 526 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 527 direction = 1;
vsluiter 1:7a2ec350cdf5 528 }