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 17:04:50 2013 +0000
Revision:
17:c5a38d01dfbe
Parent:
16:f0176e9e4a9d
Child:
18:789e9fafa5f6
Last update before using GameButton

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