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:
Wed Aug 21 20:21:43 2013 +0000
Revision:
5:d2e819018807
Parent:
4:119537f0ff8e
Child:
6:c2040b4cf589
Game Paddle working!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:cde34c55fa20 1 #include "mbed.h"
vsluiter 0:cde34c55fa20 2
vsluiter 0:cde34c55fa20 3 #define NUMBER_OF_PIXELS 50
vsluiter 0:cde34c55fa20 4 #define PADDLE_LENGTH 5
vsluiter 2:d2f8772a8db5 5 #define LEFT false
vsluiter 2:d2f8772a8db5 6 #define RIGHT true
vsluiter 5:d2e819018807 7
vsluiter 5:d2e819018807 8 #define MAX_PADDLE_SIZE 10
vsluiter 0:cde34c55fa20 9 void Randomblinks(float seconds, bool colored = false);
vsluiter 0:cde34c55fa20 10 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 1:7a2ec350cdf5 11 void WinLoose(float seconds, bool side);
vsluiter 5:d2e819018807 12 void UpdateDemoPaddle(void);
vsluiter 2:d2f8772a8db5 13 void Score(uint8_t left, uint8_t right);
vsluiter 5:d2e819018807 14 void DrawGamePaddle(void);
vsluiter 5:d2e819018807 15
vsluiter 0:cde34c55fa20 16 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 17 volatile int8_t paddlestart= 0;
vsluiter 0:cde34c55fa20 18 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 0:cde34c55fa20 19
vsluiter 5:d2e819018807 20 class Paddle
vsluiter 5:d2e819018807 21 {
vsluiter 5:d2e819018807 22 public:
vsluiter 5:d2e819018807 23 Paddle();//constructor
vsluiter 5:d2e819018807 24 // ~Paddle();//deconstructor
vsluiter 5:d2e819018807 25 int8_t position;
vsluiter 5:d2e819018807 26 uint8_t direction;
vsluiter 5:d2e819018807 27 void setColor(uint8_t red, uint8_t green, uint8_t blue);
vsluiter 5:d2e819018807 28 uint8_t getSize(void);
vsluiter 5:d2e819018807 29 void setSize(uint8_t size);
vsluiter 5:d2e819018807 30 uint8_t getColor(uint8_t pixel, uint8_t color);
vsluiter 5:d2e819018807 31 private:
vsluiter 5:d2e819018807 32 uint8_t m_red ,m_green ,m_blue;
vsluiter 5:d2e819018807 33 uint8_t m_size;
vsluiter 5:d2e819018807 34 uint8_t m_paddle[MAX_PADDLE_SIZE][3];
vsluiter 5:d2e819018807 35 };
vsluiter 5:d2e819018807 36
vsluiter 5:d2e819018807 37 Paddle::Paddle()
vsluiter 5:d2e819018807 38 {
vsluiter 5:d2e819018807 39 setColor(255,255,255);
vsluiter 5:d2e819018807 40 setSize(4);
vsluiter 5:d2e819018807 41 position = -getSize();
vsluiter 5:d2e819018807 42 direction = 1;
vsluiter 5:d2e819018807 43 }
vsluiter 5:d2e819018807 44
vsluiter 5:d2e819018807 45 uint8_t Paddle::getColor(uint8_t pixel, uint8_t color)
vsluiter 5:d2e819018807 46 {
vsluiter 5:d2e819018807 47 if(pixel<MAX_PADDLE_SIZE && color < 3)
vsluiter 5:d2e819018807 48 return m_paddle[pixel][color];
vsluiter 5:d2e819018807 49 else
vsluiter 5:d2e819018807 50 return 0;
vsluiter 5:d2e819018807 51 }
vsluiter 5:d2e819018807 52
vsluiter 5:d2e819018807 53 uint8_t Paddle::getSize(void)
vsluiter 5:d2e819018807 54 {
vsluiter 5:d2e819018807 55 return m_size;
vsluiter 5:d2e819018807 56 }
vsluiter 5:d2e819018807 57
vsluiter 5:d2e819018807 58 void Paddle::setSize(uint8_t size)
vsluiter 5:d2e819018807 59 {
vsluiter 5:d2e819018807 60 if(size > MAX_PADDLE_SIZE)
vsluiter 5:d2e819018807 61 size = MAX_PADDLE_SIZE;
vsluiter 5:d2e819018807 62 m_size = size;
vsluiter 5:d2e819018807 63 setColor(m_red, m_green, m_blue);
vsluiter 5:d2e819018807 64 }
vsluiter 5:d2e819018807 65
vsluiter 5:d2e819018807 66 void Paddle::setColor(uint8_t red, uint8_t green, uint8_t blue)
vsluiter 5:d2e819018807 67 {
vsluiter 5:d2e819018807 68 uint8_t paddlepixel;
vsluiter 5:d2e819018807 69 m_red = red;
vsluiter 5:d2e819018807 70 m_green = green;
vsluiter 5:d2e819018807 71 m_blue = blue;
vsluiter 5:d2e819018807 72 for(paddlepixel = 0 ; paddlepixel < MAX_PADDLE_SIZE ; paddlepixel++)
vsluiter 5:d2e819018807 73 {
vsluiter 5:d2e819018807 74 float factor;
vsluiter 5:d2e819018807 75 factor = 1.0*paddlepixel/(m_size*1.0);
vsluiter 5:d2e819018807 76 if (factor > 1)
vsluiter 5:d2e819018807 77 factor = 1;
vsluiter 5:d2e819018807 78 factor = factor*factor*factor;// make the effect more dramatic
vsluiter 5:d2e819018807 79 m_paddle[paddlepixel][0] = (float)m_red * factor;
vsluiter 5:d2e819018807 80 m_paddle[paddlepixel][1] = (float)m_green * factor;
vsluiter 5:d2e819018807 81 m_paddle[paddlepixel][2] = (float)m_blue * factor;
vsluiter 5:d2e819018807 82 }
vsluiter 5:d2e819018807 83 }
vsluiter 0:cde34c55fa20 84
vsluiter 0:cde34c55fa20 85 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 86 {
vsluiter 0:cde34c55fa20 87 uint8_t pixelcounter;
vsluiter 0:cde34c55fa20 88 /*start by writing 32 zeroes */
vsluiter 0:cde34c55fa20 89 ledstrip.write(0);
vsluiter 0:cde34c55fa20 90 ledstrip.write(0);
vsluiter 0:cde34c55fa20 91 ledstrip.write(0);
vsluiter 0:cde34c55fa20 92 ledstrip.write(0);
vsluiter 0:cde34c55fa20 93 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 0:cde34c55fa20 94 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 0:cde34c55fa20 95 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 0:cde34c55fa20 96 }
vsluiter 0:cde34c55fa20 97 }
vsluiter 0:cde34c55fa20 98
vsluiter 0:cde34c55fa20 99 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 100 {
vsluiter 0:cde34c55fa20 101 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 102 }
vsluiter 5:d2e819018807 103
vsluiter 5:d2e819018807 104 Paddle paddle;
vsluiter 5:d2e819018807 105
vsluiter 0:cde34c55fa20 106 int main()
vsluiter 0:cde34c55fa20 107 {
vsluiter 0:cde34c55fa20 108 Ticker updater;
vsluiter 5:d2e819018807 109 Ticker demopaddlepos;
vsluiter 0:cde34c55fa20 110 uint8_t ledcounter;
vsluiter 4:119537f0ff8e 111 updater.attach(UpdateLEDstrip, .02);
vsluiter 5:d2e819018807 112 demopaddlepos.attach(UpdateDemoPaddle, .03);
vsluiter 0:cde34c55fa20 113 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 4:119537f0ff8e 114 ledstrip.frequency(1000000);
vsluiter 4:119537f0ff8e 115 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {//turn off leds
vsluiter 0:cde34c55fa20 116 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 117 }
vsluiter 5:d2e819018807 118 paddle.setSize(6);
vsluiter 5:d2e819018807 119 paddle.setColor(255,0,255);
vsluiter 0:cde34c55fa20 120 while(1) {
vsluiter 2:d2f8772a8db5 121 //PaddleDemo(2,255,10,100);
vsluiter 5:d2e819018807 122 DrawGamePaddle();
vsluiter 5:d2e819018807 123 wait(.05);
vsluiter 5:d2e819018807 124 //Score(3,2);
vsluiter 5:d2e819018807 125 //WinLoose(2.5, LEFT);
vsluiter 5:d2e819018807 126 if(paddle.direction == 1)
vsluiter 5:d2e819018807 127 paddle.position++;
vsluiter 5:d2e819018807 128 else
vsluiter 5:d2e819018807 129 paddle.position--;
vsluiter 5:d2e819018807 130 if(paddle.position == NUMBER_OF_PIXELS)
vsluiter 5:d2e819018807 131 paddle.direction = 0;
vsluiter 5:d2e819018807 132 if(paddle.position == -7)
vsluiter 5:d2e819018807 133 paddle.direction = 1;
vsluiter 5:d2e819018807 134 // paddle.position = -paddle.getSize();
vsluiter 2:d2f8772a8db5 135 //Randomblinks(5, true);
vsluiter 2:d2f8772a8db5 136 //WinLoose(3, false);
vsluiter 0:cde34c55fa20 137 }
vsluiter 0:cde34c55fa20 138 }
vsluiter 0:cde34c55fa20 139
vsluiter 5:d2e819018807 140 void DrawGamePaddle(void)
vsluiter 5:d2e819018807 141 {
vsluiter 5:d2e819018807 142 uint8_t ledcounter;
vsluiter 5:d2e819018807 143 for(ledcounter = 0; ledcounter< NUMBER_OF_PIXELS; ledcounter++)
vsluiter 5:d2e819018807 144 {
vsluiter 5:d2e819018807 145 if(ledcounter >= paddle.position && ledcounter <= paddle.position+paddle.getSize())
vsluiter 5:d2e819018807 146 {
vsluiter 5:d2e819018807 147 uint8_t colorpos;
vsluiter 5:d2e819018807 148 if(paddle.direction ==1)
vsluiter 5:d2e819018807 149 {
vsluiter 5:d2e819018807 150 colorpos = ledcounter-paddle.position;
vsluiter 5:d2e819018807 151 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 152 }
vsluiter 5:d2e819018807 153 else
vsluiter 5:d2e819018807 154 {
vsluiter 5:d2e819018807 155 colorpos = paddle.getSize()-(ledcounter-paddle.position);
vsluiter 5:d2e819018807 156 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 157 }
vsluiter 5:d2e819018807 158 }
vsluiter 5:d2e819018807 159 else
vsluiter 5:d2e819018807 160 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 5:d2e819018807 161 }
vsluiter 5:d2e819018807 162 }
vsluiter 5:d2e819018807 163
vsluiter 2:d2f8772a8db5 164 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 165 {
vsluiter 2:d2f8772a8db5 166 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 167 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 168 uint8_t scorecounter;
vsluiter 3:a2b58da5c03b 169 typedef struct ledcolor
vsluiter 3:a2b58da5c03b 170 {
vsluiter 3:a2b58da5c03b 171 uint8_t red;
vsluiter 3:a2b58da5c03b 172 uint8_t green;
vsluiter 3:a2b58da5c03b 173 uint8_t blue;
vsluiter 3:a2b58da5c03b 174 }ledcolor_t;
vsluiter 3:a2b58da5c03b 175 ledcolor_t rightled={0,0,0}, leftled={0,0,0};
vsluiter 3:a2b58da5c03b 176 if(left >= right)
vsluiter 3:a2b58da5c03b 177 {
vsluiter 3:a2b58da5c03b 178 maxscore = left;
vsluiter 3:a2b58da5c03b 179 leftled.green = 255;
vsluiter 3:a2b58da5c03b 180 rightled.red = 255;
vsluiter 3:a2b58da5c03b 181 }
vsluiter 3:a2b58da5c03b 182 if(right >= left)
vsluiter 3:a2b58da5c03b 183 {
vsluiter 3:a2b58da5c03b 184 maxscore = right;
vsluiter 3:a2b58da5c03b 185 leftled.red = 255;
vsluiter 3:a2b58da5c03b 186 rightled.green = 255;
vsluiter 3:a2b58da5c03b 187 }
vsluiter 2:d2f8772a8db5 188 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 189 {
vsluiter 2:d2f8772a8db5 190 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 191 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 192 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 193 uint8_t sidecounter;
vsluiter 2:d2f8772a8db5 194 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 2:d2f8772a8db5 195 {
vsluiter 2:d2f8772a8db5 196 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 197 }
vsluiter 2:d2f8772a8db5 198 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 199 {
vsluiter 3:a2b58da5c03b 200 write_led(&totalstrip[sidecounter*2],leftled.red,leftled.green,leftled.blue);
vsluiter 2:d2f8772a8db5 201 }
vsluiter 2:d2f8772a8db5 202 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 203 {
vsluiter 3:a2b58da5c03b 204 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
vsluiter 2:d2f8772a8db5 205 }
vsluiter 3:a2b58da5c03b 206 wait(0.7);
vsluiter 2:d2f8772a8db5 207 }
vsluiter 3:a2b58da5c03b 208 wait(0.5);
vsluiter 2:d2f8772a8db5 209 }
vsluiter 2:d2f8772a8db5 210
vsluiter 1:7a2ec350cdf5 211 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 212 {
vsluiter 1:7a2ec350cdf5 213 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 214 Timer timer;
vsluiter 1:7a2ec350cdf5 215 timer.start();
vsluiter 1:7a2ec350cdf5 216 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 217 {
vsluiter 1:7a2ec350cdf5 218 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 219 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 220 {
vsluiter 1:7a2ec350cdf5 221 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 222 {
vsluiter 1:7a2ec350cdf5 223 if(side)
vsluiter 1:7a2ec350cdf5 224 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 225 else
vsluiter 1:7a2ec350cdf5 226 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 227 }
vsluiter 1:7a2ec350cdf5 228 else
vsluiter 1:7a2ec350cdf5 229 {
vsluiter 1:7a2ec350cdf5 230 if(side)
vsluiter 1:7a2ec350cdf5 231 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 232 else
vsluiter 1:7a2ec350cdf5 233 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 234
vsluiter 1:7a2ec350cdf5 235 }
vsluiter 1:7a2ec350cdf5 236 }
vsluiter 1:7a2ec350cdf5 237 }
vsluiter 1:7a2ec350cdf5 238 }
vsluiter 0:cde34c55fa20 239 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 240 {
vsluiter 0:cde34c55fa20 241 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 242 Timer timer;
vsluiter 0:cde34c55fa20 243 timer.start();
vsluiter 0:cde34c55fa20 244 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 245 {
vsluiter 0:cde34c55fa20 246 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 247 {
vsluiter 0:cde34c55fa20 248 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 249 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 250 else
vsluiter 0:cde34c55fa20 251 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 252 }
vsluiter 0:cde34c55fa20 253 }
vsluiter 0:cde34c55fa20 254 }
vsluiter 0:cde34c55fa20 255
vsluiter 0:cde34c55fa20 256 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 257 {
vsluiter 0:cde34c55fa20 258 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 259 uint8_t test;
vsluiter 0:cde34c55fa20 260 Timer timer;
vsluiter 0:cde34c55fa20 261 timer.start();
vsluiter 0:cde34c55fa20 262 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 263 {
vsluiter 0:cde34c55fa20 264 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 265 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 266 {
vsluiter 0:cde34c55fa20 267 if(ledcounter == test)
vsluiter 0:cde34c55fa20 268 {
vsluiter 0:cde34c55fa20 269 if(colored)
vsluiter 0:cde34c55fa20 270 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 271 else
vsluiter 0:cde34c55fa20 272 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 273 }
vsluiter 0:cde34c55fa20 274 else
vsluiter 0:cde34c55fa20 275 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 276 }
vsluiter 0:cde34c55fa20 277 }
vsluiter 0:cde34c55fa20 278 }
vsluiter 0:cde34c55fa20 279
vsluiter 5:d2e819018807 280 void UpdateDemoPaddle(void)
vsluiter 1:7a2ec350cdf5 281 {
vsluiter 1:7a2ec350cdf5 282 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 283 if(direction) {
vsluiter 1:7a2ec350cdf5 284 paddlestart++;
vsluiter 1:7a2ec350cdf5 285 } else {
vsluiter 1:7a2ec350cdf5 286 paddlestart--;
vsluiter 1:7a2ec350cdf5 287 }
vsluiter 1:7a2ec350cdf5 288
vsluiter 1:7a2ec350cdf5 289 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 290 direction = 0;
vsluiter 1:7a2ec350cdf5 291 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 292 direction = 1;
vsluiter 1:7a2ec350cdf5 293 }
vsluiter 1:7a2ec350cdf5 294
vsluiter 2:d2f8772a8db5 295
vsluiter 0:cde34c55fa20 296 //DigitalOut myled(LED1);
vsluiter 0:cde34c55fa20 297
vsluiter 0:cde34c55fa20 298 //int main() {
vsluiter 0:cde34c55fa20 299 // while(1) {
vsluiter 0:cde34c55fa20 300 // myled = 1;
vsluiter 0:cde34c55fa20 301 // wait(0.2);
vsluiter 0:cde34c55fa20 302 // myled = 0;
vsluiter 0:cde34c55fa20 303 // wait(0.2);
vsluiter 0:cde34c55fa20 304 // }
vsluiter 0:cde34c55fa20 305 //}