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 18:32:16 2013 +0000
Revision:
3:a2b58da5c03b
Parent:
2:d2f8772a8db5
Child:
4:119537f0ff8e
Added coloring to scoring

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 0:cde34c55fa20 7 void Randomblinks(float seconds, bool colored = false);
vsluiter 0:cde34c55fa20 8 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 1:7a2ec350cdf5 9 void WinLoose(float seconds, bool side);
vsluiter 1:7a2ec350cdf5 10 void UpdatePaddle(void);
vsluiter 2:d2f8772a8db5 11 void Score(uint8_t left, uint8_t right);
vsluiter 0:cde34c55fa20 12 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 13 volatile int8_t paddlestart= 0;
vsluiter 0:cde34c55fa20 14 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 0:cde34c55fa20 15
vsluiter 0:cde34c55fa20 16
vsluiter 0:cde34c55fa20 17 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 18 {
vsluiter 0:cde34c55fa20 19 uint8_t pixelcounter;
vsluiter 0:cde34c55fa20 20 /*start by writing 32 zeroes */
vsluiter 0:cde34c55fa20 21 ledstrip.write(0);
vsluiter 0:cde34c55fa20 22 ledstrip.write(0);
vsluiter 0:cde34c55fa20 23 ledstrip.write(0);
vsluiter 0:cde34c55fa20 24 ledstrip.write(0);
vsluiter 0:cde34c55fa20 25 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 0:cde34c55fa20 26 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 27 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 0:cde34c55fa20 28 }
vsluiter 0:cde34c55fa20 29 }
vsluiter 0:cde34c55fa20 30
vsluiter 0:cde34c55fa20 31 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 32 {
vsluiter 0:cde34c55fa20 33 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 34 }
vsluiter 0:cde34c55fa20 35 int main()
vsluiter 0:cde34c55fa20 36 {
vsluiter 0:cde34c55fa20 37 Ticker updater;
vsluiter 0:cde34c55fa20 38 Ticker paddlepos;
vsluiter 0:cde34c55fa20 39 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 40 updater.attach(UpdateLEDstrip, .05);
vsluiter 0:cde34c55fa20 41 paddlepos.attach(UpdatePaddle, .03);
vsluiter 0:cde34c55fa20 42 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 0:cde34c55fa20 43 ledstrip.frequency(100000);
vsluiter 0:cde34c55fa20 44 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {
vsluiter 0:cde34c55fa20 45 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 46 }
vsluiter 0:cde34c55fa20 47 while(1) {
vsluiter 2:d2f8772a8db5 48 //PaddleDemo(2,255,10,100);
vsluiter 2:d2f8772a8db5 49 Score(0,0);
vsluiter 3:a2b58da5c03b 50 Score(1,1);
vsluiter 2:d2f8772a8db5 51 Score(0,1);
vsluiter 2:d2f8772a8db5 52 Score(3,2);
vsluiter 2:d2f8772a8db5 53 WinLoose(2.5, LEFT);
vsluiter 2:d2f8772a8db5 54 Score(3,4);
vsluiter 2:d2f8772a8db5 55 WinLoose(1.5, RIGHT);
vsluiter 2:d2f8772a8db5 56 //Randomblinks(5, true);
vsluiter 2:d2f8772a8db5 57 //WinLoose(3, false);
vsluiter 0:cde34c55fa20 58 }
vsluiter 0:cde34c55fa20 59 }
vsluiter 0:cde34c55fa20 60
vsluiter 2:d2f8772a8db5 61 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 62 {
vsluiter 2:d2f8772a8db5 63 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 64 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 65 uint8_t scorecounter;
vsluiter 3:a2b58da5c03b 66 typedef struct ledcolor
vsluiter 3:a2b58da5c03b 67 {
vsluiter 3:a2b58da5c03b 68 uint8_t red;
vsluiter 3:a2b58da5c03b 69 uint8_t green;
vsluiter 3:a2b58da5c03b 70 uint8_t blue;
vsluiter 3:a2b58da5c03b 71 }ledcolor_t;
vsluiter 3:a2b58da5c03b 72 ledcolor_t rightled={0,0,0}, leftled={0,0,0};
vsluiter 3:a2b58da5c03b 73 if(left >= right)
vsluiter 3:a2b58da5c03b 74 {
vsluiter 3:a2b58da5c03b 75 maxscore = left;
vsluiter 3:a2b58da5c03b 76 leftled.green = 255;
vsluiter 3:a2b58da5c03b 77 rightled.red = 255;
vsluiter 3:a2b58da5c03b 78 }
vsluiter 3:a2b58da5c03b 79 if(right >= left)
vsluiter 3:a2b58da5c03b 80 {
vsluiter 3:a2b58da5c03b 81 maxscore = right;
vsluiter 3:a2b58da5c03b 82 leftled.red = 255;
vsluiter 3:a2b58da5c03b 83 rightled.green = 255;
vsluiter 3:a2b58da5c03b 84 }
vsluiter 2:d2f8772a8db5 85 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 86 {
vsluiter 2:d2f8772a8db5 87 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 88 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 89 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 90 uint8_t sidecounter;
vsluiter 2:d2f8772a8db5 91 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 2:d2f8772a8db5 92 {
vsluiter 2:d2f8772a8db5 93 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 94 }
vsluiter 2:d2f8772a8db5 95 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 96 {
vsluiter 3:a2b58da5c03b 97 write_led(&totalstrip[sidecounter*2],leftled.red,leftled.green,leftled.blue);
vsluiter 2:d2f8772a8db5 98 }
vsluiter 2:d2f8772a8db5 99 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 100 {
vsluiter 3:a2b58da5c03b 101 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
vsluiter 2:d2f8772a8db5 102 }
vsluiter 3:a2b58da5c03b 103 wait(0.7);
vsluiter 2:d2f8772a8db5 104 }
vsluiter 3:a2b58da5c03b 105 wait(0.5);
vsluiter 2:d2f8772a8db5 106 }
vsluiter 2:d2f8772a8db5 107
vsluiter 1:7a2ec350cdf5 108 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 109 {
vsluiter 1:7a2ec350cdf5 110 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 111 Timer timer;
vsluiter 1:7a2ec350cdf5 112 timer.start();
vsluiter 1:7a2ec350cdf5 113 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 114 {
vsluiter 1:7a2ec350cdf5 115 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 116 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 117 {
vsluiter 1:7a2ec350cdf5 118 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 119 {
vsluiter 1:7a2ec350cdf5 120 if(side)
vsluiter 1:7a2ec350cdf5 121 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 122 else
vsluiter 1:7a2ec350cdf5 123 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 124 }
vsluiter 1:7a2ec350cdf5 125 else
vsluiter 1:7a2ec350cdf5 126 {
vsluiter 1:7a2ec350cdf5 127 if(side)
vsluiter 1:7a2ec350cdf5 128 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 129 else
vsluiter 1:7a2ec350cdf5 130 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 131
vsluiter 1:7a2ec350cdf5 132 }
vsluiter 1:7a2ec350cdf5 133 }
vsluiter 1:7a2ec350cdf5 134 }
vsluiter 1:7a2ec350cdf5 135 }
vsluiter 0:cde34c55fa20 136 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 137 {
vsluiter 0:cde34c55fa20 138 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 139 Timer timer;
vsluiter 0:cde34c55fa20 140 timer.start();
vsluiter 0:cde34c55fa20 141 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 142 {
vsluiter 0:cde34c55fa20 143 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 144 {
vsluiter 0:cde34c55fa20 145 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 146 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 147 else
vsluiter 0:cde34c55fa20 148 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 149 }
vsluiter 0:cde34c55fa20 150 }
vsluiter 0:cde34c55fa20 151 }
vsluiter 0:cde34c55fa20 152
vsluiter 0:cde34c55fa20 153 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 154 {
vsluiter 0:cde34c55fa20 155 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 156 uint8_t test;
vsluiter 0:cde34c55fa20 157 Timer timer;
vsluiter 0:cde34c55fa20 158 timer.start();
vsluiter 0:cde34c55fa20 159 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 160 {
vsluiter 0:cde34c55fa20 161 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 162 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 163 {
vsluiter 0:cde34c55fa20 164 if(ledcounter == test)
vsluiter 0:cde34c55fa20 165 {
vsluiter 0:cde34c55fa20 166 if(colored)
vsluiter 0:cde34c55fa20 167 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 168 else
vsluiter 0:cde34c55fa20 169 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 170 }
vsluiter 0:cde34c55fa20 171 else
vsluiter 0:cde34c55fa20 172 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 173 }
vsluiter 0:cde34c55fa20 174 }
vsluiter 0:cde34c55fa20 175 }
vsluiter 0:cde34c55fa20 176
vsluiter 1:7a2ec350cdf5 177 void UpdatePaddle(void)
vsluiter 1:7a2ec350cdf5 178 {
vsluiter 1:7a2ec350cdf5 179 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 180 if(direction) {
vsluiter 1:7a2ec350cdf5 181 paddlestart++;
vsluiter 1:7a2ec350cdf5 182 } else {
vsluiter 1:7a2ec350cdf5 183 paddlestart--;
vsluiter 1:7a2ec350cdf5 184 }
vsluiter 1:7a2ec350cdf5 185
vsluiter 1:7a2ec350cdf5 186 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 187 direction = 0;
vsluiter 1:7a2ec350cdf5 188 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 189 direction = 1;
vsluiter 1:7a2ec350cdf5 190 }
vsluiter 1:7a2ec350cdf5 191
vsluiter 2:d2f8772a8db5 192
vsluiter 0:cde34c55fa20 193 //DigitalOut myled(LED1);
vsluiter 0:cde34c55fa20 194
vsluiter 0:cde34c55fa20 195 //int main() {
vsluiter 0:cde34c55fa20 196 // while(1) {
vsluiter 0:cde34c55fa20 197 // myled = 1;
vsluiter 0:cde34c55fa20 198 // wait(0.2);
vsluiter 0:cde34c55fa20 199 // myled = 0;
vsluiter 0:cde34c55fa20 200 // wait(0.2);
vsluiter 0:cde34c55fa20 201 // }
vsluiter 0:cde34c55fa20 202 //}