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:
Fri Aug 23 07:52:12 2013 +0000
Revision:
14:5b588ea6bd8f
Parent:
13:e96098b6660d
Child:
15:72c494e934c8
Adaptive speed depending on position where paddle is hit

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 0:cde34c55fa20 17 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 18 volatile int8_t paddlestart= 0;
vsluiter 0:cde34c55fa20 19 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 12:97c71b84c984 20 MODSERIAL pc(USBTX,USBRX);
vsluiter 0:cde34c55fa20 21
vsluiter 5:d2e819018807 22 class Paddle
vsluiter 5:d2e819018807 23 {
vsluiter 5:d2e819018807 24 public:
vsluiter 5:d2e819018807 25 Paddle();//constructor
vsluiter 5:d2e819018807 26 // ~Paddle();//deconstructor
vsluiter 11:fc80c39ba9f0 27 int16_t position;
vsluiter 5:d2e819018807 28 uint8_t direction;
vsluiter 12:97c71b84c984 29 void setSpeed(float speed); //pixels per second
vsluiter 5:d2e819018807 30 void setColor(uint8_t red, uint8_t green, uint8_t blue);
vsluiter 5:d2e819018807 31 uint8_t getSize(void);
vsluiter 5:d2e819018807 32 void setSize(uint8_t size);
vsluiter 5:d2e819018807 33 uint8_t getColor(uint8_t pixel, uint8_t color);
vsluiter 5:d2e819018807 34 private:
vsluiter 5:d2e819018807 35 uint8_t m_red ,m_green ,m_blue;
vsluiter 5:d2e819018807 36 uint8_t m_size;
vsluiter 5:d2e819018807 37 uint8_t m_paddle[MAX_PADDLE_SIZE][3];
vsluiter 7:e605dbca7330 38 float m_speed;
vsluiter 7:e605dbca7330 39 Ticker UpdatePosition;
vsluiter 7:e605dbca7330 40 void PositionUpdater(void);
vsluiter 5:d2e819018807 41 };
vsluiter 5:d2e819018807 42
vsluiter 5:d2e819018807 43 Paddle::Paddle()
vsluiter 5:d2e819018807 44 {
vsluiter 5:d2e819018807 45 setColor(255,255,255);
vsluiter 5:d2e819018807 46 setSize(4);
vsluiter 5:d2e819018807 47 position = -getSize();
vsluiter 5:d2e819018807 48 direction = 1;
vsluiter 7:e605dbca7330 49 setSpeed(50);
vsluiter 7:e605dbca7330 50 }
vsluiter 7:e605dbca7330 51
vsluiter 7:e605dbca7330 52 void Paddle::setSpeed(float speed)
vsluiter 7:e605dbca7330 53 {
vsluiter 7:e605dbca7330 54 //truncate
vsluiter 7:e605dbca7330 55 float time;
vsluiter 7:e605dbca7330 56 if(speed > 100000)
vsluiter 7:e605dbca7330 57 speed = 100000;
vsluiter 7:e605dbca7330 58 if(speed <= 0)
vsluiter 7:e605dbca7330 59 speed = 0.001;
vsluiter 7:e605dbca7330 60 m_speed = speed;
vsluiter 7:e605dbca7330 61 time = 1/m_speed;
vsluiter 10:6f9624c7425d 62 UpdatePosition.detach();
vsluiter 7:e605dbca7330 63 UpdatePosition.attach(this,&Paddle::PositionUpdater, time);
vsluiter 7:e605dbca7330 64 }
vsluiter 7:e605dbca7330 65
vsluiter 7:e605dbca7330 66 void Paddle::PositionUpdater(void)
vsluiter 7:e605dbca7330 67 {
vsluiter 7:e605dbca7330 68 if(direction == 1)
vsluiter 7:e605dbca7330 69 position++;
vsluiter 7:e605dbca7330 70 else
vsluiter 7:e605dbca7330 71 position--;
vsluiter 5:d2e819018807 72 }
vsluiter 5:d2e819018807 73
vsluiter 5:d2e819018807 74 uint8_t Paddle::getColor(uint8_t pixel, uint8_t color)
vsluiter 5:d2e819018807 75 {
vsluiter 5:d2e819018807 76 if(pixel<MAX_PADDLE_SIZE && color < 3)
vsluiter 5:d2e819018807 77 return m_paddle[pixel][color];
vsluiter 5:d2e819018807 78 else
vsluiter 5:d2e819018807 79 return 0;
vsluiter 5:d2e819018807 80 }
vsluiter 5:d2e819018807 81
vsluiter 5:d2e819018807 82 uint8_t Paddle::getSize(void)
vsluiter 5:d2e819018807 83 {
vsluiter 5:d2e819018807 84 return m_size;
vsluiter 5:d2e819018807 85 }
vsluiter 5:d2e819018807 86
vsluiter 5:d2e819018807 87 void Paddle::setSize(uint8_t size)
vsluiter 5:d2e819018807 88 {
vsluiter 5:d2e819018807 89 if(size > MAX_PADDLE_SIZE)
vsluiter 5:d2e819018807 90 size = MAX_PADDLE_SIZE;
vsluiter 5:d2e819018807 91 m_size = size;
vsluiter 5:d2e819018807 92 setColor(m_red, m_green, m_blue);
vsluiter 5:d2e819018807 93 }
vsluiter 5:d2e819018807 94
vsluiter 5:d2e819018807 95 void Paddle::setColor(uint8_t red, uint8_t green, uint8_t blue)
vsluiter 5:d2e819018807 96 {
vsluiter 5:d2e819018807 97 uint8_t paddlepixel;
vsluiter 5:d2e819018807 98 m_red = red;
vsluiter 5:d2e819018807 99 m_green = green;
vsluiter 5:d2e819018807 100 m_blue = blue;
vsluiter 5:d2e819018807 101 for(paddlepixel = 0 ; paddlepixel < MAX_PADDLE_SIZE ; paddlepixel++)
vsluiter 5:d2e819018807 102 {
vsluiter 5:d2e819018807 103 float factor;
vsluiter 5:d2e819018807 104 factor = 1.0*paddlepixel/(m_size*1.0);
vsluiter 5:d2e819018807 105 if (factor > 1)
vsluiter 5:d2e819018807 106 factor = 1;
vsluiter 5:d2e819018807 107 factor = factor*factor*factor;// make the effect more dramatic
vsluiter 5:d2e819018807 108 m_paddle[paddlepixel][0] = (float)m_red * factor;
vsluiter 5:d2e819018807 109 m_paddle[paddlepixel][1] = (float)m_green * factor;
vsluiter 5:d2e819018807 110 m_paddle[paddlepixel][2] = (float)m_blue * factor;
vsluiter 5:d2e819018807 111 }
vsluiter 5:d2e819018807 112 }
vsluiter 0:cde34c55fa20 113
vsluiter 0:cde34c55fa20 114 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 115 {
vsluiter 0:cde34c55fa20 116 uint8_t pixelcounter;
vsluiter 0:cde34c55fa20 117 /*start by writing 32 zeroes */
vsluiter 0:cde34c55fa20 118 ledstrip.write(0);
vsluiter 0:cde34c55fa20 119 ledstrip.write(0);
vsluiter 0:cde34c55fa20 120 ledstrip.write(0);
vsluiter 0:cde34c55fa20 121 ledstrip.write(0);
vsluiter 0:cde34c55fa20 122 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 0:cde34c55fa20 123 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 124 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 0:cde34c55fa20 125 }
vsluiter 0:cde34c55fa20 126 }
vsluiter 0:cde34c55fa20 127
vsluiter 0:cde34c55fa20 128 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 129 {
vsluiter 0:cde34c55fa20 130 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 131 }
vsluiter 5:d2e819018807 132
vsluiter 5:d2e819018807 133 Paddle paddle;
vsluiter 6:c2040b4cf589 134 bool leftpushed = false, rightpushed = false;
vsluiter 12:97c71b84c984 135 int16_t leftpushpos= 0, rightpushpos = 0;
vsluiter 6:c2040b4cf589 136 void left_pushed(void)
vsluiter 6:c2040b4cf589 137 {
vsluiter 12:97c71b84c984 138 leftpushpos = paddle.position;
vsluiter 8:f46db1ff5ec9 139 if(paddle.direction != 1)
vsluiter 6:c2040b4cf589 140 leftpushed = true;
vsluiter 6:c2040b4cf589 141 }
vsluiter 6:c2040b4cf589 142
vsluiter 6:c2040b4cf589 143 void right_pushed(void)
vsluiter 6:c2040b4cf589 144 {
vsluiter 12:97c71b84c984 145 rightpushpos = paddle.position;
vsluiter 8:f46db1ff5ec9 146 if(paddle.direction == 1)
vsluiter 6:c2040b4cf589 147 rightpushed = true;
vsluiter 6:c2040b4cf589 148 }
vsluiter 5:d2e819018807 149
vsluiter 0:cde34c55fa20 150 int main()
vsluiter 0:cde34c55fa20 151 {
vsluiter 0:cde34c55fa20 152 Ticker updater;
vsluiter 12:97c71b84c984 153 //Ticker demopaddlepos;
vsluiter 8:f46db1ff5ec9 154 Timer gametimer;
vsluiter 6:c2040b4cf589 155 InterruptIn buttonleft(PTD5);
vsluiter 6:c2040b4cf589 156 InterruptIn buttonright(PTD0);
vsluiter 0:cde34c55fa20 157 uint8_t ledcounter;
vsluiter 8:f46db1ff5ec9 158 uint8_t left_score = 0, right_score = 0;
vsluiter 12:97c71b84c984 159 pc.baud(115200);
vsluiter 6:c2040b4cf589 160 buttonleft.mode(PullUp);
vsluiter 6:c2040b4cf589 161 buttonright.mode(PullUp);
vsluiter 8:f46db1ff5ec9 162 buttonright.fall(right_pushed);
vsluiter 6:c2040b4cf589 163 buttonleft.fall(left_pushed);
vsluiter 12:97c71b84c984 164 updater.attach(UpdateLEDstrip, .03);
vsluiter 12:97c71b84c984 165 //demopaddlepos.attach(UpdateDemoPaddle, .03);
vsluiter 0:cde34c55fa20 166 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 11:fc80c39ba9f0 167 ledstrip.frequency(1000000); //1MHz clock
vsluiter 4:119537f0ff8e 168 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {//turn off leds
vsluiter 0:cde34c55fa20 169 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 170 }
vsluiter 5:d2e819018807 171 paddle.setSize(6);
vsluiter 12:97c71b84c984 172 paddle.setSpeed(STARTING_SPEED);
vsluiter 5:d2e819018807 173 paddle.setColor(255,0,255);
vsluiter 9:c5086fe3c0cc 174 gametimer.start();
vsluiter 0:cde34c55fa20 175 while(1) {
vsluiter 10:6f9624c7425d 176 static uint8_t naglevel1 = 0, naglevel2 = 0;
vsluiter 12:97c71b84c984 177 //paddle.position = 48;
vsluiter 12:97c71b84c984 178 //while(1);
vsluiter 13:e96098b6660d 179 if(leftpushed || rightpushed)
vsluiter 6:c2040b4cf589 180 {
vsluiter 13:e96098b6660d 181 if(paddle.direction == 1)
vsluiter 6:c2040b4cf589 182 {
vsluiter 13:e96098b6660d 183 if(rightpushed)
vsluiter 12:97c71b84c984 184 {
vsluiter 13:e96098b6660d 185 //printf("\n\rright pushed");
vsluiter 13:e96098b6660d 186 rightpushed = false;
vsluiter 13:e96098b6660d 187 if(rightpushpos >= NUMBER_OF_PIXELS )
vsluiter 13:e96098b6660d 188 {
vsluiter 13:e96098b6660d 189 paddle.direction = 0;
vsluiter 14:5b588ea6bd8f 190 paddle.setSpeed(25+(-NUMBER_OF_PIXELS+rightpushpos)*4);
vsluiter 13:e96098b6660d 191 paddle.position = NUMBER_OF_PIXELS;
vsluiter 13:e96098b6660d 192 }
vsluiter 13:e96098b6660d 193 pc.printf("\n\rright pushed. Paddle position: %d, registered: %d", paddle.position, rightpushpos);
vsluiter 12:97c71b84c984 194 }
vsluiter 13:e96098b6660d 195 }
vsluiter 13:e96098b6660d 196 else
vsluiter 13:e96098b6660d 197 {
vsluiter 13:e96098b6660d 198 if(leftpushed)
vsluiter 13:e96098b6660d 199 {
vsluiter 13:e96098b6660d 200 //printf("\n\rleft pushed");
vsluiter 13:e96098b6660d 201 leftpushed = false;
vsluiter 13:e96098b6660d 202 if(leftpushpos <= 0 )
vsluiter 13:e96098b6660d 203 {
vsluiter 13:e96098b6660d 204 paddle.direction = 1;
vsluiter 14:5b588ea6bd8f 205 paddle.setSpeed(25+(-leftpushpos)*4);
vsluiter 13:e96098b6660d 206 paddle.position = 0;
vsluiter 13:e96098b6660d 207 }
vsluiter 13:e96098b6660d 208 pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d", paddle.position, leftpushpos);
vsluiter 13:e96098b6660d 209 }
vsluiter 6:c2040b4cf589 210 }
vsluiter 6:c2040b4cf589 211 }
vsluiter 5:d2e819018807 212 else
vsluiter 13:e96098b6660d 213 {
vsluiter 13:e96098b6660d 214 if(paddle.position > ( NUMBER_OF_PIXELS + paddle.getSize() ) && (paddle.direction == 1))
vsluiter 6:c2040b4cf589 215 {
vsluiter 13:e96098b6660d 216 pc.printf("\n\rleft player score. Paddle position: %d", paddle.position);
vsluiter 13:e96098b6660d 217 //left player scores!
vsluiter 13:e96098b6660d 218 left_score++;
vsluiter 13:e96098b6660d 219 HandleScore(&left_score,&right_score,false, &gametimer);
vsluiter 13:e96098b6660d 220 paddle.position = -paddle.getSize();
vsluiter 13:e96098b6660d 221 naglevel1=naglevel2 = 0;
vsluiter 6:c2040b4cf589 222 }
vsluiter 13:e96098b6660d 223 if(paddle.position < -paddle.getSize() && (paddle.direction == 0))
vsluiter 13:e96098b6660d 224 {
vsluiter 13:e96098b6660d 225 pc.printf("\n\rlright player score. Paddle position: %d", paddle.position);
vsluiter 13:e96098b6660d 226 //right player scores!
vsluiter 13:e96098b6660d 227 right_score++;
vsluiter 13:e96098b6660d 228 HandleScore(&left_score,&right_score,true, &gametimer);
vsluiter 13:e96098b6660d 229 naglevel1=naglevel2 = 0;
vsluiter 13:e96098b6660d 230 paddle.position = NUMBER_OF_PIXELS;
vsluiter 13:e96098b6660d 231 }
vsluiter 12:97c71b84c984 232 }
vsluiter 12:97c71b84c984 233 if(gametimer.read()>6 && !naglevel1)
vsluiter 9:c5086fe3c0cc 234 {
vsluiter 10:6f9624c7425d 235 naglevel1 = 1;
vsluiter 9:c5086fe3c0cc 236 paddle.setSize(4);
vsluiter 14:5b588ea6bd8f 237 //paddle.setSpeed(40);
vsluiter 9:c5086fe3c0cc 238 }
vsluiter 11:fc80c39ba9f0 239 if(gametimer.read()>10 && !naglevel2)
vsluiter 9:c5086fe3c0cc 240 {
vsluiter 10:6f9624c7425d 241 naglevel2 = 1;
vsluiter 9:c5086fe3c0cc 242 paddle.setSize(2);
vsluiter 14:5b588ea6bd8f 243 //paddle.setSpeed(70);
vsluiter 9:c5086fe3c0cc 244 }
vsluiter 12:97c71b84c984 245 DrawGamePaddle();
vsluiter 0:cde34c55fa20 246 }
vsluiter 0:cde34c55fa20 247 }
vsluiter 0:cde34c55fa20 248
vsluiter 9:c5086fe3c0cc 249 void HandleScore(uint8_t *leftscore, uint8_t *rightscore, bool last_won, Timer *gametimer)
vsluiter 9:c5086fe3c0cc 250 {
vsluiter 10:6f9624c7425d 251 WinLoose(1.5, last_won);
vsluiter 9:c5086fe3c0cc 252 Score(*leftscore, *rightscore);
vsluiter 9:c5086fe3c0cc 253 if(*leftscore + *rightscore == 11)
vsluiter 9:c5086fe3c0cc 254 {
vsluiter 9:c5086fe3c0cc 255 *leftscore = 0;
vsluiter 9:c5086fe3c0cc 256 *rightscore = 0;
vsluiter 9:c5086fe3c0cc 257 Randomblinks(2,5);
vsluiter 9:c5086fe3c0cc 258 }
vsluiter 9:c5086fe3c0cc 259 (*(mbed::Timer *)gametimer).reset();
vsluiter 9:c5086fe3c0cc 260 paddle.setSize(6);
vsluiter 12:97c71b84c984 261 paddle.setSpeed(STARTING_SPEED);
vsluiter 9:c5086fe3c0cc 262 }
vsluiter 9:c5086fe3c0cc 263
vsluiter 5:d2e819018807 264 void DrawGamePaddle(void)
vsluiter 5:d2e819018807 265 {
vsluiter 5:d2e819018807 266 uint8_t ledcounter;
vsluiter 12:97c71b84c984 267 uint8_t colorpos;
vsluiter 5:d2e819018807 268 for(ledcounter = 0; ledcounter< NUMBER_OF_PIXELS; ledcounter++)
vsluiter 5:d2e819018807 269 {
vsluiter 12:97c71b84c984 270 if(paddle.direction == 1)
vsluiter 5:d2e819018807 271 {
vsluiter 12:97c71b84c984 272 if(ledcounter > paddle.position-paddle.getSize() && ledcounter <= paddle.position)
vsluiter 5:d2e819018807 273 {
vsluiter 12:97c71b84c984 274 colorpos = paddle.getSize()-(paddle.position - ledcounter);//paddle.getSize()-(ledcounter-paddle.position);
vsluiter 5:d2e819018807 275 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 276 }
vsluiter 5:d2e819018807 277 else
vsluiter 12:97c71b84c984 278 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 12:97c71b84c984 279 }
vsluiter 12:97c71b84c984 280 else
vsluiter 12:97c71b84c984 281 {
vsluiter 12:97c71b84c984 282 if(ledcounter >= paddle.position && ledcounter <= paddle.position+paddle.getSize())
vsluiter 5:d2e819018807 283 {
vsluiter 5:d2e819018807 284 colorpos = paddle.getSize()-(ledcounter-paddle.position);
vsluiter 5:d2e819018807 285 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
vsluiter 5:d2e819018807 286 }
vsluiter 12:97c71b84c984 287 else
vsluiter 12:97c71b84c984 288 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 5:d2e819018807 289 }
vsluiter 5:d2e819018807 290 }
vsluiter 5:d2e819018807 291 }
vsluiter 5:d2e819018807 292
vsluiter 2:d2f8772a8db5 293 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 294 {
vsluiter 2:d2f8772a8db5 295 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 296 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 297 uint8_t scorecounter;
vsluiter 3:a2b58da5c03b 298 typedef struct ledcolor
vsluiter 3:a2b58da5c03b 299 {
vsluiter 3:a2b58da5c03b 300 uint8_t red;
vsluiter 3:a2b58da5c03b 301 uint8_t green;
vsluiter 3:a2b58da5c03b 302 uint8_t blue;
vsluiter 3:a2b58da5c03b 303 }ledcolor_t;
vsluiter 3:a2b58da5c03b 304 ledcolor_t rightled={0,0,0}, leftled={0,0,0};
vsluiter 3:a2b58da5c03b 305 if(left >= right)
vsluiter 3:a2b58da5c03b 306 {
vsluiter 3:a2b58da5c03b 307 maxscore = left;
vsluiter 3:a2b58da5c03b 308 leftled.green = 255;
vsluiter 3:a2b58da5c03b 309 rightled.red = 255;
vsluiter 3:a2b58da5c03b 310 }
vsluiter 3:a2b58da5c03b 311 if(right >= left)
vsluiter 3:a2b58da5c03b 312 {
vsluiter 3:a2b58da5c03b 313 maxscore = right;
vsluiter 3:a2b58da5c03b 314 leftled.red = 255;
vsluiter 3:a2b58da5c03b 315 rightled.green = 255;
vsluiter 3:a2b58da5c03b 316 }
vsluiter 2:d2f8772a8db5 317 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 318 {
vsluiter 2:d2f8772a8db5 319 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 320 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 321 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 322 uint8_t sidecounter;
vsluiter 2:d2f8772a8db5 323 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 2:d2f8772a8db5 324 {
vsluiter 2:d2f8772a8db5 325 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 326 }
vsluiter 2:d2f8772a8db5 327 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 328 {
vsluiter 3:a2b58da5c03b 329 write_led(&totalstrip[sidecounter*2],leftled.red,leftled.green,leftled.blue);
vsluiter 2:d2f8772a8db5 330 }
vsluiter 2:d2f8772a8db5 331 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 332 {
vsluiter 3:a2b58da5c03b 333 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
vsluiter 2:d2f8772a8db5 334 }
vsluiter 10:6f9624c7425d 335 wait(0.4);
vsluiter 2:d2f8772a8db5 336 }
vsluiter 3:a2b58da5c03b 337 wait(0.5);
vsluiter 2:d2f8772a8db5 338 }
vsluiter 2:d2f8772a8db5 339
vsluiter 1:7a2ec350cdf5 340 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 341 {
vsluiter 1:7a2ec350cdf5 342 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 343 Timer timer;
vsluiter 1:7a2ec350cdf5 344 timer.start();
vsluiter 1:7a2ec350cdf5 345 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 346 {
vsluiter 1:7a2ec350cdf5 347 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 348 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 349 {
vsluiter 1:7a2ec350cdf5 350 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 351 {
vsluiter 1:7a2ec350cdf5 352 if(side)
vsluiter 1:7a2ec350cdf5 353 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 354 else
vsluiter 1:7a2ec350cdf5 355 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 356 }
vsluiter 1:7a2ec350cdf5 357 else
vsluiter 1:7a2ec350cdf5 358 {
vsluiter 1:7a2ec350cdf5 359 if(side)
vsluiter 1:7a2ec350cdf5 360 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 361 else
vsluiter 1:7a2ec350cdf5 362 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 363
vsluiter 1:7a2ec350cdf5 364 }
vsluiter 1:7a2ec350cdf5 365 }
vsluiter 1:7a2ec350cdf5 366 }
vsluiter 1:7a2ec350cdf5 367 }
vsluiter 11:fc80c39ba9f0 368
vsluiter 0:cde34c55fa20 369 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 370 {
vsluiter 0:cde34c55fa20 371 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 372 Timer timer;
vsluiter 0:cde34c55fa20 373 timer.start();
vsluiter 0:cde34c55fa20 374 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 375 {
vsluiter 0:cde34c55fa20 376 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 377 {
vsluiter 0:cde34c55fa20 378 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 379 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 380 else
vsluiter 0:cde34c55fa20 381 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 382 }
vsluiter 0:cde34c55fa20 383 }
vsluiter 0:cde34c55fa20 384 }
vsluiter 0:cde34c55fa20 385
vsluiter 0:cde34c55fa20 386 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 387 {
vsluiter 0:cde34c55fa20 388 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 389 uint8_t test;
vsluiter 0:cde34c55fa20 390 Timer timer;
vsluiter 0:cde34c55fa20 391 timer.start();
vsluiter 0:cde34c55fa20 392 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 393 {
vsluiter 0:cde34c55fa20 394 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 395 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 396 {
vsluiter 0:cde34c55fa20 397 if(ledcounter == test)
vsluiter 0:cde34c55fa20 398 {
vsluiter 0:cde34c55fa20 399 if(colored)
vsluiter 0:cde34c55fa20 400 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 401 else
vsluiter 0:cde34c55fa20 402 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 403 }
vsluiter 0:cde34c55fa20 404 else
vsluiter 0:cde34c55fa20 405 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 406 }
vsluiter 0:cde34c55fa20 407 }
vsluiter 0:cde34c55fa20 408 }
vsluiter 0:cde34c55fa20 409
vsluiter 5:d2e819018807 410 void UpdateDemoPaddle(void)
vsluiter 1:7a2ec350cdf5 411 {
vsluiter 1:7a2ec350cdf5 412 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 413 if(direction) {
vsluiter 1:7a2ec350cdf5 414 paddlestart++;
vsluiter 1:7a2ec350cdf5 415 } else {
vsluiter 1:7a2ec350cdf5 416 paddlestart--;
vsluiter 1:7a2ec350cdf5 417 }
vsluiter 1:7a2ec350cdf5 418
vsluiter 1:7a2ec350cdf5 419 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 420 direction = 0;
vsluiter 1:7a2ec350cdf5 421 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 422 direction = 1;
vsluiter 1:7a2ec350cdf5 423 }